{
===============================================================================
  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.3
  Fecha versión actual: 20-08-2002
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    31-03-2002    Eliminar el procedimiento virtual BorrarLineasDetalle, que se aplicaba
                  al TratarCambios y decir que si.

    07-04-2002    Se ha adaptado el frame para transaccion unica.

    09-04-2002    Sustituir las constantes IDYES/IDNO por IDOK.

    20-08-2002    Añadir en TratarCambios el Cancel.
===============================================================================
}

unit RdxFrameMovimientos;

{$I ..\COMPILE.INC}

interface

uses
  Consts, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  RdxFrame, RdxDBFrame, IBCustomDataSet, Tipos, IBDataBase, DB, RxMemDS;

type
  TRdxFrameMovimientos = class(TRdxDBFrame)
  private
    FTablaPedidos : TIBDataSet;
    FTablaDetalleMem : TRxMemoryData;
  protected

    FCodigoAlmacenOrigen : Variant;
    FCodigoAlmacenDestino : Variant;
    FCodigoArticulo : Variant;
    FCodigoPedido : Variant;
    FCodigoCliente : Variant;
    FListaAlmacenesCodigo : TStringList;
    FListaCodigosAlmacen : TStringList;

    procedure SetTablaPedidos (Value : TIBDataSet);
    procedure SetTablaDetalleMem (Value : TRxMemoryData);
    procedure SetCodigoAlmacenOrigen (Value : Variant); virtual;
    procedure SetCodigoAlmacenDestino (Value : Variant); virtual;
    procedure SetCodigoArticulo (Value : Variant); virtual;
    procedure SetCodigoPedido (Value : Variant); virtual;
    procedure SetCodigoCliente (Value : Variant); virtual;

    procedure BuscarAlmacenOrigen; virtual; abstract;
    procedure BuscarAlmacenDestino; virtual; abstract;
    procedure BuscarPedido; virtual; abstract;
    procedure BuscarCliente; virtual; abstract;

    function TratarCambios : integer; override;
    procedure SetContenido (NuevoFrame : TRdxFrame); override;
    procedure CambiarModo(ModoAnterior, Modo : TRdxModo); override;
  public
    property TablaPedidos: TIBDataSet read FTablaPedidos write SetTablaPedidos;
    property TablaDetalleMem: TRxMemoryData read FTablaDetalleMem write SetTablaDetalleMem;
    property CodigoAlmacenOrigen : Variant read FCodigoAlmacenOrigen write SetCodigoAlmacenOrigen;
    property CodigoAlmacenDestino : Variant read FCodigoAlmacenDestino write SetCodigoAlmacenDestino;
    property CodigoPedido : Variant read FCodigoPedido write SetCodigoPedido;
    property CodigoCliente : Variant read FCodigoCliente write SetCodigoCliente;
    property CodigoArticulo : Variant read FCodigoArticulo write SetCodigoArticulo;

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

implementation

{$R *.DFM}

uses
  IB, Mensajes
  {$IFDEF RDX_D6}, Variants{$ENDIF};

{ TRdxFrameProveedores }

const
msgPregunta = '¿Esta seguro de que desea salir del movimiento?';

constructor TRdxFrameMovimientos.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FTablaPedidos := nil;
  FTablaDetalleMem := nil;
  FCodigoAlmacenOrigen := NULL;
  FCodigoAlmacenDestino := NULL;
  FCodigoPedido := NULL;
  FCodigoCliente := NULL;
  FCodigoArticulo := NULL;

  FListaAlmacenesCodigo := TStringList.Create;
  FListaCodigosAlmacen := TStringList.Create;
end;

destructor TRdxFrameMovimientos.Destroy;
begin
  FListaAlmacenesCodigo.Free;
  FListaCodigosAlmacen.Free;
  inherited;
end;

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

procedure TRdxFrameMovimientos.SetCodigoAlmacenOrigen(Value: Variant);
begin
  if (not VarIsNull(Value)) then
  begin
    FCodigoAlmacenOrigen := Value;
    BuscarAlmacenOrigen;
  end;
end;


procedure TRdxFrameMovimientos.SetCodigoArticulo(Value: Variant);
begin
  if VarIsNull(Value) then
    exit;
  if Value = '' then
    exit;
  FCodigoArticulo := Value;
end;

procedure TRdxFrameMovimientos.SetCodigoAlmacenDestino(Value: Variant);
begin
  if not VarIsNull(Value) then
  begin
    FCodigoAlmacenDestino := Value;
    BuscarAlmacenDestino;
  end;
end;

procedure TRdxFrameMovimientos.SetCodigoPedido(Value: Variant);
begin
  if (not VarIsNull(Value)) then
  begin
    FCodigoPedido := Value;
    BuscarPedido;
  end;
end;

procedure TRdxFrameMovimientos.SetCodigoCliente(Value: Variant);
begin
  if (not VarIsNull(Value)) then
  begin
    FCodigoCliente := Value;
    BuscarCliente;
  end;
end;


procedure TRdxFrameMovimientos.CambiarModo(ModoAnterior, Modo: TRdxModo);
begin
  inherited;
  if (FModo in [Normal, Seleccionar]) then
  begin
    TablaDetalleMem.Close;
    TablaDetalleMem.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 almacén que tiene el frame
      en CodigoAlmacen (al activar el modo Añadir NO se pisa este valor con
      el código de almacén nuevo), preguntamos si la tabla esta activa por si
      se ha cerrado al realizar algun cambio en modificar y ejecutar TratarCambios}
    if (not TablaDetalleMem.Active) or (ModoAnterior = Anadir) then
      BuscarAlmacenDestino;
  end;
end;

procedure TRdxFrameMovimientos.SetTablaPedidos(Value: TIBDataSet);
begin
  if (FTablaPedidos <> Value) then
  begin
    FTablaPedidos := Value;
  end;
end;

procedure TRdxFrameMovimientos.SetTablaDetalleMem(Value: TRxMemoryData);
begin
  if (FTablaDetalleMem <> Value) then
  begin
    FTablaDetalleMem := Value;
  end;
end;

function TRdxFrameMovimientos.TratarCambios : integer;
begin
  if TablaDetalleMem.Modified = true then
    TablaDetalleMem.Post;
  if (TablaDetalleMem.RecordCount <> 0) then
    case VerMensajePregunta(msgPregunta) of
      IDYES       : Result := IDOK;
      IDNO        : Result := IDNO;
      IDCANCEL    : Result := IDCANCEL;
    end
  else Result := IDOK;
end;

end.
