{
===============================================================================
  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: 01-10-2001
  Versión actual: 1.0.8
  Fecha versión actual:  06-03-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    02-03-2002    En el contenido se pueden añadir muchos materiales a la vez.

    07-04-2002    Se ha adaptado a una unica transacción.

    09-05-2002    Cambio de grid en lugar de utilizar UltimDBGrid,
                  utilizaremos dxDBGrid.

    15-05-2002    Revisión. Cuando se añaden muchos materiales a la vez se
                  respeta el orden de selección.

    15-05-2002    P225. Guardar el último orden utilizado en las columnas de
                  la lista de materiales.

    30-07-2002    Revisión. Había un fallo al seleccionar varios materiales a
                  la vez. No se borraba el contenido de la lista de selecciona-
                  dos cuando se seleccionaba uno solo y se deseleccionaban
                  los demás.

    15-09-2002    P243. Añadir un campo de búsqueda rápida por la descripción.

    06-03-2004    Al hacer doble click sobre el grid, se pasará a modificar el
                  registro o se seleccionará, dependiendo del modo en el que
                  se encuentre la pantalla.
===============================================================================
}

unit Articulos;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  Db, DBTables, Grids, DBGrids, ComCtrls, IBDatabase, ToolWin, ExtCtrls,
  IBCustomDataSet, IBQuery, RXDBCtrl, RdxPaneles, RdxBarras,
  RdxBotones, Tipos, Mensajes, RdxFrameArticulos, dxCntner, dxTL,
  dxDBCtrl, dxDBGrid, StdCtrls, RdxComboBox, dxDBEdtr, dxDBELib, dxEditor,
  dxExEdtr, dxEdLib;

type
  TfrArticulos = class(TRdxFrameArticulos)
    BarraArticulos: TRdxBarraSuperior;
    bAnadir: TRdxBotonSuperior;
    bModificar: TRdxBotonSuperior;
    bEliminar: TRdxBotonSuperior;
    bConsultar: TRdxBotonSuperior;
    bBuscar: TRdxBotonSuperior;
    bListar: TRdxBotonSuperior;
    bLocalizar: TRdxBotonSuperior;
    brSeleccion: TRdxBarraInferior;
    bSeleccionar: TRdxBoton;
    bCancelarGuardar: TRdxBoton;
    dsArticulos: TDataSource;
    pnlCuerpo: TRdxPanel;
    pnlExtra: TRdxBarraSuperior;
    pnlBusquedaRapida: TRdxPanel;
    eBusqueda: TLabel;
    BusquedaRapida: TdxLookupEdit;
    pnlGrid: TPanel;
    gridArticulos: TdxDBGrid;
    imgSombra: TImage;
    procedure bAnadirClick(Sender: TObject);
    procedure bModificarClick(Sender: TObject);
    procedure bEliminarClick(Sender: TObject);
    procedure bConsultarClick(Sender: TObject);
    procedure bBuscarClick(Sender: TObject);
    procedure bSeleccionarClick(Sender: TObject); virtual;
    procedure bCancelarGuardarClick(Sender: TObject);
    procedure bListarClick(Sender: TObject);
    procedure bLocalizarClick(Sender: TObject);
    procedure gridArticulosRefreshButton(Sender: TObject);
    procedure BusquedaRapidaKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure gridArticulosDblClick(Sender: TObject);
    procedure gridArticulosSelectedCountChange(Sender: TObject);
  private
    FListaArticulosAux : TStringList;
  protected
    procedure ActualizarBotones;
    procedure BuscarArticulo; override;
    procedure FreeContenido; override;
    procedure CambiarModo(ModoAnterior, Modo : TRdxModo); override;
  public
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
    property TablaArticulos;
    property Entidad;
  end;

var
  frArticulos: TfrArticulos;

implementation

{$R *.DFM}

uses
  BaseDatos, Articulo, BuscarArticulo, TablaArticulos, ListarArticulos,
  LocalizarArticulo, Configuracion, Literales;

constructor TfrArticulos.Create (AOwner : TComponent);
begin
  inherited Create(AOwner);
  Entidad := entArticulo;
  ConfigurarFrame(Self, Self.Entidad);
  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;;
  TablaArticulos := TIBDataSet.Create(Self);
  dsArticulos.DataSet := TablaArticulos;

  with gridArticulos do
  begin
    IniFileName := Configuracion.FICHERO_CONFIGURACION;
    IniSectionName := 'MATERIAL';
    OptionsBehavior := OptionsBehavior + [edgoStoreToIniFile];
  end;

  with TablaArticulos do
  begin
    DisableControls;
    Database := BaseDatos;
    Transaction := Transaccion;
    SelectSQL.Assign(dmTablaArticulos.sqlGrid);
    Prepare;
    Open;
    ActualizarBotones;
    dmTablaArticulos.InicializarTablaArticulos(@TablaArticulos);
    EnableControls;
  end;
  dmTablaArticulos.InicializarGridArticulos(gridArticulos);
  gridArticulos.LoadFromIniFile(gridArticulos.IniFileName);

  FListaArticulosAux := TStringList.Create;
  gridArticulos.GotoFirst;
end;

destructor TfrArticulos.Destroy;
begin
  TablaArticulos.Close;
  TablaArticulos.UnPrepare;
  TablaArticulos.Free;
  if FListaArticulosAux <> NIL then
  begin
    FListaArticulosAux.Clear;
    FListaArticulosAux.Free;
    FListaArticulosAux := NIL;
  end;
  inherited;
end;

