Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 1526 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Bom dia!

Estou com problema em aplicar desconto na nota, o desconto é de R$ 8,78 em uma nota no valor de R$ 208,78 na impressão o desconto é arredondado para R$ 8,80 o valor a pagar fica R$ 199,98 e mostra o troco de R$ 0,02

Onde está o erro?

  • Moderadores
Postado

Tópico movido para a área SAC para que o SLA de resposta seja considerado. 


logoacbr.pngConheça o Portal do Projeto ACBr

Ajude o Projeto ACBr crescer - Assine o SAC ACBr
Assine um dos planos de longa duração do SAC ACBr, obtenha Descontos Especiais, Parcele no Cartão e ainda ganhe Brindes Exclusivos. Saiba mais aqui

Conheça o ACBrLib, o ACBr de forma nativa para qualquer linguagem de programação. Saiba mais aqui

 

 

 

 

Postado
4 minutos atrás, BigWings disse:

No XML está correto?

Se não estiver, provavelmente é algo na sua rotina.

Acredito que seja no arredondamento, mas não sei como resolver;

Tenho outro exemplo aqui:

tenho uma venda de R$ 56,94 aplico o desconto em (R$) de R$ 6,94 então tenho R$ 50,00, faço o rateio que se não me engano em porcentagem é 12,188 arredondando fica 12,20

e o valor do item sem o desconto é R$ 9,49 passando a ser R$ 8,33.

Então o desconto de cada item é de R$ 1,16 que multiplicado por 6 que seria o total de itens na nota fica o total de desconto R$ 6,96

Lembrando que o desconto que apliquei foi de R$ 6,94 na venda e depois faço o rateio!

Como resolver isso?

19 minutos atrás, Adelmo Junior disse:

Justamente faço o rateio no é que é alterado esse valor

Eu carrego do banco para alimentar o componente

  • Moderadores
  • Solution
Postado
37 minutos atrás, Adelmo Junior disse:

tenho uma venda de R$ 56,94 aplico o desconto em (R$) de R$ 6,94 então tenho R$ 50,00, faço o rateio que se não me engano em porcentagem é 12,188 arredondando fica 12,20

e o valor do item sem o desconto é R$ 9,49 passando a ser R$ 8,33.

Você tem que guardar o resíduo do arredondamento em cada item. Somando os resíduos de arredondamento de cada item você vai ter um valor que deve ser somado ao desconto do item de maior valor.

Ex:

6,94 / 56,94 = 0,1218826835265191

9,49 * 0,1218826835265191 = 1,156666666666667 => desc: 1,15 resíduo: 0,0066666666666667

47,45 * 0,1218826835265191 = 5,783333333333333 => desc: 5,78 resíduo: 0,0033333333333333

resíduo total: 0,0066666666666667 + 0,0033333333333333 = 0,01

desc. total rateado = 6,93 + resíduo total => 6,93 + 0,01 = 6,94

O resíduo total acrescenta no item de maior valor, no exemplo o segundo, ficando o desconto 5,78 + 0,01 = 5,79

 

  • Curtir 1
  • Obrigado 1
Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

Postado
39 minutos atrás, BigWings disse:

Você tem que guardar o resíduo do arredondamento em cada item. Somando os resíduos de arredondamento de cada item você vai ter um valor que deve ser somado ao desconto do item de maior valor.

Ex:

6,94 / 56,94 = 0,1218826835265191

9,49 * 0,1218826835265191 = 1,156666666666667 => desc: 1,15 resíduo: 0,0066666666666667

47,45 * 0,1218826835265191 = 5,783333333333333 => desc: 5,78 resíduo: 0,0033333333333333

resíduo total: 0,0066666666666667 + 0,0033333333333333 = 0,01

desc. total rateado = 6,93 + resíduo total => 6,93 + 0,01 = 6,94

O resíduo total acrescenta no item de maior valor, no exemplo o segundo, ficando o desconto 5,78 + 0,01 = 5,79

 

Vou verificar aqui, obrigado pela dica

Postado
Em 16/09/2020 at 11:33, Adelmo Junior disse:

Vou verificar aqui, obrigado pela dica

A questão agora é como pegar esses resíduos! tem uma luz ai pra me dar mais uma forcinha, agradeço

Postado
2 minutos atrás, Juliomar Marchetti disse:

Tu sabe o total certo? e tu sabe o total do desconto.

faz a diferença entre um e outro. será que não funciona?

Baseado nisso vou fazer esse teste!, obrigado

Postado
33 minutos atrás, Adelmo Junior disse:

