unit InformeEstadoAlmacen;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  InformeBase, FR_IBXDB, FR_Shape, FR_Class, Db, IBCustomDataSet, IBQuery,
  IBDatabase, FR_DSet, FR_DBSet, Tipos;

type
  TdmInformeEstadoAlmacen = class(TdmInformeBase)
    TablaEstado: TIBQuery;
    frdsTablaEstado: TfrDBDataSet;
  private
    FAlmacen: Integer;
    FFamIni: string;
    FFamFin: string;
    FNombreAlmacen: string;
    FTipo: TTipoInforme;
    FDesIni: string;
    FDesFin: string;
  protected
    procedure RellenarCabecera(Band: TfrBand); override;
    procedure PrepararConsultas; override;
  public
    constructor Create(AOwner: TComponent); override;
  published
    property Tipo : TTipoInforme read FTipo write FTipo;
    property DescripcionIni : string read FDesIni write FDesIni;
    property DescripcionFin : string read FDesFin write FDesFin;
    property FamiliaIni : string read FFamIni write FFamIni;
    property FamiliaFin : string read FFamFin write FFamFin;
    property CodigoAlmacen : Integer read FAlmacen write FAlmacen;
    property NombreAlmacen : string read FNombreAlmacen write FNombreAlmacen;
  end;

var
  dmInformeEstadoAlmacen: TdmInformeEstadoAlmacen;

implementation

{$R *.DFM}

{ TdmInformeEstadoAlmacen }

uses
  RdxEmpresaActiva, Literales;

constructor TdmInformeEstadoAlmacen.Create(AOwner: TComponent);
begin
  inherited;
  FNombreInforme := 'ListadoEstadoAlmacen.frf';
  Tipo := tiTodo;
end;

