Fórum duvida clientdataset e firebird #241048
02/07/2004
0
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
Curtir tópico
+ 0Posts
02/07/2004
Vinicius2k
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
02/07/2004
Gameiro
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
02/07/2004
Vinicius2k
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
02/07/2004
Thiago Vidal
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
02/07/2004
Gameiro
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)