[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