Erro ao excluir dados de tabela detalhe

Delphi

18/10/2006

Terceiro post e mais importante.

Tenho duas tabelas uma mestre e outra detalhe, ta funcionando tudo belezinha, exceto na hora de excluir, todas as vezes q tento excluir, recebo a seguinte mensagem de erro:

Cannot delete master record with details

Como posso contornar esse problema?
Removendo todas os registros referentes a tabela mestre, da tabela detalhe antes da exclusão?

Agradeço desde já


Gardel

Gardel

Curtidas 0

Respostas

Ronaldo.cutu

Ronaldo.cutu

18/10/2006

bom dia

se sua tabela detalhes tem relacionamento com a mestre vc
primeiro tem excluir os itens da detalhes para depois escluir
a da mestre

att

Ronaldo


GOSTEI 0
Gardel

Gardel

18/10/2006

Sim, entendo e imaginei q fosse isso mesmo...

Porém, essa implementação de exclusão, eu fiz dentro do próprio banco de dados através de exclusão em cascata, pela chave estrangeira. Sendo assim gostaria que o delphi ignorasse esse erro, e permitisse que o proprio banco de dados realizasse essa operação.

Exemplo:
Qdo se faz o autoincremento dos campos chave primaria (cadastro de clientes por exemplo) por trigger, qdo adicionamos esses campos no dataset pelo delphi, esse campo vem com a propriedade required true, sendo assim toda vez q vc deixa o campo vazio e tenta salvar o registro ele gera o erro, dizendo que o campo é requerido, então coloca-se o valor da propriedade required como false, assim o erro não é gerado e o proprio banco trata de autoincrementar o campo usando a trigger.

Como no exemplo citado, o delphi ignora, e deixa o bd tratar, gostaria de saber se existe alguma maneira de fazer com que o delphi ignore esse erro e deixe o bd fazer as exclusão por si mesmo, visto que já está implementado dentro do banco.

Espero ter sido claro :)

Agradeço...


GOSTEI 0
Raserafim

Raserafim

18/10/2006

vc já prestou atenção se este erro tb ocorre quando está só a aplicação rodando sem o delphi estar aberto?
as vezes acontece erros que apenas o debugador do delphi pega, mas na aplicação para o cliente, este erro pode não aparecer.


GOSTEI 0
Gardel

Gardel

18/10/2006

Sim sim, observei...

Qdo dentro do Delphi, o erro ocorre, e a mensagem de erro é mostrada.
Qdo fora do delphi, ou seja, com o programa já para o cliente a mensagem de erro nao é mostrada, porém, simplesmente nada acontece, o registro da tabela mestre não é excluido, muito menos os da tabela detalhe.

Alguém tem alguma idéia de como resolver isso?

Agradeço.


GOSTEI 0
Nigro

Nigro

18/10/2006

Mas a função do banco é essa mesmo a de sobrepor a integridade referencial sobre a linguagem.


GOSTEI 0
Tiagorocha

Tiagorocha

18/10/2006

Deixa ver se eu tô entendendo direito...
1. Tem chave estrangeira apontando pra tabela master na tabela detail?
2. Tem ON UPDATE CASCADE nessa chave estrangeira?
3. E AINDA ASSIM NÃO FUNCIONA? Que estranho...


GOSTEI 0
Tiagorocha

Tiagorocha

18/10/2006

2. Tem [b:37278e63e6]ON UPDATE[/b:37278e63e6] CASCADE nessa chave estrangeira?

Digo... ON DELETE


GOSTEI 0
Gardel

Gardel

18/10/2006

Exato...

Dentro do banco (FireBird), na tabela detalhe tem a chave estrangeira que liga ela com a tabela Mestre e essa chave está confirurada pra excluir em cascata caso o registro da tabela Mestre seja excluido.

Sinceramente desisti de contornar o problema, estou deletando pelo Delphi mesmo, faço um loop na tabela detalhe excluindo todo os registros da tabela detalhe que tem o mesmo codigo da tabela mestre.

O erro sumiu assim, mais não entendo porque esse erro ocorre...

Obrigado pela ajuda,


GOSTEI 0
Tiagorocha

Tiagorocha

18/10/2006

Uma solução meio esquisita, porém comum no meio de desenvolvimento, é criar uma trigger no Before Delete da tabela master com um comando DELETE FROM DETALHE WHERE CODIGO=OLD.CODIGO ou coisa assim.
Eu só faria isso em último caso (num caso igual ao seu) :P


GOSTEI 0
Racastro

Racastro

18/10/2006

Após alterar a chave estrangeira da tabela detalhe para DELETE ON CASCADE, vá no ´DataSetProvider´ que está ligado à tabela MASTER e altere a opção ´poCascadeDeletes´ para TRUE. Pronto. Após essas alterações a exclusão deverá ocorrer sem problemas
Obrigada!!!


GOSTEI 0
T3r3son

T3r3son

18/10/2006

To passando pelo mesmo problema, preciso saber como excluir os itens (sqldataset+dsp+clientdataset)
Alguma sugestão???
[]´s
Evaristo


GOSTEI 0
Wanderok

Wanderok

18/10/2006

Ola.

Vejam se os registros da tabela detalhe nao estao linkados por algum objeto em seu projeto no momento da exclusao.


GOSTEI 0
Ricardoferreira_spa

Ricardoferreira_spa

18/10/2006

vai nas propriedades Options do dataserprovider e coloca pra true o
poCascadeDeletes e poCascadeUpdates

Esperto ter ajudado

[/code][/url]


GOSTEI 0
Osocram

Osocram

18/10/2006

Isso que o amigo Ricardo passou esta certo.

vai nas propriedades Options do dataserprovider e coloca pra true o poCascadeDeletes e poCascadeUpdates Esperto ter ajudado
[/code][/url]


So para complementar o que estava acontecendo no caso de vcs, é que no banco de dados esta em cascade mas no delphi não permite, tanto que se vc tentar excluir o registro direto no banco deve funcionar.
Alterando as configurações que nem o Ricardo comentou dae o provider vai permitir isso tbm.

Flw.


GOSTEI 0
POSTAR