ActiveVFP - Reportes en blanco

376 views
Skip to first unread message

Richard Silva

unread,
Feb 11, 2023, 8:00:42 PM2/11/23
to Comunidad de Visual Foxpro en Español
Hola a todos.

He seguido los pasos para instalar ActiveVFP en un equipo con WIndows 10 x64 y los runtimes de VFP instalados , y el sitio de pruebas está funcionando. Es muy interesante. Pero, en algún lugar me he equivocado, porque al imprimir los reportes en PDF salen totalmente en blanco.

Debo mencionar que al configurar en el Servicio de Componentes (32 bits) - Configuración DCOM los permisos para las cuentas IUSR, IWAM, y ASPNET, sólo he encontrado y configurado la cuenta de IUSR, las otras dos no existen. Es correcto esto?

Se agradece mucho la colaboración de alguien que tenga conocimientos del tema y pueda darme una mano, o dos, :)

Saludos

Victor Espina

unread,
Feb 13, 2023, 7:55:31 AM2/13/23
to Comunidad de Visual Foxpro en Español
Pregunta: estas seguro que el PDF se genera ??

Richard Silva

unread,
Feb 13, 2023, 11:20:45 AM2/13/23
to Comunidad de Visual Foxpro en Español
Sí. Totalmente seguro. El archivo generado pesa 3 KB.

Aquí lo adjunto, por si sirve de algo.

Muchas gracias por la orientación que me puedan brindar!
JP0QBWWU.pdf

Victor Espina

unread,
Feb 13, 2023, 3:55:13 PM2/13/23
to Comunidad de Visual Foxpro en Español
Debe estar ocuirriendo algun error porque 3 KB es un tamaño ddemasiado pequeño para un PDF.

Victor Espina

Richard Silva

unread,
Feb 13, 2023, 4:34:33 PM2/13/23
to Comunidad de Visual Foxpro en Español
Eso creo. 

Podría ser una alternativa eliminar el registro del COMponente, compilarlo y volver a registrar?

Porque no recibo ningún mensaje de error, o algo por lo que pueda guiarme para solucionarlo.

Estoy agradecido por la disposición para ayudar.

José Antonio Peña Martínez

unread,
Feb 13, 2023, 5:22:57 PM2/13/23
to publice...@googlegroups.com
3KB es la medida de un archivo "vacio" PDF por lo general ocurre cuando algun error de programa no genera el pdf y asi sal una "hoja en blanco" ...Saludos!

--
Blog de la Comunidad Visual FoxPro en Español: http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/e53f66ca-8c44-4402-b2c5-60a023c5abe8n%40googlegroups.com.


--
Desarrollo de Sistemas TecnoPro
José Antonio Peña

Saludos!

Jose Antonio Peña Martínez

unread,
Feb 13, 2023, 5:29:40 PM2/13/23
to Comunidad de Visual Foxpro en Español
Si estas usando alguna impresora "virtual" para generar el PDF revisa que este correctamente instalada, no se si esto te ayude pero prueba ... saludos!

Richard Silva

unread,
Feb 13, 2023, 6:18:36 PM2/13/23
to Comunidad de Visual Foxpro en Español
Sigo investigando...

Estoy usando la propia impresora de Win 10:

Microsoft Print to PDF

Victor Espina

unread,
Feb 14, 2023, 7:30:44 AM2/14/23
to Comunidad de Visual Foxpro en Español
Ayudaria mucho ver el codigo con el que estas generando el PDF.

Victor Espina

Richard Silva

unread,
Feb 14, 2023, 7:55:05 AM2/14/23
to Comunidad de Visual Foxpro en Español
Seguro. Este es el código:


<Code>

<%
oPDF=CREATEOBJECT("pdfrun.print2pdf")
if isnull(oPDF)
  return .f.
