{
===============================================================================
  Copyright (©) 2001. Rodax Software.
===============================================================================
  Los contenidos de este fichero son propiedad de Rodax Software titular del
  copyright. Este fichero sólo podrá ser copiado, distribuido y utilizado,
  en su totalidad o en parte, con el permiso escrito de Rodax Software, o de
  acuerdo con los términos y condiciones establecidas en el acuerdo/contrato
  bajo el que se suministra.
  -----------------------------------------------------------------------------
  Web:  www.rodax-software.com
===============================================================================
  Fecha primera versión: 11-08-2002
  Versión actual: 1.0.1
  Fecha versión actual: 14-04-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    14-04-2004    Al hacer doble click sobre el grid, se pasará a consultar el
                  registro o se seleccionará, dependiendo del modo en el que
                  se encuentre la pantalla.

    14-04-2004    p272. Adaptación a multiempresa.
===============================================================================
}

unit ArticulosObraHistorica;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  RDXFRAME, Grids, DBGrids, ComCtrls, RdxBotones, ToolWin, ExtCtrls,
  StdCtrls, RdxComboBox, Tipos, Menus, am2000menuitem, IB,
  Db, am2000popupmenu, am2000, RdxBarras,
  RdxPaneles, RXDBCtrl, DBTables,  
  IBCustomDataSet, RdxCampos, StrFunc, Mensajes, RdxFrameArticulosObraHistorica, cxStyles,
  cxCustomData, cxGraphics, cxFilter, cxData, cxDataStorage, cxEdit,
  cxDBData, cxGridLevel, cxClasses, cxControls, cxGridCustomView,
  cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGrid,
  cxContainer, cxTextEdit;

type
  TfrArticulosObraHistorica = class(TRdxFrameArticulosObraHistorica)
    dsEstadoObra: TDataSource;
    BarraEstado: TRdxBarraSuperior;
    brSeleccion: TRdxBarraInferior;
    bSeleccionar: TRdxBoton;
    bCancelarGuardar: TRdxBoton;
    pnlCuerpo: TRdxPanel;
    pnlGridArticulos: TPanel;
    pnlDatos: TPanel;
    pnlExtra: TRdxBarraSuperior;
    bEliminar: TRdxBotonSuperior;
    bConsultar: TRdxBotonSuperior;
    bBuscar: TRdxBotonSuperior;
    bListar: TRdxBotonSuperior;
    gridArticulosObra: TcxGrid;
    imgSombra: TImage;
    gridArticulosObraView: TcxGridDBTableView;
    Panel1: TPanel;
    eNombre: TLabel;
    Panel2: TPanel;
    eAlmacen: TLabel;
    cbxAlmacen: TRdxComboBox;
    Buscar: TcxTextEdit;
    bLimpiar: TRdxBoton;
    bRefrescar: TRdxBoton;

    procedure bConsultarClick(Sender: TObject);
    procedure bEliminarClick(Sender: TObject);
    procedure bBuscarClick(Sender: TObject);
    procedure bListadosClick(Sender: TObject);
    procedure cbxAlmacenChange(Sender: TObject);
    procedure bSeleccionarClick(Sender: TObject);
    procedure bCancelarGuardarClick(Sender: TObject);
    procedure gridArticulosObraRefreshButton(Sender: TObject);
    procedure gridArticulosObraDblClick(Sender: TObject);
    procedure bRefrescarClick(Sender: TObject);
    procedure BuscarPropertiesChange(Sender: TObject);
    procedure bLimpiarClick(Sender: TObject);
  private
    FCodigoAlmacenInicial : TTipoCodigoFecha;
    FListaAlmacenesCodigo : TStringList;
    procedure ActualizarBotones;
  protected
    procedure SetCodigoAlmacen (Value : TTipoCodigoFecha); override;
    procedure BuscarAlmacen; override;
    procedure BuscarArticulo; override;
    procedure FreeContenido; override;
    procedure SetContenido (NuevoFrame : TRdxFrame); override;
  public
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
    property TablaArticulosObraHistorica;
    property CodigoAlmacen;
    property CodigoArticulo;
  end;

var
  frArticulosObraHistorica: TfrArticulosObraHistorica;

implementation
 {$R *.DFM}

uses
  BaseDatos, ArticuloObraHistorica, {BuscarArticuloObraHistorica,}
  {ListadoArticulosObraHistorica,} MovimientoAlmacenes, PedidosProveedores,
  TablaArticulosObraHistorica, Excepciones, Configuracion, RdxEmpresaActiva,
  Literales, Entidades, Variants;

constructor TfrArticulosObraHistorica.Create (AOwner : TComponent);
var
  i:integer;
  liIndex :integer;

