In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Usar un único objeto TFastReport y Clear()

FastReport for Xailer & [x]Harbour (English/Spanish)
Israel Solis
Posts: 142
Joined: Wed Nov 03, 2004 12:42 pm
Location: Cancún, México
Contact:

Usar un único objeto TFastReport y Clear()

Postby Israel Solis » Mon Dec 09, 2019 3:42 pm

Hola compañeros

Hace días se me presentó un problema de GPF con FastReport, mi error se debía a que cargaba y descargaba en cada ocasión la libreria TFastReoort, por consejo de Ignacio Ortiz ahora uso un único objeto TFastReport borrando su contenido con el método Clear() PERO ALGO HAGO MAL que no funciona correctamente...

Code: Select all

* * * * * * * * AQUI CREO EL UNICO OBJECTO TFASTREPORT... * * * * * * *
METHOD FormInitialize( oSender ) CLASS tFrmMain
       WITH OBJECT ::oFastReport := TFastReport():New(Self)
         :SetTitle( Application:cTitle + " - Reporte" )
         :cLanguage := "Spanish"
         :Create()
      END WITH
RETURN NIL


* * * * *  ESTE METODO ES LLAMADO EN VARIAS OCASIONES Y ARMA UN NUEVO REPORTE CON REGISTROS DIFERENTES... * * * * *
METHOD PrintCFDI(cFileFR3, cFileOutput, oDSdetalle, oDSsubDetalle) CLASS tFrmMain
   LOCAL oDetalle, oSubDetalle

   WITH OBJECT ::oFastReport
      oDSdetalle:GoTop()
      oDSsubDetalle:GoTop()

     // * * * * * * * *
     // EN UN SEGUNDO REPORTE YA NO MUESTRA REGISTROS DE LOS DATASET's,....
     
      oDetalle   := :AddDataSet( "Conceptos",     oDSdetalle )
      oSubDetalle:= :AddDataSet( cNameSubDetalle, oDSsubDetalle )
      oSubDetalle:SetMaster( oDetalle, { "IDCONCEPTO=IDCONCEPTO" } )

      :LoadFromFile( cFileFR3 )
      :AddFunction( "Function ValorBanco(cValor: String, nDato: Integer):String", "Sanroms", "bla, bla,..." )
      :AddFunction( "Function ValorTipoJornada(cValor: String, nDato: Integer):String", "Sanroms", "bla, bla,..." )
      :AddFunction( "Function ValorTipoNomina( cValor: String, nDato: Integer):String", "Sanroms", "bla, bla,..." )
      :AddFunction( "Function ValorPeriodoPago(cValor: String, nDato: Integer):String", "Sanroms", "bla, bla,..." )

      :DeleteCategory( "EMISOR" )
      :AddCategory( "EMISOR" )
      :AddVariable( "Emisor_Logotipo",  cLogotipo )
      :AddVariable( "Emisor_Domicilio", cDomicilio)


            :PrepareReport()
            :SetProperty( "PDFExport", "ShowDialog",    .F. )
            :SetProperty( "PDFExport", "FileName",      cFileOutput + ".pdf" )
            :SetProperty( "PDFExport", "Compressed",    .t. )
            :SetProperty( "PDFExport", "EmbeddedFonts", .t. )
            :SetProperty( "PDFExport", "PrintOptimized",.t. )
            :SetProperty( "PDFExport", "Author",        "Sanroms Software de México" )
            :SetProperty( "PDFExport", "Subject",       "Comprobante Fiscal Digital" )
            :DoExport( "PDFExport" )

      :Clear()  // SOLO CLEAR() y LISTO PARA EL SIGUIENTE REPORTE?
   END WITH

RETURN .T.



Mi problema es que solo en el PRIMER reporte generado muestralos registros de manera correcta, a partir de la SEGUNDA ocasión que se genera un nuevo reporte NO MUESTRA REGISTROS, como si los DataSet estuvieran vacios
Saludos :D

Israel
hgarciaj
Posts: 86
Joined: Thu Sep 23, 2010 12:44 am

Re: Usar un único objeto TFastReport y Clear()

Postby hgarciaj » Mon Dec 09, 2019 4:08 pm