endif
*-oPDF.cPSColorPrinter ="Xerox Phaser 6120 PS"
oPDF.cPSColorPrinter ="Microsoft Print to PDF"
*-oPDF.cPSColorPrinter = "Microsoft XPS Document Writer"
oUtil=NEWOBJECT('AVFPutilities')
* files older than 10 Minutes(600 ms.), erase.  3rd param is path - can be hardcoded
oUtil.DeleteFiles('pdf',600,oProp.AppStartPath+[Temp\])
lcCompany=oRequest.Form("Company")
IF ISNULL(lcCompany) .OR. EMPTY(lcCompany)
  *-oPDF.cRecordSelect = [SELECT * from ']+ oProp.DataPath+[customer' INTO CURSOR tcursor]
  oSQL = CREATEOBJECT( "AVFPsql" )
  oSQL.LogIn(['Driver={MySQL ODBC 5.1 Driver}; Server=localhost; Database=mydb; Uid=root; Pwd=1234;'])
    oSQL.cSQLCursor = "tCursor"
    oSQL.Execute([SELECT pro_id as company, pro_ccodigo as contact, pro_cdescrip as phone ]+;
               [ FROM proveedores ]+;
               [ where pro_cdescrip like '%CA%' order by pro_cdescrip] )
copy to oProp.AppStartPath+[Temp\] + [_prueba]
oPDF.cRecordSelect = [select * from ']+ oProp.AppStartPath+[Temp\] + [_prueba' into CURSOR tCursor]
ELSE
  oPDF.cRecordSelect = [SELECT * from '] + oProp.DataPath+[customer' ]+;
 [WHERE UPPER(company)=ALLTRIM(UPPER(']+lcCompany+[')) INTO CURSOR tcursor]
 * the following properties are coded for portability.  They may be hardcoded instead.
ENDIF

