{
===============================================================================
  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.0
  Fecha versión actual: 01-10-2002
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
===============================================================================
}

unit RdxDBFrame;

interface

uses
  Consts, Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  RdxFrame, IBCustomDataSet, IBDatabase, IBEvents;

type
  TRdxDBFrame = class(TRdxFrame)
  private
    FBaseDatos : TIBDataBase;
    FTransaccion : TIBTransaction;
    procedure SetBaseDatos (Value : TIBDataBase);
    procedure SetTransaccion (Value : TIBTransaction);
  protected
    procedure SetModo (Value : TRdxModo); override;
    procedure ActivarModo; virtual;
    function TratarCambios : integer; virtual;
    procedure ActivarModoAnadir; virtual; abstract;
    procedure ActivarModoModificar; virtual; abstract;
    procedure ActivarModoConsultar; virtual; abstract;
    procedure ActivarModoEliminar; virtual; abstract;
    procedure ActivarModoTraslado; virtual; abstract;
    procedure ActivarModoEntrada; virtual; abstract;
    procedure ActivarModoEntradaPedido; virtual; abstract;
    procedure ActivarModoSalida; virtual; abstract;
    procedure ActivarModoSalidaDevolucion; virtual; abstract;
    function ComprobarDatos : Boolean; virtual; abstract;
    function RealizarOperacion : Boolean; virtual;
    function DescartarOperacion : Boolean; virtual;
    function AnadirDatos : Boolean; virtual; abstract;
    function ModificarDatos : Boolean; virtual; abstract;
    function EliminarDatos : Boolean; virtual; abstract;
    function CancelarAnadir : Boolean; virtual; abstract;
    function CancelarModificar : Boolean; virtual; abstract;
    function CancelarEliminar : Boolean; virtual; abstract;
  public
    property BaseDatos : TIBDataBase read FBaseDatos write SetBaseDatos;
    property Transaccion : TIBTransaction read FTransaccion write SetTransaccion;
    procedure Rollback;
    procedure Commit;
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
    function CloseFrame : boolean; override;
  published
    property OnShow;
  end;

implementation
{$R *.DFM}

uses
  IB, DB;

{ TRdxDBFrame }

constructor TRdxDBFrame.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FTransaccion := NIL;
  FBaseDatos := NIL;
end;

procedure TRdxDBFrame.Commit;
begin
  if FTransaccion = NIL then
    Exit;
  if FTransaccion.InTransaction then
    FTransaccion.CommitRetaining;
end;

procedure TRdxDBFrame.Rollback;
begin
  if FTransaccion = NIL then
    exit;
  if FTransaccion.InTransaction then
    FTransaccion.RollbackRetaining;
end;

procedure TRdxDBFrame.SetTransaccion(Value: TIBTransaction);
begin
  if (Value = NIL) then
    Exit;

  if (FTransaccion <> Value) then
    FTransaccion := Value;
end;

procedure TRdxDBFrame.SetBaseDatos(Value: TIBDataBase);
begin
  if (FBaseDatos <> Value) then
    FBaseDatos := Value;
end;

procedure TRdxDBFrame.SetModo(Value: TRdxModo);
begin
  if FModo <> Value then
  begin
    if TratarCambios = IDCANCEL then
      exit;
    inherited;
    ActivarModo;
  end;
end;

function TRdxDBFrame.DescartarOperacion: Boolean;
begin
  case Modo of
    Anadir : Result := CancelarAnadir;
    Modificar : Result := CancelarModificar;
    Eliminar : Result := CancelarEliminar;
  end;
end;

function TRdxDBFrame.RealizarOperacion: Boolean;
begin
  case Modo of
    Anadir    : begin
                  if ComprobarDatos then
                    Result := AnadirDatos
                  else
                    Result := False;
                end;
    Modificar : begin
                  if ComprobarDatos then
                    Result := ModificarDatos
                  else
                    Result := False;
                end;
    Eliminar  : begin
                  if ComprobarDatos then
                    Result := EliminarDatos
                  else
                    Result := False;
                end;
  end;
end;

function TRdxDBFrame.CloseFrame : boolean;
begin
  { Sólo tratamos los cambios en aquellos frames que sean visibles.
    Cuando no son visibles no se pregunta porque lo que se quiere
    es cerrarlo sin mostrar nada por pantalla (por ejemplo, cuando
    se quiere facturar un pedido que no se puede). }
  if Visible then
  begin
    if TratarCambios = IDCANCEL then
    begin
      Result := False;
      Exit;
    end;
  end;
  Result := inherited CloseFrame;
end;

function TRdxDBFrame.TratarCambios: integer;
begin
  { Esta función vacía sirve para evitar que los frames hijos que no tengan
    cambios en las tablas (grids por ejemplo) estén obligados a
    redefinir esta función aunque luego no les sirva de nada. }
  Result := IDOK;
end;

procedure TRdxDBFrame.ActivarModo;
begin
  case Modo of
    Anadir    : ActivarModoAnadir;
    Modificar : ActivarModoModificar;
    Consultar : ActivarModoConsultar;
    Eliminar  : ActivarModoEliminar;
  end;
end;

destructor TRdxDBFrame.Destroy;
begin
  inherited;
end;

end.

