Fórum Violação de Chave #39547

18/10/2003

0

Pessoal !!!

Como faço para tratar um erro de violação de chave assim que digitar um código que já existe na tabela e se código sendo chave primária.
Quando digitar este código quero fazer de uma forma que já verifica se esse código já existe ou não, antes de dar um post



Rogério


Roger_prog

Roger_prog

Responder

Posts

18/10/2003

Afarias

existem duas abordágens bem diferentes ai para tratar ´códigos duplicados´ -- uma (a mais correta) é capturar a exceção do banco e informar q o código está duplicado, claro q está só é possível durante o POST do registro (ou no ApplyUpdates se estiver usando CDS).

sendo assim seria feito algo como::

try
Post;
except
{trata a excessão -- verificando se erro de chave primária}
{emite a mensagem de informação ao usuário}
end;


a outra, e me parece q o q vc quer, é informar q o código está duplicado no momento da digitação (antes do usuário postar as alterações) -- neste caso, vc pode usar uma consulta de apoio para fornecer tal informação::

with IBSQL1 do
try
SQL.Text := ´select ´OK´ from rdb$database where exists (select 1 from minha_tabela where campo_codigo = :codigo´;
Transaction.StartTransaction;
Params[0].AsInteger := codigo_digitado;
ExecQuery
if Fields[0].AsString = ´OK´ then // ou Fields[0].AsString <> ´´
ShowMessage(´código já existe!´);
finally
Transaction.Commit;
end;


bom... claro q este método NÃO substitui o outro, apenas complementa -- o tratamento da exceção tem q existir -- imagine q no momento q o usuário digitou o código, este não existia ... mas o registro ainda não foi gravado, de forma que, entre o tempo da digitação do código e então digitação dos demais dados e então gravação do registro, é possível q alguem na rede tenha cadastrado (e gravado) este mesmo código.


T+


Responder

Gostei + 0

07/03/2005

Valdirdill

Não etendi a linha
SQL.Text := ´select ´OK´ from rdb$database where exists (select 1 from minha_tabela where campo_codigo = :codigo´;
Não funciona.


existem duas abordágens bem diferentes ai para tratar ´códigos duplicados´ -- uma (a mais correta) é capturar a exceção do banco e informar q o código está duplicado, claro q está só é possível durante o POST do registro (ou no ApplyUpdates se estiver usando CDS). sendo assim seria feito algo como:: try Post; except {trata a excessão -- verificando se erro de chave primária} {emite a mensagem de informação ao usuário} end; a outra, e me parece q o q vc quer, é informar q o código está duplicado no momento da digitação (antes do usuário postar as alterações) -- neste caso, vc pode usar uma consulta de apoio para fornecer tal informação:: with IBSQL1 do try SQL.Text := ´select ´OK´ from rdb$database where exists (select 1 from minha_tabela where campo_codigo = :codigo´; Transaction.StartTransaction; Params[0].AsInteger := codigo_digitado; ExecQuery if Fields[0].AsString = ´OK´ then // ou Fields[0].AsString <> ´´ ShowMessage(´código já existe!´); finally Transaction.Commit; end; bom... claro q este método NÃO substitui o outro, apenas complementa -- o tratamento da exceção tem q existir -- imagine q no momento q o usuário digitou o código, este não existia ... mas o registro ainda não foi gravado, de forma que, entre o tempo da digitação do código e então digitação dos demais dados e então gravação do registro, é possível q alguem na rede tenha cadastrado (e gravado) este mesmo código. T+



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar