Problema com chave primaria!

Delphi

19/05/2009

Estou tentando apagar o registro_detalhe e esta dando erro no indice com a tabela_master. O que fazer?

´Violation of FOREIGN_KEY constraint indice table on tabela_master´

Delphi6, interbase 6


Fausto.malheiros

Fausto.malheiros

Curtidas 0

Respostas

Diegus

Diegus

19/05/2009

Coloca aqui como vc ta fazendo esse procedimento de exclusão...


GOSTEI 0
.lg.

.lg.

19/05/2009

Sua tabela faz ligação com alguma outra tabela.

Você está tentando apagar um registro onde ele tem dados relacionado em outra tabela.

Verifica a se a tabela tem integridade estrutural com outras tabelas. Se tiver... e houver dados... vc não vai conseguir apagar os campos.

so 1 dúvida:
Registro_detalhe é uma tabela!?


GOSTEI 0
Fausto.malheiros

Fausto.malheiros

19/05/2009

Registro_detalhe é uma tabela!?


O registro_detalhe esta contido dentro da tabela cliente.

exemplo: Quando vou apagar o cliente ele da um erro na tabela_master, de cidade. Se eu estivesse excluindo a cidade codigo = 20, concordo que daria o erro, pois tem varios clientes cadastrado na cidade codigo = 20, mas estou fazendo o contrario. Estou escluindo o cliente, não poderia dar esse erro.

codigo abaixo:


[b:304e366fa3][color=red:304e366fa3]Essa qry tem a função de buscar somente os codigos de parcelamento[/color:304e366fa3][/b:304e366fa3]
QryAtualizaParcelamento.Close;
QryAtualizaParcelamento.Params[0].AsInteger := StrToInt(EdtAnoExercicio.Text);
QryAtualizaParcelamento.Open;
while not QryAtualizaParcelamento.Eof do
begin
QryTrabalho.Close;
QryTrabalho.SQL.Clear;
[b:304e366fa3][color=red:304e366fa3]essa tabela é detalhe da tabela de baixo[/color:304e366fa3][/b:304e366fa3]
QryTrabalho.SQL.add(´delete from [color=orange:304e366fa3]parcelamento_inscricao[/color:304e366fa3] p ´);
QryTrabalho.SQL.add(´where p.codigo_parcelamento = ´ + QryAtualizaParcelamento.FieldByName(´codigo_parcelamento´).AsString);
QryTrabalho.ExecSQL;
QryAtualizaParcelamento.Next;
end;

StbMensagem.SimpleText := ´Aguarde, pesquisando parcelas... ´;
self.Update;
QryAtualizaParcelamento.First;
while not QryAtualizaParcelamento.Eof do
begin
QryTrabalho.Close;
QryTrabalho.SQL.Clear;
[b:304e366fa3][color=red:304e366fa3]essa tabela é detalhe da tabela de baixo que preciso deletar[/color:304e366fa3][/b:304e366fa3]
QryTrabalho.SQL.add(´delete from [color=orange:304e366fa3]parcelas[/color:304e366fa3] p ´);
QryTrabalho.SQL.add(´where p.codigo_parcelamento = ´ + QryAtualizaParcelamento.FieldByName(´codigo_parcelamento´).AsString);
QryTrabalho.ExecSQL;
QryAtualizaParcelamento.Next;
end;

StbMensagem.SimpleText := ´Aguarde, atualizando BANCO DE DADOS... ´;
self.Update;
DtmDados.SQLBanco.Commit(TD);

StbMensagem.SimpleText := ´Aguarde, excluindo DÍVIDAS... ´;
self.Update;
DtmDados02.QryExcluiDivida.Close;
DtmDados02.QryExcluiDivida.ParamByName(´ano_exercicio´).AsInteger := StrToInt(EdtAnoExercicio.Text);
[b:304e366fa3][color=red:304e366fa3]aqui esta dando o erro em relação ás tabelas excluidas acima[/color:304e366fa3][/b:304e366fa3]
DtmDados02.QryExcluiDivida.ExecSQL;


GOSTEI 0
.lg.

.lg.

19/05/2009

Qual comando sql tem dentro da query [b:8b0b707b10]QryExcluiDivida[/b:8b0b707b10]?


GOSTEI 0
Fausto.malheiros

Fausto.malheiros

19/05/2009

delete from divida_ativa d where d.ano_exercicio = :ano_exercicio and not Exists(select * from parcelamento_inscricao i where i.ano_exercicio = d.ano_exercicio and i.inscricao = d.inscricao and not exists(select * from parcelas p where p.codigo_parcelamento = i.codigo_parcelamento and not p.data_pagamento is null) )


Eu só posso excluir uma divida, se não tiver nenhum parcelamento em aberto.

Por isso no codigo eu excluo primeiro os parcelamentos e suas parcelas, usando como parametro o ano_exercicio.

Uma vez excluidas as parcelas, dai sim, excluo as dividas, usando o mesmo parametro, ano_exercicio.

DtmDados02.QryExcluiDivida.Close; DtmDados02.QryExcluiDivida.ParamByName(´ano_exercicio´).AsInteger := StrToInt([b:b1f32f9773]EdtAnoExercicio.Text[/b:b1f32f9773]); DtmDados02.QryExcluiDivida.ExecSQL;



GOSTEI 0
.lg.

.lg.

19/05/2009

Desculpe não ter repondido na sexta em diante... a partir das 5:30pm meu fds é totalmente apertado. Seria bom se os fds tivessem 3 dias. Mas... voltemos ao seu problema.

Estou meio que entre alguns palpites...
Para eliminar os meus palpites... Você poderia mostrar o relacionamento entre as tabelas desse procedimento!?
Eis as tabelas que enxergei no seu procedimento:
- DIVIDA_ATIVA
- PARCELAMENTO_INSCRICAO
- PARCELAS

Só mostre nas tabelas as colunas que tiverem foreign Key ( vindo de qual tabela ) e as colunas com Primary Key. Não precisa mostrar as demais colunas.

Tem jeito?


GOSTEI 0
Fausto.malheiros

Fausto.malheiros

19/05/2009

Blz .Ig.!

Sem problema algum amigo! Eu que agradeço o fato de vcs estar me ajudando.

ocorreu o seguinte: quando eu estava montando pra vc o relacionamento das tabelas, surgiu uma quarta tabela nessa coisa toda. A tabela PARCELAS.

Como eu disse anteriormente, não fui eu que desenvolvi esse sistema e estou apanhando em algumas coisas.

Achoque o problema esta aqui:

(violation of FOREIGN KEY constraint ´FK_PARCELAS_PARCELAMENTO´ [b:b1a5a07b20]on table ´PARCELAS[/b:b1a5a07b20]´)

Quando acorre essa mensagem de erro acima, é por que eu tenho que apagar ´primeiro´ a tabela que esta no [b:b1a5a07b20]´on table ´tabela_qualquer´[/b:b1a5a07b20] , depois apagar a tabela corrente certo?


GOSTEI 0
.lg.

.lg.

19/05/2009

Da uma olhada no relacionamento entre a tabela PARCELA e a tabela PARCELAMENTO.

Pelo nome da foreign key. O problema está aí. Dá uma olhada no que essa FK restringe entre as 2 tabelas e veja o que você está tentando fazer.


GOSTEI 0
POSTAR