begin
  inherited Create(AOwner);
  FCodigoAlmacenInicial := NIL;
  Entidad := entArticulosObraHistorica;
  ConfigurarFrame(Self, Self.Entidad);

  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;
  TablaArticulosObraHistorica := TIBDataSet.Create(Self);
  dsEstadoObra.DataSet := TablaArticulosObraHistorica;

  with TablaArticulosObraHistorica do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaArticulosObraHistorica.sqlGrid);
  end;

  // Carga todas las obras y codigos
  FListaAlmacenesCodigo := dmTablaArticulosObraHistorica.DarObras(EmpresaActiva.Codigo);
  for i:=0 to FListaAlmacenesCodigo.Count-1 do
    cbxAlmacen.Items.Add(FListaAlmacenesCodigo.Strings[i]);

  // Carga la primera obra
  cbxAlmacen.ItemIndex := 0;
  liIndex := FListaAlmacenesCodigo.IndexOf(cbxAlmacen.Text);
  //Asigno el objeto codigo de almacen (CodigoObra, Nombre, FechaCierre)
  if (liIndex = -1)
  then ActualizarBotones
  else CodigoAlmacen := TTipoCodigoFecha(FListaAlmacenesCodigo.Objects[liIndex]);

  {Como FCodigoAlmacenInicial solo sirve para guardar el codigo de almacen
   del que se parte cuando se activa una ventana modal, reiniciamos a null su
   valor ya que el codigo que nos interesa es el que establecerá despues de
   la creacion el frame padre, en nuestro caso ArticuloAlmacen}
  FCodigoAlmacenInicial := NIL;

  dmTablaArticulosObraHistorica.InicializarGridArticulosObraHistorica(gridArticulosObra);
end;

destructor TfrArticulosObraHistorica.Destroy;
begin
  TablaArticulosObraHistorica.Close;
  TablaArticulosObraHistorica.UnPrepare;
  TablaArticulosObraHistorica.Free;

  FListaAlmacenesCodigo.Free;
  FListaAlmacenesCodigo := NIL;
  
  inherited;
end;

procedure TfrArticulosObraHistorica.BuscarAlmacen;
begin
  if Transaccion = NIL then
    exit;

  try
    with TablaArticulosObraHistorica do
    begin
      DisableControls;
      Close;

      if (CodigoAlmacen <> Nil) then begin
        Params.ByName('CODIGOOBRA').AsInteger := CodigoAlmacen.Codigo;
        Params.ByName('FECHACIERRE').AsString := CodigoAlmacen.Fecha;
      end;
      Params.ByName('CODIGOEMPRESA').AsInteger := EmpresaActiva.Codigo;
      Prepare;
      Open;
      ActualizarBotones;
      dmTablaArticulosObraHistorica.InicializarTablaArticulosObraHistorica(@TablaArticulosObraHistorica);      
      EnableControls;
    end;
    // Establece en el combox el almacen correspondiente al codigo a buscar
    cbxAlmacen.ItemIndex := FListaAlmacenesCodigo.IndexOf(CodigoAlmacen.darDescripcion);

  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrArticulosObraHistorica.BuscarArticulo;
begin
  with TablaArticulosObraHistorica do
  begin
    DisableControls;
    Close;
    Open;
    ActualizarBotones;
    dmTablaArticulosObraHistorica.InicializarTablaArticulosObraHistorica(@TablaArticulosObraHistorica);    
    EnableControls;
  end;
  TablaArticulosObraHistorica.Locate('CODIGOARTICULO',CodigoArticulo,[]);
end;

procedure TfrArticulosObraHistorica.cbxAlmacenChange(Sender: TObject);
begin
  CodigoAlmacen := TTipoCodigoFecha(FListaAlmacenesCodigo.Objects[FListaAlmacenesCodigo.IndexOf(cbxAlmacen.Text)]); //FListaAlmacenesCodigo.Values[cbxAlmacen.Text];
end;

procedure TfrArticulosObraHistorica.FreeContenido;
begin
  if (Contenido is TRdxFrameArticulosObraHistorica) then begin
    CodigoAlmacen := (Contenido as TRdxFrameArticulosObraHistorica).CodigoAlmacen;
    CodigoArticulo := (Contenido as TRdxFrameArticulosObraHistorica).CodigoArticulo;
  end;

  inherited;
end;

procedure TfrArticulosObraHistorica.bConsultarClick(Sender: TObject);
begin
  CodigoArticulo := TablaArticulosObraHistorica.FieldByName('CODIGOARTICULO').AsString;
  Contenido := TfrArticuloObraHistorica.Create(Self);
  Contenido.Modo := Consultar;
end;

