duvida clientdataset e firebird

Delphi

02/07/2004

Estou começando a usar dbExpress e Firebird 1.5.

Preciso evitar que o usuario cadastre um registro repetido, minha tabela tem o campo código como chave primaria, fiz o seguinte,no evento OnPostError do clientdataset coloquei o seguinte codigo:

if (copy(e.Message,1,13))=´KEY VIOLATION´ then
begin
action:=DaAbort;
showmessage(´Já existe Operador com este Código - Favor Corrigir´);

mas quando coloco um registro repetido ele não funciona e aparece a seguinte mensagem

´violation of PRIMARY or UNIQUE KEY constraint ´INTEG_2´ on table ´OPERADOR´.

não estou sabendo como fazer, se alguem souber como tratar isso por favor me mande.

Obrigado


Gameiro

Gameiro

Curtidas 0

Respostas

Vinicius2k

Vinicius2k

02/07/2004

Colega,
if (copy(e.Message,1,13))=[color=red:6f9c3b1229]´KEY VIOLATION[/color:6f9c3b1229]´ then...

[color=red:6f9c3b1229]violation of PRIMARY or UNIQUE KEY [/color:6f9c3b1229]constraint ´INTEG_2´ on table ´OPERADOR´.


Se vc pretende tratar a exceção desta maneira precisa comparar o E.Message com a mensagem que é retornada do banco... ´Key Violation´ eh parte do retorno da mensagem usando paradox... para IB/FB a mensagem é diferente, como vc mesmo citou...

Espero ter ajudado...
T+


GOSTEI 0
Gameiro

Gameiro

02/07/2004

Valeu Vinicius,
já coloquei a mensagem do Firebird, mas mesmo assim da o erro.
Mudei a quantiade de caracteres do comando copy e nãoda certo.


GOSTEI 0
Vinicius2k

Vinicius2k

02/07/2004

Bem,
Como vc está usando ClientDataSet não vai ocorrer nenhum erro no Post, pq vc está postando o registro no Buffer... o erro só irá ocorrer no ApplyUpdates e também não será uma exceção... apenas um erro controlado internamente pelo ClientDataSet...
Creio que o q vc deve fazer seja :
if ClientDataSet.ApplyUpdates > 0 then
  // houve erro, aborte aqui com ClientDataSet.CancelUpdates, por exemplo...
  ...

Para verificar a mensagem de erro vc deve usar o evento OnReconcileError do ClientDataSet, e neste evento escrever a rotina, já adaptada à mensagem de erro do FB...

Espero ter ajudado...
T+


GOSTEI 0
Thiago Vidal

Thiago Vidal

02/07/2004

Se voce estiver utilizando um ClientDataSet e sua base de dados não tiver muitos registros, voce pode validar antes de enviar, usando o metodo CloneCursor

Segue um exemplo... se alguem tiver alguma recomendação para não utilizar este método, por favor me avise.... descobri isso há pouco tempo e me têm sido muito útil ultimamente.

  function CheckValidLogin(Login: string; cdsTemp: TClientDataSet): Boolean;
    with TClientDataSet.Create(nil) do try
      [b]CloneCursor(cdsTemp), True);[/b]
      // É válido se o login não for encontrado
      Result := not Locate(´LOGIN´, Login, [loCaseInsensitive]);
      // Se for encontrado, é válido se estivermos falando do mesmo registro
      if not Result then
      Result := FieldByName(´id_usuario´).AsInteger = cdsTemp.FieldByName(´id_usuario´).AsInteger;
    finally
      Free;
    end;
  end;


Agora, se vc nao quiser esquentar a cabeça com isso, mude sua rotina para:
if (Pos(´VIOLATION´, UpperCase(E.Message)) > 0) then ...


Aí ele vai avisar se houver qualquer tipo de violação de qualquer índice.


GOSTEI 0
Gameiro

Gameiro

02/07/2004

valeu ai pessoal, consegui o que queria


GOSTEI 0
POSTAR