Fórum Violation Foreig Key Contrait - Problemas com chave FK? #57672
11/01/2007
0
Pessoal agora que achei que estava pronta minha primeira S.Proc. :D
Me deparei com o problema para deletar :(
Isto ainda pq nem fiz o Update, espero que nao tenha porblemas tambem...hehehe
Bom,
Tenho uma tabela Meste e outra detalhe com um campo chamado sequencia que faz referencia, ai vou deletar em cascata, mais esta ocorrendo erro assim
[b:11dfb07f5a][color=red:11dfb07f5a]´violation foreign key contraint FK_Debito_1 on table Debito foreign key references are present for the record´[/color:11dfb07f5a][/b:11dfb07f5a]
Bom no delphi tenho um query para deletar assim
Antes quando nao usava S.Procedure funcionava, mais tambem estava um pouco diferente minha unit, mais agora nao funciona mais e mostra o erro acima:
Vou deixar postado minhas duas tabelas pra ver se tem haver
Tabela Mestre
E a Tabela Detalhe
Bom esta ai como criei as 2 tabelas
Agradeço a ajuda de todos
Adriano.
Me deparei com o problema para deletar :(
Isto ainda pq nem fiz o Update, espero que nao tenha porblemas tambem...hehehe
Bom,
Tenho uma tabela Meste e outra detalhe com um campo chamado sequencia que faz referencia, ai vou deletar em cascata, mais esta ocorrendo erro assim
[b:11dfb07f5a][color=red:11dfb07f5a]´violation foreign key contraint FK_Debito_1 on table Debito foreign key references are present for the record´[/color:11dfb07f5a][/b:11dfb07f5a]
Bom no delphi tenho um query para deletar assim
procedure TFConta.b5Click(Sender: TObject); var ok: boolean; begin if Tag = 1 then begin beep; ShowMessage(´Este comando não está diponivel para este evento!´); Exit; end; if trim(edit1.text)=´´ then begin showmessage(´Selecione o codigo que vc deseja excluir´); end else if application.messagebox(Pchar(´Deseja Excluir este Lançamento:´ + #13+´Mes do Lançamento: ´+dm.qtbcontalanDataExtenso.AsString + 13+´Dia/Data do Lançamento: ´+dm.qtbcontalanData.AsString +13+´Valor do Lançamento: ´+dm.qtbcontalan.fieldbyname(´valor´).AsString+13+´Histórico: ´+13+ dm.qtbcontalanhistorico.AsString), Pchar(´Excluir Dados´+Self.Caption), MB_ICONQUESTION + MB_YESNO) = IDYES then begin try // começo do finally try //começo co except unie o laço with dm.qtbcontalan do begin close; sql.clear; sql.add(´delete from tbconta´); //codigo SQL para deletar linha sql.add(´where sequencia = ´+quotedstr(edit1.text)+´´); ExecSQL; end; except application.MessageBox(´Erro na Gravação! Tente Novamente!´,´Aviso´,mb_ok+mb_iconexclamation); ok:=false; editV; //procedure da unit funçoes
Antes quando nao usava S.Procedure funcionava, mais tambem estava um pouco diferente minha unit, mais agora nao funciona mais e mostra o erro acima:
Vou deixar postado minhas duas tabelas pra ver se tem haver
Tabela Mestre
SET SQL DIALECT 3; SET NAMES ISO8859_1; /******************************************************************************/ /*** Tables ***/ /******************************************************************************/ CREATE TABLE TBCONTA ( SEQUENCIA INTEGER NOT NULL, CONTAD VARCHAR(10), CONTAC VARCHAR(10), VALOR NUMERIC(15,2), DESCRICAO BLOB SUB_TYPE 1 SEGMENT SIZE 80, DATA DATE, VALORD NUMERIC(15,2), VALORC NUMERIC(15,2), DC CHAR(1), CONTA VARCHAR(10), DATAEXTENSO VARCHAR(30), MES VARCHAR(2), ANO VARCHAR(4), MARCAR CHAR(1), HISTORICO VARCHAR(100) COLLATE PT_PT, NOMECD VARCHAR(50), NOMECC VARCHAR(50), NUMCONTAD VARCHAR(10), NUMCONTAC VARCHAR(10), NOMECONTA VARCHAR(50), NUMCONTA VARCHAR(10) ); /******************************************************************************/ /*** Primary Keys ***/ /******************************************************************************/ ALTER TABLE TBCONTA ADD CONSTRAINT PK_TBCONTA PRIMARY KEY (SEQUENCIA) USING DESCENDING INDEX PK_TBCONTA; /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE DESCENDING INDEX IDXCONTA ON TBCONTA (SEQUENCIA); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: AUTOINCRCONTA */ CREATE TRIGGER AUTOINCRCONTA FOR TBCONTA ACTIVE BEFORE INSERT POSITION 0 AS begin if (new.sequencia is null) then select coalesce(max(sequencia),0)+1 from tbconta into new.sequencia; end ^ /* Trigger: RETRCONTA */ CREATE TRIGGER RETRCONTA FOR TBCONTA ACTIVE AFTER DELETE POSITION 0 AS begin UPDATE tbconta SET SEQUENCIA = SEQUENCIA - 1 WHERE SEQUENCIA > OLD.SEQUENCIA; end ^ SET TERM ; ^
E a Tabela Detalhe
SET SQL DIALECT 3; SET NAMES ISO8859_1; /******************************************************************************/ /*** Tables ***/ /******************************************************************************/ CREATE TABLE DEBITO ( SEQUENCIA INTEGER NOT NULL, CONTAD VARCHAR(15), VALOR NUMERIC(15,2), HISTORICO VARCHAR(100), MES VARCHAR(2), ANO VARCHAR(4), DATA DATE, CONTA VARCHAR(15) ); /******************************************************************************/ /*** Foreign Keys ***/ /******************************************************************************/ ALTER TABLE DEBITO ADD CONSTRAINT FK_DEBITO_1 FOREIGN KEY (SEQUENCIA) REFERENCES TBCONTA (SEQUENCIA) ON DELETE CASCADE ON UPDATE CASCADE; /******************************************************************************/ /*** Indices ***/ /******************************************************************************/ CREATE DESCENDING INDEX IDXDEBITO ON DEBITO (SEQUENCIA); /******************************************************************************/ /*** Triggers ***/ /******************************************************************************/ SET TERM ^ ; /******************************************************************************/ /*** Triggers for tables ***/ /******************************************************************************/ /* Trigger: TR_AUTOINC_DEBITO */ CREATE TRIGGER TR_AUTOINC_DEBITO FOR DEBITO ACTIVE BEFORE INSERT POSITION 0 AS begin /* Trigger text autoincremento */ if (new.sequencia is null) then select coalesce(max(sequencia),0)+1 from debito into new.sequencia; end ^ /* Trigger: TR_RETR_DEBITO */ CREATE TRIGGER TR_RETR_DEBITO FOR DEBITO ACTIVE AFTER DELETE POSITION 0 AS begin /* Trigger text retroceder debito*/ UPDATE debito SET SEQUENCIA = SEQUENCIA - 1 WHERE SEQUENCIA > OLD.SEQUENCIA; end ^ SET TERM ; ^
Agradeço a ajuda de todos
Adriano.
Adriano_servitec
Curtir tópico
+ 0
Responder
Posts
12/01/2007
Adriano_servitec
Ja sei o motivo, eh por causa desta trigger
Mais no caso vou precisar tirar essa trigger aki tambem
Pena pois eu usava ela para organizar o campo sequencia. :cry:
Gotaria de manter organizada a sequencia, mais ja que nao tem jeito, entao resolvi retirar as trigger
/* Trigger: TR_RETR_DEBITO */ CREATE TRIGGER TR_RETR_DEBITO FOR DEBITO ACTIVE AFTER DELETE POSITION 0 AS begin /* Trigger text retroceder debito*/ UPDATE debito SET SEQUENCIA = SEQUENCIA - 1 WHERE SEQUENCIA > OLD.SEQUENCIA; end ^ SET TERM ; ^
Mais no caso vou precisar tirar essa trigger aki tambem
/* Trigger: RETRCONTA */ CREATE TRIGGER RETRCONTA FOR TBCONTA ACTIVE AFTER DELETE POSITION 0 AS begin UPDATE tbconta SET SEQUENCIA = SEQUENCIA - 1 WHERE SEQUENCIA > OLD.SEQUENCIA; end ^ SET TERM ; ^
Pena pois eu usava ela para organizar o campo sequencia. :cry:
Gotaria de manter organizada a sequencia, mais ja que nao tem jeito, entao resolvi retirar as trigger
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)