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
  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;
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.
