unit uRptPresupuestosCliente_Server;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, frxClass, frxDBSet, uDAScriptingProvider,
  uDADataTable, uDACDSDataTable, DB, uDAClasses, uDABINAdapter, uROTypes,
  uDAInterfaces, uDAMemDataTable, uDABin2DataStreamer,
  frxGradient, frxChBox, frxCross, frxOLE, frxBarcode, frxRich, uDAEngine,
  IBSQL, IBDatabase, IBCustomDataSet, IBQuery, uDADataStreamer;

type
  TRptPresupuestosCliente = class(TDataModule)
    DADataCabecera: TDADataSource;
    DADataDetalles: TDADataSource;
    frxBarCodeObject1: TfrxBarCodeObject;
    frxOLEObject1: TfrxOLEObject;
    frxCrossObject1: TfrxCrossObject;
    frxCheckBoxObject1: TfrxCheckBoxObject;
    frxGradientObject1: TfrxGradientObject;
    frxDBCabecera: TfrxDBDataset;
    frxDBDetalles: TfrxDBDataset;
    Bin2DataStreamer: TDABin2DataStreamer;
    tbl_Cabecera: TDAMemDataTable;
    tbl_Detalles: TDAMemDataTable;
    frxReport: TfrxReport;
    schReport: TDASchema;
    DataDictionary: TDADataDictionary;
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    cabecera: TIBQuery;
    detalles: TIBQuery;
    procedure DataModuleCreate(Sender: TObject);
  private
    FConnection: IDAConnection;
    procedure GenerarPresupuesto(const AID : Integer); overload;
  public
    function GenerarPresupuesto(const AID : String): Binary; overload;
  end;

implementation

{$R *.dfm}

uses
  uDataModuleServer, schPresupuestosClienteClient_Intf;

const
  rptInforme = 'InfPresupuestoCliente.fr3';

  { Dataset names for schReport }
  ds_InformeCabecera = 'Informe_Cabecera';
  ds_InformeDetalles = 'Informe_Detalles';


{ TRptPresupuestosProveedor }


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

function TRptPresupuestosCliente.GenerarPresupuesto(const AID: String): Binary;
var
  ID_Presupuestos: TStringList;
  i: Integer;

begin
  Result := Binary.Create;
  FConnection.BeginTransaction;

  try
    ID_Presupuestos := TStringList.Create;
    ID_Presupuestos.CommaText := AID;

    //Vamos generando todos y cada uno de los albaranes recibidos
    for i := 0 to ID_Presupuestos.Count - 1 do
        GenerarPresupuesto(StrToInt(ID_Presupuestos.Strings[i]));

    frxReport.PreviewPages.SaveToStream(Result);

  finally
    FConnection.RollbackTransaction;
  end;
end;

procedure TRptPresupuestosCliente.GenerarPresupuesto(const AID: Integer);
{var
  AStream: TMemoryStream;
  dsMaster: IDADataset;
  dsDetail: IDADataset;}
begin
  //AStream := TMemoryStream.Create;

//  try
    {dsMaster := schReport.NewDataset(FConnection, ds_InformeCabecera, ['ID'], [AID]);
    dsDetail := schReport.NewDataset(FConnection, ds_InformeDetalles, ['ID'], [AID], False);

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

    AStream.Clear;
    Bin2DataStreamer.WriteDataset(AStream, dsDetail, [woRows, woSchema], -1);
    Bin2DataStreamer.ReadDataset(AStream, tbl_Detalles, TRUE, '', TRUE, TRUE);}

    tbl_Cabecera.ParamByName('ID').AsInteger := AID;
    tbl_Detalles.ParamByName('ID').AsInteger := AID;
    tbl_Cabecera.Active := True;
    tbl_Detalles.Active := True;

    frxReport.LoadFromFile(DarRutaInformes + rptInforme, True);
    frxReport.PrepareReport(False);

{  finally
    //AStream.Free;
    dsMaster := Nil;
    dsDetail := Nil;
  end;}
end;

end.
