duvida clientdataset e firebird
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
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
Curtidas 0
Respostas
Vinicius2k
02/07/2004
Colega,
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+
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
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.
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
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 :
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+
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
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.
Agora, se vc nao quiser esquentar a cabeça com isso, mude sua rotina para:
Aí ele vai avisar se houver qualquer tipo de violação de qualquer índice.
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
02/07/2004
valeu ai pessoal, consegui o que queria
GOSTEI 0