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, uDABin2DataStreamer, uDAMemDataTable; type TRptFacturasCliente = class(TDataModule) DADataCabecera: TDADataSource; DADataDetalles: TDADataSource; tbl_FacturaCliente: TDAMemDataTable; tbl_DetallesFacturaCliente: TDAMemDataTable; frxRichObject1: TfrxRichObject; frxBarCodeObject1: TfrxBarCodeObject; frxOLEObject1: TfrxOLEObject; frxCrossObject1: TfrxCrossObject; frxCheckBoxObject1: TfrxCheckBoxObject; frxGradientObject1: TfrxGradientObject; frxDBCabecera: TfrxDBDataset; frxDBDetalles: TfrxDBDataset; DADataVencimientos: TDADataSource; tbl_Vencimientos: TDAMemDataTable; frxDBDataset1: TfrxDBDataset; DataDictionary: TDADataDictionary; frxReport: TfrxReport; Bin2DataStreamer: TDABin2DataStreamer; schReport: TDASchema; procedure DataModuleCreate(Sender: TObject); private FConnection: IDAConnection; //Genera cada uno de los albaranes 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'; rptFacturaClienteAbeto = 'InfFacturaClienteAbeto.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; try ID_Facturas := TStringList.Create; ID_Facturas.CommaText := AFacturaID; //Vamos generando todos y cada uno de los albaranes recibidos for i := 0 to ID_Facturas.Count - 1 do GenerarFactura(StrToInt(ID_Facturas.Strings[i])); frxReport.PreviewPages.SaveToStream(Result); finally FConnection.RollbackTransaction; end; end; procedure TRptFacturasCliente.GenerarFactura(const ID: integer); begin tbl_FacturaCliente.ParamByName('ID').AsInteger := ID; tbl_DetallesFacturaCliente.ParamByName('ID_FACTURA').AsInteger := ID; tbl_Vencimientos.ParamByName('ID_FACTURA').AsInteger := ID; tbl_FacturaCliente.Active := True; tbl_DetallesFacturaCliente.Active := True; tbl_Vencimientos.Active := True; if (tbl_FacturaCliente.FieldByName('ID_TIENDA').AsInteger <> 3) then frxReport.LoadFromFile(DarRutaInformes + rptFacturaCliente, True) else frxReport.LoadFromFile(DarRutaInformes + rptFacturaClienteAbeto, True); frxReport.PrepareReport(False); end; end.