[firebase-br] Arredondamento de Parcelas

ibestvip zottissistemas em ibestvip.com.br
Dom Set 24 21:29:53 -03 2006


galera, to com um dilema.

tenho uma venda de R$855,00  e que é pago R$12,33
 Restando R$842,67 que serão lançadas duas parcelas.
Dividindo R$ 842,67 por 2 fica = R$421,335 que no
Delphi arredonda para R$421,34  Multiplicando R$421,34 * 2 = 842,68
ou seja R$ 0,01 de diferença a mais. tentei de todas as formas fazer no 
delphi e não consegui, pois ele não enxerga a diferença.

tentei fazer uma SP e também não consegui.
alguém poderia me dar uma luz?

Segue em anexo a SP:

SET TERM ^ ;

CREATE PROCEDURE PRC_GERAR_PARCELAS (
    P_COD_VENDA INTEGER)
AS
BEGIN
  EXIT;
END^

SET TERM ; ^


SET TERM ^ ;

ALTER PROCEDURE PRC_GERAR_PARCELAS (
    P_COD_VENDA INTEGER)
AS
DECLARE VARIABLE V_COD_COND_PGTO INTEGER;
DECLARE VARIABLE V_COD_CLIENTE INTEGER;
DECLARE VARIABLE V_VENCIMENTO DATE;
DECLARE VARIABLE V_DTA_ENTREGA DATE;
DECLARE VARIABLE V_QTDE_PARC INTEGER;
DECLARE VARIABLE V_INT_DIAS INTEGER;
DECLARE VARIABLE V_VLR_PARCELA_N NUMERIC(18,2);
DECLARE VARIABLE I INTEGER;
DECLARE VARIABLE V_VLR_PARCELA FLOAT;
DECLARE VARIABLE V_TOTAL_VENDA NUMERIC(18,2);
DECLARE VARIABLE V_DIFERENCA INTEGER;
DECLARE VARIABLE V_TOTAL_VENDA_R NUMERIC(18,2);
DECLARE VARIABLE V_PRIM_VENC INTEGER;
begin
    delete from cta_receber
    where COD_VENDA = :p_cod_venda;

     select COD_CLIENTE, cod_pgto, total_venda, dta_entrega
    from venda
    where COD_VENDA = :p_cod_venda
    into :v_cod_cliente, :v_cod_cond_pgto, :v_total_venda, :v_dta_entrega;

     select intervalo_dias,primeiro_venc, qtd_parc
    from cond_pgto
    where cod_pgto = :v_cod_cond_pgto
    into :v_int_dias, :v_prim_venc, :v_qtde_parc;

    v_vlr_parcela = :v_total_venda / :v_qtde_parc;

     v_vlr_parcela_n = cast(:v_vlr_parcela as numeric(18,2));

     v_vlr_parcela = cast(:v_vlr_parcela as float);

     v_total_venda_r = :v_vlr_parcela * :v_qtde_parc;

     v_diferenca = :v_total_venda - :v_total_venda_r;

    if (:v_total_venda_r + :v_diferenca > :v_total_venda) then
    begin
        v_diferenca = :V_DIFERENCA * (-1);
    end

     if (:v_qtde_parc = 0) then
    begin
            v_vencimento   = current_date;
             insert into cta_receber
            (cod_cliente, cod_venda, com_entrada, desconto, dta_lanc, 
dta_venc, pago, taxa_juro, total_pago, total_venda,valor_parcela)
            values
            (:v_cod_cliente, :p_cod_venda, 'N', 0, current_date, 
:v_vencimento, 'N', 0, 0, :v_total_venda,:v_vlr_parcela_n);
       end
     else if (:v_qtde_parc > 0) then
    begin
         I = 1;
             while (:I <= :v_qtde_parc) do
            begin
                 if (:I = 1) then
                begin
                 v_vencimento   =  :v_dta_entrega + (:v_int_dias * :I);
                  insert into cta_receber
                     (cod_cliente, cod_venda, com_entrada, desconto, 
dta_lanc, dta_venc, pago, taxa_juro, total_pago, total_venda,valor_parcela)
                   values
                  (:v_cod_cliente, :p_cod_venda, 'N', 0, current_date, 
:v_vencimento, 'N', 0, 0, :v_total_venda,:v_vlr_parcela_n + :v_diferenca);
                  end
                /*depois lança normalmente*/
                else
                begin
               v_vencimento   =  :v_dta_entrega + (:v_int_dias * :I);
                  insert into cta_receber
                     (cod_cliente, cod_venda, com_entrada, desconto, 
dta_lanc, dta_venc, pago, taxa_juro, total_pago, total_venda,valor_parcela)
                   values
                  (:v_cod_cliente, :p_cod_venda, 'N', 0, current_date, 
:v_vencimento, 'N', 0, 0, :v_total_venda,:v_vlr_parcela_n);
               end
                I = I + 1;
            end
        end
end
^


SET TERM ; ^







Mais detalhes sobre a lista de discussão lista