Fórum Tratamento de exclusão #327444
14/08/2006
0
Preciso de uma dica de alguém que possa me ajudar..
Como poderia fazer o tratamento de exclusão quando é excluído um registro da tabela mestre sendo que tem relacionamento com a tabela detalhe. Na tabela detalhe tem um FK que relaciona com a tabela mestre pelo PK. Ex: Tenho o cadastro de regiões e cidades, então a tabela de regiao e mestre e a tabela de cidade é detalhe tenho que fazer um tratamento indicando que tem registros na tabela detalhe, impedindo a exclusão. Será que devo usar o evento onreconcilierros do ClientDataset ??
Estou usando o Delphi 7 + Interbase 6.0 + conexão dbexpress
Aguardo retorno
Rogério
Rogeranalista
Curtir tópico
+ 0Posts
15/08/2006
Marco Salles
é uma opção... Mas acho que outros fatores devam ser levados em conta... Qaundo voce criou esse relacionamentos , qual a opção que voce escolheu para [b:8ea6ba3f56]Delete Rule[/b:8ea6ba3f56]... ?????
Se for [b:8ea6ba3f56]CASCADE[/b:8ea6ba3f56] < procure aqui mesmo no forum> a eliminação do registro Mestre automaticamente eliminara os escravos e neste caso nenhum exceção sera lançada
O Padrão Para Delete Rule e [b:8ea6ba3f56]NO ACTION[/b:8ea6ba3f56]... -->> Nesse caso uma exceção sera lançada e não sera possivel a elimação do Registro Mestre
:idea: :idea: :idea:
porem voce disse que esta usando DbExpress e portanto acredito que clientDataSet..
Quando voce elimina , com o cds trabalha com Buffer , aparentemente nada ocorrera.. Somente na hora que voce der um ApplyUpdates é que
a exceção sera lançada e voce podera tratar no evento ReconcileError
Tipo Isto:
if pos(´violation of FOREIGN KEY constraint´,e.Message) > 0 Then showmessage(´neca de catibiriba´)
esta mensagem [b:8ea6ba3f56]´violation of FOREIGN KEY constraint´ [/b:8ea6ba3f56], escrita dessa maneira é para o firebird , eu não sei , qual a mensagem é para o Interbase 6.0 .. Mas isto voce mesmo pode descobrir fazendo Um
Showmessage(e.message) no evento ReconcileError
Outro ponto que deve ser destaque é que a mensagem de informação , tem mais destaque exceutando a aplicação via executável e não pelo delphi (F9) a não ser que voce desabilite algumas opçoes da IDE. em outras palavras , [b:8ea6ba3f56]para testar use o executável[/b:8ea6ba3f56]
espero que tenha lhe ajudaddo.
Gostei + 0
15/08/2006
Rogeranalista
Quando ao relacionamento usei a script normal para criar a fk e no final coloquei update cascade
Ex:
ALTER TABLE ´ENDERECO_COBRANCA´ ADD CONSTRAINT ´FKENDCOBBAIRROCDBAIRRO´ FOREIGN KEY (´CODBAI_END_COBRANCA´) REFERENCES BAIRRO (´COD_BAIRRO´) ON UPDATE CASCADE;
Rogério
Gostei + 0
16/08/2006
Marco Salles
então delete este relacionamento e façao outro usando NO ACTION no Lugar de CASCADE..
mas mesmo com CASCADE , voce pode impedir que registos da TABELA MÃE sejam excluidos... so que nesse caso , é a aplicação que controlaria isto , e não mais o BANCO..
por exemplo no evento beforeDelete do DataSet voce deveria ´pesquisar´ se existe algum registro na tabelaFilha caso afirmativo gere uma exceção , e caso negativo prosiga com a exclusão
Gostei + 0
16/08/2006
Marco Salles
então delete este relacionamento e façao outro usando NO ACTION no Lugar de CASCADE..
[b:23c4e77263]mas [/b:23c4e77263]mesmo com CASCADE , :arrow: voce pode impedir que registos da TABELA MÃE sejam excluidos... so que nesse caso , é a aplicação que controlaria isto , e não mais o BANCO..
por exemplo no evento beforeDelete do DataSet voce deveria ´pesquisar´ se existe algum registro na tabelaFilha caso afirmativo gere uma exceção , e caso negativo prossiga com a exclusão
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)