Fórum Erro ao deletar um registro com referencia em outro. #401970

30/05/2011

0

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....
Rogerio Sena

Rogerio Sena

Responder

Posts

30/05/2011

Rogerio Sena

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....
Responder

Gostei + 0

30/05/2011

Wilson Junior

No ClientDataSet existe o evento OnReconcileError, que serve para este tipo de erro.

Espero ter colaborado.
Responder

Gostei + 0

30/05/2011

Rogerio Sena

E como utilizo ?
Responder

Gostei + 0

30/05/2011

Rogerio Sena

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.
Responder

Gostei + 0

30/05/2011

Wilson Junior

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.
Responder

Gostei + 0

31/05/2011

Rogerio Sena

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...
Responder

Gostei + 0

31/05/2011

Wilson Junior

Coloque este código no evento OnReconcileError do ClientDataSet:

  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.
Responder

Gostei + 0

31/05/2011

Rogerio Sena

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.
Responder

Gostei + 0

31/05/2011

Rogerio Sena

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 );
;
Responder

Gostei + 0

09/06/2011

Rogerio Sena

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....
Responder

Gostei + 0

09/06/2011

Wilson Junior

Você colocou a sua mensagem no evento OnReconcileError do ClientDataSet? Pois o "e.Message" que coloquei, vem deste evento.

Espero ter colaborado.
Responder

Gostei + 0

09/06/2011

Rogerio Sena

sim coloquei . Obrigado por responder
Responder

Gostei + 0

13/06/2011

Rogerio Sena

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...
Responder

Gostei + 0

14/06/2011

Rafael Mattos

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;


Responder

Gostei + 0

14/06/2011

Wilson Junior

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.
Responder

Gostei + 0

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

Aceitar