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
Fast Report & MySql
- compubrion
- Posts: 130
- Joined: Thu Mar 08, 2007 6:12 pm
- Location: Miranda - Venezuela
- Contact:
Re: Fast Report & MySql
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
*--
El parametro bRelation hace el trabajo, espero que te ayude
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
*--
*
Harbour / Bcc / MinGW / Fwh 13.9
Re: Fast Report & MySql
Gracias compubrion
saludos,
Mauricio
saludos,
Mauricio
- ruben Dario
- Posts: 986
- Joined: Thu Sep 27, 2007 3:47 pm
- Location: Colombia
Re: Fast Report & MySql
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.
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.
Re: Fast Report & MySql
Ruben,
Si, funciono, aunque esta un poco diferente mi codigo, pude hacerlo funcionar.
con codigo que publico Daniel Gil
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
- ruben Dario
- Posts: 986
- Joined: Thu Sep 27, 2007 3:47 pm
- Location: Colombia
Re: Fast Report & MySql
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
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
Re: Fast Report & MySql
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
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