[firebase-br] Problema com retorno da Procedure

Isael Faria Junior isael em stetika.com.br
Seg Out 20 14:21:44 -03 2008


Pessoal,

tenho uma procedure que me retorna valores após o calculo,
porem quando uso valores inteiros para calculo ele me retorna valores 
corretos, mais quando passo valores com virgula ele multiplica o valor 
por 100,
alguem poria me dar uma luz ?

Estou pegando o retorno pelo delphi 7, pelo banco o retorna da correto, 
porem se gravar da um valor diferente

Procedure
SET TERM ^ ;

CREATE PROCEDURE SP_CALCULO_IMPOSTO_NF (
    V_SIT_IPI_EMB VARCHAR(1),
    V_PER_DESCONTO DOUBLE PRECISION,
    V_PESO DOUBLE PRECISION,
    V_QTD DOUBLE PRECISION,
    V_VAL_UNITARIO DOUBLE PRECISION,
    V_TIP_OPERACAO INTEGER,
    V_ID_PRODUTO INTEGER,
    V_PER_IPI DOUBLE PRECISION,
    V_PER_ICMS DOUBLE PRECISION)
RETURNS (
    V_VALOR_IPI NUMERIC(15,2),
    V_VALOR_ICMS NUMERIC(15,2),
    V_VALOR_DESCONTO NUMERIC(15,2),
    V_VALOR_TOTAL NUMERIC(15,2),
    V_VAL_BASE_IPI NUMERIC(15,2),
    V_VAL_ISENTA_IPI NUMERIC(15,2),
    V_VAL_OUTRAS_IPI NUMERIC(15,2),
    V_VAL_BASE_ICMS NUMERIC(15,2),
    V_VAL_ISENTA_ICMS NUMERIC(15,2),
    V_VAL_OUTRAS_ICMS NUMERIC(15,2))
AS
DECLARE VARIABLE V_BC_ICMS_ST NUMERIC(15,2);
DECLARE VARIABLE V_VAL_ICMS_ST NUMERIC(15,2);
DECLARE VARIABLE V_ISENTA_IPI NUMERIC(15,2);
DECLARE VARIABLE V_OUT_IPI NUMERIC(15,2);
DECLARE VARIABLE V_ISENTA_ICMS NUMERIC(15,2);
DECLARE VARIABLE V_OUT_ICMS NUMERIC(15,2);
DECLARE VARIABLE V_PER_IVA NUMERIC(15,2);
DECLARE VARIABLE V_VALOR_ITEM NUMERIC(15,2);
DECLARE VARIABLE V_VAL_MARGEM_AGREGADA NUMERIC(15,2);
DECLARE VARIABLE V_PER_BASE_IPI NUMERIC(15,2);
DECLARE VARIABLE V_PER_BASE_ICMS NUMERIC(15,2);
begin
  if (v_peso <> 0) then
   v_qtd = v_peso;


  SELECT perc_ipi,isenta_ipi,outras_ipi,
        perc_icms,isenta_icms,outras_icms
   FROM TIPO_OPERACAO
   WHERE id_tipo_operacao = :v_tip_operacao
  INTO :V_PER_BASE_IPI,:v_isenta_ipi,:v_out_ipi,
       :v_per_BASE_icms,:v_isenta_icms,:v_out_icms;


  SELECT per_iva FROM PRODUTOS
   WHERE ID_PRODUTO = :v_id_produto
  INTO :v_per_iva;

  if (:v_per_iva IS NULL) then
   V_PER_IVA = 0;

  v_valor_desconto = :v_val_unitario * (:v_per_desconto/100);

  v_val_base_ipi   = ((:v_qtd * :v_val_unitario) - :v_valor_desconto) * 
(:V_PER_BASE_IPI/100);
  v_valor_ipi      = :v_val_base_ipi * (:v_per_ipi/100);
  v_val_isenta_ipi = ((:v_qtd * :v_val_unitario) - :v_valor_desconto) * 
(:v_isenta_ipi/100);
  v_val_outras_ipi = ((:v_qtd * :v_val_unitario) - :v_valor_desconto) * 
(:v_out_ipi/100);

  v_val_base_icms   = ((:v_qtd * :v_val_unitario) - :v_valor_desconto) * 
(:v_per_BASE_icms/100);
  v_valor_icms      = :v_val_base_icms * (:v_per_icms/100);
  v_val_isenta_icms = ((:v_qtd * :v_val_unitario) - :v_valor_desconto) * 
(:v_isenta_icms/100);
  v_val_outras_icms = ((:v_qtd * :v_val_unitario) - :v_valor_desconto) * 
(:v_out_icms/100);

  v_valor_item      =  (:v_qtd * :v_val_unitario) + v_valor_ipi;

  v_valor_total     = (:v_qtd * (:v_val_unitario - :v_valor_desconto));

  if (:v_sit_ipi_emb = 'S') then
   v_valor_total        = v_valor_total + v_valor_ipi;
  else
   v_valor_total        = v_valor_total;

  if (:v_per_ipi <> 0) then
  BEGIN
   V_VAL_MARGEM_AGREGADA = :v_valor_item * (:v_per_iva/100);
   v_bc_icms_st          = :v_valor_item + :v_val_margem_agregada;
   v_val_icms_st         = :v_bc_icms_st * (:v_per_icms/100);
   v_val_icms_st         = :v_val_icms_st - v_valor_icms;
   v_valor_icms          = :v_val_icms_st;
   v_valor_total         = ((:v_qtd * :v_val_unitario)+ v_valor_ipi)+ 
v_valor_icms;
  END

  suspend;
end




Mais detalhes sobre a lista de discussão lista