{
===============================================================================
  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 unidades de medida con misma descripcion), arreglo de
                  el boton cancelar de el mensaje "esta seguro que desea eliminar"

===============================================================================
}

unit UnidadesMedida;

interface

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

type
  TfrUnidadesMedida = class(TRdxDBFrame)
    BarraUnidadesMedida: TRdxBarraSuperior;
    dsBancos: TDataSource;
    brDoble: TRdxBarraInferior;
    bAceptar: TRdxBoton;
    bCancelar: TRdxBoton;
    pnlCuerpo: TRdxPanel;
    pnlGrid: TRdxPanel;
    pnlBotones: TRdxPanel;
    bAnadir: TRdxBoton;
    bEliminar: TRdxBoton;
    gridUnidadesMedida: TdxDBGrid;
    procedure bAnadirClick(Sender: TObject);
    procedure bEliminarClick(Sender: TObject);
    procedure bAceptarClick(Sender: TObject);
    procedure bCancelarClick(Sender: TObject);
  private
    TablaUnidadesMedida : 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
  frUnidadesMedida: TfrUnidadesMedida;

implementation

{$R *.DFM}

{ TfrUnidadesMedida }

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

constructor TfrUnidadesMedida.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  Application.OnException := AppException;
  Entidad := entUnidadesMedida;
  ConfigurarFrame(Self, Self.Entidad);

  BaseDatos := dmBaseDatos.BD;
  Transaccion := dmBaseDatos.Transaccion;
  TablaUnidadesMedida := TIBDataSet.Create(Self);
  TablaUnidadesMedida.AfterInsert := BancosAfterInsert;
  dsBancos.DataSet := TablaUnidadesMedida;

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

destructor TfrUnidadesMedida.Destroy;
begin
  Application.OnException := NIL;
  TablaUnidadesMedida.Close;
  TablaUnidadesMedida.UnPrepare;
  TablaUnidadesMedida.Free;
  inherited;
end;

procedure TfrUnidadesMedida.bAnadirClick(Sender: TObject);
begin
    TablaUnidadesMedida.Append;
    gridUnidadesMedida.SetFocus;
end;

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

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

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

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

procedure TfrUnidadesMedida.AppException(Sender: TObject; E: Exception);
begin
  if E.Message = 'Field ''DESCRIPCION'' must have a value' then begin
    VerMensaje(msgUniMedFaltaDes);
    TablaUnidadesMedida.Edit;
  end
  else if E.Message = 'violation of PRIMARY or UNIQUE KEY constraint "PK_UNIDADESMEDIDA" on table "UNIDADESMEDIDA"' then begin
    VerMensajeFmt(msgUniMedRepetida, [UpperCase(TablaUnidadesMedida.FieldByName('DESCRIPCION').AsString)]);
    TablaUnidadesMedida.Edit;
  end
  else
    VerMensaje(E.Message);
end;

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

procedure TfrUnidadesMedida.ActivarModoAnadir;
begin
  try
    with TablaUnidadesMedida do
    begin
      Prepare;
      Open;
      ActualizarBotones;

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

end.
