Violação de Chave
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
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
Curtidas 0
Respostas
Afarias
18/10/2003
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+
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+
GOSTEI 0
Valdirdill
18/10/2003
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.
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+
GOSTEI 0