Erro ao excluir dados de tabela detalhe
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á
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
Curtidas 0
Respostas
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
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
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...
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
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.
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
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.
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
18/10/2006
Mas a função do banco é essa mesmo a de sobrepor a integridade referencial sobre a linguagem.
GOSTEI 0
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...
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
18/10/2006
2. Tem [b:37278e63e6]ON UPDATE[/b:37278e63e6] CASCADE nessa chave estrangeira?
Digo... ON DELETE
GOSTEI 0
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,
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
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
Eu só faria isso em último caso (num caso igual ao seu) :P
GOSTEI 0
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!!!
Obrigada!!!
GOSTEI 0
T3r3son
18/10/2006
To passando pelo mesmo problema, preciso saber como excluir os itens (sqldataset+dsp+clientdataset)
Alguma sugestão???
[]´s
Evaristo
Alguma sugestão???
[]´s
Evaristo
GOSTEI 0
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.
Vejam se os registros da tabela detalhe nao estao linkados por algum objeto em seu projeto no momento da exclusao.
GOSTEI 0
Ricardoferreira_spa
18/10/2006
vai nas propriedades Options do dataserprovider e coloca pra true o
poCascadeDeletes e poCascadeUpdates
Esperto ter ajudado
[/code][/url]poCascadeDeletes e poCascadeUpdates
Esperto ter ajudado
GOSTEI 0
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