Estaba pensado para aquellas ocasiones en que necesitaríamos realizar un listado sencillo, sin grupos ni totales, pero hasta el punto de diseñar un informe específico.
Sólo era capaz de realizarlo en orientación "Vertical", lo que limitaba la cantidad de información que podía mostrar.
Bien, pues ya lo he conseguido, con el único inconveniente de que su uso queda limitado a VFP9 por las funciones utilizadas.
Espero que os sirva de ayuda.
Este el el código:
[ACTUALIZADO EL 16 DE MARZO DE 2016]
******************************************************************************
* Autogeneracion de un listado (report rapido) partiendo de un cursor o tabla.
* Se autoajusta fuente, tamaño y nº de columnas a mostrar
* Vers: 1.6
******************************************************************************
* Parametros: cCursor --> Nombre del cursor/tabla origen
* cTitulo --> Titulo para el listado
* lNoRepite --> (.F./.T.) No repetir 1er.campo
* nType --> Tipo Salida (sólo FoxyPreviewer)
* 0 -> Vista Previa (default)
* 10 -> PDF
* 11 -> PDF como imagen
* 12 -> RTF
* 13 -> XLS
* 14 -> HTML
* 15 -> HTML Simple
* 20 -> Automático (por extensión --> cDestino)
*
* lRetorno --> (.F./.T.) Devolver nombre del report generado
* sin borrarlo, para su uso posterior
* cDestino --> Archivo a exportar con extensión (solo TYPE 20):
* "PDF","RTF","DOC","XLS","XML","HTM","HTML","MHT",
* "BMP","GIF","JPG","JPEG","TIF","TIFF","PNG","EMF"
* lOrienta --> (.F./.T.) Forzar orientación horizontal
******************************************************************************
* NOTAS:
*
* Se hacen coincidir los valores de 'nType' con OBJECT TYPE de FoxyPreviewer
*
* Si el nuevo parámetro 'lRetorno'=.T., sólo generará el report, sin mostrarlo,
* y se devuelve el nombre de dicho report. Habrá que borrarlo posteriormente.
******************************************************************************
*
* Ej. Do autorepo with "micursor", "Titulo del Listado",.F.,15,.F.
*
******************************************************************************
LPARAMETERS cCursor, cTitulo, lNoRepite, nType, lRetorno, cDestino, lOrienta
*
LOCAL cRepo, cFile, nLong, sFont, cFont, cCampos, nMaxCol
LOCAL sExtra, nOrientation, nOriginal, nVersion, CampoUno
cRepo = SYS(2015) + '.frx'
IF VARTYPE(cCursor) # 'C'
WAIT WINDOW "Faltan Datos"
RETURN
ENDIF
IF VARTYPE(cTitulo) # 'C'
cTitulo = cCursor
ENDIF
IF lRetorno = .T.
nType = 0
cDestino = ''
ENDIF
IF VARTYPE(nType) # 'N'
nType = 0
ENDIF
IF VARTYPE(cDestino) # 'C'
cDestino = ''
IF nType = 20
nType = 1
ENDIF
ELSE
IF EMPTY(cDestino)
cDestino = cCursor
ENDIF
ENDIF
nOrientation = 0
IF lOrienta = .T.
nOrientation = 1
ENDIF
DO CASE
CASE INLIST(nType, 10,11)
cFile = FORCEEXT(cDestino,'pdf')
CASE nType = 12
cFile = FORCEEXT(cDestino,'rtf')
CASE nType = 13
cFile = FORCEEXT(cDestino,'xls')
CASE INLIST(nType, 14,15)
cFile = FORCEEXT(cDestino,'html')
CASE INLIST(nType, 20)
IF INLIST(JUSTEXT(cDestino),"PDF","RTF","DOC","XLS","XML","HTM","HTML","MHT","BMP","GIF","JPG","JPEG","TIF","TIFF","PNG","EMF")
cFile = ALLTRIM(cDestino)
ELSE
nType = 1
cDestino = ''
cFile = ''
ENDIF
OTHERWISE
nType = 1
cDestino = ''
cFile = ''
ENDCASE
cFile =LOWER(cFile)
nVersion = INT(VERSION(5) / 100)
cFont = 'Times New Roman' && Fuente de letra a usar
*
nMaxCol = 225 && Nº máximo de columnas (depende de fuente)
IF nVersion = 9
nMaxCol = 315
ENDIF
*
nLong = 0
cCampos = ''
nOriginal = PRTINFO(1)
*
* Establecer anchura, limites y tamaño fuente
nCampos = AFIELDS(aCampos, cCursor)
FOR xx = 1 TO nCampos
*
IF xx = 1
CampoUno = LOWER(ALLTRIM(aCampos(xx,1)))
ENDIF
*
IF nLong + aCampos(xx, 3) > nMaxCol
*
cTitulo = cTitulo + ' ***'
EXIT
*
ELSE
IF EMPTY(cCampos)
cCampos = cCampos + aCampos(xx,1)
ELSE
cCampos = cCampos + ', ' +aCampos(xx,1)
ENDIF
*
nLong = nLong + aCampos(xx, 3) + 8
*
ENDIF
ENDFOR
IF nVersion = 9
* Establecer orientación necesaria
IF nOrientation = 0
IF nLong > 225
nOrientation = 1
ELSE
nMaxCol = 225
ENDIF
ENDIF
* Comprobar y cambiar orientacion si procede
IF nOriginal <> nOrientation
CambiarOrientacion(nOrientation)
ENDIF
ENDIF
* 'sFont' fuente según nº caracteres por linea
* 'sExtra' retroceso vertical para titulos columnas
DO CASE
CASE nLong > nMaxCol - 35
sFont = 7
sExtra = 120
CASE nLong > nMaxCol - 65
sFont = 8
sExtra = 200
CASE nLong > nMaxCol - 95
sFont = 9
sExtra = 360
OTHERWISE
sFont = 10
sExtra = 450
ENDCASE
* Crear report
nReport = 80
IF nVersion = 9
nReport = SET("ReportBehavior")
SET Reportbehavior 80
ENDIF
CREATE REPORT (cRepo) FROM DBF(cCursor) FIELDS &cCampos COLUMN WIDTH nLong
IF nVersion = 9
SET Reportbehavior nReport
ENDIF
* Abrir report como fichero
USE (cRepo) IN 0 ALIAS mirepor EXCL
SELECT mirepor
* Evitar Repetición 1er.campo si así se pidió
IF lNoRepite = .T.
GOTO TOP
LOCATE FOR LOWER(ALLTRIM(EXPR)) = CampoUno AND ObjType = 8
IF !EOF()
REPLACE Supalways WITH .F.
REPLACE Supovflow WITH .T.
REPLACE Suprpcol WITH 3
REPLACE Supgroup WITH 0
REPLACE Supvalchng WITH .T.
REPLACE FontStyle WITH 1
ENDIF
GOTO TOP
ENDIF
*
* Cambiar texto 'Page' por 'Página' en caso de runtime en ingles
REPLACE EXPR WITH ["Página "] FOR ALLTRIM(EXPR) = ["Page "] IN mirepor
*
* Cambiar la fuente para todos 'labels' y 'campos'
REPLACE ALL fontface WITH cFont FOR INLIST(ObjType, 1, 5, 8)
* Cambiar tamaño fuente y estilo para 'labels' encabezado columnas
REPLACE ALL FONTSIZE WITH sFont, FontStyle WITH 3 FOR ObjType=5 AND Vpos=0 IN mirepor
* Reducir tamaño fuente para todos 'campos'
REPLACE ALL FONTSIZE WITH MIN(sFont - 1,8) FOR ObjType = 8
* Cambiar tamaño fuente y estilo para 'labels' y 'campos' del pie de pagina
REPLACE FONTSIZE WITH MAX(sFont - 2,8), FontStyle WITH 3 FOR ALLTRIM(EXPR) = [DATE()] IN mirepor
REPLACE FONTSIZE WITH MAX(sFont - 2,8), FontStyle WITH 3 FOR ALLTRIM(EXPR) = ["Página "] IN mirepor
REPLACE FONTSIZE WITH MAX(sFont - 2,8), FontStyle WITH 3 FOR ALLTRIM(EXPR) = [_PAGENO] IN mirepor
*-------------------------------------------
* Añadir línea separación en pie de pagina
*-------------------------------------------
GOTO TOP
LOCATE FOR ALLTRIM(mirepor.EXPR) = [_PAGENO]
miW = mirepor.hpos + mirepor.WIDTH + 100
miV = mirepor.Vpos - 100
*
APPEND BLANK IN mirepor
REPLACE mirepor.ObjType WITH 7
REPLACE mirepor.objcode WITH 4
REPLACE mirepor.Vpos WITH miV
REPLACE mirepor.WIDTH WITH miW
REPLACE mirepor.HEIGHT WITH 300
REPLACE mirepor.penred WITH -1
REPLACE mirepor.pengreen WITH -1
REPLACE mirepor.penblue WITH -1
REPLACE mirepor.fillred WITH 192
REPLACE mirepor.fillgreen WITH 192
REPLACE mirepor.fillblue WITH 192
REPLACE mirepor.pensize WITH 1
REPLACE mirepor.fillpat WITH 1
REPLACE mirepor.TOP WITH .F.
REPLACE mirepor.Supalways WITH .T.
REPLACE mirepor.offset WITH 16
REPLACE mirepor.Suprpcol WITH 3
REPLACE mirepor.platform WITH 'WINDOWS'
*-------------------------------------------
* Añadir línea separación en encabezado
*-------------------------------------------
GOTO TOP
LOCATE FOR mirepor.ObjType=5 AND mirepor.Vpos=0
*
miV = mirepor.Vpos + mirepor.HEIGHT - 100
*
APPEND BLANK IN mirepor
REPLACE mirepor.ObjType WITH 7
REPLACE mirepor.objcode WITH 4
REPLACE mirepor.Vpos WITH miV
REPLACE mirepor.WIDTH WITH miW
REPLACE mirepor.HEIGHT WITH 300
REPLACE mirepor.penred WITH -1
REPLACE mirepor.pengreen WITH -1
REPLACE mirepor.penblue WITH -1
REPLACE mirepor.fillred WITH 192
REPLACE mirepor.fillgreen WITH 192
REPLACE mirepor.fillblue WITH 192
REPLACE mirepor.pensize WITH 1
REPLACE mirepor.fillpat WITH 1
REPLACE mirepor.TOP WITH .F.
REPLACE mirepor.Supalways WITH .T.
REPLACE mirepor.offset WITH 16
REPLACE mirepor.Suprpcol WITH 3
REPLACE mirepor.platform WITH 'WINDOWS'
*
* Mover todo hacia abajo, para colocar titulo
IF !EMPTY(cTitulo)
*
extra = 4000 && Altura para el titulo
GOTO TOP
REPLACE ALL Vpos WITH Vpos + extra FOR INLIST(ObjType, 5, 6, 7, 8) IN mirepor
REPLACE ALL HEIGHT WITH HEIGHT + extra FOR objcode = 1 IN mirepor
*
* Añadir Titulo
APPEND BLANK IN mirepor
REPLACE mirepor.platform WITH 'WINDOWS'
REPLACE mirepor.ObjType WITH 5
REPLACE mirepor.hpos WITH 100
REPLACE mirepor.fontface WITH cFont
REPLACE mirepor.FontStyle WITH 4
REPLACE mirepor.FONTSIZE WITH 16
REPLACE mirepor.WIDTH WITH 70000
REPLACE mirepor.HEIGHT WITH 2800
REPLACE mirepor.Supalways WITH .T.
REPLACE mirepor.EXPR WITH ["&cTitulo"]
REPLACE mirepor.mode WITH 1
*
REPLACE mirepor.Suprpcol WITH 3
REPLACE mirepor.penred WITH -1
REPLACE mirepor.pengreen WITH -1
REPLACE mirepor.penblue WITH -1
REPLACE mirepor.fillred WITH -1
REPLACE mirepor.fillgreen WITH -1
REPLACE mirepor.fillblue WITH -1
ENDIF
*
* Ajustar 'labels' columnas segun version VFP
REPLACE ALL mirepor.Vpos WITH mirepor.Vpos - sExtra FOR mirepor.ObjType=5 AND mirepor.Vpos = extra
*
DELETE ALL FOR ObjType = 26 IN mirepor
PACK
*
USE IN mirepor
*
* Mandar impresion
*
IF lRetorno = .F.
IF VARTYPE(_SCREEN.oFoxyPreviewer) = 'O'
*
IF nReport = 80
SET Reportbehavior 90
ENDIF
*
_SCREEN.oFoxyPreviewer.cTitle = 'Vista Previa'
_SCREEN.oFoxyPreviewer.lExpandFields = .T.
_SCREEN.oFoxyPreviewer.lPDFEmbedFonts = .T.
_SCREEN.oFoxyPreviewer.cPDFSymbolFontsList = 'Wingdings 2'
_SCREEN.oFoxyPreviewer.cPDFDefaultFont = 'Times New Roman'
_SCREEN.oFoxyPreviewer.cSaveDefName = cTitulo
*
SELECT &cCursor
GOTO TOP
*
IF nType < 10
REPORT FORM (cRepo) OBJECT TYPE nType
ELSE
REPORT FORM (cRepo) OBJECT TYPE nType TO FILE &cFile PREVIEW
ENDIF
*
IF nReport = 80
SET Reportbehavior nReport
ENDIF
*
ELSE
*
nType = 0
*
oFormObj = ""
IF _SCREEN.FORMCOUNT > 0
*
FOR vv = 1 TO _SCREEN.FORMCOUNT
IF _SCREEN.FORMS(vv).SHOWWINDOW = 2
oFormObj = "Window (_Screen.Forms(vv).Name)"
EXIT
ENDIF
ENDFOR
ENDIF
*
oForm = CREATEOBJECT("Form")
WITH oForm
*
.CAPTION = "Vista Previa"
.WINDOWTYPE = 1
MOUSE DBLCLICK AT .CURRENTX + 1, .CURRENTY + 5
*
SELECT &cCursor
GOTO TOP
*
REPORT FORM (cRepo) TO PRINTER PROMPT NOCONSOLE NOEJECT PREVIEW WINDOW (.NAME)
*
.RELEASE()
*
ENDWITH
*
ENDIF
*
* Borrar Report autogenerado
*
DELETE FILE (JUSTSTEM(cRepo) + '.frx')
DELETE FILE (JUSTSTEM(cRepo) + '.frt')
cRepo = ''
*
ENDIF
* Comprobar y establecer orientacion original si procede
IF nVersion = 9
IF nOriginal <> nOrientation
CambiarOrientacion(nOriginal)
ENDIF
ENDIF
RETURN cRepo
*************
* Funciones *
*************
FUNCTION CambiarOrientacion
LPARAMETERS nValor
LOCAL cValor1, cValor2
*
cValor1=[ORIENTATION=0]
cValor2=[ORIENTATION=1]
IF nValor = 0
cValor1=[ORIENTATION=1]
cValor2=[ORIENTATION=0]
ENDIF
*
CREATE CURSOR mytemp (nulo c(1))
*
cRepo2 = SYS(2015)+'.frx'
* Crear un report temporal para cambiar orientacion
CREATE REPORT (cRepo2) FROM DBF('mytemp') FIELDS nulo COLUMN WIDTH 256
*
*
USE (cRepo2) IN 0 ALIAS mytempfrx EXCL
SELECT mytempfrx
*
GOTO TOP
REPLACE mytempfrx.EXPR WITH STRTRAN(mytempfrx.EXPR,cValor1,cValor2)
*
SYS(1037,3)
*
* Eliminar cursor y reports temporales
*
USE IN SELECT('mytempfrx')
USE IN SELECT('mytemp')
*
DELETE FILE (JUSTSTEM(cRepo2) + '.frx')
DELETE FILE (JUSTSTEM(cRepo2) + '.frt')
*
ENDFUNC
Un saludo a todos.
Jose Antonio Blasco
alguna idea para alinear a la izquierda los campos de detalle?? y q al imprimir una columna numerica te queda asi:
ResponderBorrarCampo 1 Campo 2
12.25 6.83