procedure TfrArticulosObraHistorica.bEliminarClick(Sender: TObject);
begin
  CodigoArticulo := TablaArticulosObraHistorica.FieldByName('CODIGOARTICULO').AsString;
  Contenido := TfrArticuloObraHistorica.Create(Self);
  Contenido.Modo := Eliminar;
end;

procedure TfrArticulosObraHistorica.bBuscarClick(Sender: TObject);
begin
//  CodigoArticulo := TablaArticulosObraHistorica.FieldByName('CODIGOARTICULO').AsString;
//  Contenido := TfrBuscarArticuloObraHistorica.Create(Self);
end;

procedure TfrArticulosObraHistorica.bListadosClick(Sender: TObject);
begin
//  CodigoArticulo := TablaArticulosObraHistorica.FieldByName('CODIGOARTICULO').AsString;
//  Contenido := TfrListadoArticulosObraHistorica.Create(Self);
end;

procedure TfrArticulosObraHistorica.bSeleccionarClick(Sender: TObject);
begin
  if TablaArticulosObraHistorica.RecordCount = 0 then
  begin
    VerMensaje(msgArtNoHayArtAlm);
    exit;
  end;
  {Codigo almacen no haria falta coger el valor porque ya lo tendríamos,
   porque se inicializa el crearlo el padre y cada vez que se selecciona un
   almacen distinto del combox CodigoAlmacen cambia}
  //FCodigoArticulo := TablaArticulosObraHistorica.FieldByName('CODIGOARTICULO').AsString;
  if gridArticulosObraView.Controller.SelectedRecordCount = 0 then
    FCodigoArticulo := TablaArticulosObraHistorica.FieldByName('CODIGOARTICULO').Value
  else
    FListaArticulos := dmTablaArticulosObraHistorica.darListaArticulos(gridArticulosObra, @TablaArticulosObraHistorica);

  CloseFrame;
end;

procedure TfrArticulosObraHistorica.bCancelarGuardarClick(Sender: TObject);
begin
  {Se recupera el almacen inicial que ha sido guardado en la primera asignación
   del CodigoAlmacen del frame, para que no haga frMovimientos todo lo que hace
   cuando el codigo almacen es distinto. No se puede diferenciar desde otro sitio
   cuando se ha dado a seleccionar y cuando a cancelar}
  FCodigoAlmacen := FCodigoAlmacenInicial;
  FCodigoArticulo := Null;
  CloseFrame;
end;

procedure TfrArticulosObraHistorica.SetCodigoAlmacen(Value: TTipoCodigoFecha);
begin
  if (Value = NIL) then
    Exit;

  {Se guarda el codigo de almacen que asigna inicialmente el padre}
  if (FCodigoAlmacenInicial = NIL) then
    FCodigoAlmacenInicial := Value;

  inherited;
end;

procedure TfrArticulosObraHistorica.ActualizarBotones;
begin
  if BaseDatos.IsReadOnly then
  begin
    bEliminar.Enabled := False;
    bConsultar.Enabled := True;
    bBuscar.Enabled := True;
    bListar.Enabled := True;
    Exit;
  end;

  if TablaArticulosObraHistorica.RecordCount= 0 then
  begin
    bConsultar.Enabled := False;
    bEliminar.Enabled := False;
    bBuscar.Enabled := False;
    bListar.Enabled := False;
  end
  else begin
    bConsultar.Enabled := True;
    bEliminar.Enabled := True;
    bBuscar.Enabled := True;
    bListar.Enabled := True;
  end;
end;

procedure TfrArticulosObraHistorica.gridArticulosObraRefreshButton(
  Sender: TObject);
begin
  //Porque no se va ha cambiar de almacen ya que es solo refresco
  BuscarArticulo;
end;

procedure TfrArticulosObraHistorica.gridArticulosObraDblClick(
  Sender: TObject);
begin
  if Modo = Seleccionar then
    bSeleccionar.Click
  else
    bConsultar.Click;
end;

procedure TfrArticulosObraHistorica.SetContenido(NuevoFrame: TRdxFrame);
begin
  inherited;
//  if (Contenido is TfrListadoArticulosObraHistorica) then
//    (Contenido as TfrListadoArticulosObraHistorica).CodigoAlmacen := CodigoAlmacen;
end;

procedure TfrArticulosObraHistorica.bRefrescarClick(Sender: TObject);
begin
  //Porque no se va ha cambiar de almacen ya que es solo refresco
  BuscarArticulo;
end;

procedure TfrArticulosObraHistorica.BuscarPropertiesChange(
  Sender: TObject);
begin
  FiltrarGrid(gridArticulosObra, Buscar.Text);
end;

procedure TfrArticulosObraHistorica.bLimpiarClick(Sender: TObject);
begin
  Buscar.Text := '';
end;

end.

