unit uRptPresupuestosCliente_Server; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, frxClass, frxDBSet, uDAScriptingProvider, uDADataTable, uDACDSDataTable, DB, uDAClasses, uDABINAdapter, uROTypes, uDAInterfaces, uDAMemDataTable, uDADataStreamer, uDABin2DataStreamer, frxGradient, frxChBox, frxCross, frxOLE, frxBarcode, frxRich, uDAEngine, IBSQL, IBDatabase, IBCustomDataSet, IBQuery; type TRptPresupuestosCliente = class(TDataModule) DADSCabecera: TDADataSource; DADSDetalles: TDADataSource; frxBarCodeObject1: TfrxBarCodeObject; frxOLEObject1: TfrxOLEObject; frxCrossObject1: TfrxCrossObject; frxCheckBoxObject1: TfrxCheckBoxObject; frxGradientObject1: TfrxGradientObject; frxDBCabecera: TfrxDBDataset; frxDBDetalles: TfrxDBDataset; tbl_Cabecera: TDAMemDataTable; tbl_Detalles: TDAMemDataTable; frxReport: TfrxReport; IBDatabase1: TIBDatabase; IBTransaction1: TIBTransaction; DataSource1: TDataSource; DataSource2: TDataSource; capitulos: TIBQuery; DataSource3: TDataSource; detalles: TIBQuery; DataSource4: TDataSource; resumen: TIBQuery; resumenID: TIntegerField; resumenID_PRESUPUESTO: TIntegerField; resumenPOSICION: TIntegerField; resumenTIPO_DETALLE: TIBStringField; resumenCONCEPTO: TIBStringField; resumenIMPORTE_TOTAL: TIBBCDField; resumenVISIBLE: TSmallintField; frxDBCapitulos: TfrxDBDataset; frxDBResumen: TfrxDBDataset; DABin2DataStreamer1: TDABin2DataStreamer; cabecera: TIBQuery; cabeceraID: TIntegerField; cabeceraID_EMPRESA: TIntegerField; cabeceraFECHA_PRESUPUESTO: TDateField; cabeceraREFERENCIA: TIBStringField; cabeceraPORTADA: TMemoField; cabeceraMEMORIA: TMemoField; cabeceraOBSERVACIONES: TMemoField; cabeceraIMPORTE_NETO: TIBBCDField; cabeceraIMPORTE_PORTE: TIBBCDField; cabeceraDESCUENTO: TFloatField; cabeceraIMPORTE_DESCUENTO: TIBBCDField; cabeceraBASE_IMPONIBLE: TIBBCDField; cabeceraIVA: TFloatField; cabeceraID_CLIENTE: TIntegerField; cabeceraREFERENCIA_CLIENTE: TIBStringField; cabeceraCLIENTE_FINAL: TIBStringField; cabeceraNIF_CIF: TIBStringField; cabeceraNOMBRE: TIBStringField; cabeceraIMPORTE_IVA: TIBBCDField; cabeceraIMPORTE_TOTAL: TIBBCDField; cabeceraPERSONA_CONTACTO: TIBStringField; cabeceraCALLE: TIBStringField; cabeceraPOBLACION: TIBStringField; cabeceraPROVINCIA: TIBStringField; cabeceraCODIGO_POSTAL: TIBStringField; DADSCapitulos: TDADataSource; tbl_Capitulos: TDAMemDataTable; DADSResumen: TDADataSource; tbl_Resumen: TDAMemDataTable; DAMemDataTable1: TDAMemDataTable; DAMemDataTable2: TDAMemDataTable; schReport: TDASchema; DataDictionary: TDADataDictionary; procedure DataModuleCreate(Sender: TObject); private FConnection: IDAConnection; procedure GenerarPresupuesto(const AID : Integer); overload; public function GenerarPresupuesto(const AID : String): Binary; overload; end; implementation {$R *.dfm} uses uDataModuleServer, schPresupuestosClienteClient_Intf; const rptInforme = 'InfPresupuestoCliente.fr3'; { Dataset names for schReport } ds_InformeCabecera = 'Informe_Cabecera'; ds_InformeCapitulos = 'Informe_Capitulos'; { TRptPresupuestosProveedor } procedure TRptPresupuestosCliente.DataModuleCreate(Sender: TObject); begin schReport.ConnectionManager := dmServer.ConnectionManager; FConnection := dmServer.DarNuevaConexion; frxReport.EngineOptions.NewSilentMode := simReThrow; end; function TRptPresupuestosCliente.GenerarPresupuesto(const AID: String): Binary; var ID_Presupuestos: TStringList; i: Integer; begin Result := Binary.Create; //FConnection.BeginTransaction; <--- Creo que no va a hacer falta. try ID_Presupuestos := TStringList.Create; ID_Presupuestos.CommaText := AID; //Vamos generando todos y cada uno de los presupuestos recibidos for i := 0 to ID_Presupuestos.Count - 1 do GenerarPresupuesto(StrToInt(ID_Presupuestos.Strings[i])); frxReport.PreviewPages.SaveToStream(Result); finally //FConnection.RollbackTransaction; <--- Creo que no va a hacer falta. end; end; procedure TRptPresupuestosCliente.GenerarPresupuesto(const AID: Integer); var AStream: TMemoryStream; dsCabecera: IDADataset; dsCapitulos: IDADataset; I: Integer; begin //AStream := TMemoryStream.Create; try { dsCabecera := schReport.NewDataset(FConnection, ds_InformeCabecera, ['ID'], [AID]); dsCapitulos := schReport.NewDataset(FConnection, ds_InformeCapitulos, ['ID_PRESUPUESTO'], [AID], False); AStream.Clear; DABin2DataStreamer1.WriteDataset(AStream, dsCabecera, [woRows, woSchema]); DABin2DataStreamer1.ReadDataset(AStream, DAMemDataTable1, True, ds_InformeCabecera, True, True); AStream.Clear; DABin2DataStreamer1.WriteDataset(AStream, dsCapitulos, [woRows, woSchema]); DABin2DataStreamer1.ReadDataset(AStream, DAMemDataTable2, True, ds_InformeCapitulos, True, True); DADSCabecera.DataTable := DAMemDataTable1; frxDBCabecera.DataSource := DADSCabecera; DADSCapitulos.DataTable := DAMemDataTable2; frxDBCapitulos.DataSource := DADSCapitulos;} { DAMemDataTable1.Active := True; for I := 0 to DAMemDataTable1.RecordCount - 1 do ShowMessage(DAMemDataTable1.Fields[2].AsString);} { AStream.Clear; Bin2DataStreamer.WriteDataset(AStream, dsDetail, [woRows, woSchema], -1); Bin2DataStreamer.ReadDataset(AStream, tbl_Detalles, TRUE, '', TRUE, TRUE);} frxDBCabecera.DataSource := DADSCabecera; frxDBCapitulos.DataSource := DADSCapitulos; frxDBDetalles.DataSource := DADSDetalles; frxDBResumen.DataSource := DADSResumen; tbl_Cabecera.ParamByName('ID').AsInteger := AID; tbl_Capitulos.ParamByName('ID_PRESUPUESTO').AsInteger := AID; tbl_Detalles.ParamByName('ID_PRESUPUESTO').AsInteger := AID; tbl_Resumen.ParamByName('ID_PRESUPUESTO').AsInteger := AID; tbl_Cabecera.Active := True; tbl_Capitulos.Active := True; tbl_Detalles.Active := True; tbl_Resumen.Active := True; frxReport.LoadFromFile(DarRutaInformes + rptInforme, True); frxReport.PrepareReport(False); finally //AStream.Free; dsCabecera := Nil; dsCapitulos := Nil; end; end; end.