unit uRptFacturasProveedor_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, FactuGES_Intf, frxExportPDF, uDABin2DataStreamer,
  uDARemoteDataAdapter;

type
  TRptFacturasProveedor = class(TDataModule)
    DataDictionary: TDADataDictionary;
    frxCheckBoxObject1: TfrxCheckBoxObject;
    frxChartObject1: TfrxChartObject;
    frxGradientObject1: TfrxGradientObject;
    frxCrossObject1: TfrxCrossObject;
    frxOLEObject1: TfrxOLEObject;
    frxBarCodeObject1: TfrxBarCodeObject;
    frxRichObject1: TfrxRichObject;
    frxReport: TfrxReport;
    frxPDFExport1: TfrxPDFExport;
    tbl_InformeListadoFacturas: TDAMemDataTable;
    DADSInformeListadoFacturas: TDADataSource;
    frxDBInformeListadoFacturas: TfrxDBDataset;
    tbl_InformeListadoFacturasPendientes: TDAMemDataTable;
    DADSInformeListadoFacturasPendientes: TDADataSource;
    frxDBInformeListadoFacturasPendientes: TfrxDBDataset;
    DADSInformeListadoFacturasPendResumen: TDADataSource;
    frxDBInformeListadoFacturasPendResumen: TfrxDBDataset;
    frxDBInformeListadoFacturasResumen: TfrxDBDataset;
    DADSInformeListadoFacturasResumen: TDADataSource;
    tbl_InformeListadoFacturasResumen: TDAMemDataTable;
    tbl_InformeListadoFacturasPendResumen: TDAMemDataTable;
    Bin2DataStreamer: TDABin2DataStreamer;
    DARemoteDataAdapter: TDARemoteDataAdapter;
    schReport: TDASchema;
    procedure DataModuleCreate(Sender: TObject);
    procedure DataModuleDestroy(Sender: TObject);
  private
    FConnection: IDAConnection;
    FIdEmpresa: Integer;
    FFechaInicio: Variant;
    FFechaFin: Variant;
    FFechaVenInicio: Variant;
    FFechaVenFin: Variant;
    FListaIDProveedores: TIntegerArray;
    FListaNombresProveedores: TStringList;
    FImporteMinimo: Currency;
    FDesglosado : Boolean;
    procedure RecuperarNombresProveedores;
    procedure PrepararTablaInforme(ATabla: TDAMemDataTable);
    procedure PrepararTablaResumenInforme(ATabla: IDADataset);
    procedure IniciarParametrosInforme;
    function _GenerarInforme(const TipoInforme: String): Binary;
  public
    function GenerarInformeIVA(const IdEmpresa: Integer; const FechaInicio: Variant; const FechaFin: Variant; const ListaIDProveedores: TIntegerArray; const Desglosado: Boolean; const ImporteMinimo: Currency): Binary;
    function GenerarInformeListadoFacturas(const IdEmpresa: Integer; const FechaInicio: Variant; const FechaFin: Variant; const FechaVenInicio: Variant; const FechaVenFin: Variant; const ListaIDProveedores: TIntegerArray; const Desglosado: Boolean; const ImporteMinimo: Currency): Binary;
    function GenerarInformeListadoFacturasPendientes(const IdEmpresa: Integer; const FechaInicio: Variant; const FechaFin: Variant; const FechaVenInicio: Variant; const FechaVenFin: Variant; const ListaIDProveedores: TIntegerArray; const Desglosado: Boolean; const ImporteMinimo: Currency): Binary;
  end;

implementation

{$R *.dfm}

uses
  uSistemaFunc, StrUtils, uDataModuleServer, schFacturasProveedorClient_Intf,
  uROServer, DataAbstract4_Intf;