oPDF.cReport = oProp.AppStartPath+"reports\listcust.frx"
oPDF.cPhysicalPath=oProp.AppStartPath+[Temp\]     &&[C:\Program Files\dotComSolution\AVFPdemo2\Temp\]
oPDF.cLogicalPath=[http://]+oRequest.ServerVariables("HTTP_HOST") + JustPath(oRequest.ServerVariables("URL"))+[/Temp/] &&[http://www.ddddd.com/avfpdemo2/Temp/]
lcFile=oPDF.GetOutput() && generate output, return temp file name
lcNewPath=oPDF.cLogicalPath + lcFile && new URL
oResponse.Redirect( lcNewPath )  && redirect browser to created file
oPDF = .NULL.
release oPDF  
%>
</Code>


Se puede ver que:
Se usa la impresora "Microsoft Print to PDF".
He partido de la consulta original y, por supuesto,  la he adaptado para un servidor local y una bd de prueba a manera de obtener el reporte con el cursor generado.

La he ejecutado en el phpMyAdmin y retorna los registros, sin problema.

Victor Espina

unread,
Feb 14, 2023, 8:07:20 AM2/14/23
to Comunidad de Visual Foxpro en Español
Prueba instalando una de las impresoras PS que viene con Windows (cualquier HP Laserjet cuyo nombre termine en PS te servira),  mapeala al puerto FILE y dale un nombre claro como PSPrinter o AFVPPrinter.  Usa esta impresora en lugar de la qque estas usando ahora, a ver si con eso funciona.

Saludos

Victor Espina

José Antonio Peña Martínez

unread,
Feb 14, 2023, 10:56:56 AM2/14/23
to publice...@googlegroups.com
Tambien podrias revisar si todas las carpetas que estas utilizando tienes permisos completos ...

[C:\Program Files\dotComSolution\AVFPdemo2\Temp\] y AppStartPath ... podría ser que el programa no puede escribir el PDF ... pero primero prueba lo que dice Victor ...

Saludos!

Carlos Vargas

unread,
Feb 14, 2023, 11:42:52 AM2/14/23
to Comunidad de Visual Foxpro en Español
*  * files older than 10 Minutes(600 ms.), erase.  3rd param is path - can be hardcoded
es correcto esto? por que 10 minutos serian (10*60*1000)
600 milisec no es ni siquiera un segundo, seria 0.6 segundos...
podriac confirmanos esto?

Richard Silva

unread,
Feb 15, 2023, 5:41:42 AM2/15/23
to Comunidad de Visual Foxpro en Español
Víctor, no me funcionó instalando la HP ... PS.

Pero, compilé el pdfrun nuevamente, asigné los respectivos permisos y observo que el reporte se emite correctamente la 1ra vez. Luego de eso, sólo salen reportes en blanco.

Adjunto reportes obtenidos, si pueden ser de ayuda.

Gracias por leer y por la sugerencia.
JP139OJO.pdf
Primer Reporte.pdf

Richard Silva

unread,
Feb 15, 2023, 5:46:43 AM2/15/23
to Comunidad de Visual Foxpro en Español
Jose Antonio:

La aplicación está en una carpeta de usuario, fuera de las carpetas protegidas del sistema. Por si acaso, he verificado los permisos. Todo ok.

Muchas gracias por la sugerencia.

Richard Silva

unread,
Feb 15, 2023, 5:49:41 AM2/15/23
to Comunidad de Visual Foxpro en Español
Carlos:

No hay problema con ése código. He verificado que elimina los archivos PDF creados en el directorio "temp" después de 10 minutos. Hace la comprobación y eliminación cuando se emite un nuevo reporte.

Gracias por leer.

Victor Espina

unread,
Feb 15, 2023, 8:40:12 AM2/15/23
to Comunidad de Visual Foxpro en Español
ok, creo que ya vi el probema.  La propidad cRecordSelect contiene una instruccion SELECT-SQL que toma los datos de un DBF llamado "_prueba.dbf" que esta presente fisicamente en la ruta (y por lo tanto es abierto automaticamente al ejecutar el select), y como resultado crea un cursor (dentro de la rutina print2PDF) llamado "tcursor". En el metodo makePS esta el contenido de esta propiedad es ejecutado y, como consecuencia, se abre el archio _prueba.dbf y se crea el cursor tcursor,  y el primer PDF se genera sin problemas.... pero tanto el DBF como el cursor QUEDAN ABIERTOS; cuando intentas generar el 2do PDF,  se deberia estar generando un error al generar de nuevo la tabla _prueba.dbf (pues esta abierta aun), pero ese error por algna razon esta siendo obviado por lo que el codigo contina.  Al invocar a GetOutput() el metodo MakePS() se vuelve a ejecutar y el SELECT podria funcionar pues _PRUEBA.DBF aun existe (solo que es el mismo usado. para el reporte anterior), pero ahora el SELECT va a fallar porque el cursor tcursor YA EXISTE, por lo que esto podria estar causando que el 2do reporte se genere en blanco pues el PS no se genera pero aun asi se invoca a MakePDF().

La solucion vendria entonces por dos lados.  En tu codigo, deberias cambiar esto:

copy to oProp.AppStartPath+[Temp\] + [_prueba]
oPDF.cRecordSelect = [select * from ']+ oProp.AppStartPath+[Temp\] + [_prueba' into CURSOR tCursor]

por esto:

cCursor = "Q" + SYS(2015) + ".dbf"
copy to oProp.AppStartPath+[Temp\] + cCursor
oPDF.cRecordSelect = [select * from ']+ oProp.AppStartPath+[Temp\] + cCursor + [.dbf' into CURSOR tCursor]



y dentro del codigo de print2pdf.prg, hacer estos cambios:

1. En la definicion de la clase añadir la propiedad cDataAlias
Screenshot 2023-02-15 at 10.21.20.png


2. En el metodo MakePS almacenar en cDataAlias el nombre del cursor creado

Screenshot 2023-02-15 at 10.20.38.png

3. En el metodo Cleanup, cerrar el cursor creado:
Screenshot 2023-02-15 at 10.22.13.png


Espero te funcione.

Saludos

Victor Espina

Richard Silva

unread,
Feb 15, 2023, 9:52:33 AM2/15/23
to Comunidad de Visual Foxpro en Español
Realicé las correcciones sugeridas.

En la primera parte de las modificaciones, me parece que no hace falta agregar la extensión ".dbf" la segunda vez.

En la carpeta Temp obtengo el dbf con los datos y el reporte , como debería, pero sigue saliendo el reporte en blanco.

Adjunto imagen.
Muestra.png

Richard Silva

unread,
Feb 15, 2023, 9:59:29 AM2/15/23
to Comunidad de Visual Foxpro en Español
Aquí se puede ver el contenido del cursor generado:
Datos.png

Victor Espina

unread,
Feb 15, 2023, 10:09:04 AM2/15/23
to Comunidad de Visual Foxpro en Español
Que misterio!!  Ahora si no tengo idea de que pueda ser :(

José Antonio Peña Martínez

unread,
Feb 15, 2023, 7:15:17 PM2/15/23
to publice...@googlegroups.com
Cada reporte que envías tiene nombre diferente o "empalmas" el siguiente reporte o PDF? ... si lo estas "empalmando" usa un nombre de archivo diferente cada vez que lo envíes y prueba ..

Saludos!

Richard Silva

unread,
Feb 15, 2023, 7:41:20 PM2/15/23
to Comunidad de Visual Foxpro en Español
Cada reporte se envía con un nombre diferente.

Me parece que es en esta linea del código AVFP donde se genera el nombre temporal del reporte:

...
lcFile=oPDF.GetOutput() && generate output, return temp file name
...


Gracias!

Victor Espina

unread,
Feb 16, 2023, 9:37:15 AM2/16/23
to Comunidad de Visual Foxpro en Español
Es correcto; lo hacen usando SYS(2015).  Quizas el problema es que esta ocurriendo un error y tu no te estas enterando.  Intenta cambiando el codigo de GetOutput por este:

function GetOutput()
LOCAL lcFile
TRY
    lcFile=SUBSTR(SYS(2015), 3, 10)+[.pdf]
    this.cOutputFile=this.cPhysicalPath+lcFile
    this.ReadIni() &&Read the .ini settings
    this.SetPrinter() &&Set printer to Postscript driver
    this.GSFind() &&Locate/Install Ghostscript
    this.MakePS() &&Print To Postscript file
    this.MakePDF() &&Turn Postscript into PDF
    this.Cleanup() &&Put things back the way
CATCH TO ex
    THIS.cError = ex.Message + " (" + ex.Procedure + ":" + ALLT(STR(ex.LineNo)) + ")"
    THIS.lError = .T.
    lcFile = ""
ENDTRY
RETURN lcFile
endfunc

y luego en tu codigo 

<%
....
LOCAL cResult
cResult = "OK"
lcFile=oPDF.GetOutput() && generate output, return temp file name
IF NOT oPDF.lError
   lcNewPath=oPDF.cLogicalPath + lcFile && new URL
  oResponse.Redirect( lcNewPath )  && redirect browser to created fil
ELSE
   cResult = oPDF.cError
ENDIF
%>

Resultado:  <%=cResult%>


La idea es que si ocurre un error puedas ver en el browser una descripcion de ese error.

Saludos

Victor Espina

Richard Silva

unread,
Feb 16, 2023, 10:08:28 AM2/16/23
to Comunidad de Visual Foxpro en Español
Modifiqué un poco el código:

<%
...
LOCAL cResult
cResult = "OK"
lcFile=oPDF.GetOutput() && generate output, return temp file name
IF NOT oPDF.lError
   lcNewPath=oPDF.cLogicalPath + lcFile && new URL
  oResponse.Redirect( lcNewPath )  && redirect browser to created fil
ELSE
   cResult = oPDF.cError
   STRTOFILE( cResult, oProp.AppStartPath+[Temp\] + sys( 2015 ) + '.txt' )
ENDIF
..
%>

Y en el archivo temporal obtengo:

Could not Initilize Ghostscript.

Interesante, no?

José Antonio Peña Martínez

unread,
Feb 16, 2023, 10:24:39 AM2/16/23
to publice...@googlegroups.com
GhostScript es un componente de la impresora virtual, por eso te decía que revises si puedes usar todas las propiedades de la impresora virtual, cuando descargas por ejemplo Bullzip PDF Printer se instala GhostScript ... no se si te ayude pero prueba agregando esa impresora o buscar GhostScript por separado y vuelvelo a instalar.

Saludos!

Richard Silva

unread,
Feb 16, 2023, 11:34:43 AM2/16/23
to Comunidad de Visual Foxpro en Español
Instalé Bullzip PDF Printer. Sigue saliendo vacío el reporte. Pero, ahora obtengo este mensaje:

Installation parms do not exist for ID: GHOSTSCRIPT.

Buscando eso en las conversaciones de los grupos, encontré esto:


Sigo investigando...

Muchas gracias por seguir ahí!

José Antonio Peña Martínez

unread,
Feb 16, 2023, 4:08:07 PM2/16/23
to publice...@googlegroups.com
Instalaste con privilegios de Administrador? ...

Recuerdo que desde el inicio indicabas que era una instalación en win 10 para "testear", me imagino que en otras versiones del SO si funciona ...
Partiendo de esto, me imagino que el problema es el SO, y que cambia cada SO? ... pues los privilegios, por eso tmb comente si tenias permisos completos sobre todas las carpetas que usabas, lo curioso es que dices que funciona una vez al volver a compilar.

Ahora, en el post que estas revisando la primer opinion dice que le puso un tiempo de espera de 3 segundos para dejar que se termine de generar el pdf.

Saludos!


Jose Antonio Peña Martínez

unread,
Feb 16, 2023, 4:14:15 PM2/16/23
to Comunidad de Visual Foxpro en Español
Ahhh se me olvidaba creo haber visto ese error en las versiones mas nuevas de Bullzip PDF Printer, busca la version 11 y prueba

Setup_BullzipPDFPrinter_11_7_0_2716_PRO_EXP

esa funciona bien ...

y precisamente en windows 10 64 bits  me dio problema la mas actual

Jose Antonio Peña Martínez

unread,
Feb 16, 2023, 4:17:05 PM2/16/23
to Comunidad de Visual Foxpro en Español

Richard Silva

unread,
Feb 16, 2023, 5:47:09 PM2/16/23
to Comunidad de Visual Foxpro en Español
Jose Antonio Peña Martínez's profile photo
Jose Antonio:

Instalé con privilegios de Administrador el Bullzip que gentilmente compartiste.

También agregué una función en el prg AVFP para esperar 3 segundos.

No he probado en otros SO.

Nada. Los reportes siguen saliendo en blanco.

Parece ser un problema con el GhostScript. Incluso instalé la versión 9.52 del GS porque leí que existía el problema de que los reportes salían en blanco con las versiones más recientes.


Aprecio muchas las sugerencias,

Saludos.

Victor Espina

unread,
Feb 16, 2023, 9:20:07 PM2/16/23
to Comunidad de Visual Foxpro en Español
Y tienes instalado Ghostscript ??   Fue lo primero que pense, pero como indicabas que el primer reporte si se generaba, entonces lo descarte.

Victor Espina

Victor Espina

unread,
Feb 16, 2023, 9:22:44 PM2/16/23
to Comunidad de Visual Foxpro en Español
Ghostscript es una libreria que permite convertir archivos Postscript en archivos PDF.  Es utilizada por muchos productos como Bullzip, PDFCreator, etc, pero no es "parte" de esas librerias, sino una libreria de terceros con licencia publica de uso.   Justamente lo que hace la rutina Print2PDF es utilizar una impresora Postscript para obtener una representacion Postscript del reporte VFP y luego utiliza Ghostscript para convertir ese archivo PS en un archivo PDF.

Victor Espina

Ignacio Debole

unread,
Feb 16, 2023, 10:19:27 PM2/16/23
to publice...@googlegroups.com
Richard, el Ghostscript genera previamente un archivo .ps en windows\temp o en el temp del usuario del appdata o en la misma carpeta donde está instalado.
Fijate por favor si ese .ps se genera, y si el archivo está, significa que no está convirtiendo .ps a .pdf.
Si el archivo no está, entonces no está trayendo datos por lo cual no hace el report.
Saludos

Ignacio

Ing. Bernardo José Martínez Pérez

unread,
Feb 16, 2023, 10:36:48 PM2/16/23
to publice...@googlegroups.com
Ya checaste si hay alguna variable que no exista, eso pasa cuando se trata de imprimir una variable y está no existe, prueba en modo diseño para que te arroje el error.

Enviado desde Smartphome

From: publice...@googlegroups.com <publice...@googlegroups.com> on behalf of Richard Silva <rjsi...@gmail.com>
Sent: Thursday, February 16, 2023 4:47:09 PM
To: Comunidad de Visual Foxpro en Español <publice...@googlegroups.com>
Subject: Re: [vfp] Re: ActiveVFP - Reportes en blanco
 

Victor Espina

unread,
Feb 17, 2023, 9:45:26 AM2/17/23
to Comunidad de Visual Foxpro en Español
Ghostscript no genera ningun archivo PS.  Lo que hace es tomar un archivo PS YA GENERADO y usarlo para crear una representacion PDF del mismo.  En el caso de la libreria Print2PDF hay un metodo llamado MakePS() que es el encargado de generar ese archivo PS ejecutando un REPORT FORM y enviando el resultado a una impresora PS configurada para usar el puerto FILE.

Victor Espina

Ignacio Debole

unread,
Feb 17, 2023, 10:16:03 AM2/17/23
to publice...@googlegroups.com
Si Victor, tenés razón, hace mucho que no lo uso, y mi cabeza confundió algunas cosas.
Pero en definitiva a Richard el archivo .ps tiene que existir en algún lado.
Saludos

Victor Espina

unread,
Feb 17, 2023, 10:46:26 AM2/17/23
to Comunidad de Visual Foxpro en Español
SI, y entiendo que efectivamente es asi por que de otra forma no se generaria el PDF en blanco sino que simplemente no se generaria.

Victor

José Antonio Peña Martínez

unread,
Feb 17, 2023, 12:17:37 PM2/17/23
to publice...@googlegroups.com
Está muy bueno el hilo, ya le hemos "disparado" con sugerencias pero no se logra solucionar, mira, según lo que comentas la primera vez que generas el informe funciona .

Prueba:

1.- Funciona solo una vez al haber recompilado tu proyecto?.
2.- Funciona solo una vez al haber reiniciado tu equipo?.

Porque puede ser una condición a variable que agrupa datos que la segunda vez esa misma variable tiene un valor erroneo. digamos que la primera vez que generas un reporte tienes un valor o condición que se cumple pero en tu programa pero no lo reinicias cada vez que generas un informe, entonces para la segunda ocasion el valor contenido no permite la generacion del reporte.
Saludos!

Richard Silva

unread,
Feb 17, 2023, 5:47:21 PM2/17/23
to Comunidad de Visual Foxpro en Español
Víctor:

GhostScript está instalado. Como mencioné antes, lo instalé con la versión más reciente de Bullzip y también con la versión previa a esa.

Por si acaso, también lo instalé desde la página oficial.

Richard Silva

unread,
Feb 17, 2023, 5:49:25 PM2/17/23
to Comunidad de Visual Foxpro en Español
Ignacio:

No encuentro el archivo .ps en ninguna de esas ubicaciones. Para mí, no se genera, o se genera sólo una vez. Luego, nunca más.

Richard Silva

unread,
Feb 17, 2023, 5:53:02 PM2/17/23
to Comunidad de Visual Foxpro en Español
Berny:

No he tocado el reporte para nada, por lo que deberían existir todas las variables y los campos.
Obtuve un cursor de una BD en MySQL y renombré los campos para no tocar el reporte.

Gracias por la sugerencia!

Richard Silva

unread,
Feb 17, 2023, 6:06:07 PM2/17/23
to Comunidad de Visual Foxpro en Español
Jose Antonio :

Funciona solo una vez al recompilar el proyecto Print2PDF y establecerle los respectivos permisos en el Servicio de COMponentes, en los de tab Seguridad e Identidad.

Aclaro que el archivo .AVFP es prácticamente el mismo de la demostración, con los únicos cambios para obtener el cursor y lo que ha sugerido Víctor, que ha sido de gran ayuda para identificar el problema.


Seguimos intentando.

Estoy agradecido por su compañía y sugerencias.
Reply all
Reply to author
Forward
0 new messages