*************************************************************
* Autogeneracion de un listado (report rapido) partiendo de un
* cursor o tabla.
* Se autoajusta fuente, tamaño y nº de columnas a mostrar
*
* Parametros: cCursor --> Nombre del cursor/tabla origen
* cTitulo --> Titulo para el listado
*
* Ej: do autorepo with "micursor", "Titulo del Listado"
*
****************************************************************
LPARAMETERS cCursor, cTitulo
*
LOCAL cRepo, nLong, sFont, cFont, cCampos, nMaxCol, sExtra
cRepo = SYS(2015) + '.frx'
*
IF VARTYPE(cCursor) # 'C'
WAIT WINDOW "Faltan Datos"
ENDIF
IF VARTYPE(cTitulo) # 'C'
cTitulo = ''
ENDIF
cFont = 'Calibri' && Fuente de letra a usar
nMaxCol = 225 && Nº máximo de columnas (depende de fuente)
nLong = 0
cCampos = ''
* Establecer anchura, limites y tamaño fuente
nCampos = AFIELDS(aCampos, cCursor)
FOR xx = 1 TO nCampos
nLong = nLong + aCampos(xx, 3)
IF nLong > nMaxCol
cTitulo = cTitulo + ' ***'
EXIT
ELSE
IF EMPTY(cCampos)
cCampos = cCampos + aCampos(xx,1)
ELSE
cCampos = cCampos + ', ' +aCampos(xx,1)
ENDIF
ENDIF
ENDFOR
* Ajusto tamaño de fuente depende long. datos
* 'sExtra' para ajustar campos (depende de ver. VFP)
DO CASE
CASE nLong > 190
sFont = 7
sExtra = IIF(VERSION(5) / 100 = 9, 120, -320)
CASE nLong > 160
sFont = 8
sExtra = IIF(VERSION(5) / 100 = 9, 200, -170)
CASE nLong > 135
sFont = 9
sExtra = IIF(VERSION(5) / 100 = 9, 360, -110)
OTHERWISE
sFont = 10
sExtra = IIF(VERSION(5) / 100 = 9, 450, 180)
ENDCASE
* Crear un report y pasar a realizar ajustes
CREATE REPORT (cRepo) FROM DBF(cCursor) FIELDS &cCampos COLUMN WIDTH 256
*
USE (cRepo) IN 0 ALIAS mirepor EXCL
SELECT mirepor
*
* 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, 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 sFont - 1 FOR objtype = 8
* Cambiar tamaño fuente y estilo para 'labels' y 'campos' del pie de pagina
REPLACE FONTSIZE WITH sFont - 1, fontstyle WITH 2 FOR ALLTRIM(EXPR) = [DATE()] IN mirepor
REPLACE FONTSIZE WITH sFont - 1, fontstyle WITH 2 FOR ALLTRIM(EXPR) = ["Página "] IN mirepor
REPLACE FONTSIZE WITH sFont - 1, fontstyle WITH 2 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 6
REPLACE mirepor.Vpos WITH miV
REPLACE mirepor.WIDTH WITH miW
REPLACE mirepor.HEIGHT WITH 105
REPLACE mirepor.penpat WITH 8
REPLACE mirepor.supalways WITH .T.
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
*
APPEND BLANK IN mirepor
REPLACE mirepor.objtype WITH 6
REPLACE mirepor.Vpos WITH miV
REPLACE mirepor.WIDTH WITH miW
REPLACE mirepor.HEIGHT WITH 105
REPLACE mirepor.penpat WITH 8
REPLACE mirepor.supalways WITH .T.
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, 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
*
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
oForm = CREATEOBJECT("Form")
WITH oForm
.CAPTION = "Vista Previa "
.WINDOWTYPE = 1
.WIDTH = _SCREEN.WIDTH - 16
.HEIGHT = _SCREEN.HEIGHT - 16
*
SELECT &cCursor
GOTO TOP
REPORT FORM (cRepo) PREVIEW WINDOW (.NAME)
REPORT FORM (cRepo) TO PRINTER PROMPT NOCONSOLE NOEJECT
*
.RELEASE()
ENDWITH
*
* Borrar Report autogenerado
DELETE FILE (JUSTSTEM(cRepo) + '.frx')
DELETE FILE (JUSTSTEM(cRepo) + '.frt')
*
RETURN