const
  rptInformeIVA = 'InformeIVAProveedores.fr3';
  rptInformeIVADesglosado = 'InformeIVAProveedoresDesglosado.fr3';
  rptInformeListadoFacturasProveedor = 'InformeListadoFacturasProveedor.fr3';
  rptInformeListadoFacturasProveedorDesglosado = 'InformeListadoFacturasProveedorDesglosado.fr3';
  rptInformeListadoFactuasProveedorPendiente = 'InformeListadoFacturasProveedorPendientes.fr3';
  rptInformeListadoFactuasProveedorPendienteDesglosado = 'InformeListadoFacturasProveedorPendientesDesglosado.fr3';

  { Dataset names for schReport }
  ds_InformeListadoFacturasResumen = 'InformeListadoFacturasResumen';
  ds_InformeListadoFacturasPendientesResumen = 'InformeListadoFacturasPendientesResumen';

{ TRptFacturasProveedor }


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

  FListaNombresProveedores := TStringList.Create;  
end;

procedure TRptFacturasProveedor.DataModuleDestroy(Sender: TObject);
begin
  FreeANDNIL(FListaNombresProveedores);
end;

function TRptFacturasProveedor.GenerarInformeIVA(const IdEmpresa: Integer;
  const FechaInicio, FechaFin: Variant;
  const ListaIDProveedores: TIntegerArray; const Desglosado: Boolean;
  const ImporteMinimo: Currency): Binary;
var
  ATipoInforme: String;
  AStream: TMemoryStream;
  dsMaster: IDADataset;

begin
  FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO"

  AStream := TMemoryStream.Create;
  try
    //Inicializamos parametros
    FIdEmpresa := IdEmpresa;
    FFechaInicio := FechaInicio;
    FFechaFin := FechaFin;
    FFechaVenInicio := Null;
    FFechaVenFin := Null;
    FImporteMinimo := ImporteMinimo;
    FDesglosado := Desglosado;

    if Assigned(FListaIDProveedores) then
       FListaIDProveedores.Free;

    FListaIDProveedores := ListaIDProveedores;

    //Se van a prepara las tablas del informe
    if tbl_InformeListadoFacturas.Active then
       tbl_InformeListadoFacturas.Active := False;

    PrepararTablaInforme(tbl_InformeListadoFacturas);

    //Se prepara la tabla del listado resumen del informe
    if tbl_InformeListadoFacturasResumen.Active then
       tbl_InformeListadoFacturasResumen.Active := False;

    dsMaster := schReport.NewDataset(FConnection, ds_InformeListadoFacturasResumen, [], [], False);
    PrepararTablaResumenInforme(dsMaster);

    //Esto se hace para rellenar la tabla del datamodule que usa el informe.
    dsMaster.Open;
    AStream.Clear;
    Bin2DataStreamer.WriteDataset(AStream, dsMaster, [woRows, woSchema], -1);
    Bin2DataStreamer.ReadDataset(AStream, tbl_InformeListadoFacturasResumen, TRUE, '', TRUE, TRUE);

    //DESGLOSADO POR PROVEEDOR EN ESTE INFORME NO SE DESGLOSARÁ POR PROVEEDOR
    if FDesglosado then
       ATipoInforme := rptInformeIVADesglosado
    else
       ATipoInforme := rptInformeIVA;

    //Finalmente se abren las tablas del informe
    tbl_InformeListadoFacturas.Active := True;
    tbl_InformeListadoFacturasResumen.Active := True;

    Result := _GenerarInforme(ATipoInforme);

  finally
    AStream.Free;
    dsMaster := Nil;
    FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO"
  end;
end;

function TRptFacturasProveedor.GenerarInformeListadoFacturas(
  const IdEmpresa: Integer; const FechaInicio, FechaFin: Variant;
  const FechaVenInicio, FechaVenFin: Variant;
  const ListaIDProveedores: TIntegerArray; const Desglosado: Boolean;
  const ImporteMinimo: Currency): Binary;
var
  ATipoInforme: String;
  AStream: TMemoryStream;
  dsMaster: IDADataset;

