15 de noviembre de 2014

Los detalles que tu mamá no te conto sobre HTMLListener

Pues bien, varios de los foxeros que visitan el foro de Microsoft creo que me vieron batallar por cerca de semana y media, por el tema de HTMLListener. Esta es una clase que viene en VFP9 SP2 (no estoy seguro si ya estaba en el SP1), la cual nos da la posibilidad de que nuestros reportes generados por archivos FRX, nos den la salida a formato HTML (entre uno de los tipos de salidas).

Sobre el uso de esta clase podemos encontrar documentación en el HELP de VFP9 SP2, y otro tanto en la Web. Pero lo que no vamos a encontrar es documentación relacionada con algunos problemas que se dan al implementar de esta clase en nuestros proyectos. Encontraran eso sí la exposición del problema pero no la solución.

Estos errores estan relacionados a las constantes: "FRX_OBJTYP_BAND" y "FRX_PLATFORM_WINDOWS". Estas constantes viene declaradas en el archivo de cabecera "foxpro_reporting.h" que se encuentra en la carpeta FFC (donde también se ubica la librería de clases VCX _Reportlistener, a la cual pertenece la clase HtmlListener.

Yendonos al punto, expondré el ejemplo típico que encontraremos en la web.
LOCAL loListener
loListener =.null.

*-- Asegurarse de que no existe el archivo HTML
ERASE SalidaHTML.HTM

*-- Crear la clase Listener
SET CLASSLIB TO HOME() + 'FFC\_REPORTLISTENER'
loListener = CREATEOBJECT('htmlListener')

DO (_reportoutput) WITH 5,loListener

*-- Configurar algunas propiedades
loListener.TargetFileName = 'SalidaHTML'

REPORT FORM  OBJECT loListener
Hasta aquí muy bien, es probable que en su ambiente de desarrollo no tengan ningún problema; pero cuando ya están incluyendo estas líneas en su proyecto, y lo corren desde el EXE, pueda que aun les corra sin problema (aun que yo si los tuve) pero al llevarlo a distribución la cosa cambia. Más adelante expondré que necesitamos ademas un parche de Windows.

Ahora expondré el código que me soluciono el problema de las constantes no encontradas, en el cual veremos que obviamos algunas líneas de código.
LOCAL loListener
loListener =.null.

*-- Asegurarse de que no existe el archivo HTML
ERASE SalidaHTML.HTM

DO (_reportoutput) WITH 5,loListener 

*-- Configurar algunas propiedades
loListener.QuietMode = .T.
loListener.TargetFileName = 'SalidaHTML'
Erase (loListener.TargetFileName)

REPORT FORM  OBJECT loListener
Algunas aclaraciones

Resulta que la línea de código : DO (_reportoutput) WITH 5,loListener al generar el proyecto no incluye el archivo "reportoutput.app" , por lo que nuestro proyecto no incluirá otras librerías de clases necesarias, la solución para ello es hacer que forzosamente "reportoutput.app" sea incluido en el proyecto, de la siguiente manera:
EXTERNAL FILE HOME() + 'reportoutput.app'
En sí el problema es que nunca se incluye en nuestros proyecto las clases que "reportoutput.app" invoca al correrlo, siendo así que entre las cosas que no se generan van las constantes descritas al inicio como errores en corrida.

Yo concluyo que el ejemplo típico forzando la inclusión de "reportoutput.app" en el proyecto debería funcionar, pero con el código que expuse que me dio solución al problema nos ahorramos un par de lineas:
*-- Crear la clase Listener
SET CLASSLIB TO HOME() + 'FFC\_REPORTLISTENER'
loListener = CREATEOBJECT('htmlListener')
Estas no son necesarias ya que "reportaoutput" hace el trabajo por nosotros.

He de manifestar mi agradecimiento a Edwin Duran, que respondió a unos de mis hilos en el foro, enviandome además un conjunto de programas que generaban un archivo PDF a partir de uin reporte FRX, pero que casualmente ahí venia el ejemplo para generar HTML con HtmlListener, que fue el que al final me soluciono el problema, quedando así demostrado como "san foxito" no proveer muchas soluciones útiles para nuestras aplicaciones.

Agrego como nota final en link para bajar la actualización del MSXML4, que es un componente esencial para que ReportListener nos de resultados que esperamos.

*** MSXML 4.0 Service Pack 2 (Servicios principales de Microsoft XML) ***
http://www.microsoft.com/downloads/details.aspx?displaylang=es&FamilyID=3144b72b-b4f2-46da-b4b6-c5d7485f2b42

Saludos,

William Hernández
Santiago de Chile

1 comentario :

  1. Hola William...he creado un archivo xml con (_reportoutput) y el archivo que genera no tiene ningún esquema en particular. Podrías indicarme alguna dirección en donde tenga algún ejemplo como para que se le indique el esque que debe seguir la generación del archivo XML. Desde ya muchas gracias.

    ResponderBorrar

Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.