unit uRptPedidosProveedor_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, FactuGES_Intf;

type
  TRptPedidosProveedor = class(TDataModule)
    DABINAdapter: TDABINAdapter;
    frxDBCabecera: TfrxDBDataset;
    frxDBDetalles: TfrxDBDataset;
    frxReport: TfrxReport;
    IBDatabase1: TIBDatabase;
    IBTransaction1: TIBTransaction;
    DataSource1: TDataSource;
    DataSource2: TDataSource;
    cabecera: TIBQuery;
    detalles: TIBQuery;
    frxCheckBoxObject1: TfrxCheckBoxObject;
    frxChartObject1: TfrxChartObject;
    frxGradientObject1: TfrxGradientObject;
    frxCrossObject1: TfrxCrossObject;
    frxOLEObject1: TfrxOLEObject;
    frxBarCodeObject1: TfrxBarCodeObject;
    frxRichObject1: TfrxRichObject;
    DADSCabecera: TDADataSource;
    DADSDetalles: TDADataSource;
    tbl_Detalles: TDAMemDataTable;
    tbl_Cabecera: TDAMemDataTable;
    detallesID: TIntegerField;
    detallesID_PEDIDO: TIntegerField;
    detallesPOSICION: TIntegerField;
    detallesTIPO_DETALLE: TIBStringField;
    detallesREFERENCIA: TIBStringField;
    detallesCONCEPTO: TIBStringField;
    detallesCANTIDAD: TIntegerField;
    detallesUNIDAD_MEDIDA: TIBStringField;
    detallesIMPORTE_UNIDAD: TIBBCDField;
    detallesIMPORTE_TOTAL: TIBBCDField;
    detallesREFERENCIA_PROVEEDOR: TIBStringField;
    detallesREFERENCIA_FABRICANTE: TIBStringField;
    cabeceraID: TIntegerField;
    cabeceraID_EMPRESA: TIntegerField;
    cabeceraREFERENCIA: TIBStringField;
    cabeceraFECHA_PEDIDO: TDateField;
    cabeceraOBSERVACIONES: TMemoField;
    cabeceraNOMBRE: TIBStringField;
    cabeceraFAX: TIBStringField;
    cabeceraPERSONA_CONTACTO: TIBStringField;
    cabeceraCODIGO_CLIENTE: TIBStringField;
    cabeceraCALLE: TIBStringField;
    cabeceraPOBLACION: TIBStringField;
    cabeceraPROVINCIA: TIBStringField;
    cabeceraCODIGO_POSTAL: TIBStringField;
    cabeceraENTREGAR_A: TIBStringField;
    frxPDFExport1: TfrxPDFExport;
    schReport: TDASchema;
    DataDictionary: TDADataDictionary;
    procedure DataModuleCreate(Sender: TObject);
    procedure frxReportGetValue(const VarName: string; var Value: Variant);
  private
    FConnection: IDAConnection;
    FImprimirPrecio : Boolean;
    FImprimirRefProveedor : Boolean;
    procedure _GenerarPedido(const ID : Integer);
  public
    function GenerarPedido(const ListaID : TIntegerArray;
      const ImprimirPrecio: Boolean = True;
      const ImprimirRefProveedor: Boolean = True): Binary;

    function GenerarPedidoEnPDF(const ListaID: TIntegerArray;
      const ImprimirPrecio: Boolean = True;
      const ImprimirRefProveedor: Boolean = True): Binary;
  end;

implementation

{$R *.dfm}

uses
  uDataModuleServer, schPedidosProveedorClient_Intf;

const
  rptInforme = 'InfPedidoProveedor.fr3';

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


{ TRptPedidosProveedor }


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

procedure TRptPedidosProveedor.frxReportGetValue(const VarName: string;
  var Value: Variant);
begin
  if VarName = 'ImprimirPrecio' then
    Value := FImprimirPrecio;
  if VarName = 'ImprimirRefProveedor' then
    Value := FImprimirRefProveedor;
end;

function TRptPedidosProveedor.GenerarPedido(const ListaID : TIntegerArray;
        const ImprimirPrecio: Boolean = True;
        const ImprimirRefProveedor: Boolean = True): Binary;
var
  i: Integer;
begin
  Result := Binary.Create;
  FImprimirPrecio := ImprimirPrecio;
  FImprimirRefProveedor := ImprimirRefProveedor;
  
  //FConnection.BeginTransaction; <--- Creo que no va a hacer falta.
  try
    //Vamos generando todos y cada uno de los albaranes recibidos
    for i := 0 to ListaID.Count - 1 do
        _GenerarPedido(ListaID.Items[i]);
    frxReport.PreviewPages.SaveToStream(Result);
  finally
    //FConnection.RollbackTransaction; <--- Creo que no va a hacer falta.
  end;
end;

procedure TRptPedidosProveedor._GenerarPedido(const ID: Integer);
var
  AStream: TMemoryStream;
  dsMaster: IDADataset;
  dsDetail: IDADataset;
begin
  AStream := TMemoryStream.Create;

  try
    frxDBCabecera.DataSource := DADSCabecera;
    frxDBDetalles.DataSource := DADSDetalles;

    tbl_Cabecera.ParamByName('ID').AsInteger := ID;
    tbl_Detalles.ParamByName('ID_PEDIDO').AsInteger := ID;

    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;

function TRptPedidosProveedor.GenerarPedidoEnPDF(
  const ListaID: TIntegerArray; const ImprimirPrecio: Boolean;
  const ImprimirRefProveedor: Boolean): Binary;
var
  i: Integer;
begin
  Result := Binary.Create;
  FImprimirPrecio := ImprimirPrecio;
  FImprimirRefProveedor := ImprimirRefProveedor;

  //FConnection.BeginTransaction; <--- Creo que no va a hacer falta.
  try
    //Vamos generando todos y cada uno de los albaranes recibidos
    for i := 0 to ListaID.Count - 1 do
        _GenerarPedido(ListaID.Items[i]);

    frxPDFExport1.Stream := Result;
    frxReport.Export(frxPDFExport1)
  finally
    //FConnection.RollbackTransaction; <--- Creo que no va a hacer falta.
  end;
end;


end.