begin
  FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO"

  AStream := TMemoryStream.Create;
  try
    //Inicializamos parametros
    FIdEmpresa := IdEmpresa;
    FFechaInicio := FechaInicio;
    FFechaFin := FechaFin;
    FFechaVenInicio := FechaVenInicio;
    FFechaVenFin := FechaVenFin;
    FImporteMinimo := ImporteMinimo;
    FDesglosado := Desglosado;

    if Assigned(FListaIDProveedores) then
       FListaIDProveedores.Free;
    FListaIDProveedores := ListaIDProveedores;

    //Se prepara la tabla del listado general del informe
    if tbl_InformeListadoFacturas.Active then
       tbl_InformeListadoFacturas.Active := False;

    PrepararTablaInforme(tbl_InformeListadoFacturas);

    //Se prepara la tabla del listado resumen del informe
    if tbl_InformeListadoFacturasResumen.Active then
       tbl_InformeListadoFacturasResumen.Active := False;
    dsMaster := schReport.NewDataset(FConnection, ds_InformeListadoFacturasResumen, [], [], False);

    PrepararTablaResumenInforme(dsMaster);

    //Esto se hace para rellenar la tabla del datamodule que usa el informe.
    dsMaster.Open;
    AStream.Clear;
    Bin2DataStreamer.WriteDataset(AStream, dsMaster, [woRows, woSchema], -1);
    Bin2DataStreamer.ReadDataset(AStream, tbl_InformeListadoFacturasResumen, TRUE, '', TRUE, TRUE);

    //DESGLOSADO POR PROVEEDOR EN ESTE INFORME NO SE DESGLOSARÁ POR PROVEEDOR
    if FDesglosado then
       ATipoInforme := rptInformeListadoFacturasProveedorDesglosado
    else
       ATipoInforme := rptInformeListadoFacturasProveedor;

    //Finalmente se abren las tablas del informe
    tbl_InformeListadoFacturas.Active := True;
    tbl_InformeListadoFacturasResumen.Active := True;

    Result := _GenerarInforme(ATipoInforme);

  finally
    AStream.Free;
    dsMaster := Nil;
    FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO"
  end;
end;

function TRptFacturasProveedor.GenerarInformeListadoFacturasPendientes(
  const IdEmpresa: Integer; const FechaInicio, FechaFin: Variant;
  const FechaVenInicio, FechaVenFin: Variant;
  const ListaIDProveedores: TIntegerArray; const Desglosado: Boolean;
  const ImporteMinimo: Currency): Binary;
var
  Condicion: TDAWhereExpression;
  ATipoInforme: String;
  AStream: TMemoryStream;
  dsMaster: IDADataset;

begin
  FConnection.BeginTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO"

  AStream := TMemoryStream.Create;
  try
    //Inicializamos parametros
    FIdEmpresa := IdEmpresa;
    FFechaInicio := FechaInicio;
    FFechaFin := FechaFin;
    FFechaVenInicio := FechaVenInicio;
    FFechaVenFin := FechaVenFin;
    FImporteMinimo := ImporteMinimo;
    FDesglosado := Desglosado;

    if Assigned(FListaIDProveedores) then
       FListaIDProveedores.Free;
    FListaIDProveedores := ListaIDProveedores;


    //Se prepara la tabla del listado general del informe
    if tbl_InformeListadoFacturasPendientes.Active then
       tbl_InformeListadoFacturasPendientes.Active := False;

    PrepararTablaInforme(tbl_InformeListadoFacturasPendientes);

    // Filtrar el informe por situacion
    with tbl_InformeListadoFacturasPendientes.DynamicWhere do
    begin
      // (SITUACION >= PAGADA)
      Condicion := NewBinaryExpression(NewField('', fld_FacturasProveedorSITUACION), NewConstant('PAGADA', datString), dboNotEqual);
      if IsEmpty then
         Expression := Condicion
      else
         Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
    end;

    //Se prepara la tabla del listado resumen del informe
    if tbl_InformeListadoFacturasPendResumen.Active then
       tbl_InformeListadoFacturasPendResumen.Active := False;

    dsMaster := schReport.NewDataset(FConnection, ds_InformeListadoFacturasPendientesResumen, [], [], False);
    PrepararTablaResumenInforme(dsMaster);

    // Filtrar el informe por situacion
    dsMaster.Where.AddText(' AND (SITUACION <> ''PAGADA'')');

    //Esto se hace para rellenar la tabla del datamodule que usa el informe.
    dsMaster.Open;
    AStream.Clear;
    Bin2DataStreamer.WriteDataset(AStream, dsMaster, [woRows, woSchema], -1);
    Bin2DataStreamer.ReadDataset(AStream, tbl_InformeListadoFacturasPendResumen, TRUE, '', TRUE, TRUE);

    //DESGLOSADO POR PROVEEDOR EN ESTE INFORME
    if FDesglosado then
       ATipoInforme := rptInformeListadoFactuasProveedorPendienteDesglosado
    else
       ATipoInforme := rptInformeListadoFactuasProveedorPendiente;

    //Finalmente se abren las tablas del informe
    tbl_InformeListadoFacturasPendientes.Active := True;
    tbl_InformeListadoFacturasPendResumen.Active := True;

    Result := _GenerarInforme(ATipoInforme);

  finally
    AStream.Free;
    dsMaster := Nil;
    FConnection.RollbackTransaction; //<--- Creo que no va a hacer falta. "PUES SI ES NECESARIO"
  end;
