Fórum Trigger para tabela detalhe #59205
02/12/2007
0
DELPHI7, FIREBIRD 2.0.
TAB ´CLIENTES´
REGISTRO (PK)
NOME
ENDERECO
BAIRRO
CIDADE ETC....
TAB TELEFONES
REGISTRO (PK)
REG_CLIENTE (FK) -> INTEGRIDADE REFERENCIAL C/ TAB ´CLIENTES´
NUMERO
CONTATO
[quote:aab03103c7=´Moderação´][color=red:aab03103c7]Título editado por Massuda
Por favor, não use apenas letras maiúsculas no título/texto.
No caso de reincidência, seus tópicos poderão vir a ser bloqueados.
Leia as :arrow: [url=http://forum.clubedelphi.net/viewtopic.php?t=6689]Regras de Conduta[/url] do fórum.
Este tópico não foi bloqueado em respeito ao colega que respondeu.[/color:aab03103c7][/quote:aab03103c7]
Gilson.pontes
Curtir tópico
+ 0Posts
03/12/2007
Brasidata
não consegui entender claramente sua dúvida, mas se a sua preocupação é somente garantir a integridade dos dados, você pode se valer dos recursos da chave estrangeira, sem a necesidade de uma trigger.
Observe que, ao criar a FK vc tem os parametros ON UPADATE e ON DELETE que lhe auxiliam nessa tarefa.
ALTER TABLE TELEFONES ADD CONSTRAINT FK_TELEFONES_CODCLIENTE FOREIGN KEY (REG_CLIENTE) REFERENCES CLIENTES (REGISTRO) [color=darkblue:d3818a1eb2]ON DELETE [/color:d3818a1eb2][color=red:d3818a1eb2]CASCADE[/color:d3818a1eb2] [color=darkblue:d3818a1eb2]ON UPDATE[/color:d3818a1eb2] [color=red:d3818a1eb2]CASCADE[/color:d3818a1eb2];
Em vermelho estão os parâmetros que definirão a ação do registro quando o registro ´pai´ for alterado ou excluído. No caso deste exemplo, ´CASCADE´ significa que ao alterarmos o campo REGISTRO da tabela CLIENTES, o campo REG_CLIENTE correspondente na tabela telefones será automaticamente alterada tb, permanecendo o vínculo e consequentemente a integridade. Caso o registro PAI seja excluído, seus TELEFONES tb serão excluídos automaticamente sem a necessidade da intervenção do seu aplicativo.
Você ainda pode usar o valor ´SET NULL´ para os parâmetros ON UPDATE e ON DELETE se quiser que o campo REG_CLIENTE receba o valor NULL e seu registro permaneça na tabela TELEFONES. Porém, nesse caso, não haverá mais vínculo com a tabela MESTRE.
Se você OMITIR os parâmetros ON UPDATE e/ou ON DELETE ao criar a Chave estrangeira (FK) eles assumirão o valor NO ACTION que retornará uma excessão da base de dados quando vc tentar excluir um registro da tabela CLIENTES que tenha registros vinculados na tabela TELEFONES, garantindo a integridade referencial, porém levantando uma excessão.
Me desculpe se não era essa a sua dúvida, mas foi o que consegui entender. Caso não seja, poste novamente com mais detalhes para que eu possa tentar ajudá-lo.
Bom trabalho!
Gostei + 0
03/12/2007
Brasidata
Onde estiver ´Excessão´ em minha mensagem anterior, leia-se ´EXCEÇÃO´.
Escrever as pressas, cuidando de uma neném de pouco mais de um aninho dá nisso!!! :)
Gostei + 0
04/12/2007
Gilson.pontes
Ou seja, se as tabelas estão ´unidas´ em integridade referencial, não deveria entrar em ´REG_CLIENTE´ o ´REGISTRO´ da tabela ´CLIENTES´ automaticamente assim que eu dou um Insert na tabela ´TELEFONES´?
Grato desde já..... Gilson.
Gostei + 0
04/12/2007
Gilson.pontes
peço desculpas pelas letras maiúsculas acima..... Como todo usuário do firebird sabe, quase tudo fica em maiúsculo e.... como estava mexendo no firebird ao escrever a mensagem acima, acabei indo ´na onda´...... peço sinceras desculpas...... Obrigao.... Gilson.
Gostei + 0
04/12/2007
Brasidata
Respondendo a sua pergunta ´Deveria, não?´:
De forma alguma. A integridade referencial está aí para garantir que uma exclusão ou alteração no registro pai não deixará órfão os detalhes presentes nas outras tabelas OU fazer com que uma alteração no campo chave seja refletida em seus registros ´filhos´.
Não consigo enxergar uma forma de usar triggers ou qualquer outra ferramenta do banco para realizar as inserções automaticamente na tabela de detalhes baseado somente na chave estrangeira, por um motivo bem simples: Como o servidor saberia exatamente a qual registro ´pai´ pertence os dados que estão sendo inseridos na tabela ´filha´ sem que você o informe através do campo de referencia (nesse caso o REG_CLIENTE) ?
Sendo assim, a forma mais adequada para essa operação será usando a sua aplicação.
Uma técnica que talvez amenize o seu ´sofrimento´ seria usar os componentes DBX para criar um relacionamento Mestre-detalhes. Aqui mesmo no site você encontrará video-aulas que mostram passo-a-passo essa dica.
Seguem os links:
[url] https://www.devmedia.com.br/articles/viewcomp.asp?comp=4405&hl=mestre detalhe [/url]
[url] https://www.devmedia.com.br/articles/viewcomp.asp?comp=1744&hl=mestre detalhe [/url]
[url] https://www.devmedia.com.br/articles/viewcomp.asp?comp=5630&hl=master detail [/url]
Gostei + 0
04/12/2007
Gilson.pontes
IBDataSetClientes -> ´select * from Clientes´
IBDataSetAparelhos -> ´select * from Aparelhos where REG_CLIENTE = :REGISTRO´ (IBDataSetAparelhos.DataSouce = DataSourceClientes)
Fazendo dessa forma, ao inserir novo telefone, com a tabela clientes aberta, o delphi não deveria inserir o REG_CLIENTE automaticamente?
(Obs: tenho um sistema em que utilizo o Paradox e funciona dessa forma. Apesar de, no caso desse sistema, eu utilizo Tables para a inserção/edição de dados)
grato....
Gostei + 0
04/12/2007
Brasidata
Há muito tempo não uso os componentes da paleta IBX. Tenho preferido o DBExpress por questões de escalabilidade e segurança.
Realmente eu não sei se o funcionamento da referencia mestre-detalhes nos componentes IBX ocorre da maneira que vc ilustrou.
Assim que eu tiver um tempinho pesquiso mais sobre isso.
Bom trabalho.
Gostei + 0
04/12/2007
Gilson.pontes
Gostei + 0
04/12/2007
Gandalf.nho
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)