{
===============================================================================
  Copyright (©) 2002. 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-2002
  Versión actual: 1.0.1
  Fecha versión actual: 28-05-2004
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    28/05/2004    Se han adaptado los frames para que se autoconfiguren
===============================================================================
}

unit RdxFrameArticulos;

{$I ..\COMPILE.INC}

interface

uses
  Windows, Classes,
  RdxFrame, RdxDBFrame, IBCustomDataSet, DB, Entidades;

type
  TRdxFrameArticulos = class(TRdxDBFrame)
  private
    FTablaArticulos : TIBDataSet;
    FTablaPropiedades : TIBDataSet;
  protected
    FListaArticulos : TStringList;
    procedure SetTablaArticulos (Value : TIBDataSet);
    procedure SetTablaPropiedades (Value : TIBDataSet);
    procedure SetListaArticulos (Value : TStringList);
    procedure SetCodigoArticulo (Value : Variant);
    procedure SetFCodigoArticulo (Value : Variant);
    function GetCodigoArticulo: Variant;
    function GetFCodigoArticulo: Variant;

    procedure SetContenido (NuevoFrame : TRdxFrame); override;
    function TratarCambios : integer; override;
    procedure BuscarArticulo; virtual; abstract;
    procedure CambiarModo(ModoAnterior, Modo : TRdxModo); override;
    function CambiarEntidad(EntidadAnterior, Entidad : TRdxEntidad): Boolean; override;
  public
    property TablaArticulos: TIBDataSet read FTablaArticulos write SetTablaArticulos;
    property TablaPropiedades: TIBDataSet read FTablaPropiedades write SetTablaPropiedades;
    property ListaArticulos : TStringList read FListaArticulos write SetListaArticulos;
    property CodigoArticulo : Variant read GetCodigoArticulo write SetCodigoArticulo;
    property FCodigoArticulo : Variant read GetFCodigoArticulo write SetFCodigoArticulo;

    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
    property BaseDatos;
    property Transaccion;
  end;

implementation

{$R *.DFM}

uses
  Mensajes, StrFunc, Literales, Configuracion
  {$IFDEF RDX_D6}, Variants, SysUtils{$ENDIF};

{ TRdxFrameArticulos }

constructor TRdxFrameArticulos.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FListaArticulos := TStringList.Create;
  FTablaArticulos := NIL;
end;

destructor TRdxFrameArticulos.Destroy;
begin
  FreeAndNIL(FListaArticulos);
  inherited;
end;

function TRdxFrameArticulos.TratarCambios : integer;
begin
  if (TablaArticulos.State in dsEditModes) then
    case VerMensajePregunta(msgGuardarCambios) of
      IDCANCEL    : Result := IDCANCEL;
      IDYES       : begin
                      if (RealizarOperacion)
                      then Result := IDOK
                      else Result := IDCANCEL;
                    end;
      IDNO        : begin
                      if (DescartarOperacion)
                      then Result := IDOK
                      else Result := IDCANCEL;
                    end;
    end
  else Result := IDOK;
end;

procedure TRdxFrameArticulos.SetContenido(NuevoFrame: TRdxFrame);
begin
  if (Contenido <> NIL) then
    if (Contenido.Name = NuevoFrame.ClassName) then
    begin
      NuevoFrame.Free;
      exit;
    end;

  inherited;

  if (TablaArticulos <> NIL) then
  begin
    FCodigoArticulo := TablaArticulos.FieldByName('CODIGO').Value;
    if (Contenido is TRdxFrameArticulos) then
      (Contenido as TRdxFrameArticulos).CodigoArticulo := FCodigoArticulo;
  end;
end;

procedure TRdxFrameArticulos.SetTablaArticulos(Value: TIBDataSet);
begin
  if (FTablaArticulos <> Value) then
  begin
    FTablaArticulos := Value;
  end;
end;

procedure TRdxFrameArticulos.CambiarModo(ModoAnterior, Modo : TRdxModo);
begin
  inherited;
  if (FModo in [Normal, Seleccionar]) then
  begin
    TablaArticulos.Close;
    TablaArticulos.Open;
  end
  else begin
    { Si estábamos en el modo Añadir y pasamos a cualquier otro modo SIEMPRE
      es necesario buscar el codigo de articulo que tiene el frame
      en CodigoArticulo (al activar el modo Añadir NO se pisa este valor con
      el código de articulo nuevo), preguntamos si la tabla esta activa por si
      se ha cerrado al realizar algun cambio en modificar y ejecutar TratarCambios}
    if (not TablaArticulos.Active) or (ModoAnterior = Anadir) then
      BuscarArticulo;
  end;
end;

function TRdxFrameArticulos.GetCodigoArticulo: Variant;
begin
  Result := FCodigoArticulo;
end;

function TRdxFrameArticulos.GetFCodigoArticulo: Variant;
begin
  if (ListaArticulos.Count = 0) then
    Result := NULL
  else
    Result := ListaArticulos.Strings[ListaArticulos.Count-1];
end;

procedure TRdxFrameArticulos.SetCodigoArticulo(Value: Variant);
begin
  if (not VarIsNull(Value)) then
  begin
    FCodigoArticulo := Value;
    BuscarArticulo;
  end
end;

procedure TRdxFrameArticulos.SetFCodigoArticulo(Value: Variant);
begin
  FListaArticulos.Clear;
  if (not VarIsNull(Value)) then
    FListaArticulos.Add(Value);
end;

procedure TRdxFrameArticulos.SetListaArticulos(Value: TStringList);
begin
  if (Value = Nil) or (Value.Count = 0) then
    exit;

  FListaArticulos.Clear;
  FListaArticulos.Assign(Value);
end;

procedure TRdxFrameArticulos.SetTablaPropiedades(Value: TIBDataSet);
begin
  if (FTablaPropiedades <> Value) then
  begin
    FTablaPropiedades := Value;
  end;
end;

function TRdxFrameArticulos.CambiarEntidad(EntidadAnterior,
  Entidad: TRdxEntidad): Boolean;
begin
  inherited CambiarEntidad(EntidadAnterior, Entidad);
  ConfigurarFrame(Self, Self.Entidad);
end;

end.