end;

procedure TRptFacturasProveedor.IniciarParametrosInforme;
var
  ATextos : TStringList;
  ACadena : String;
begin
  ATextos := TStringList.Create;

  try
    if (not VarIsNull(FFechaInicio)) and (not VarIsNull(FFechaFin)) then
      ACadena := Format('Fechas de factura desde el %s hasta el %s', [VarToStr(FFechaInicio), VarToStr(FFechaFin)])
    else
      ACadena := 'Sin rango de fechas';
    ATextos.Add(ACadena);
    ACadena := '';

    // Filtrar el informe por fechas de vencimiento
    if (not VarIsNull(FFechaVenInicio)) and (not VarIsNull(FFechaVenFin)) then
    begin
      ACadena := Format('Vencimientos desde el %s hasta el %s', [VarToStr(FFechaVenInicio), VarToStr(FFechaVenFin)]);
      ATextos.Add(ACadena);
      ACadena := '';
    end;

    if (FImporteMinimo > 0) then
    begin
      ACadena := Format('Facturas con importe superior a %m', [FImporteMinimo]);
      ATextos.Add(ACadena);
      ACadena := '';
    end;

    if Assigned(FListaIDProveedores) and (FListaIDProveedores.Count > 0) then
    begin
      RecuperarNombresProveedores;
      ACadena := FListaNombresProveedores.Text;
    end
    else begin
      ACadena := 'Todos los proveedores';
      if FDesglosado then
        ACadena := ACadena + ' (desglosados)'
    end;

    ATextos.Add(ACadena);
    ACadena := '';

    frxReport.Variables.Variables['TextoParametros'] := ATextos.Text;
  finally
    FreeAndNil(ATextos);
  end;
end;

procedure TRptFacturasProveedor.PrepararTablaInforme(ATabla: TDAMemDataTable);
var
  Condicion: TDAWhereExpression;
  i: Integer;

