Erro ao deletar um registro com referencia em outro.
Amigos ao tentar deletar um registro que tenha referencia em outra tabela aparece o erro abaixo.
---------------------------
Debugger Exception Notification
---------------------------
Project MATERIAIS.exe raised exception class EUIBError with message ´violation of FOREIGN KEY constraint "FK_FUNCIONARIO" on table "SEPARACAO"
Foreign key references are present for the record
violation of FOREIGN KEY constraint ""
Error Code: 146´.
---------------------------
Break Continue Help
--------------------------- Então criei um codigo com tratamento de exceções mas ainda da erro o codigo é esse abaixo: procedure TFrmFuncionario.btnDeletarClick(Sender: TObject);
begin
if Application.MessageBox(
'Tem certeza que deseja excluir o registro?',
'Confirmação', MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2) = mrYes then
begin
DataSource1.DataSet.Delete;
if DataSource1.DataSet is TClientDataSet then
begin
try
if (TClientDataSet(DataSource1.DataSet).ApplyUpdates(0) =0)then
DataSource1.OnStateChange(DataSource1);
except
application.MessageBox('Exclusão não Permitida,Registro Presente na Aplicatção','SEPARACAO',MB_ICONERROR);
end;
end;
end;
end;
end.
Sera que alguem pode me ajudar o chegar a solução do problema? obrigado....
Debugger Exception Notification
---------------------------
Project MATERIAIS.exe raised exception class EUIBError with message ´violation of FOREIGN KEY constraint "FK_FUNCIONARIO" on table "SEPARACAO"
Foreign key references are present for the record
violation of FOREIGN KEY constraint ""
Error Code: 146´.
---------------------------
Break Continue Help
--------------------------- Então criei um codigo com tratamento de exceções mas ainda da erro o codigo é esse abaixo: procedure TFrmFuncionario.btnDeletarClick(Sender: TObject);
begin
if Application.MessageBox(
'Tem certeza que deseja excluir o registro?',
'Confirmação', MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2) = mrYes then
begin
DataSource1.DataSet.Delete;
if DataSource1.DataSet is TClientDataSet then
begin
try
if (TClientDataSet(DataSource1.DataSet).ApplyUpdates(0) =0)then
DataSource1.OnStateChange(DataSource1);
except
application.MessageBox('Exclusão não Permitida,Registro Presente na Aplicatção','SEPARACAO',MB_ICONERROR);
end;
end;
end;
end;
end.
Sera que alguem pode me ajudar o chegar a solução do problema? obrigado....
Rogerio Sena
Curtidas 0
Respostas
Rogerio Sena
30/05/2011
Amigos ao tentar deletar um registro que tenha referencia em outra tabela aparece o erro abaixo.
---------------------------
Debugger Exception Notification
---------------------------
Project MATERIAIS.exe raised exception class EUIBError with message ´violation of FOREIGN KEY constraint "FK_FUNCIONARIO" on table "SEPARACAO"
Foreign key references are present for the record
violation of FOREIGN KEY constraint ""
Error Code: 146´.
---------------------------
Break Continue Help
--------------------------- Então criei um codigo com tratamento de exceções mas ainda da erro o codigo é esse abaixo: procedure TFrmFuncionario.btnDeletarClick(Sender: TObject);
begin
if Application.MessageBox(
'Tem certeza que deseja excluir o registro?',
'Confirmação', MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2) = mrYes then
begin
DataSource1.DataSet.Delete;
if DataSource1.DataSet is TClientDataSet then
begin
try
if (TClientDataSet(DataSource1.DataSet).ApplyUpdates(0) =0)then
DataSource1.OnStateChange(DataSource1);
except
application.MessageBox('Exclusão não Permitida,Registro Presente na Aplicatção','SEPARACAO',MB_ICONERROR);
end;
end;
end;
end;
end. Notei agora que o erro acontece na lina:if (TClientDataSet(DataSource1.DataSet).ApplyUpdates(0) =0)then
Sera que alguem pode me ajudar o chegar a solução do problema? obrigado....
Debugger Exception Notification
---------------------------
Project MATERIAIS.exe raised exception class EUIBError with message ´violation of FOREIGN KEY constraint "FK_FUNCIONARIO" on table "SEPARACAO"
Foreign key references are present for the record
violation of FOREIGN KEY constraint ""
Error Code: 146´.
---------------------------
Break Continue Help
--------------------------- Então criei um codigo com tratamento de exceções mas ainda da erro o codigo é esse abaixo: procedure TFrmFuncionario.btnDeletarClick(Sender: TObject);
begin
if Application.MessageBox(
'Tem certeza que deseja excluir o registro?',
'Confirmação', MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2) = mrYes then
begin
DataSource1.DataSet.Delete;
if DataSource1.DataSet is TClientDataSet then
begin
try
if (TClientDataSet(DataSource1.DataSet).ApplyUpdates(0) =0)then
DataSource1.OnStateChange(DataSource1);
except
application.MessageBox('Exclusão não Permitida,Registro Presente na Aplicatção','SEPARACAO',MB_ICONERROR);
end;
end;
end;
end;
end. Notei agora que o erro acontece na lina:if (TClientDataSet(DataSource1.DataSet).ApplyUpdates(0) =0)then
Sera que alguem pode me ajudar o chegar a solução do problema? obrigado....
GOSTEI 0
Wilson Junior
30/05/2011
No ClientDataSet existe o evento OnReconcileError, que serve para este tipo de erro.
Espero ter colaborado.
Espero ter colaborado.
GOSTEI 0
Rogerio Sena
30/05/2011
E como utilizo ?
GOSTEI 0
Rogerio Sena
30/05/2011
Obrigado por responder wilsom,mas nao tem uma forma de fazer usando um try except sem recorer a esse metódo que vc explicou pois eu nao tenho conhecimento sobre ele. Eu apenas quero que se houver o erro seja dada a mensagem que o registro esta sendo usado em outro formulario e seje cancelada a operação.
GOSTEI 0
Wilson Junior
30/05/2011
Ele é bem fácil de utilizar, olhe estes links:
http://www.mail-archive.com/delphi-br@yahoogrupos.com.br/msg20124.html
http://www.activedelphi.com.br/forum/viewtopic.php?t=58675&sid=19c8e644800f4200d8e17c9ab16d39e6
Espero ter colaborado.
http://www.mail-archive.com/delphi-br@yahoogrupos.com.br/msg20124.html
http://www.activedelphi.com.br/forum/viewtopic.php?t=58675&sid=19c8e644800f4200d8e17c9ab16d39e6
Espero ter colaborado.
GOSTEI 0
Rogerio Sena
30/05/2011
Bom dia colega wilson, vi os links mas ainda esta confuso pra mim, sera que vc nao poderia me ajudar em cima do código de exemplo que eu passei. Nao to sabendo fazer tentei pelo exemplo mas ta complicado.Me explica quando clico em deletar e em seguida confirmar o erro da na parte TClientDataSet(DataSource1.DataSet).ApplyUpdates(0) =0 usando o metodo reconcileerror ele pula esse erro e da a mensagem? clicando na mensagem é automaticamente abortada a deleção e volta a tela do formulario?
Obrigado...
GOSTEI 0
Wilson Junior
30/05/2011
Coloque este código no evento OnReconcileError do ClientDataSet:
No seu código coloque assim:
Espero ter colaborado.
if pos(UpperCase('violation of foreign key constraint'), UpperCase(e.Message)) > 0 then
Application.MessageBox( 'Exclusão não Permitida, Registro Presente na Aplicação'#13'Erro:'#13 + e.Message, 'SEPARACAO', MB_ICONERROR )
;
No seu código coloque assim:
if TClientDataSet(DataSource1.DataSet).ApplyUpdates(0) = 0 then
DataSource1.OnStateChange( DataSource1 )
else
ShowMessage('Ocorreu erro ao gravar!')
;
Espero ter colaborado.
GOSTEI 0
Rogerio Sena
30/05/2011
application.MessageBox( 'Exclusão não Permitida, Registro Presente na Aplicação'#13'Erro:'#13 + e.Message, 'SEPARACAO', MB_ICONERROR )
a palavra application nao esta passando.
GOSTEI 0
Rogerio Sena
30/05/2011
wilson inclui bibiotecas na uses e ficou assim :
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ExtCtrls, DBCtrls, StdCtrls, Buttons, Mask,DBClient, TConnect; ai passou o application, mas agora o erro esta no e.Message if pos(UpperCase('violation of foreign key constraint'), UpperCase(e.Message)) > 0 then
application.MessageBox( 'Exclusão não Permitida, Registro Presente na Aplicação'#13'Erro:'#13 + (TRAVOU AQUI-->e.Message), 'SEPARACAO', MB_ICONERROR );
;
Dialogs, DB, ExtCtrls, DBCtrls, StdCtrls, Buttons, Mask,DBClient, TConnect; ai passou o application, mas agora o erro esta no e.Message if pos(UpperCase('violation of foreign key constraint'), UpperCase(e.Message)) > 0 then
application.MessageBox( 'Exclusão não Permitida, Registro Presente na Aplicação'#13'Erro:'#13 + (TRAVOU AQUI-->e.Message), 'SEPARACAO', MB_ICONERROR );
;
GOSTEI 0
Rogerio Sena
30/05/2011
olá amigos ainda não consegui resolver o problema..
O colega wilson passou um código mas esta dando alguns erros.
quando clico no executável funciona da seguinte maneira.
Tento deletar um funcionario que esta referenciado em outra tabela e aparece a mensagem:
titulo confirmação
tem certeza que deseja excluir o registro?
sim não, ai eu clico em sim e aparece uma segunda mensagem:
titulo SEPARACAO que é a tabela que usa a referencia.
Exclusão não permitida,registro presente na aplicação
erro:
E.Message não , ao clicar em não aparece a terceira mensagem: titulo PSEPARACAO ocorreu um erro ao gravar! ok , ao clicar em ok o form fica vazio mas o registro não é excluido. Se eu rodar em tempo de desing(construção) não executa aparece o erro logo apos + E.Message,(aqui). [Error] UDMClient.pas(91): Incompatible types: 'String' and 'PAnsiChar' [Fatal Error] PSeparacao.dpr(16): Could not compile used unit 'UDMClient.pas' Tenho que declarar o pos como uma variavél? Não estou conseguindo fazer a coisas funcionar legal sera que alguem pode me ajudar? Obrigado amigos....
erro:
E.Message não , ao clicar em não aparece a terceira mensagem: titulo PSEPARACAO ocorreu um erro ao gravar! ok , ao clicar em ok o form fica vazio mas o registro não é excluido. Se eu rodar em tempo de desing(construção) não executa aparece o erro logo apos + E.Message,(aqui). [Error] UDMClient.pas(91): Incompatible types: 'String' and 'PAnsiChar' [Fatal Error] PSeparacao.dpr(16): Could not compile used unit 'UDMClient.pas' Tenho que declarar o pos como uma variavél? Não estou conseguindo fazer a coisas funcionar legal sera que alguem pode me ajudar? Obrigado amigos....
GOSTEI 0
Wilson Junior
30/05/2011
Você colocou a sua mensagem no evento OnReconcileError do ClientDataSet? Pois o "e.Message" que coloquei, vem deste evento.
Espero ter colaborado.
Espero ter colaborado.
GOSTEI 0
Rogerio Sena
30/05/2011
sim coloquei . Obrigado por responder
GOSTEI 0
Rogerio Sena
30/05/2011
Oi amigos bom dia.
Eu ainda não consegui resolver esse problema de deletar se o registro estiver sendo usado como referencia em outra tabela. Na verade se faz referencia não quero deletar mas sim que seja exibida uma mensagem avisando sobre a referencia em outra tabela, mas se nao faz referencia ai sim deletar.
Bom no evento onreconcileerror do clientdataset eu coloquei como o moderador wilsom informou:
procedure TDMClient.cdsFuncionarioReconcileError(
DataSet: TCustomClientDataSet; E: EReconcileError;
UpdateKind: TUpdateKind; var Action: TReconcileAction);
begin
if pos(UpperCase('violation of foreign key constraint'), UpperCase(e.Message)) > 0 then
application.MessageBox( 'Exclusão não Permitida, Registro Presente na Aplicação'#13'Erro:'#13 + E.Message, 'SEPARACAO', MB_ICONERROR );
; o erro em execução aparece depois da virgula E.Message,<--aqui. outra coisa tenho que declar alguma variável antes do begin? No formulario de funcionario o código para o botão deletar e esse: procedure TFrmFuncionario.btnDeletarClick(Sender: TObject);
begin
if Application.MessageBox(
'Tem certeza que deseja excluir o registro?',
'Confirmação', MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2) = mrYes then
begin
DataSource1.DataSet.Delete;
if DataSource1.DataSet is TClientDataSet then
if TClientDataSet(DataSource1.DataSet).ApplyUpdates(0) = 0 then
DataSource1.OnStateChange( DataSource1 )
else
ShowMessage('Ocorreu erro ao gravar!')
; To pesquisando em sites e foruns mas até agora nao consegui me desculpe se estou sendo demais com meus post mas quero aprender e não economizo esforços para issso rsrsrs...
DataSet: TCustomClientDataSet; E: EReconcileError;
UpdateKind: TUpdateKind; var Action: TReconcileAction);
begin
if pos(UpperCase('violation of foreign key constraint'), UpperCase(e.Message)) > 0 then
application.MessageBox( 'Exclusão não Permitida, Registro Presente na Aplicação'#13'Erro:'#13 + E.Message, 'SEPARACAO', MB_ICONERROR );
; o erro em execução aparece depois da virgula E.Message,<--aqui. outra coisa tenho que declar alguma variável antes do begin? No formulario de funcionario o código para o botão deletar e esse: procedure TFrmFuncionario.btnDeletarClick(Sender: TObject);
begin
if Application.MessageBox(
'Tem certeza que deseja excluir o registro?',
'Confirmação', MB_ICONQUESTION or MB_YESNO or MB_DEFBUTTON2) = mrYes then
begin
DataSource1.DataSet.Delete;
if DataSource1.DataSet is TClientDataSet then
if TClientDataSet(DataSource1.DataSet).ApplyUpdates(0) = 0 then
DataSource1.OnStateChange( DataSource1 )
else
ShowMessage('Ocorreu erro ao gravar!')
; To pesquisando em sites e foruns mas até agora nao consegui me desculpe se estou sendo demais com meus post mas quero aprender e não economizo esforços para issso rsrsrs...
GOSTEI 0
Rafael Mattos
30/05/2011
mas o que está acontecendo, pq não tem erro é só isso aqui mesmo
procedure TDMClient.cdsFuncionarioReconcileError(
DataSet: TCustomClientDataSet; E: EReconcileError;
UpdateKind: TUpdateKind; var Action: TReconcileAction);
begin
if Pos('VIOLATION OF FOREIGN KEY',UpperCase(E.Message))>0 then begin
Action := raCancel;
MessageDlg('Registro não pode ser excluido'+#13+
'Por ter relacionamento Pendente',mtWarning,[mbOK],0);
Exit;
end;
end;
GOSTEI 0
Wilson Junior
30/05/2011
Olhe este link http://www.planetadelphi.com.br/artigo/161/curso-delphi-%E2%80%93-criando-uma-aplicacao-do-inicio-ao-fim---parte-7
Espero ter colaborado.
Espero ter colaborado.
GOSTEI 0
Rogerio Sena
30/05/2011
obrigado consegui .
GOSTEI 0
José
30/05/2011
Este tópico esta sendo fechado por inatividade. Se necessário, sinalizar para que seja reaberto ou abrir um novo.
GOSTEI 0