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, frxExportPDF; 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; frxPDFExport1: TfrxPDFExport; procedure DataModuleCreate(Sender: TObject); private FConnection: IDAConnection; procedure _GenerarPresupuesto(const AID : Integer); public function GenerarPresupuesto(const ListaID : String): Binary; overload; function GenerarPDF(const ListaID : String): Binary; overload; end; implementation {$R *.dfm} uses uDataModuleServer, schPresupuestosClienteClient_Intf; const rptInforme = 'InfPresupuestoCliente.fr3'; { TRptPresupuestosProveedor } procedure TRptPresupuestosCliente.DataModuleCreate(Sender: TObject); begin schReport.ConnectionManager := dmServer.ConnectionManager; FConnection := dmServer.DarNuevaConexion; frxReport.EngineOptions.NewSilentMode := simReThrow; end; function TRptPresupuestosCliente.GenerarPDF(const ListaID: 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 := ListaID; //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])); frxPDFExport1.Stream := Result; frxReport.Export(frxPDFExport1) finally //FConnection.RollbackTransaction; <--- Creo que no va a hacer falta. end; end; function TRptPresupuestosCliente.GenerarPresupuesto(const ListaID: 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 := ListaID; //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); begin 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); end; end.