Não funcionou!

     DesctoAcomulado:=0;
      ValorDescto:= 0.00;
      percdescto:= 0.00;
      TotalRealDescto:= 0.00;
      ValorDesctoProduto:=0;

      try

               ValorDesctoProduto:= DataModule1.ClientMestreTOTAL_DESCTO.AsFloat/QtdeTotalItens;
               Maiorvalor:= DataModule1.ClienteDetalheMaior.AsString;

               DataModule1.ClienteDetalhe.DisableControls;
               DataModule1.ClienteDetalhe.First;
               while not DataModule1.ClienteDetalhe.eof do
               begin
                     if DataModule1.ClienteDetalheCANCELADO.AsString ='N' then
                     begin
                       //    percdescto          := DataModule1.ClientMestrePERC_DESCTO.AsFloat;
                       //    ValorDescto     :=  (percdescto * Datamodule1.ClienteDetalheVALOR_TOTAL.AsFloat)/100;
                         try
                           DataModule1.ClienteDetalhe.Edit;
                           DataModule1.ClienteDetalheDESCTO.AsFloat:= percdescto;
                           if DataModule1.ClienteDetalheVALOR_TOTAL.AsFloat < ValorDesctoProduto   then
                              DesctoAcomulado:= DesctoAcomulado + ValorDesctoProduto
                           else
                              DataModule1.ClienteDetalheVALOR_DESCTO.AsFloat:= ValorDesctoProduto;

                           DataModule1.ClienteDetalhe.Post;
                           DataModule1.ClienteDetalhe.ApplyUpdates(-1);
                           TotalRealDescto:= TotalRealDescto +ValorDescto;
                         except

                         end;
                     end;

                     DataModule1.ClienteDetalhe.Next;
               end;

                vDifDescto := DataModule1.ClientMestreTOTAL_DESCTO.AsFloat - fsvDesc;

                if vDifDescto < 0 then
                vDifDescto := vDifDescto * -1;

                Maiorvalor:= DataModule1.ClienteDetalheMaior.AsString;

               DataModule1.ClienteDetalhe.Locate('VALOR_TOTAL',Maiorvalor,[loPartialKey]);
               DataModule1.ClienteDetalhe.Edit;
               DataModule1.ClienteDetalheVALOR_DESCTO.AsFloat :=DesctoAcomulado + DataModule1.ClienteDetalheVALOR_DESCTO.AsFloat;
               DataModule1.ClienteDetalhe.Post;
               DataModule1.ClienteDetalhe.ApplyUpdates(-1);

      finally

             DataModule1.ClienteDetalhe.EnableControls;
      end;

 

Já fiz de tudo não funciona, ão sei o que é exatamente

Postado
23 minutos atrás, Adelmo Junior disse:

     DesctoAcomulado:=0;
      ValorDescto:= 0.00;
      percdescto:= 0.00;
      TotalRealDescto:= 0.00;
      ValorDesctoProduto:=0;

      try

               ValorDesctoProduto:= DataModule1.ClientMestreTOTAL_DESCTO.AsFloat/QtdeTotalItens;
               Maiorvalor:= DataModule1.ClienteDetalheMaior.AsString;

               DataModule1.ClienteDetalhe.DisableControls;
               DataModule1.ClienteDetalhe.First;
               while not DataModule1.ClienteDetalhe.eof do
               begin
                     if DataModule1.ClienteDetalheCANCELADO.AsString ='N' then
                     begin
                       //    percdescto          := DataModule1.ClientMestrePERC_DESCTO.AsFloat;
                       //    ValorDescto     :=  (percdescto * Datamodule1.ClienteDetalheVALOR_TOTAL.AsFloat)/100;
                         try
                           DataModule1.ClienteDetalhe.Edit;
                           DataModule1.ClienteDetalheDESCTO.AsFloat:= percdescto;
                           if DataModule1.ClienteDetalheVALOR_TOTAL.AsFloat < ValorDesctoProduto   then
                              DesctoAcomulado:= DesctoAcomulado + ValorDesctoProduto
                           else
                              DataModule1.ClienteDetalheVALOR_DESCTO.AsFloat:= ValorDesctoProduto;

                           DataModule1.ClienteDetalhe.Post;
                           DataModule1.ClienteDetalhe.ApplyUpdates(-1);
                           TotalRealDescto:= TotalRealDescto +ValorDescto;
                         except

                         end;
                     end;

                     DataModule1.ClienteDetalhe.Next;
               end;

                vDifDescto := DataModule1.ClientMestreTOTAL_DESCTO.AsFloat - fsvDesc;

                if vDifDescto < 0 then
                vDifDescto := vDifDescto * -1;

                Maiorvalor:= DataModule1.ClienteDetalheMaior.AsString;

               DataModule1.ClienteDetalhe.Locate('VALOR_TOTAL',Maiorvalor,[loPartialKey]);
               DataModule1.ClienteDetalhe.Edit;
               DataModule1.ClienteDetalheVALOR_DESCTO.AsFloat :=DesctoAcomulado + DataModule1.ClienteDetalheVALOR_DESCTO.AsFloat;
               DataModule1.ClienteDetalhe.Post;
               DataModule1.ClienteDetalhe.ApplyUpdates(-1);

      finally

             DataModule1.ClienteDetalhe.EnableControls;
      end;

 

Já fiz de tudo não funciona, ão sei o que é exatamente

 

1 hora atrás, Adelmo Junior disse:

Não funcionou!

Influencia nos tipos de variáveis com currency, extended e double?

estava usando currency e extended vinha com casas decimais com 6 dígitos e agora mudei para double e ja mudou aqui, acredito que seja isso

Postado

Eu nunca vi isso, estava funcionando de boa!

De uns dias pra cá o pessoa começou a falar que as notas estavam ficando em contingencia por esse motivo

trabalho a anos com isso e nunca demorei tanto a resolver um problema desse e não lembro ter alterado o nada nesse código

×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.