Israel,
yo lo que hago es primero cargar el reporte y luego agregar los datasets, pero antes hago un create() del objeto fastreport y al final no un clear sino un end(), no se si esto te funcione pero yo no tengo problemas con los datos (te anexo el código)
WITH OBJECT AppData:oFr
:Create()
:loadfromstring(cReporte)
:cTitle:="CFDI "+::oDbfBrow:SERIE+"-"+::oDbfBrow:FOLIODIG
:AddDataSet("Datosgen",::oDatos)
:AddDataSet("FacturaE",::oDbfFacE)
oFactD:=:AddDataSet("Facturad",::oConcep)
oPedim:=:AddDataSet("Pedimento",::oPedim)
oImpto:=:AddDataSet("Impuestos",::oImptos)
:AddDataSet("Retencion",::oReten)
:AddDataSet("Relacion",::oRela)
:AddDataSet("Pagos",::oPagos)
:AddDataSet("Tienda",::oTienda)
:AddDataSet("OtraTienda",::oTienda2)
oPedim:SetMaster(oFactD,{"Codigo"})
IF AppData:VerCfdi='3.3'
oImpto:setMaster(oFactD,{"Codigo","Partida"})
oPedim:setMaster(oFactD,{"Codigo","Partida"})
ENDIF
:onafterload:={|o|o:oPrintoptions:cPrinter:=AppData:TicketImpre,o:oPrintOptions:lShowdialog:=pfalse}
:prepareReport()
:print()
:End()
:Create()
END
Saludos
Héctor García
Israel Solis
Posts: 142
Joined: Wed Nov 03, 2004 12:42 pm
Location: Cancún, México
Contact:

Re: Usar un único objeto TFastReport y Clear()

Postby Israel Solis » Mon Dec 09, 2019 5:33 pm

Hector,

Gracias por responder. Aparentemente el problema ese el :Create() (que instancia un nuevo objecto y carga la DLL ) y :End() (que destruye la instancia) en CADA OCASIÓN y eso, en teoría, podria provocar el problema, es por eso la recomendación de Ignacio que INTENTO HACER pero no me sale jejeje
Saludos :D

Israel
hgarciaj
Posts: 86
Joined: Thu Sep 23, 2010 12:44 am

Re: Usar un único objeto TFastReport y Clear()

Postby hgarciaj » Mon Dec 09, 2019 6:38 pm

Israel, revisé el código del método :Create y no instacia nuevamente si usas el método end destruyes el objeto y liberas la memoria por loque aparentemente no tendrías problemas, el problema es que por alguna razón se quedan colgados los datasets del reporte por loque solo podrás ver información en el primero ya que para la siguiente llamada los datasets se quedan en eof() y aunque uno crea que al volver a poner los datasets empiezan de cero la realidad es que se agregan como un nuevo alias y no hay forma de que se agreguen correctamente sino es volviendo a crear la instancia. Sugiero pruebes con cleardb() además de clear()
Saludos
Héctor García
Ariel
Posts: 14
Joined: Tue Nov 26, 2019 12:28 pm

Re: Usar un único objeto TFastReport y Clear()

Postby Ariel » Mon Dec 09, 2019 10:06 pm

Israel,

en el fr de Sergey, yo uso :

oFr:ClearDataSets()

si estas usando el FR de Xailer no se si existe ese metodo, tambien podes hacer :
1) en un app declarar el oFr publico, AppData:oFr, AppData:oFr:= frReportManager():New(,.t.)
2) luego en cada report en vez de New(), AppData:oFr:AddReport()
3) AppData:oFr:ClearDataSets()

4) Al salir de tu app : AppData:oFr:DestroyFR()
asi lo uso no se si funcionará con el FR d Xailer, pero es cuestión de probar :)
Espero te sirva.
Saludos.
Israel Solis
Posts: 142
Joined: Wed Nov 03, 2004 12:42 pm
Location: Cancún, México
Contact:

Re: Usar un único objeto TFastReport y Clear()

Postby Israel Solis » Tue Dec 10, 2019 3:22 pm

Héctor,

Gracias por tus consejos, pero No me funcionó agregando :ClearDB() ya que me marcó errores.

Ariel,

Precisamente ASI lo hacia yo con FR de Sergey y funcionaba sin problema, pero en FR de Xailer no existe esos métodos y la equivalencia seria usar el CLEAR() pero es lo que no logro.

MIL GRACIAS A AMBOS POR CONTESTAR !!
Saludos :D

Israel
User avatar
ignacio
Site Admin
Posts: 8679
Joined: Mon Apr 06, 2015 8:00 pm
Location: Madrid, Spain
Contact:

Re: Usar un único objeto TFastReport y Clear()

Postby ignacio » Tue Dec 10, 2019 9:23 pm

Buenos días,

Te ruego pruebes con la siguiente DLL:

https://www.xailer.com/files/temp/frx.dll

Saludos

Nota: Comprueba que los datos del dataset efectivamente cambian
Ignacio Ortiz de Zúñiga
[Equipo de Xailer / Xailer team]
http://www.xailer.com
Israel Solis
Posts: 142
Joined: Wed Nov 03, 2004 12:42 pm
Location: Cancún, México
Contact:

Re: Usar un único objeto TFastReport y Clear()

Postby Israel Solis » Wed Dec 11, 2019 4:36 pm

Ignacio,

FUNCIONO EXCELENTE, MIL GRACIAS
Saludos :D

Israel

Return to “FastReport”