procedure TdmInformeEstadoAlmacen.PrepararConsultas;
begin
  TablaEstado.Database := FBaseDatos;
  TablaEstado.Transaction := FTransaccion;

  with TablaEstado.SQL do
  begin
    Clear;
    case Tipo of
      tiTodo        : begin
                        Add('select distinct E.CODIGOARTICULO, A.DESCRIPCION, E.EXISTENCIAS, ');
                        Add('E.STOCKMIN, E.STOCKMAX, sum(PENDIENTES) as "PENDIENTE" ');
                        Add('from ARTICULOS A, ESTADOALMACEN E ');
                        Add('left outer join PEDIDOSPROVEEDOR P ');
                        Add('on (P.CODIGOALMACEN = E.CODIGOALMACEN and P.CODIGOEMPRESA = E.CODIGOEMPRESA) ');
                        Add('left outer join DETALLESPEDIDOSPROVEEDOR D ');
                        Add('on ((D.CODIGOPEDIDO = P.CODIGO) and (D.CODIGOARTICULO = E.CODIGOARTICULO) and ');
                        Add('(D.CODIGOEMPRESA = P.CODIGOEMPRESA)) ');
                        Add('where E.CODIGOEMPRESA = :CODIGOEMPRESA ');
                        Add('and E.CODIGOALMACEN = :CODIGOALMACEN ');
                        Add('and A.CODIGO = E.CODIGOARTICULO ');
                        Add('group by E.CODIGOARTICULO, A.DESCRIPCION, E.EXISTENCIAS, ');
                        Add('E.STOCKMIN, E.STOCKMAX ');
                        Add('order by E.CODIGOARTICULO ');
                      end;
      tiPorDescripcion: begin
                        Add('select distinct E.CODIGOARTICULO, A.DESCRIPCION, E.EXISTENCIAS, ');
                        Add('E.STOCKMIN, E.STOCKMAX, sum(PENDIENTES) as "PENDIENTE" ');
                        Add('from ARTICULOS A, ESTADOALMACEN E ');
                        Add('left outer join PEDIDOSPROVEEDOR P ');
                        Add('on (P.CODIGOALMACEN = E.CODIGOALMACEN and P.CODIGOEMPRESA = E.CODIGOEMPRESA) ');
                        Add('left outer join DETALLESPEDIDOSPROVEEDOR D ');
                        Add('on ((D.CODIGOPEDIDO = P.CODIGO) and (D.CODIGOARTICULO = E.CODIGOARTICULO) and ');
                        Add('(D.CODIGOEMPRESA = P.CODIGOEMPRESA)) ');
                        Add('where E.CODIGOEMPRESA = :CODIGOEMPRESA ');
                        Add('and E.CODIGOALMACEN = :CODIGOALMACEN ');
                        Add('and A.CODIGO = E.CODIGOARTICULO ');
                        Add('and upper(A.DESCRIPCION) between upper(:DESCRIPCIONINI) and upper(:DESCRIPCIONFIN) ');
                        Add('group by E.CODIGOARTICULO, A.DESCRIPCION, E.EXISTENCIAS, ');
                        Add('E.STOCKMIN, E.STOCKMAX ');
                        Add('order by E.CODIGOARTICULO ');
                        TablaEstado.ParamByName('DESCRIPCIONINI').AsString := FDesIni;
                        TablaEstado.ParamByName('DESCRIPCIONFIN').AsString := FDesFin;
                      end;
      tiPorFamilias : begin
                        Add('select distinct E.CODIGOARTICULO, A.DESCRIPCION, E.EXISTENCIAS, ');
                        Add('E.STOCKMIN, E.STOCKMAX, sum(PENDIENTES) as "PENDIENTE" ');
                        Add('from ARTICULOS A, ESTADOALMACEN E ');
                        Add('left outer join PEDIDOSPROVEEDOR P ');
                        Add('on (P.CODIGOALMACEN = E.CODIGOALMACEN and P.CODIGOEMPRESA = E.CODIGOEMPRESA) ');
                        Add('left outer join DETALLESPEDIDOSPROVEEDOR D ');
                        Add('on ((D.CODIGOPEDIDO = P.CODIGO) and (D.CODIGOARTICULO = E.CODIGOARTICULO) and ');
                        Add('(D.CODIGOEMPRESA = P.CODIGOEMPRESA)) ');
                        Add('where E.CODIGOEMPRESA = :CODIGOEMPRESA ');
                        Add('and E.CODIGOALMACEN = :CODIGOALMACEN ');
                        Add('and A.FAMILIA between :FAMILIAINI and :FAMILIAFIN ');
                        Add('and A.CODIGO = E.CODIGOARTICULO ');
                        Add('group by E.CODIGOARTICULO, A.DESCRIPCION, E.EXISTENCIAS, ');
                        Add('E.STOCKMIN, E.STOCKMAX ');
                        Add('order by E.CODIGOARTICULO ');
                        TablaEstado.ParamByName('FAMILIAINI').AsString := FFamIni;
                        TablaEstado.ParamByName('FAMILIAFIN').AsString := FFamFin;
                      end;
    end;
    TablaEstado.ParambyName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
    TablaEstado.ParambyName('CODIGOALMACEN').AsInteger := CodigoAlmacen;
  end;
end;

procedure TdmInformeEstadoAlmacen.RellenarCabecera(Band: TfrBand);
var
  iCont : Integer;
  Objeto : TfrView;
begin
  inherited;
  with Band do
  begin
     for iCont := 0 to Objects.Count - 1 do
      begin
        Objeto := Objects[iCont];
        if ((Objeto is TfrMemoView) and (Objeto.Name = 'CabParametros')) then
        begin
          with (Objeto as TfrMemoView) do
          begin
            Memo.Clear;
            Memo.Add('Almacén: ' + IntToStr(CodigoAlmacen) + ' - ' + NombreAlmacen);
            case Tipo of
              tiTodo            : Memo.Add(msgInfIntervaloTodosArt);
              tiPorDescripcion  : Memo.Add(SysUtils.Format(msgInfIntervaloDesArt, [FDesIni, FDesFin]));
              tiPorFamilias     : Memo.Add(SysUtils.Format(msgInfIntervaloFam, [FFamIni, FFamFin]));
            end;
          end;
        end;
      end;
  end;
end;

end.