procedure TfrArticulos.BuscarArticulo;
begin
  with TablaArticulos do
  begin
    DisableControls;
    Close;
    Open;
    ActualizarBotones;
    dmTablaArticulos.InicializarTablaArticulos(@TablaArticulos);
    EnableControls;
  end;
  TablaArticulos.Locate('CODIGO',CodigoArticulo,[]);
end;

procedure TfrArticulos.FreeContenido;
begin
  if (Contenido is TRdxFrameArticulos) then
    CodigoArticulo := (Contenido as TRdxFrameArticulos).CodigoArticulo;
  inherited;
end;

procedure TfrArticulos.bAnadirClick(Sender: TObject);
begin
  Contenido := TfrArticulo.Create(Self);
  Contenido.Modo := Anadir;
end;

procedure TfrArticulos.bModificarClick(Sender: TObject);
begin
  CodigoArticulo := TablaArticulos.FieldByName('CODIGO').AsString;
  Contenido := TfrArticulo.Create(Self);
  Contenido.Modo := Modificar;
end;

procedure TfrArticulos.bEliminarClick(Sender: TObject);
begin
  CodigoArticulo := TablaArticulos.FieldByName('CODIGO').AsString;
  Contenido := TfrArticulo.Create(Self);
  Contenido.Modo := Eliminar;
end;

procedure TfrArticulos.bConsultarClick(Sender: TObject);
begin
  CodigoArticulo := TablaArticulos.FieldByName('CODIGO').AsString;
  Contenido := TfrArticulo.Create(Self);
  Contenido.Modo := Consultar;
end;

procedure TfrArticulos.bBuscarClick(Sender: TObject);
begin
  CodigoArticulo := TablaArticulos.FieldByName('CODIGO').AsString;
  Contenido := TfrBuscarArticulo.Create(Self);
end;

procedure TfrArticulos.bSeleccionarClick(Sender: TObject);
var
  ListaArtSelec : TStringList;
  iAux : Integer;
  Aux : integer;
begin
  if TablaArticulos.RecordCount = 0 then
  begin
    VerMensaje(msgArtNoHayArt);
    exit;
  end;

  // Para no hacer un BuscarArticulo que no es necesario
  // FCodigoArticulo := TablaArticulos.FieldByName('CODIGO').Value;

  if gridArticulos.SelectedCount <= 1
  then FCodigoArticulo := TablaArticulos.FieldByName('CODIGO').Value
  else
    ListaArticulos := FListaArticulosAux;
    //FListaArticulos := dmTablaArticulos.darListaArticulos(gridArticulos, @TablaArticulos);

  CloseFrame;
end;

procedure TfrArticulos.bCancelarGuardarClick(Sender: TObject);
begin
  FCodigoArticulo := Null;
  CloseFrame;
end;

procedure TfrArticulos.bListarClick(Sender: TObject);
begin
  CodigoArticulo := TablaArticulos.FieldByName('CODIGO').AsString;
  Contenido := TfrListarArticulos.Create(Self);
  Contenido.Modo := Listar;
end;

procedure TfrArticulos.bLocalizarClick(Sender: TObject);
begin
  CodigoArticulo := TablaArticulos.FieldByName('CODIGO').AsString;
  Contenido := TfrLocalizarArticulo.Create(Self);
  Contenido.Modo := Localizar;
  Contenido.Visible := True;
end;

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

  if TablaArticulos.RecordCount = 0 then begin
    bAnadir.Enabled := True;
    bModificar.Enabled := False;
    bEliminar.Enabled := False;
    bConsultar.Enabled := False;
    bBuscar.Enabled := False;
    bListar.Enabled := False;
    bLocalizar.Enabled := False;
  end
  else begin
    bAnadir.Enabled := True;
    bModificar.Enabled := True;
    bEliminar.Enabled := True;
    bConsultar.Enabled := True;
    bBuscar.Enabled := True;
    bListar.Enabled := True;
    bLocalizar.Enabled := True;
  end;
end;

procedure TfrArticulos.gridArticulosRefreshButton(Sender: TObject);
begin
  BuscarArticulo;
end;

procedure TfrArticulos.gridArticulosSelectedCountChange(Sender: TObject);
var
  IndiceCol : Integer;
  CodArt : String;
  IndiceSel : Integer;
    
begin
  if TablaArticulos.Active then
  begin
    IndiceCol := gridArticulos.ColumnByFieldName('CODIGO').Index;
    CodArt := gridArticulos.FocusedNode.Strings[IndiceCol];

    FListaArticulosAux.Clear;
    for IndiceSel:=0 to gridArticulos.SelectedCount-1 do
      FListaArticulosAux.Add(gridArticulos.SelectedNodes[IndiceSel].Strings[IndiceCol]);
  end;
end;

procedure TfrArticulos.BusquedaRapidaKeyDown(Sender: TObject;
  var Key: Word; Shift: TShiftState);
begin
  if (Key = VK_RETURN) and (Modo = Seleccionar) then
    bSeleccionar.Click;
end;

procedure TfrArticulos.CambiarModo(ModoAnterior, Modo: TRdxModo);
begin
    inherited;
    dmTablaArticulos.InicializarTablaArticulos(@TablaArticulos);
    if Modo = Seleccionar then
        gridArticulos.OptionsBehavior := gridArticulos.OptionsBehavior + [edgoMultiSelect]
    else
        gridArticulos.OptionsBehavior := gridArticulos.OptionsBehavior - [edgoMultiSelect];
end;

procedure TfrArticulos.gridArticulosDblClick(Sender: TObject);
begin
  if Modo = Seleccionar then
    bSeleccionar.Click
  else
    bModificar.Click;
end;

end.