begin
  // Filtrar el informe por empresa
  with ATabla.DynamicWhere do
  begin
    // (ID_EMPRESA >= ID)
    Condicion := NewBinaryExpression(NewField('', fld_FacturasProveedorID_EMPRESA), NewConstant(FIdEmpresa, datInteger), dboEqual);
    if IsEmpty then
       Expression := Condicion
    else
       Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
  end;

  // Filtrar el informe por fechas
  if not VarIsNull(FFechaInicio) and
     not VarIsNull(FFechaFin) then
  begin
    with ATabla.DynamicWhere do
    begin
      // (FECHA_INICIO between FECHA_FIN)
      Condicion := NewBinaryExpression(NewField('', fld_FacturasProveedorFECHA_FACTURA), NewConstant(FFechaInicio, datDateTime), dboGreaterOrEqual);
      Condicion := NewBinaryExpression(NewBinaryExpression(NewField('', fld_FacturasProveedorFECHA_FACTURA), NewConstant(FFechaFin, datDateTime), dboLessOrEqual), Condicion, dboAnd);
      if IsEmpty then
         Expression := Condicion
      else
         Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
    end;
  end;

  // Filtrar el informe por fechas de vencimiento
  if  not VarIsNull(FFechaVenInicio)
  and not VarIsNull(FFechaVenFin) then
  begin
    with ATabla.DynamicWhere do
    begin
      // (FECHA_VENCIMIENTO_INICIO between FECHA_VENCIMIENTO_FIN)
      Condicion := NewBinaryExpression(NewField('', fld_FacturasProveedorFECHA_VENCIMIENTO), NewConstant(FFechaVenInicio, datDateTime), dboGreaterOrEqual);
      Condicion := NewBinaryExpression(NewBinaryExpression(NewField('', fld_FacturasProveedorFECHA_VENCIMIENTO), NewConstant(FFechaVenFin, datDateTime), dboLessOrEqual), Condicion, dboAnd);
      if IsEmpty then
         Expression := Condicion
      else
         Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
    end;
  end;

  // Filtrar el informe por proveedor
  if  Assigned(FListaIDProveedores) then
  begin
    with ATabla.DynamicWhere do
    begin
      for i := 0 to FListaIDProveedores.Count - 1 do
      begin

        // (ID_PROVEEDOR = ID)
        Condicion := NewBinaryExpression(NewField('', fld_FacturasProveedorID_PROVEEDOR), NewConstant(FListaIDProveedores.Items[i], datInteger), dboEqual);
        if IsEmpty then
           Expression := Condicion
        else
           Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
        end;
    end;
  end;

  // Filtrar el informe por importe minimo
  if  (FImporteMinimo > 0) then
  begin
    with ATabla.DynamicWhere do
    begin
      // (IMPORTE_TOTAL > ImporteMinimo)
      Condicion := NewBinaryExpression(NewField('', fld_FacturasProveedorIMPORTE_TOTAL), NewConstant(FImporteMinimo, datCurrency), dboGreaterOrEqual);
      if IsEmpty then
         Expression := Condicion
      else
         Expression := NewBinaryExpression(Expression, Condicion, dboAnd);
    end;
  end;
end;

procedure TRptFacturasProveedor.PrepararTablaResumenInforme(ATabla: IDADataset);
var
  i: Integer;
  AWhereStr : String;

