unit uRptAlbaranesCliente_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, FactuGES_Intf, frxExportPDF; type TRptAlbaranesCliente = class(TDataModule) DADataCabecera: TDADataSource; DADataDetalles: TDADataSource; tbl_Cabecera: TDACDSDataTable; tbl_Detalles: TDACDSDataTable; DABINAdapter: TDABINAdapter; frxRichObject1: TfrxRichObject; frxBarCodeObject1: TfrxBarCodeObject; frxOLEObject1: TfrxOLEObject; frxCrossObject1: TfrxCrossObject; frxCheckBoxObject1: TfrxCheckBoxObject; frxGradientObject1: TfrxGradientObject; frxChartObject1: TfrxChartObject; frxDBCabecera: TfrxDBDataset; frxDBDetalles: TfrxDBDataset; frxReport: TfrxReport; frxPDFExport1: TfrxPDFExport; schReport: TDASchema; DataDictionary: TDADataDictionary; procedure DataModuleCreate(Sender: TObject); procedure frxReportGetValue(const VarName: string; var Value: Variant); private FConnection: IDAConnection; FShowLogotipo: Boolean; FConObservacionesIncidencias: Boolean; //Genera cada uno de los albaranes a imprimir procedure _GenerarAlbaran(const ID: integer); overload; public function GenerarAlbaran(const AID : String; const AConLogotipo: Boolean; const ConObservacionesIncidencias: Boolean): Binary; overload; function GenerarEtiquetas(const AID : Integer; withRefCliente: Boolean): Binary; function GenerarReportEnPDF(const ListaID : TIntegerArray; const AConLogotipo: Boolean): Binary; end; implementation {$R *.dfm} uses uDataModuleServer, schAlbaranesClienteClient_Intf; const rptInfAlbaran = 'InfAlbaranCliente.fr3'; rptInfEtiquetas = 'InfEtiquetasAlbaranCliente.fr3'; { Dataset names for schReport } ds_InformeCabecera = 'Informe_Cabecera'; ds_InformeDetalles = 'Informe_Detalles'; ds_InformeDetallesEtiquetas = 'Informe_Detalles_Etiquetas'; { TRptAlbaranesCliente } procedure TRptAlbaranesCliente.DataModuleCreate(Sender: TObject); begin schReport.ConnectionManager := dmServer.ConnectionManager; FConnection := dmServer.DarNuevaConexion; FShowLogotipo := False; FConObservacionesIncidencias := False; frxReport.EngineOptions.NewSilentMode := simReThrow; end; function TRptAlbaranesCliente.GenerarAlbaran(const AID: String; const AConLogotipo: Boolean; const ConObservacionesIncidencias: Boolean): Binary; var ID_Albaranes: TStringList; i: Integer; begin Result := Binary.Create; try FShowLogotipo := AConLogotipo; FConObservacionesIncidencias := ConObservacionesIncidencias; ID_Albaranes := TStringList.Create; ID_Albaranes.CommaText := AID; //Vamos generando todos y cada uno de los albaranes recibidos for i := 0 to ID_Albaranes.Count - 1 do _GenerarAlbaran(StrToInt(ID_Albaranes.Strings[i])); frxReport.PreviewPages.SaveToStream(Result); finally end; end; procedure TRptAlbaranesCliente.frxReportGetValue(const VarName: string; var Value: Variant); begin if VarName = 'ShowLogotipo' then Value := FShowLogotipo; if VarName = 'ConObservacionesIncidencias' then Value := FConObservacionesIncidencias; end; procedure TRptAlbaranesCliente._GenerarAlbaran(const ID: integer); var AStream: TMemoryStream; dsMaster: IDADataset; dsDetail: IDADataset; begin AStream := TMemoryStream.Create; FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" try dsMaster := schReport.NewDataset(FConnection, ds_InformeCabecera, ['ID'], [ID]); dsDetail := schReport.NewDataset(FConnection, ds_InformeDetalles, ['ID_ALBARAN'], [ID], False); AStream.Clear; DABINAdapter.WriteDataset(AStream, dsMaster, [woRows, woSchema], -1); DABINAdapter.ReadDataset(AStream, tbl_Cabecera, TRUE, '', TRUE, TRUE); AStream.Clear; DABINAdapter.WriteDataset(AStream, dsDetail, [woRows, woSchema], -1); DABINAdapter.ReadDataset(AStream, tbl_Detalles, TRUE, '', TRUE, TRUE); frxReport.LoadFromFile(DarRutaInformes + rptInfAlbaran, True); frxReport.PrepareReport(False); finally FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" AStream.Free; dsMaster := Nil; dsDetail := Nil; end; end; function TRptAlbaranesCliente.GenerarEtiquetas(const AID: Integer; withRefCliente: Boolean): Binary; var dsMaster: IDADataset; dsDetail: IDADataset; AStream: TMemoryStream; begin AStream := TMemoryStream.Create; Result := Binary.Create; FConnection.BeginTransaction; try dsMaster := schReport.NewDataset(FConnection, ds_InformeCabecera, ['ID'], [AID]); dsDetail := schReport.NewDataset(FConnection, ds_InformeDetallesEtiquetas, ['ID_ALBARAN'], [AID], False); AStream.Clear; DABINAdapter.WriteDataset(AStream, dsMaster, [woRows, woSchema], -1); DABINAdapter.ReadDataset(AStream, tbl_Cabecera, TRUE, '', TRUE, TRUE); AStream.Clear; DABINAdapter.WriteDataset(AStream, dsDetail, [woRows, woSchema], -1); DABINAdapter.ReadDataset(AStream, tbl_Detalles, TRUE, '', TRUE, TRUE); frxReport.LoadFromFile(DarRutaInformes + rptInfEtiquetas, True); if withRefCliente then frxReport.Variables.Variables['withRefCliente'] := 1 else frxReport.Variables.Variables['withRefCliente'] := 0; frxReport.PrepareReport(False); frxReport.PreviewPages.SaveToStream(Result); finally AStream.Free; FConnection.RollbackTransaction; end; end; function TRptAlbaranesCliente.GenerarReportEnPDF(const ListaID: TIntegerArray; const AConLogotipo: Boolean): Binary; var i: Integer; begin FShowLogotipo := AConLogotipo; Result := Binary.Create; try //Vamos generando todos y cada uno de los presupuestos recibidos for i := 0 to ListaID.Count - 1 do _GenerarAlbaran(ListaID.Items[i]); frxPDFExport1.Stream := Result; frxReport.Export(frxPDFExport1) finally end; end; end.