[firebase-br] Dúvida com trigger before insert

Andrei Luís compuvale.software em gmail.com
Qua Jan 23 22:05:12 -03 2013


Olá Sandro, obrigado pela sua contribuição. Sim, estava chegando a essa
conclusão quando me responderam na lista internacional.

Minha primeira empreitada foi criar essa trigger after insert, mas aí veio
outro problema: as variáveis new.nomecampo são somente leitura nesse evento.

[]s
Andrei


Em 23 de janeiro de 2013 18:57, Sandro Souza
<escovadordebits em gmail.com>escreveu:

> Bom dia/tarde/noite Andrei.
>
> Como se trata de uma trigger que está associada ao evento "before insert",
> significa que o SELECT que está definido nela não conseguirá ler o novo
> registro/linha que está sendo incluído, pois como diz o próprio evento, é
> "before insert", ou seja, antes de incluir o registro, e portanto, jamais
> esse SELECT conseguirá ler o registro que ainda não foi realmente incluído.
>
> Se fosse no evento "after insert", aí sim.
>
> Nesse caso, tomei a liberdade de alterar o código fonte dessa sua trigger e
> fazer a seguinte sugestão:
>
> *SET TERM ^ ;
>
> CREATE OR ALTER TRIGGER NOTASFISCAISITENS_BI0 FOR NOTASFISCAISITENS ACTIVE
> BEFORE INSERT POSITION 0 AS
> declare variable wbaseicm dinheiro;
> begin
>   new.subtotal = new.qtde * new.valor;
>   insert into new_table (nfi_id) values (new.registro_id);
>   select
>     n.baseicm, -- Nao esta sendo usado ainda.
>     n.registro_id,
>     n.descricao,
>     nf.nrnf,
>     a.nome,
>     uf.sigla,
>     cf.codfiscal
>   from
>     pedidositens pi,
>     orcamentos o,
>     produtos p,
>     notasfiscais nf,
>     naturezas n,
>     agenda a,
>     uf,
>     classificacaofiscal cf
>   where
>     (pi.registro_id = new.pedidoitem_id) and
>     (o.registro_id  = pi.orcamento_id) and
>     (p.registro_id  = new.produto_id) and
>     (nf.registro_id = new.notafiscal_id) and
>     (n.registro_id  = nf.natureza_id) and
>     (a.registro_id  = nf.cliente_id) and
>     (uf.sigla = a.uf) and
>     (cf.registro_id = p.classificacaofiscal_id)
>   into
>     :wbaseicm, -- Nao esta sendo usado ainda.
>     new.cfop_temp,
>     new.natureza_temp,
>     new.nrnf_temp,
>     new.cliente_temp,
>     new.uf_temp,
>     new.ncm_temp = :wncm_temp;
>   -- A variavel "wdescontopercentual" nao tem valor atribuido, portanto, a
> proxima linha de codigo nao tem sentido.
>   -- new.desconto = new.valor * (:wdescontopercentual/100);
> end^
>
> SET TERM ; ^*
>
> Note que não precisa criar variávels locais para receber os dados do SELECT
> e depois atribuir esses valores aos campos/colunas do novo registro a ser
> incluído. Pode informar diretamente os novos campos/colunas na cláusula
> INTO, como eu fiz nesse exemplo.
>
> Note também que o valor da variável "wbaseicm" não é utilizado para nada.
>
> Note também que a variável "wdescontopercentual" não recebeu qualquer
> valor, e portanto, não tem sentido a atribuição daquela expressão para o
> campo/coluna "new.desconto".
>
> Espero ter ajudado mais que atrapalhado. :D
>
>
> Em 23 de janeiro de 2013 12:17, Andrei Luís
> <compuvale.software em gmail.com>escreveu:
>
> > Boa tarde a todos,
> >
> > Estou com uma dúvida quanto ao funcionamento de triggers before insert.
> >
> > Estou criando uma trigger para calcular os impostos dos itens das notas
> > fiscais. Esta trigger é before insert na tabela dos itens.
> >
> > O problema é que o select que deveria trazer as infos da tabelas diversas
> > está trazendo tudo null, se rodo o select por fora da trigger, depois
> que a
> > mesma é acionada, o mesmo select traz todas as infos corretamente. Parece
> > que tem algo a ver com as transações, será?
> >
> > Abaixo está a trigger modificada que fiz para testar, o calculo
> > new.subtotal = new.qtde * new.valor funciona. O insert também funciona,
> mas
> > os campos que estão recebendo valores depois do select estão ficando
> todos
> > null.
> >
> > Alguém dá uma luz?
> >
> > SET TERM ^ ;
> >
> > CREATE OR ALTER TRIGGER NOTASFISCAISITENS_BI0 FOR NOTASFISCAISITENS
> > ACTIVE BEFORE INSERT POSITION 0
> > as
> > declare variable wbaseicm dinheiro;
> > declare variable wcfoptemp integer;
> > declare variable wnatureza_temp varchar(80);
> > declare variable wnrnf_temp integer;
> > declare variable wcliente_temp varchar(100);
> > declare variable wuf_temp char(2);
> > declare variable wncm_temp integer;
> > begin
> >    new.subtotal = new.qtde * new.valor;
> >    insert into new_table (nfi_id) values (new.registro_id);
> >    Select n.baseicm, n.registro_id, n.descricao, nf.nrnf, a.nome,
> uf.sigla,
> > cf.codfiscal
> >      from notasfiscaisitens        nfi
> >      left join pedidositens        pi on pi.registro_id =
> nfi.pedidoitem_id
> >      left join orcamentos          o  on o.registro_id  = pi.orcamento_id
> >      left join produtos                 p  on p.registro_id  =
> > nfi.produto_id
> >      left join notasfiscais             nf on nf.registro_id =
> > nfi.notafiscal_id
> >      left join naturezas                n  on n.registro_id  =
> > nf.natureza_id
> >      left join agenda              a  on a.registro_id  = nf.cliente_id
> >      left join uf                     on uf.sigla=a.uf
> >      left join classificacaofiscal cf on
> > cf.registro_id=p.classificacaofiscal_id
> >     where nfi.registro_id=new.registro_id
> >      into :wbaseicm, :wcfoptemp, :wnatureza_temp, :wnrnf_temp,
> > :wcliente_temp, :wuf_temp, :wncm_temp;
> >    new.cfop_temp = :wcfoptemp;
> >    new.natureza_temp = :wnatureza_temp;
> >    new.desconto = (new.Valor) * (:wdescontopercentual/100);
> >    new.nrnf_temp = :wnrnf_temp;
> >    new.cliente_temp = :wcliente_temp;
> >    new.uf_temp = :wuf_temp;
> >    new.ncm_temp = :wncm_temp;
> >
> >
> > end
> > ^
> >
> >
> > SET TERM ; ^
> >
> >
> > []s
> > Andrei
> > ______________________________________________
> > FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> > Para saber como gerenciar/excluir seu cadastro na lista, use:
> > http://www.firebase.com.br/fb/artigo.php?id=1107
> > Para consultar mensagens antigas: http://firebase.com.br/pesquisa
> >
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista