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; 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); overload; public function GenerarFicha(const AFichaID : String): Binary; overload; 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 AFichaID: String): Binary; var ID_Fichas: TStringList; i: Integer; begin Result := Binary.Create; FConnection.BeginTransaction; try ID_Fichas := TStringList.Create; ID_Fichas.CommaText := AFichaID; //Vamos generando todos y cada uno de las fichas de empleado for i := 0 to ID_Fichas.Count - 1 do GenerarFicha(StrToInt(ID_Fichas.Strings[i])); frxReport.PreviewPages.SaveToStream(Result); finally FConnection.RollbackTransaction; end; end; procedure TRptFichasEmpleado.GenerarFicha(const ID: integer); var AStream: TMemoryStream; dsMaster: IDADataset; begin AStream := TMemoryStream.Create; 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 AStream.Free; dsMaster := Nil; end; end; end.