unit uRptFacturasCliente_Server; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, frxClass, frxDBSet, uDAScriptingProvider, uDADataTable, uDACDSDataTable, DB, uDAClasses, frxChart, frxGradient, frxChBox, frxCross, frxOLE, frxBarcode, frxRich, uDABINAdapter, uROTypes, uDAInterfaces, uDADataStreamer, IBCustomDataSet, IBQuery, IBDatabase, uDAMemDataTable, FactuGES_Intf, frxExportPDF; type TRptFacturasCliente = class(TDataModule) frxDBCabecera: TfrxDBDataset; frxDBDetalles: TfrxDBDataset; DataDictionary: TDADataDictionary; IBDatabase1: TIBDatabase; IBTransaction1: TIBTransaction; DataSource1: TDataSource; DataSource2: TDataSource; cabecera: TIBQuery; detalles: TIBQuery; DABINAdapter: TDABINAdapter; DADSCabecera: TDADataSource; DADSDetalles: TDADataSource; tbl_Detalles: TDAMemDataTable; tbl_Cabecera: TDAMemDataTable; frxCheckBoxObject1: TfrxCheckBoxObject; frxChartObject1: TfrxChartObject; frxGradientObject1: TfrxGradientObject; frxCrossObject1: TfrxCrossObject; frxOLEObject1: TfrxOLEObject; frxBarCodeObject1: TfrxBarCodeObject; frxRichObject1: TfrxRichObject; frxReport: TfrxReport; cabeceraID: TIntegerField; cabeceraID_EMPRESA: TIntegerField; cabeceraREFERENCIA: TIBStringField; cabeceraTIPO: TIBStringField; cabeceraFECHA_FACTURA: TDateField; cabeceraBASE_IMPONIBLE: TIBBCDField; cabeceraSITUACION: TIBStringField; cabeceraDESCUENTO: TFloatField; cabeceraIMPORTE_DESCUENTO: TIBBCDField; cabeceraIVA: TFloatField; cabeceraIMPORTE_IVA: TIBBCDField; cabeceraRE: TFloatField; cabeceraIMPORTE_RE: TIBBCDField; cabeceraIMPORTE_TOTAL: TIBBCDField; cabeceraOBSERVACIONES: TMemoField; cabeceraNIF_CIF: TIBStringField; cabeceraID_CLIENTE: TIntegerField; cabeceraNOMBRE: TIBStringField; cabeceraCALLE: TIBStringField; cabeceraPROVINCIA: TIBStringField; cabeceraPOBLACION: TIBStringField; cabeceraCODIGO_POSTAL: TIBStringField; cabeceraRECARGO_EQUIVALENCIA: TSmallintField; cabeceraIMPORTE_NETO: TIBBCDField; cabeceraIMPORTE_PORTE: TIBBCDField; cabeceraFORMA_PAGO: TIBStringField; detallesID: TIntegerField; detallesID_FACTURA: TIntegerField; detallesPOSICION: TIntegerField; detallesTIPO_DETALLE: TIBStringField; detallesCONCEPTO: TIBStringField; detallesCANTIDAD: TIntegerField; detallesIMPORTE_UNIDAD: TIBBCDField; detallesDESCUENTO: TFloatField; detallesIMPORTE_TOTAL: TIBBCDField; detallesVISIBLE: TSmallintField; detallesREFERENCIA: TIBStringField; frxDBVencimientos: TfrxDBDataset; DADSVencimientos: TDADataSource; tbl_Vencimientos: TDAMemDataTable; vencimientos: TIBQuery; DataSource3: TDataSource; cabeceraDATOS_BANCARIOS: TIBStringField; vencimientosFECHA_VENCIMIENTO: TDateField; vencimientosIMPORTE_TOTAL: TIBBCDField; frxPDFExport1: TfrxPDFExport; schReport: TDASchema; procedure DataModuleCreate(Sender: TObject); private FConnection: IDAConnection; //Genera cada una de las facturas a imprimir procedure _GenerarFactura(const ID: Integer); public function GenerarFactura(const ListaID : TIntegerArray): Binary; function GenerarFacturaEnPDF(const ListaID : TIntegerArray): Binary; end; implementation {$R *.dfm} uses uDataModuleServer, schFacturasClienteClient_Intf; const rptFacturaCliente = 'InfFacturaCliente.fr3'; { Dataset names for schReport } ds_InformeFacturasCliente = 'InformeFacturasCliente'; ds_InformeFacturasCliente_Detalles = 'InformeFacturasCliente_Detalles'; ds_InformeFacturasCliente_Vencimientos = 'InformeFacturasCliente_Vencimientos'; { TRptFacturasCliente } procedure TRptFacturasCliente.DataModuleCreate(Sender: TObject); begin schReport.ConnectionManager := dmServer.ConnectionManager; FConnection := dmServer.DarNuevaConexion; frxReport.EngineOptions.NewSilentMode := simReThrow; frxDBCabecera.DataSource := DADSCabecera; frxDBDetalles.DataSource := DADSDetalles; frxDBVencimientos.DataSource := DADSVencimientos; end; function TRptFacturasCliente.GenerarFactura(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 una de las facturas recibidas for i := 0 to ListaID.Count - 1 do _GenerarFactura(ListaID.Items[i]); frxReport.PreviewPages.SaveToStream(Result); finally //FConnection.RollbackTransaction; <--- Creo que no va a hacer falta. end; end; function TRptFacturasCliente.GenerarFacturaEnPDF( 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 una de las facturas recibidas for i := 0 to ListaID.Count - 1 do _GenerarFactura(ListaID.Items[i]); frxPDFExport1.Stream := Result; frxReport.Export(frxPDFExport1) finally //FConnection.RollbackTransaction; <--- Creo que no va a hacer falta. end; end; procedure TRptFacturasCliente._GenerarFactura(const ID: Integer); begin tbl_Cabecera.Active := False; tbl_Detalles.Active := False; tbl_Vencimientos.Active := False; tbl_Cabecera.ParamByName('ID').AsInteger := ID; tbl_Detalles.ParamByName('ID_FACTURA').AsInteger := ID; tbl_Vencimientos.ParamByName('ID_FACTURA').AsInteger := ID; tbl_Cabecera.Active := True; tbl_Detalles.Active := True; tbl_Vencimientos.Active := True; frxReport.LoadFromFile(DarRutaInformes + rptFacturaCliente, True); frxReport.PrepareReport(False); end; end.