GARANTIR DESCONTO

Fórum Trigger para tabela detalhe #59205

02/12/2007

0

AMIGOS, ESTOU COMEÇANDO A ESTUDAR/UTILIZAR O FIREBIRD. JÁ CONSEGUI FAZER UM GENERATOR E UM TRIGGER P/ AUTOINCREMENTAR O ´REGISTRO´ DA TABELA ´CLIENTES´. MAS PARA A TABELA ´TELEFONES´, ALÉM DO GENERATOR E DO TRIGGER DE AUTOINCREMENTO DO ´REGISTRO´ DO TELEFONE, PRECISO INSERIR TAMBÉM O ´REG_CLIENTE´ DA TABELA ´CLIENTES´ PARA MANTER A INTEGRIDADE REFERENCIAL. PODERIA FAZER ISSO VIA APLICAÇÃO, MAS GOSTARIA DE FAZER VIA TRIGGER. ALGUÉM PODE ME AJUDAR? GRATO....

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

Gilson.pontes

Responder

Posts

03/12/2007

Brasidata

Gilson,

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!


Responder

Gostei + 0

03/12/2007

Brasidata

Desculpem o erro grosseiro:
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!!! :)


Responder

Gostei + 0

04/12/2007

Gilson.pontes

fico muuuuuito grato pela resposta. Mas já havia colocado a integridade referencial no banco como está descrito acima. Porém, o que está ocorrendo, na verdade, é que, ao inserir tentar inserir um telefone para um determinado cliente, via aplicação, o valor do field ´REG_CLIENTE´ não é inserido automaticamente (e deveria, não?!).

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.


Responder

Gostei + 0

04/12/2007

Gilson.pontes

Srs,

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.


Responder

Gostei + 0

04/12/2007

Brasidata

Olá Gilson,

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]


Responder

Gostei + 0

04/12/2007

Gilson.pontes

Isso. Também já havia pensado dessa forma.... (realmente, o servidor não ´saberia´ para qual cliente eu estaria incluindo mais um registro de telefone... é isso). Então, nesse caso, devo verificar por que o Delphi não está gerando o ´REG_CLIENTE´ na tabela ´TELEFONES´, já que estou colcando a integridade referencial entre as tabelas no DataModule.

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....


Responder

Gostei + 0

04/12/2007

Brasidata

Sinceramente, dessa vez eu não sei te dizer.
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.


Responder

Gostei + 0

04/12/2007

Gilson.pontes

Ok, de qualquer forma, muito obrigado. Vou dar um pesquisada então, na utilização do DBExpress. Pelo visto, deve funcionar melhor, já ´todo mundo´ fala nele.... Abraço.... mais uma vez, obrigado.


Responder

Gostei + 0

04/12/2007

Gandalf.nho

Você pode usar o evento OnNewRecord para atribuir o valor para manter o vínculo mestre-detalhe (algumas paletas como a BDE até atribuem esse valor automaticamente, mas outras não).


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar