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; 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; schReport: TDASchema; procedure DataModuleCreate(Sender: TObject); private FConnection: IDAConnection; //Genera cada una de las facturas a imprimir procedure GenerarFactura(const ID: integer); overload; public function GenerarFactura(const AFacturaID : String): Binary; overload; 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; end; function TRptFacturasCliente.GenerarFactura(const AFacturaID: String): Binary; var ID_Facturas: TStringList; i: Integer; begin Result := Binary.Create; //FConnection.BeginTransaction; <--- Creo que no va a hacer falta. try ID_Facturas := TStringList.Create; ID_Facturas.CommaText := AFacturaID; //Vamos generando todos y cada una de las facturas recibidas for i := 0 to ID_Facturas.Count - 1 do GenerarFactura(StrToInt(ID_Facturas.Strings[i])); frxReport.PreviewPages.SaveToStream(Result); finally //FConnection.RollbackTransaction; <--- Creo que no va a hacer falta. end; end; procedure TRptFacturasCliente.GenerarFactura(const ID: integer); //var // AStream: TMemoryStream; // dsMaster: IDADataset; // dsDetail: IDADataset; // dsVencimientos : IDADataset; begin // AStream := TMemoryStream.Create; try frxDBCabecera.DataSource := DADSCabecera; frxDBDetalles.DataSource := DADSDetalles; frxDBVencimientos.DataSource := DADSVencimientos; 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); finally // AStream.Free; // dsMaster := Nil; // dsDetail := Nil; end; end; end.