[firebase-br] Cantu, TRIGGER funciona!!!

Eliomar eliomar em promediconet.com.br
Seg Maio 16 09:04:10 -03 2005


Esses dias eu postei uma mensagem dizendo que as
trigger as vezes não era disparada, quando o registro 
era disparado em cascata... Mas como o Cantu respondeu
realmente é disparada, e com o exemplo que eu coloquei 
funciona perfeitamente (eu tentei simplificar o exemplo).
Deixa eu ver se consigo explicar o que eu fiz e não funcionou 
(é um pouco grande).

Eu estava fazendo um controle de nota fiscal e entrega da
mercadoria... então eu tinha a table SAIDAS, SAIDAS_ITENS e
SAIDAS_ITENS_BAIXA.

Saidas
codigo (pk)
data

saidas_itens
codigo (pk)
codigo_saidas (fk)
codigo_item (fk)
quantidade

saidas_itens_baixas
codigo (pk)
codigo_saidas_itens (fk)
data
quantidade

Entendeu até aqui?
Então quando eu faço o lançamento na table Saidas_Itens não
da baixa no estoque, vai dar baixa somente quando lanço na 
Saidas_Itens_Baixa. Então eu fiz:

TRIGGER after post table saidas_itens_baixas

/*Encontrando o codigo do item */
select saidas_itens.codigo_item
  from saidas_itens
 where saidas_itens.codigo = new.codigo_saidas_itens
  into :va_codigo_item

update itens
   set itens.estoque = itens.estoque - new.quantidade
 where itens.codigo = :va_codigo_item

até ai blz... fiz tb outra TRIGGER
before delete table saidas_itens_baixas

/*Encontrando o codigo do item */
select saidas_itens.codigo_item
  from saidas_itens
 where saidas_itens.codigo = old.codigo_saidas_itens
  into :va_codigo_item

update itens
   set itens.estoque = itens.estoque + old.quantidade
 where itens.codigo = :va_codigo_item

Agora vem a questão, se eu deletar o registro da table
Saidas_Itens_Baixas então volta para o estoque blz... 
Agora quando é deletada a table Saidas_Itens em cascata
a Saidas_Itens_Baixas é deletada, mas vem o problema... 
a TRIGGER before delete da table Saidas_Itens_Baixas é
ativada.

/*Encontrando o codigo do item */
select saidas_itens.codigo_item
  from saidas_itens
 where saidas_itens.codigo = old.codigo_saidas_itens
  into :va_codigo_item

/* nesse momento a :va_codigo_item vai estar null, então o 
   update abaixo não vai funcionar... */

update itens
   set itens.estoque = itens.estoque + old.quantidade
 where itens.codigo = :va_codigo_item

Ai eu pergunto Cantú, o firebird deleta primeiro os registros
do Pai para depois apagar os arquivos filhos? E se apaga os Pai
Primeiro como irá saber quais os filhos se já apagou os filhos?
E o FireBird sabe então o select não deveria funcionar?

Agradecido.
Eliomar,
ICQ - 167715482
MSN - eliomar0910 em hotmail.com
Soft-Data Softwares Administrativos
hptt://www.promediconet.com.br





Mais detalhes sobre a lista de discussão lista