Fast Report & MySql

Post Reply
User avatar
Mauricio
Posts: 199
Joined: Thu Oct 06, 2005 9:07 pm
Location: San Diego, CA

Fast Report & MySql

Post by Mauricio »

Hola,

como mando 2 objetos de datos a fast report

:SetUserDataSet("oFacturas",mysqlfields(oFacturas),;


aqui me gustaria enviar el detalle de las facturas que estan en otra tabla y las levanto con oMovtos.....

hacer algo asi :SetUserDataSet( "oFacturas","oMovtos"), se los envio pero solo me toma el primero


saludos,
Mauricio
User avatar
compubrion
Posts: 130
Joined: Thu Mar 08, 2007 6:12 pm
Location: Miranda - Venezuela
Contact:

Re: Fast Report & MySql

Post by compubrion »

Saludos !

Si solo quieres mandar los datos ya obtenidos desde query, puedes usar la misma sintaxis
SetUserDataSet("oFacturas")
SetUserDataSet("oMovTos")

puedes usar los dataset que quieres, no hay limitaciones, yo lo hago de esta manera,

1.- Tengo una funcion para crear los dataset y no tener que escribir la definicion por cada reporte

*--
PROCEDURE MAKEDATASET( oFr, cAlias, oQry, bRelation )
*--
LOCAL nHeader
LOCAL cHeader := ''
*--
DEFAULT lRelation := bRelation := { || NIL }
*--
FOR nHeader = 1 TO oQry:FCount()
cHeader += oQry:FieldName( nHeader ) + ";"
NEXT
*--
oFr:SetUserDataSet(cAlias, cHeader,;
{||oQry:GoTop(), EVAL( bRelation ) },;
{||oQry:Skip(1), EVAL( bRelation ) }, ;
{||oQry:Skip(-1), EVAL( bRelation ) }, ;
{||oQry:Eof()},;
{| cField | oQry:FieldGet( cField ) } )

RETURN
*--

Code: Select all

*--
STATIC PROCEDURE ANALISIS( aVar )
*--
LOCAL nReporte
LOCAL cQry, cSql, cSqlSaldo
LOCAL oQryCond, oQryProp, oQryRep, oErr, oFrRepor
LOCAL cFileMail := "Cuentas x Cobrar.pdf"
LOCAL bBlock := {|| DETALLADEUDA( oQryProp, oQryRep, aVar ) }
*--
cSql := "SELECT * FROM contratos WHERE codigo = '" + aVar[1] + "'"
cQry := "SELECT * FROM propietarios WHERE edificio = '" + aVar[1] + "' ORDER BY cuenta"
*--
TRY
  oQryCond := TDolphinQry():New( cSql, oApp:oConex )
CATCH oErr
  MSGSTOP( oErr:Description + CRLF + cSql, oApp:cSistema )
  RETURN
END
*--
IF aVar[3]

   TRY
      oQryProp := TDolphinQry():New( cQry, oApp:oConex )
   CATCH oErr
      MSGSTOP( oErr:Description + CRLF + cSql, oApp:cSistema )
      RETURN
   END
   *--
   IF aVar[2] > 0

      cSql := "SELECT * FROM deudagen WHERE edificio = '" + aVar[1] + "' "
      cSql += "AND st = 1 " //ORDER BY factura"

   ELSE

      cSql := "SELECT * FROM deudagen WHERE edificio = '" + aVar[1] + "' "
      cSql += "AND st = 1 ORDER BY cuenta,factura"

      *cSql := "SELECT a.inmueble, a.nombre, a.cedula, a.rif, a.cuenta, "
      *cSql += "b.emision, b.monto, b.mora, b.bolivares  "
      *cSql += "FROM propietarios a, deudagen b "
      *cSql += "WHERE a.edificio = '" + aVar[1] + "' "
      *cSql += "AND b.cuenta = a.cuenta AND b.st = 1 "
      *cSql += "ORDER BY a.cuenta"

   ENDIF

   //nReporte := IIF( aVar[4], 8103, 8408 )
   nReporte := IIF( aVar[4], 8103, 8405 )

ELSE

   cSql := "SELECT a.inmueble, a.nombre, a.cedula, a.rif, "
   cSql += "COUNT( b.emision ) AS items, SUM( b.monto + b.mora ) AS saldo "
   cSql += "FROM propietarios a, deudagen b "
   cSql += "WHERE a.edificio = '" + aVar[1] + "' "
   cSql += "AND b.cuenta = a.cuenta AND b.st = 1 "
   cSql += "GROUP BY b.cuenta "
   cSql += IIF( aVar[2] > 0, "HAVING items >= '" + LTRIM( STR( aVar[2] )) + "' ","" )
   cSql += "ORDER BY a.inmueble "

   nReporte := IIF( aVar[4], 8103, 8407 )

ENDIF
*--
TRY
  oQryRep := TDolphinQry():New( cSql, oApp:oConex )
CATCH oErr
  MSGSTOP( oErr:Description + CRLF + cSql, oApp:cSistema )
  oQryCond:End()
  RETURN
END
*--
IF oQryRep:LastRec() = 0
   MSGSTOP( "No Hay Información", oApp:cSistema )
   oQryCond:End()
   oQryRep:End()
   RETURN
ENDIF
*--
/*
IF aVar[3]

   IF aVar[2] > 0

      cSqlSaldo := "SELECT * FROM deudagen WHERE edificio = '" + aVar[1] + "' "
      cSqlSaldo += "AND st = 1 ORDER BY factura"

   ELSE

      cSqlSaldo := "SELECT * FROM deudagen WHERE edificio = '" + aVar[1] + "' "
      cSqlSaldo += "AND st = 1 ORDER BY factura"

   ENDIF

ELSE

   cSqlSaldo := "SELECT a.inmueble, a.nombre, a.rif, a.cuenta, "
   cSqlSaldo += "COUNT(b.emision) AS items, SUM(b.monto+b.mora) AS saldo "
   cSqlSaldo += "FROM propietarios a, deudagen b "
   cSqlSaldo += "WHERE a.edificio = '" + aVar[1] + "' "
   cSqlSaldo += "AND b.cuenta = a.cuenta AND b.st = 1 "
   cSqlSaldo += IIF( aVar[3], "", "GROUP BY a.cuenta " )
   cSqlSaldo += IIF( aVar[2] <= 0,"", "HAVING items >= '" + LTRIM( STR( aVar[2] ) ) + "' " )
   cSqlSaldo += "ORDER BY a.inmueble "

ENDIF
*/
*--
oFrRepor := frReportManager():New()
oFrRepor:LoadLangRes("Fastreport.xml")
*--
IF aVar[3]

   MAKEDATASET( oFrRepor, "Inmuebles", oQryProp, bBlock )
   MAKEDATASET( oFrRepor, "Cuentaspc", oQryRep )

ELSE

   MAKEDATASET( oFrRepor, "Cuentasxc", oQryRep )

ENDIF
*--
IF ! oFrRepor:LoadFromResource( nReporte )
   MsgInfo("ERROR AL PROCESAR EL REPORTE", oApp:cSistema )
ELSE

   WITH OBJECT oFrRepor

      :SetIcon(9000)
      :SetTitle( "Cuentas x Cobrar" )
      :AddVariable( "EMPRESA", "NOMBRE", "'" + oApp:cEmpresa + "'" )
      :AddVariable( "EMPRESA", "DIRECCION", "'" + oApp:cDirempre + "'" )
      :AddVariable( "EMPRESA", "RIF", "'" + oApp:cRifempre + "'" )
      :AddVariable( "EMPRESA", "TELEFONOS", "'" + oApp:cTelempre + "'" )
      :AddVariable( "EMPRESA", "WEBSITE", "'" + oApp:cWebempre + "'" )
      :AddVariable( "EMPRESA", "MAIL", "'" + oApp:cMailempre + "'" )
      :AddVariable( "EMPRESA", "PIEDEPAGINA", oApp:cDirempre + CRLF + oApp:cMailempre )
      :AddVariable( "CONDOMINIO", "EDIFICIO", "'" + ALLTRIM( oQryCond:nombre ) + "'" )
      :AddVariable( "CONDOMINIO", "DPTOLEGAL", "'" + STR( oQryCond:plegal,2 ) + "'" )

   END

   IF oApp:lMaster
      oFrRepor:DesignReport()
   ELSE
      FIRMAREPORT( oFrRepor, cFileMail )
      oFrRepor:PreviewOptions:SetButtons(1+8+16+32+128+256+1024)
      oFrRepor:ShowReport()
   ENDIF
ENDIF
*--
oFrRepor:ClearDataSets()
oFrRepor:DestroyFR()
*--
oQryCond:End()
oQryRep:End()
IIF( aVar[3], oQryProp:End(), )
RETURN

*--
STATIC PROCEDURE DETALLADEUDA( oQryProp, oQryRep, aVar )
*--
LOCAL cFiltro

IF ! oQryProp:Eof()

   cFiltro := "edificio = '" + aVar[1] + "' "
   cFiltro += "AND cuenta = '" + oQryProp:cuenta + " ' "
   cFiltro += "AND st = 1 "

   IF aVar[2] > 0

      oQryRep:SetWhere( cFiltro, .T. )
      cFiltro += "HAVING COUNT(*) >= '" + LTRIM( STR( aVar[2] )) + "' "
      oQryRep:SetHaving( cFiltro, .T. )
   ELSE
      oQryRep:SetWhere( cFiltro, .T. )
   ENDIF

ENDIF
RETURN
*--
*
 
El parametro bRelation hace el trabajo, espero que te ayude
Harbour / Bcc / MinGW / Fwh 13.9
User avatar
Mauricio
Posts: 199
Joined: Thu Oct 06, 2005 9:07 pm
Location: San Diego, CA

Re: Fast Report & MySql

Post by Mauricio »

Gracias compubrion :mrgreen:

;-)


