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, FactuGES_Intf; 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; frxPDFExport1: TfrxPDFExport; schReport: TDASchema; DataDictionary: TDADataDictionary; procedure DataModuleCreate(Sender: TObject); private FConnection: IDAConnection; procedure _GenerarPresupuesto(const AID : Integer); public function GenerarPresupuesto(const ListaID : TIntegerArray): Binary; function GenerarPresupuestoEnPDF(const ListaID : TIntegerArray): Binary; 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.GenerarPresupuestoEnPDF(const ListaID: TIntegerArray): Binary; var i: Integer; begin Result := Binary.Create; //FConnection.BeginTransaction; <--- Creo que no va a hacer falta. try //Vamos generando todos y cada uno de los presupuestos recibidos for i := 0 to ListaID.Count - 1 do _GenerarPresupuesto(ListaID.Items[i]); frxPDFExport1.Stream := Result; frxReport.Export(frxPDFExport1) finally //FConnection.RollbackTransaction; <--- Creo que no va a hacer falta. end; end; function TRptPresupuestosCliente.GenerarPresupuesto(const ListaID: TIntegerArray): Binary; var i: Integer; begin Result := Binary.Create; //FConnection.BeginTransaction; <--- Creo que no va a hacer falta. try //Vamos generando todos y cada uno de los presupuestos recibidos for i := 0 to ListaID.Count - 1 do _GenerarPresupuesto(ListaID.Items[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.