Erro com variáveis na trigger firebird...
27/07/2021
0
Desde já agradeço a atenção de cada um em tentar ajudar a solucionar o meu problema..
Tenho que fazer uma importação de uma planilha de excel, porém, no momento da importação preciso fazer alguns cálculos para alimentar 3 colunas da minha tabela. O que eu fiz foi criar uma trigger que antes de inserir pegasse os valores que eu preciso para fazer os cálculos e jogasse em uma variável determinada para que eu pudesse faze-los. A compilação da trigger esta tudo ok, porém, quando eu tento fazer a inserção tenho o seguinte erro:
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.
Integer overflow. The result of an integer operation caused the most significant bit of the result to carry.
At trigger 'CPT001_BI0'.
segue o código da minha trigger para uma avaliação de vcs... obrigado!!
AS declare vlrcotacao decimal(15,8); declare vlrcotacaodesp decimal(15,8); -- declare vmoeda char(20); begin vlrcotacaodesp = (select c01_valor from cot001 where c01_data = new.c01_data and c01_moeda = new.c01_moedatx); new.c01_moedapar = substring(new.c01_market from character_length(new.c01_market)-2 for character_length(new.c01_market)); vlrcotacao = (select c01_valor from cot001 where c01_data = new.c01_data and c01_moeda = new.c01_moedapar); new.c01_despesa = new.c01_taxa * vlrcotacaodesp; new.c01_totalrs = new.c01_total * vlrcotacao; (erro nessa linha) new.c01_unitario = new.c01_totalrs / new.c01_qtdade; end
obs..: no debug da trigger, os valores estão sendo atribuídos corretamente, tentei usar o cast para formatar e não adiantou, o erro esta na linha marcada..
Junior
Lindolfo Junior
Posts
27/07/2021
Emerson Nascimento
outra coisa: use RIGHT() para pegar os caracteres à direita, LEFT() à esquerda
AS declare vlrcotacao decimal(15,8); declare vlrcotacaodesp decimal(15,8); -- declare vmoeda char(20); begin vlrcotacaodesp = (select c.c01_valor from cot001 c where c.c01_data = new.c01_data and c.c01_moeda = new.c01_moedatx); new.c01_moedapar = right(new.c01_market,2); vlrcotacao = (select c.c01_valor from c.cot001 where c.c01_data = new.c01_data and c.c01_moeda = new.c01_moedapar); new.c01_despesa = (new.c01_taxa * vlrcotacaodesp); new.c01_totalrs = (new.c01_total * vlrcotacao); -- (erro nessa linha) provavelmente o resultado da multiplicação -- é maior do que a capacidade do campo new.c01_totalrs ou o campo é inteiro e o resultado é float -- campos inteiros comportam valores de -2.147.483.648 até 2.147.483.647 new.c01_unitario = (new.c01_totalrs / new.c01_qtdade); end
28/07/2021
Lindolfo Junior
outra coisa: use RIGHT() para pegar os caracteres à direita, LEFT() à esquerda
AS declare vlrcotacao decimal(15,8); declare vlrcotacaodesp decimal(15,8); -- declare vmoeda char(20); begin vlrcotacaodesp = (select c.c01_valor from cot001 c where c.c01_data = new.c01_data and c.c01_moeda = new.c01_moedatx); new.c01_moedapar = right(new.c01_market,2); vlrcotacao = (select c.c01_valor from c.cot001 where c.c01_data = new.c01_data and c.c01_moeda = new.c01_moedapar); new.c01_despesa = (new.c01_taxa * vlrcotacaodesp); new.c01_totalrs = (new.c01_total * vlrcotacao); -- (erro nessa linha) provavelmente o resultado da multiplicação -- é maior do que a capacidade do campo new.c01_totalrs ou o campo é inteiro e o resultado é float -- campos inteiros comportam valores de -2.147.483.648 até 2.147.483.647 new.c01_unitario = (new.c01_totalrs / new.c01_qtdade); end
Emerson, eu acho que descobri, essa inserção na tabela eu estou importando de uma planilha do excel, o que acontece é que o meu valor é 0.002134 e esta pegando somente o 2134, aí esta estourando, você saberia o que posso fazer com relação a isso??
desde já obrigado pela atenção.
28/07/2021
Emerson Nascimento
tem que saber como você está fazendo a leitura dos dados da planilha
Clique aqui para fazer login e interagir na Comunidade :)