begin
  // Filtrar el informe por empresa
  AWhereStr := ' (' + fld_FacturasProveedorID_EMPRESA + ' = ' + IntToStr(FIdEmpresa) + ') ';

  // Filtrar el informe por fechas
  if  not VarIsNull(FFechaInicio)
  and not VarIsNull(FFechaFin) then
  begin
    if Length(AWhereStr) > 0 then
       AWhereStr := AWhereStr + 'AND';
    AWhereStr := AWhereStr + ' (' + fld_FacturasProveedorFECHA_FACTURA + ' between ''' + ReplaceStr(VarToStr(FFechaInicio),'/','.') + ''' and ''' + ReplaceStr(VarToStr(FFechaFin),'/','.') + ''') ';
  end;

  // Filtrar el informe por fechas de vencimiento
  if  not VarIsNull(FFechaVenInicio)
  and not VarIsNull(FFechaVenFin) then
  begin
    if Length(AWhereStr) > 0 then
       AWhereStr := AWhereStr + 'AND';
    AWhereStr := AWhereStr + ' (' + fld_FacturasProveedorFECHA_VENCIMIENTO + ' between ''' + ReplaceStr(VarToStr(FFechaVenInicio),'/','.') + ''' and ''' + ReplaceStr(VarToStr(FFechaVenFin),'/','.') + ''') ';
  end;

  // Filtrar el informe por proveedor
  if  Assigned(FListaIDProveedores) then
  begin
    for i := 0 to FListaIDProveedores.Count - 1 do
    begin
      if Length(AWhereStr) > 0 then
         AWhereStr := AWhereStr + 'AND';
      AWhereStr := AWhereStr + ' (' + fld_FacturasProveedorID_PROVEEDOR + ' = ' + IntToStr(FListaIDProveedores.Items[i]) + ') ';
    end;
  end;

  // Filtrar el informe por importe minimo
  if  (FImporteMinimo > 0) then
  begin
    if Length(AWhereStr) > 0 then
       AWhereStr := AWhereStr + 'AND';
    AWhereStr := AWhereStr + ' (' + fld_FacturasProveedorIMPORTE_TOTAL + ' >= ' + CurrToStr(FImporteMinimo) + ') ';
  end;

  ATabla.Where.AddText(AWhereStr);
end;

procedure TRptFacturasProveedor.RecuperarNombresProveedores;
var
  AContactosService : IsrvContactos;
  Intf : IInterface;
  AClientID : TGUID;

  ATableNameArray: StringArray;
  ATableRequestInfoArray: TableRequestInfoArray;
  ATableRequestInfo: TableRequestInfoV5;
  AStream: TMemoryStream;
  ADataTable: TDAMemDataTable;
  i: Integer;
  AWhereBuilder : TDAWhereBuilder;
  ACondicion : TDAWhereExpression;
begin
  CreateGUID(AClientID);

  GetClassFactory('srvContactos').CreateInstance(AClientID, Intf);

  if Assigned(Intf) then
  begin
    AContactosService := Intf as IsrvContactos;

    ATableNameArray := StringArray.Create;
    ATableRequestInfoArray := TableRequestInfoArray.Create;
    AWhereBuilder := TDAWhereBuilder.Create;
    try
      ATableNameArray.Add('Proveedores');
      ATableRequestInfo := TableRequestInfoV5.Create;

      with ATableRequestInfo do
      begin
        IncludeSchema := True;
        MaxRecords := -1;
        UserFilter := '';

        AWhereBuilder.Clear;
        with AWhereBuilder do
          for i := 0 to FListaIDProveedores.Count - 1 do
          begin
            ACondicion := NewBinaryExpression(
                NewBinaryExpression(NewField('', 'ID'), NewConstant(FListaIDProveedores[i], datInteger), dboEqual),
                NewBinaryExpression(NewField('', 'ID_EMPRESA'), NewConstant(FIdEmpresa, datInteger), dboEqual),
                dboAnd);

            if not AWhereBuilder.IsEmpty then
              Expression := NewBinaryExpression(Expression, ACondicion, dboOr)
            else
              Expression := ACondicion;
          end;

        WhereClause := AWhereBuilder.ExpressionToXmlNode(AWhereBuilder.Expression);
      end;

      try
        ATableRequestInfoArray.Add(ATableRequestInfo);
        AStream := AContactosService.GetData(ATableNameArray, ATableRequestInfoArray);
        if Assigned(AStream) then
        begin
          ADataTable := TDAMemDataTable.Create(nil);
          try
            ADataTable.Name := 'Proveedores';
            ADataTable.LocalDataStreamer := Bin2DataStreamer;
            ADataTable.RemoteFetchEnabled := False;
            Bin2DataStreamer.ReadDataset(AStream, ADataTable, True);

            ADataTable.Open;
            FListaNombresProveedores.Clear;
            for i := 0 to ADataTable.RecordCount - 1 do
            begin
              FListaNombresProveedores.Add(ADataTable.FieldByName('NOMBRE').AsString);
              ADataTable.Next;
            end;

          finally
            FreeANDNil(ADataTable);
          end;
        end;
      except
        on e: Exception do
          dmServer.EscribirLog(e.Message);
      end;
    finally
      FreeANDNIL(ATableRequestInfoArray);
      FreeANDNIL(ATableNameArray);
      FreeANDNIL(AWhereBuilder);
    end;
  end;
end;


function TRptFacturasProveedor._GenerarInforme(const TipoInforme: String): Binary;
var
  AInforme: Variant;
begin
  Result := Binary.Create;

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

  frxReport.LoadFromFile(AInforme, True);
  IniciarParametrosInforme;

  frxReport.PrepareReport(False);
  frxReport.PreviewPages.SaveToStream(Result);
end;

end.
