{
===============================================================================
  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.4
  Fecha versión actual: 28-12-2002
===============================================================================
  Modificaciones:

    Fecha         Comentarios
    ---------------------------------------------------------------------------
    03-10-2001    Quitar refresco del grid, ordenación por click en titulo

    05-11-2001    Quitar la cacheUpdates, y hacer bloqueo para los demás usuarios

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

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

    28-12-2002    Se establece el campo DESCRIPCION como clave primaria y se captura la
                  excepcion (no se permitirán bancos con misma descripcion), arreglo de
                  el boton cancelar de el mensaje "esta seguro que desea eliminar"
===============================================================================
}

unit Bancos;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  RDXDBFRAME, RdxBotones, ExtCtrls, RdxPaneles, RdxBarras, RdxTitulos,
  Grids, DBGrids, RXDBCtrl, IBCustomDataSet, Db, StdCtrls,
  DBTables, dxCntner, dxTL, dxDBCtrl, dxDBGrid;

type
  TfrBancos = class(TRdxDBFrame)
    BarraBancos: TRdxBarraSuperior;
    dsBancos: TDataSource;
    brDoble: TRdxBarraInferior;
    bAceptar: TRdxBoton;
    bCancelar: TRdxBoton;
    pnlCuerpo: TRdxPanel;
    pnlGrid: TRdxPanel;
    pnlBotones: TRdxPanel;
    bAnadir: TRdxBoton;
    bEliminar: TRdxBoton;
    gridBancos: TdxDBGrid;
    procedure bAnadirClick(Sender: TObject);
    procedure bEliminarClick(Sender: TObject);
    procedure bAceptarClick(Sender: TObject);
    procedure bCancelarClick(Sender: TObject);
  private
    TablaBancos : TIBDataSet;
    procedure ActualizarBotones;
  protected
    procedure ActivarModoAnadir; override;
  public
    constructor Create (AOwner : TComponent); override;
    destructor Destroy; override;
  published
    procedure AppException(Sender: TObject; E: Exception);
    procedure BancosAfterInsert(DataSet: TDataSet);
    property BaseDatos;
    property Transaccion;
  end;

var
  frBancos: TfrBancos;

implementation

{$R *.DFM}

{ TfrBancos }

uses
  Tipos, BaseDatos, TablaBancos, IB, Mensajes, StrFunc,
  Excepciones, IBErrorCodes, Configuracion, Literales;

constructor TfrBancos.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Application.OnException := AppException;
  Entidad := entBancos;
  ConfigurarFrame(Self, Self.Entidad);
  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;
  TablaBancos := TIBDataSet.Create(Self);
  TablaBancos.AfterInsert := BancosAfterInsert;
  dsBancos.DataSet := TablaBancos;

  with TablaBancos do
  begin
    Database := BaseDatos;
    Transaction := Transaccion;
    InsertSQL.Assign(dmTablaBancos.sqlInsertar);
    ModifySQL.Assign(dmTablaBancos.sqlModificar);
    DeleteSQL.Assign(dmTablaBancos.sqlEliminar);
    SelectSQL.Assign(dmTablaBancos.sqlConsultar);
  end;
end;

destructor TfrBancos.Destroy;
begin
  Application.OnException := NIL;
  TablaBancos.Close;
  TablaBancos.UnPrepare;
  TablaBancos.Free;
  inherited;
end;

procedure TfrBancos.bAnadirClick(Sender: TObject);
begin
  TablaBancos.Append;
  gridBancos.SetFocus;
end;

procedure TfrBancos.bEliminarClick(Sender: TObject);
begin
  if (VerMensajePregunta(msgDeseaBorrar) <> IDYES) then
    Exit;
  try
    if TablaBancos.RecordCount = 0
    { Hacemos un cancel de la tabla por si el registro actual estuviera
      recien creado }
    then TablaBancos.Cancel
    else TablaBancos.Delete;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrBancos.bAceptarClick(Sender: TObject);
begin
  if TablaBancos.State in [dsEdit, dsInsert] then
    TablaBancos.Post;
  Commit;
  CloseFrame;
end;

procedure TfrBancos.bCancelarClick(Sender: TObject);
begin
  try
    Rollback;
    CloseFrame;
  except
    on E : EIBError do
      TratarExcepcion(E);
    on E : Exception do
      TratarExcepcion(E);
  end;
end;

procedure TfrBancos.BancosAfterInsert(DataSet: TDataSet);
begin
  DataSet.FieldByName('DB_KEY').AsString := '-';
end;

procedure TfrBancos.AppException(Sender: TObject; E: Exception);
begin
  if E.Message = 'Field ''DESCRIPCION'' must have a value' then begin
    VerMensaje(msgDatBancoFaltaDes);
    TablaBancos.Edit;
  end
  else if E.Message = 'violation of PRIMARY or UNIQUE KEY constraint "PK_BANCOS" on table "BANCOS"' then begin
    VerMensajeFmt(msgDatBancoRepetido, [UpperCase(TablaBancos.FieldByName('DESCRIPCION').AsString)]);
    TablaBancos.Edit;
  end
  else
    VerMensaje(E.Message);
end;

procedure TfrBancos.ActualizarBotones;
begin
  if BaseDatos.IsReadOnly then
  begin
    bAnadir.Enabled := False;
    bEliminar.Enabled := False;
    gridBancos.Enabled := False;
  end
  else begin
    bAnadir.Enabled := True;
    bEliminar.Enabled := True;
    gridBancos.Enabled := True;
  end;
end;

procedure TfrBancos.ActivarModoAnadir;
begin
  try
    with TablaBancos do
    begin
      Prepare;
      Open;
      ActualizarBotones;

      if RecordCount = 0 then
      begin
        Edit;
        FieldByName('DESCRIPCION').AsString := ' ';
        Post;
        Delete
      end
      else
      begin
        Edit;
        Post
      end;
    end;
    dmTablaBancos.InicializarGridBancos(gridBancos);
    except
    on E : EIBError do
    begin
      case E.IBErrorCode of
        isc_lock_conflict : begin
                              Rollback;
                              VerMensaje(msgDatBancoTablaBloq);
                              CloseFrame;
                            end
        else begin
          Rollback;
          TratarExcepcion(E);
        end;
      end;
    end;
    on E : Exception do begin
      Rollback;
      TratarExcepcion(E);
    end;
    end;
end;

end.
