unit uRptMedicaciones_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, IBCustomDataSet, IBQuery, IBDatabase,
  uDAMemDataTable, frxExportPDF, uDABin2DataStreamer, Etiquetas_Intf;

type
  TRptMedicaciones = class(TDataModule)
    frxDBCabecera: TfrxDBDataset;
    frxDBDetallesEnBlister: TfrxDBDataset;
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    cabecera: TIBQuery;
    detallesenblister: TIBQuery;
    DADSCabecera: TDADataSource;
    DADSDetallesEnBlister: TDADataSource;
    tbl_DetallesEnBlister: TDAMemDataTable;
    tbl_Cabecera: TDAMemDataTable;
    frxCheckBoxObject1: TfrxCheckBoxObject;
    frxChartObject1: TfrxChartObject;
    frxGradientObject1: TfrxGradientObject;
    frxCrossObject1: TfrxCrossObject;
    frxOLEObject1: TfrxOLEObject;
    frxBarCodeObject1: TfrxBarCodeObject;
    frxRichObject1: TfrxRichObject;
    frxReport: TfrxReport;
    frxDBDetallesFueraBlister: TfrxDBDataset;
    DADSDetallesFueraBlister: TDADataSource;
    tbl_DetallesFueraBlister: TDAMemDataTable;
    detallesfuerablister: TIBQuery;
    DataSource3: TDataSource;
    frxPDFExport1: TfrxPDFExport;
    Bin2DataStreamer: TDABin2DataStreamer;
    detallesenblisterID: TIntegerField;
    detallesenblisterID_MEDICACION: TIntegerField;
    detallesenblisterPOSICION: TIntegerField;
    detallesenblisterTIPO_DETALLE: TIBStringField;
    detallesenblisterID_ARTICULO: TIntegerField;
    detallesenblisterREFERENCIA: TIBStringField;
    detallesenblisterCONCEPTO: TIBStringField;
    detallesenblisterCANTIDAD: TIBBCDField;
    detallesenblisterPOSOLOGIA: TIBStringField;
    detallesenblisterFORMA_COLOR: TIBStringField;
    detallesenblisterLOTE: TIBStringField;
    detallesenblisterVISIBLE: TSmallintField;
    cabeceraID: TIntegerField;
    cabeceraID_PACIENTE: TIntegerField;
    cabeceraREFERENCIA: TIBStringField;
    cabeceraPACIENTE: TIBStringField;
    cabeceraNUMERO_SS: TIBStringField;
    cabeceraFECHA_DESDE: TDateField;
    cabeceraFECHA_HASTA: TDateField;
    cabeceraFARMACEUTICO: TIBStringField;
    cabeceraTELEFONO_FARM: TIBStringField;
    cabeceraMOVIL_FARM: TIBStringField;
    detallesfuerablisterID: TIntegerField;
    detallesfuerablisterID_MEDICACION: TIntegerField;
    detallesfuerablisterPOSICION: TIntegerField;
    detallesfuerablisterTIPO_DETALLE: TIBStringField;
    detallesfuerablisterID_ARTICULO: TIntegerField;
    detallesfuerablisterREFERENCIA: TIBStringField;
    detallesfuerablisterCONCEPTO: TIBStringField;
    detallesfuerablisterCANTIDAD: TIBBCDField;
    detallesfuerablisterPOSOLOGIA: TIBStringField;
    detallesfuerablisterFORMA_COLOR: TIBStringField;
    detallesfuerablisterLOTE: TIBStringField;
    detallesfuerablisterVISIBLE: TSmallintField;
    schReport: TDASchema;
    DataDictionary: TDADataDictionary;
    cabeceraPABELLON: TIBStringField;
    procedure DataModuleCreate(Sender: TObject);
    procedure DataModuleDestroy(Sender: TObject);
  private
    FConnection: IDAConnection;
    procedure _GenerarInforme(const ID: Integer);
  public
    function GenerarInforme(const ListaID : TIntegerArray): Binary;
  end;

implementation

{$R *.dfm}

uses
  uSistemaFunc, StrUtils, uDataModuleServer,
  uROServer, DataAbstract4_Intf;

const
  rptEtiquetas = 'EtiquetasBlister.fr3';

{ TRptMedicaciones }


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

  frxDBCabecera.DataSource := DADSCabecera;
  frxDBCabecera.CloseDataSource := False;

  frxDBDetallesEnBlister.DataSource := DADSDetallesEnBlister;
  frxDBDetallesEnBlister.CloseDataSource := False;

  frxDBDetallesFueraBlister.DataSource := DADSDetallesFueraBlister;
  frxDBDetallesFueraBlister.CloseDataSource := False;
end;

procedure TRptMedicaciones.DataModuleDestroy(Sender: TObject);
begin
  tbl_Cabecera.Active := False;
  tbl_DetallesEnBlister.Active := False;
  tbl_DetallesFueraBlister.Active := False;
end;

function TRptMedicaciones.GenerarInforme(const ListaID: TIntegerArray): Binary;
var
  i: Integer;
begin
  Result := Binary.Create;
  try
    //Vamos generando todos y cada una de las facturas recibidas
    for i := 0 to ListaID.Count - 1 do
        _GenerarInforme(ListaID.Items[i]);

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

procedure TRptMedicaciones._GenerarInforme(const ID: Integer);
var
  AInforme: Variant;
begin
  FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO"
  try
    tbl_Cabecera.Active := False;
    tbl_DetallesEnBlister.Active := False;
    tbl_DetallesFueraBlister.Active := False;

    tbl_Cabecera.ParamByName('ID').AsInteger := ID;
    tbl_DetallesEnBlister.ParamByName('ID_MEDICACION').AsInteger := ID;
    tbl_DetallesFueraBlister.ParamByName('ID_MEDICACION').AsInteger := ID;

    tbl_Cabecera.Active := True;
    tbl_DetallesEnBlister.Active := True;
    tbl_DetallesFueraBlister.Active := True;

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

    frxReport.LoadFromFile(AInforme, True);

    frxReport.PrepareReport(False);

  finally
    FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO"
  end;
end;


end.
