unit uRptFichasPaciente_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,
  Etiquetas_Intf;

type
  TRptFichasPaciente = class(TDataModule)
    DADataCabecera: TDADataSource;
    tbl_FichaPaciente: 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 las fichas a imprimir
    procedure _GenerarFicha(const ID: Integer);
  public
    function GenerarFicha(const ListaID: TIntegerArray): Binary;
  end;

implementation

{$R *.dfm}

uses
  uSistemaFunc, uDataModuleServer, schContactosClient_Intf;

const
  rptFichaPaciente = 'InfFichaPaciente.fr3';

  { Dataset names for schReport }
  ds_InformeFichaPaciente = 'InformeFichasPaciente';


{ TRptFichaPaciente }


procedure TRptFichasPaciente.DataModuleCreate(Sender: TObject);
begin
  schReport.ConnectionManager := dmServer.ConnectionManager;
  FConnection := dmServer.DarNuevaConexion;
  frxReport.EngineOptions.NewSilentMode := simReThrow;

  frxDBCabecera.DataSource := DADataCabecera;
  frxDBCabecera.CloseDataSource := False;
end;

procedure TRptFichasPaciente.DataModuleDestroy(Sender: TObject);
begin
  tbl_FichaPaciente.Active := False;
end;

function TRptFichasPaciente.GenerarFicha(const ListaID: TIntegerArray): Binary;
var
  i: Integer;
begin
  Result := Binary.Create;
  try
    //Vamos generando todos y cada uno de las fichas de paciente
    for i := 0 to ListaID.Count - 1 do
      _GenerarFicha(ListaID.Items[i]);

    frxReport.PreviewPages.SaveToStream(Result);
  finally
  end;
end;

procedure TRptFichasPaciente._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_InformeFichaPaciente, ['ID'], [ID]);

    AStream.Clear;
    Bin2DataStreamer.WriteDataset(AStream, dsMaster, [woRows, woSchema], -1);
    Bin2DataStreamer.ReadDataset(AStream, tbl_FichaPaciente, TRUE, '', TRUE, TRUE);

    AInforme := DarRutaFichero(DarRutaInformes, rptFichaPaciente);
    if VarIsNull(AInforme) then
       raise Exception.Create (('Error Servidor: _GenerarFicha, no encuentra informe ' + rptFichaPaciente));

    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.
