unit uRptFichasEmpleado_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, FactuGES_Intf; type TRptFichasEmpleado = class(TDataModule) DADataCabecera: TDADataSource; tbl_FichaEmpleado: TDAMemDataTable; frxRichObject1: TfrxRichObject; frxBarCodeObject1: TfrxBarCodeObject; frxOLEObject1: TfrxOLEObject; frxCrossObject1: TfrxCrossObject; frxCheckBoxObject1: TfrxCheckBoxObject; frxGradientObject1: TfrxGradientObject; frxChartObject1: TfrxChartObject; frxDBCabecera: TfrxDBDataset; schReport: TDASchema; DataDictionary: TDADataDictionary; frxReport: TfrxReport; Bin2DataStreamer: TDABin2DataStreamer; procedure DataModuleCreate(Sender: TObject); private FConnection: IDAConnection; //Genera cada uno de los albaranes a imprimir procedure _GenerarFicha(const ID: Integer); public function GenerarFicha(const ListaID: TIntegerArray): Binary; end; implementation {$R *.dfm} uses uDataModuleServer, schContactosClient_Intf; const rptFichaEmpleado = 'InfFichaEmpleado.fr3'; { Dataset names for schReport } ds_InformeFichaEmpleado = 'InformeFichasEmpleado'; { TRptFichaEmpleado } procedure TRptFichasEmpleado.DataModuleCreate(Sender: TObject); begin schReport.ConnectionManager := dmServer.ConnectionManager; FConnection := dmServer.DarNuevaConexion; frxReport.EngineOptions.NewSilentMode := simReThrow; end; function TRptFichasEmpleado.GenerarFicha(const ListaID: TIntegerArray): Binary; var i: Integer; begin Result := Binary.Create; try //Vamos generando todos y cada uno de las fichas de empleado for i := 0 to ListaID.Count - 1 do _GenerarFicha(ListaID.Items[i]); frxReport.PreviewPages.SaveToStream(Result); finally end; end; procedure TRptFichasEmpleado._GenerarFicha(const ID: Integer); var AStream: TMemoryStream; dsMaster: IDADataset; begin AStream := TMemoryStream.Create; FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" try dsMaster := schReport.NewDataset(FConnection, ds_InformeFichaEmpleado, ['ID'], [ID]); AStream.Clear; Bin2DataStreamer.WriteDataset(AStream, dsMaster, [woRows, woSchema], -1); Bin2DataStreamer.ReadDataset(AStream, tbl_FichaEmpleado, TRUE, '', TRUE, TRUE); frxReport.LoadFromFile(DarRutaInformes + rptFichaEmpleado, True); frxReport.PrepareReport(False); finally FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO" AStream.Free; dsMaster := Nil; end; end; end.