saludos,
Mauricio
User avatar
ruben Dario
Posts: 986
Joined: Thu Sep 27, 2007 3:47 pm
Location: Colombia

Re: Fast Report & MySql

Post by ruben Dario »

Buen Dia compañero.

lo que entiendo que cuando se tiene varios query por ejemplo el cado Maestro detalle la function DETALLADEUDA sirbe para hacer un filtro con un columna especial del maestro.

Ejemplo que mi maestro teng una columna codprod y en el detelle tengo tambien otra columna codprod le haria el filtro al detalle por la colunma codprod y listo. Todo esto lo hace el MAKEDATASET

Mauricio te funciono el ejemplo. ya que tambien tengo el mismo problema.
Ruben Dario Gonzalez
Cali-Colombia
rubendariogd@hotmail.com - rubendariogd@gmail.com
User avatar
Mauricio
Posts: 199
Joined: Thu Oct 06, 2005 9:07 pm
Location: San Diego, CA

Re: Fast Report & MySql

Post by Mauricio »

Ruben,

Si, funciono, aunque esta un poco diferente mi codigo, pude hacerlo funcionar.
con codigo que publico Daniel Gil

Code: Select all

METHOD  Reporte2() CLASS TFacturas
   local oFr := frReportManager():New()
   local cQry := " ", oFacturas, oMovtos, oClientes
   local oVars := oMain:oMysql:Query( "SELECT * FROM empresa")

   cQry := " "
   cQry := " SELECT * FROM facturas WHERE control = " + ClipValue2Sql( ::oFacturas:Control )
   oMovtos := oMain:oMysql:Query( cQry )
   oFacturas := oMain:oMysql:Query( cQry )

   cQry := " "
   cQry := " SELECT * FROM clientes WHERE codigo = " + ClipValue2Sql( ::oFacturas:Cliente )
   oClientes := oMain:oMysql:Query( cQry )


   cQry := " "
   cQry := " SELECT * FROM movtos WHERE control = " + ClipValue2Sql( ::oFacturas:Control )
   oMovtos := oMain:oMysql:Query( cQry )



    WITH OBJECT oFr
     :LoadLangRes( "spanish.xml" )
     :SetUserDataSet("oFacturas",mysqlfields(oFacturas),;
                     {|| oFacturas:GoTop()} ,;
                     {|| oFacturas:SKIP(1)},;
                     {|| oFacturas:SKIP(-1)},;
                     {|| oFacturas:EOF() },;
                     { | aField | oFacturas:FieldGet( afield )} )
     :SetUserDataSet("oMovtos",mysqlfields(oMovtos),;
                     {|| oMovtos:GoTop()} ,;
                     {|| oMovtos:SKIP(1)},;
                     {|| oMovtos:SKIP(-1)},;
                     {|| oMovtos:EOF() },;
                     { | aField | oMovtos:FieldGet( afield )} )

     :SetUserDataSet("oVars",mysqlfields(oVars),;
                     {|| oVars:GoTop()} ,;
                     {|| oVars:SKIP(1)},;
                     {|| oVars:SKIP(-1)},;
                     {|| oVars:EOF() },;
                     { | aField | oVars:FieldGet( afield )} )

     :SetUserDataSet("oClientes",mysqlfields(oClientes),;
                     {|| oClientes:GoTop()} ,;
                     {|| oClientes:SKIP(1)},;
                     {|| oClientes:SKIP(-1)},;
                     {|| oClientes:EOF() },;
                     { | aField | oClientes:FieldGet( afield )} )

     :LoadFromFile("reportes\cfdi1.fr3")
     :DesignReport()
     :ShowReport()
     :ClearDataSets()
     :DestroyFr()

    END WITH
    oVars:end()
    oFacturas:end()
    oMovtos:end()
    oClientes:end()
