unit uRptPedidosCliente_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, uDAMemDataTable, uDADataStreamer, uDABin2DataStreamer; type TRptPresupuestosCliente = class(TDataModule) DADataCabecera: TDADataSource; DADataDetalles: TDADataSource; frxRichObject1: TfrxRichObject; frxBarCodeObject1: TfrxBarCodeObject; frxOLEObject1: TfrxOLEObject; frxCrossObject1: TfrxCrossObject; frxCheckBoxObject1: TfrxCheckBoxObject; frxGradientObject1: TfrxGradientObject; frxChartObject1: TfrxChartObject; frxDBCabecera: TfrxDBDataset; frxDBDetalles: TfrxDBDataset; schReport: TDASchema; DataDictionary: TDADataDictionary; frxReport: TfrxReport; Bin2DataStreamer: TDABin2DataStreamer; tbl_Cabecera: TDAMemDataTable; tbl_Detalles: TDAMemDataTable; procedure DataModuleCreate(Sender: TObject); private FConnection: IDAConnection; procedure GenerarPedido(const AID : Integer); overload; public function GenerarPedido(const AID : String): Binary; overload; end; implementation {$R *.dfm} uses uDataModuleServer, schPedidosClienteClient_Intf; const rptInforme = 'InfPedidoCliente.fr3'; { Dataset names for schReport } ds_InformeCabecera = 'Informe_Cabecera'; ds_InformeDetalles = 'Informe_Detalles'; { TRptPedidosProveedor } procedure TRptPresupuestosCliente.DataModuleCreate(Sender: TObject); begin schReport.ConnectionManager := dmServer.ConnectionManager; FConnection := dmServer.DarNuevaConexion; frxReport.EngineOptions.NewSilentMode := simReThrow; end; function TRptPresupuestosCliente.GenerarPedido(const AID: String): Binary; var ID_Pedidos: TStringList; i: Integer; begin Result := Binary.Create; FConnection.BeginTransaction; try ID_Pedidos := TStringList.Create; ID_Pedidos.CommaText := AID; //Vamos generando todos y cada uno de los albaranes recibidos for i := 0 to ID_Pedidos.Count - 1 do GenerarPedido(StrToInt(ID_Pedidos.Strings[i])); frxReport.PreviewPages.SaveToStream(Result); finally FConnection.RollbackTransaction; end; end; procedure TRptPresupuestosCliente.GenerarPedido(const AID: Integer); var AStream: TMemoryStream; dsMaster: IDADataset; dsDetail: IDADataset; begin AStream := TMemoryStream.Create; try dsMaster := schReport.NewDataset(FConnection, ds_InformeCabecera, ['ID'], [AID]); dsDetail := schReport.NewDataset(FConnection, ds_InformeDetalles, ['ID_PEDIDO'], [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 + rptInforme, True); frxReport.PrepareReport(False); finally AStream.Free; dsMaster := Nil; dsDetail := Nil; end; end; end.