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
*--
*--
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