Erro Key Violation - Ja tentei tratar e nao consegui
30/11/2005
0
Ola amigos... venho aki pra mais uma vez tentar resolver um pequeno problema.
Tenho um banco feito em interbase, e estou usando dbexpress(sqlconnection,sqldataset, provider e clientdataset).
Quando tento incluir um registro que ja existe acusa o erro ´key violation´.
Este campo não pode ser auto incremento... pois a chave primária dele não segue um padrão.
ja tentei tratar com este codigo mas nao resolveu, acredit que seja pq ele foi descrito para uso do BDE. Nao consegui transferir este código pra dbexpress.
[color=blue:b3f057f020]Inclua a unit DBITYPES na clausula uses
procedure TForm1.Table1PostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);
begin
if EDBEngineError(E).Errors[0].ErrorCode = 9729 then
ShowMessage(´Registro já existe!´);
Action:= daAbort;
end;[/color:b3f057f020]
Também estou tentando verificar se um dbedit foi alterado. para isto estou usando o seguinte código que não funciona no evento onexit:
[color=blue:b3f057f020]If DMdados.CDSpecas.State= dsEdit then
begin
if DBEdit2.OnChange=true then
begin
if qrycodigo.Locate(´codpeca´,dbedit2.Text,[])=true then
begin
ShowMessage(´Este codigo já existe, escolha outro!´);
DBEdit2.SetFocus;
end;
end;
end;[/color:b3f057f020]
a mensagem de erro q aparece é: ´not enough actual parameters´, mas não sei que parametros são esses... se alguem souber eu agradeço. obrigado.
Tenho um banco feito em interbase, e estou usando dbexpress(sqlconnection,sqldataset, provider e clientdataset).
Quando tento incluir um registro que ja existe acusa o erro ´key violation´.
Este campo não pode ser auto incremento... pois a chave primária dele não segue um padrão.
ja tentei tratar com este codigo mas nao resolveu, acredit que seja pq ele foi descrito para uso do BDE. Nao consegui transferir este código pra dbexpress.
[color=blue:b3f057f020]Inclua a unit DBITYPES na clausula uses
procedure TForm1.Table1PostError(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction);
begin
if EDBEngineError(E).Errors[0].ErrorCode = 9729 then
ShowMessage(´Registro já existe!´);
Action:= daAbort;
end;[/color:b3f057f020]
Também estou tentando verificar se um dbedit foi alterado. para isto estou usando o seguinte código que não funciona no evento onexit:
[color=blue:b3f057f020]If DMdados.CDSpecas.State= dsEdit then
begin
if DBEdit2.OnChange=true then
begin
if qrycodigo.Locate(´codpeca´,dbedit2.Text,[])=true then
begin
ShowMessage(´Este codigo já existe, escolha outro!´);
DBEdit2.SetFocus;
end;
end;
end;[/color:b3f057f020]
a mensagem de erro q aparece é: ´not enough actual parameters´, mas não sei que parametros são esses... se alguem souber eu agradeço. obrigado.
Wagsilvasilva
Curtir tópico
+ 0
Responder
Posts
01/12/2005
Helderjr
Cara uso o Firebird e crie a seguinte rotina.
var lSair : Boolean;
begin
lSair := False;
while not (lSair) do
begin
try
lSair := True;
with QrTabela do
begin
Sql.Clear;
Sql.Add( DbScriptInsert(´TABELA´,[´Codigo´ ,´Nome´ ] ) )
ParamByName(´Codigo´).Value := EdCodigo.Value;
ParamByName(´Nome´).Value := EdNome.Text;
ExecSQL();
end;
except
on Exc:Exception do
begin
if MenKeyViolation( Exc.Message, lSair ) then
EdCodigo.value := EdCodigo.Value + 1;
end;
end;
end;
Essa função MenKeyViolation verifica se dentro da mensagem Exc.Message contem a string ´´Error Code: 345´ que representa o erro key violation. O insert esta dentro de um while q soma 1 no campo codigo q é minha chave primaria até encontrar um codigo q não existe.
Como vc disse q sua chave primaria não tem um padrão, ai vc tem q fazer o tratamento do erro conforme sua necessidade.
var lSair : Boolean;
begin
lSair := False;
while not (lSair) do
begin
try
lSair := True;
with QrTabela do
begin
Sql.Clear;
Sql.Add( DbScriptInsert(´TABELA´,[´Codigo´ ,´Nome´ ] ) )
ParamByName(´Codigo´).Value := EdCodigo.Value;
ParamByName(´Nome´).Value := EdNome.Text;
ExecSQL();
end;
except
on Exc:Exception do
begin
if MenKeyViolation( Exc.Message, lSair ) then
EdCodigo.value := EdCodigo.Value + 1;
end;
end;
end;
Essa função MenKeyViolation verifica se dentro da mensagem Exc.Message contem a string ´´Error Code: 345´ que representa o erro key violation. O insert esta dentro de um while q soma 1 no campo codigo q é minha chave primaria até encontrar um codigo q não existe.
Como vc disse q sua chave primaria não tem um padrão, ai vc tem q fazer o tratamento do erro conforme sua necessidade.
Responder
Clique aqui para fazer login e interagir na Comunidade :)