return nil

function mysqlfields( oQry )
   Local clField := ""
   local nLen, x

   nLen := oQry:Fcount()

   for x := 1 to oQry:Fcount()
      cLfield := cLfield + oQry:FieldName( x ) + iif( x < nLen ,";","" )
   Next
Return cLfield

 
User avatar
ruben Dario
Posts: 986
Joined: Thu Sep 27, 2007 3:47 pm
Location: Colombia

Re: Fast Report & MySql

Post by ruben Dario »

Saludos compañero.

viendo tu codigo , te hago una pregunta , como filtras.

veo que tienes oFacturas y oMovtos etc.. asumo que tienes el numero de factura y en movimientos tambien. como haces el filtro cuando enlaza la factura tome el detalle las facturas que estan en el movimiento. puede se la fuctura o alguna columna especifca.

ejemplo si tienes factura asi,

No factura , valor , iva ect
12 , 12000,1221
13 . 14000,23

el de movimiento asi
No factura , valor , iva , referencia , direccion etc
12,1000,800,100,"DJDKSAJDKASDJK"
12,10000,200,"2djskdjsk"
12,1000,221,"dsjdksdjdkas"
13,14000,23,"DSDASDAJD"

Con el ejemplo que te anexo el amigo compubrion, funciono. Tu como lo haces
Ruben Dario Gonzalez
Cali-Colombia
rubendariogd@hotmail.com - rubendariogd@gmail.com
User avatar
Mauricio
Posts: 199
Joined: Thu Oct 06, 2005 9:07 pm
Location: San Diego, CA

Re: Fast Report & MySql

Post by Mauricio »

Ruben,
en esta caso solo estoy imprimiendo una factura.

el filtro lo hago de ::oFacturas, que es el objeto donde muestro el browse con las facturas a imprimir

despues todo lo voy leyendo con ::oFacturas:Control que es el numero de factura, que esta en las 2 tablas, facturas y movimientos

cQry := " "
cQry := " SELECT * FROM movtos WHERE control = " + ClipValue2Sql( ::oFacturas:Control )
oMovtos := oMain:oMysql:Query( cQry )

no se, si me explique o te enrede mas,

saludos,
Mauricio
Post Reply