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

Sandro Souza escovadordebits em gmail.com
Qua Jan 23 18:57:20 -03 2013


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
>



Mais detalhes sobre a lista de discussão lista