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); procedure DataModuleDestroy(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 uSistemaFunc, 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; frxDBCabecera.DataSource := DADataCabecera; frxDBCabecera.CloseDataSource := False; end; procedure TRptFichasEmpleado.DataModuleDestroy(Sender: TObject); begin tbl_FichaEmpleado.Active := False; 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; AInforme: Variant; 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); AInforme := DarRutaFichero(DarRutaInformes, rptFichaEmpleado); if VarIsNull(AInforme) then raise Exception.Create (('Error Servidor: _GenerarFicha, no encuentra informe ' + rptFichaEmpleado)); frxReport.LoadFromFile(AInforme, 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.