 |
ActiveDelphi .: O site do programador Delphi! :.
|
Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
chip_set Experiente


Registrado: Quarta-Feira, 14 de Dezembro de 2005 Mensagens: 448
|
Enviada: Seg Jun 27, 2011 12:20 pm Assunto: [Resolvido] Distribuição de Desconto |
|
|
Bom dia Galera, o que eu estou trazendo hoje nunca me havia afetado, porem agora com esse negocio de PAF-ECF tem me dado um dor de cabeça imensa, que a distribuição do desconto Exemplo
Eu tenho a seguinte venda
SubTotal = 35,70
Desconto = 4,64
Total Geral = 31,06
Percentual de desconto aplicado = 12,99720
e os seguintes produtos
produto quantidade valor unitario s/ desc valor unit c/ desc total
1 5 0,50 0,44 2,20
2 2 0,50 0,44 0,88
3 1 12,20 10,61 10,61
4 2 10,00 8,70 17,40
Se somarmos os valores agora depois de aplicado o desconto o valor total vai ser diferente do valor total da nota. Ou seja ao invés de ficar em 31,06 o valor vai pra 31,09 e isso ta dando me gerando uma dor de cabeça danada, pois quanto eu vou enviar os dados para a importação o valor dos produtos difere do valor da venda.
Abaixo segue o Código que estou utilizando.
dados.CDS_ITENS_VENDAS.Edit;
dados.CDS_ITENS_VENDASVAL_C_DESCONTO.Value:=roundto(dados.CDS_ITENS_VENDASVALOR_UNIT.Value-(dados.CDS_ITENS_VENDASVALOR_UNIT.Value*(strtofloat(edit1.Text)/100)),-2);
dados.CDS_ITENS_VENDAStotal_c_desconto.Value:=dados.CDS_ITENS_VENDASVAL_C_DESCONTO.Value*dados.CDS_ITENS_VENDASQUANTIDADE.Value;
dados.CDS_ITENS_VENDAS.Post;
dados.CDS_ITENS_VENDAS.ApplyUpdates(0);
Editado pela última vez por chip_set em Ter Jul 12, 2011 11:58 am, num total de 1 vez |
|
Voltar ao Topo |
|
 |
chip_set Experiente


Registrado: Quarta-Feira, 14 de Dezembro de 2005 Mensagens: 448
|
Enviada: Ter Jun 28, 2011 10:13 am Assunto: |
|
|
Encontrei uma função que igual do roundto porem em currency que dizia solucionar o problema, a função é a seguinte:
function arredonda_liberty(const AValue: Currency; const ADigit: TRoundToRange): Currency;
var
LFactor: Extended;
rmOrig: TFPURoundingMode;
begin
LFactor := IntPower(10, ADigit);
Result := Round(AValue / LFactor) * LFactor;
rmOrig := GetRoundMode();
if rmOrig <> rmNearest then begin
SetRoundMode(rmNearest);
Result := Round(Result / LFactor) * LFactor;
SetRoundMode(rmOrig);
end;
end;
Porém o problema continua, então fiz o seguinte para resolver provisóriamente o problema até achar uma solução melhor:
if valor_total<dados>=valor_total do
begin
dados.CDS_ITENS_VENDAS.Edit;
dados.CDS_ITENS_VENDASVAL_C_DESCONTO.Value:=(dados.CDS_ITENS_VENDASTOTAL_C_DESCONTO.Value+0.01)/dados.CDS_ITENS_VENDASQUANTIDADE.Value;
dados.CDS_ITENS_VENDASTOTAL_C_DESCONTO.Value:=dados.CDS_ITENS_VENDASVAL_C_DESCONTO.Value*dados.CDS_ITENS_VENDASQUANTIDADE.Value;
dados.CDS_ITENS_VENDAS.Post;
dados.CDS_ITENS_VENDAS.ApplyUpdates(0);
valor_total:=valor_total+0.01;
// showmessage(FormatFloat('###0.00',valor_total));
dados.cds_itens_vendas.Next;
end
end;
if valor_total>dados.CDS_VENDASVALOR_TOTAL.Value then
begin
valor_total:=valor_total-0.01;
dados.CDS_ITENS_VENDAS.First;
while dados.CDS_VENDASVALOR_TOTAL.Value<=valor_total do
begin
dados.CDS_ITENS_VENDAS.Edit;
dados.CDS_ITENS_VENDASVAL_C_DESCONTO.Value:=(dados.CDS_ITENS_VENDASTOTAL_C_DESCONTO.Value-0.01)/dados.CDS_ITENS_VENDASQUANTIDADE.Value;
dados.CDS_ITENS_VENDASTOTAL_C_DESCONTO.Value:=dados.CDS_ITENS_VENDASVAL_C_DESCONTO.Value*dados.CDS_ITENS_VENDASQUANTIDADE.Value;
dados.CDS_ITENS_VENDAS.Post;
dados.CDS_ITENS_VENDAS.ApplyUpdates(0);
valor_total:=valor_total-0.01;
// showmessage(FormatFloat('###0.00',valor_total));
dados.cds_itens_vendas.Next;
end
end; |
|
Voltar ao Topo |
|
 |
joemil Moderador

Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 9100 Localização: Sinop-MT
|
Enviada: Ter Jun 28, 2011 10:30 am Assunto: |
|
|
eu faco parecido com isso:
1. calculo o percentual do desconto
2. dou o desconto em cada item, somando o total
3. se o total somado for diferente do total da nota, somo ou subtraio a diferenca do total da nota
mas sempre da uma diferenca mesmo, pq o calculo é inverso _________________ <b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/ |
|
Voltar ao Topo |
|
 |
gilsonnrodrigues Moderador

Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Ter Jun 28, 2011 12:51 pm Assunto: |
|
|
Citação: | se o total somado for diferente do total da nota, somo ou subtraio a diferenca do total da nota |
mas ai vc estaria violando a informação.
exemplo:
venda:
<PRE>
prod valor
1 5,00
2 5,00
3 5,00
subtotal: 15,00
desconto: 5,00
Total: 10,00
</PRE>
rateamento: (5 / 15 = 0,33333333333333333333333333333333 ou (1/3))
<PRE>
prod valor desc Total item
1 5,00 1,66 3,34
2 5,00 1,66 3,34
3 5,00 1,66 3,34
soma: 15,00 4,98 10,02
</PRE>
e ai?
vai mudar o total da nota pra 10,02?
mas a nota foi 10,00 |
|
Voltar ao Topo |
|
 |
joemil Moderador

Registrado: Quinta-Feira, 25 de Março de 2004 Mensagens: 9100 Localização: Sinop-MT
|
Enviada: Ter Jun 28, 2011 3:08 pm Assunto: |
|
|
ops.
Citação: | se o total somado for diferente do total da nota, somo ou subtraio a diferenca do total da nota |
ta errado o texto ai:
se o total somado for diferente do total da nota, somo ou subtraio a diferenca do ultimo item da nota _________________ <b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
Enviar imagens: http://tinypic.com/ |
|
Voltar ao Topo |
|
 |
chip_set Experiente


Registrado: Quarta-Feira, 14 de Dezembro de 2005 Mensagens: 448
|
Enviada: Ter Jun 28, 2011 3:35 pm Assunto: |
|
|
pois é vou corrigir, assim que eu tiver uma solução definitiva eu posto aqui. |
|
Voltar ao Topo |
|
 |
gilsonnrodrigues Moderador

Registrado: Quinta-Feira, 14 de Abril de 2005 Mensagens: 9009 Localização: Governador Valadares-MG
|
Enviada: Ter Jun 28, 2011 7:23 pm Assunto: |
|
|
joemil escreveu: | ops.
Citação: | se o total somado for diferente do total da nota, somo ou subtraio a diferenca do total da nota |
ta errado o texto ai:
se o total somado for diferente do total da nota, somo ou subtraio a diferenca do ultimo item da nota |
mas não é simples assim:
e se nesse exemplo meu, o ultimo item ai de 5,00 fosse 4,98 e tivesse mais um de 0,02?
se vc jogasse o restante nele ele iria ficar negativo. |
|
Voltar ao Topo |
|
 |
chip_set Experiente


Registrado: Quarta-Feira, 14 de Dezembro de 2005 Mensagens: 448
|
Enviada: Qui Jul 07, 2011 5:33 pm Assunto: |
|
|
Bom fiz o seguinte, e parece que está funcionando as vezes até leva uns 3 ou 5 segundos mais funciona.
while (valor_total<>dados.CDS_VENDASVALOR_TOTAL.AsCurrency) and (valor_total<>(dados.CDS_VENDASVALOR_TOTAL.AsCurrency+0.01)) and (valor_total<dados>dados.CDS_VENDASVALOR_TOTAL.AsCurrency then
begin
// (-)
showmessage('O valor total é MAIOR vamos - que o valor das vendas');
diferenca:=valor_total-dados.CDS_VENDASVALOR_TOTAL.Value;
// diferenca:=diferenca*-1;
showmessage('A diferença do total a maior é de: '+currtostr(diferenca));
dados.CDS_ITENS_VENDAS.Edit;
dados.CDS_ITENS_VENDASVAL_C_DESCONTO.Value:=dados.CDS_ITENS_VENDASVAL_C_DESCONTO.Value-(diferenca/dados.CDS_ITENS_VENDASQUANTIDADE.Value);
dados.CDS_ITENS_VENDASTOTAL_C_DESCONTO.Value:=dados.CDS_ITENS_VENDASVAL_C_DESCONTO.Value*dados.CDS_ITENS_VENDASQUANTIDADE.Value;
dados.CDS_ITENS_VENDAS.Post;
dados.CDS_ITENS_VENDAS.ApplyUpdates(0);
end;
if valor_total<dados.CDS_VENDASVALOR_TOTAL.AsCurrency then
begin
//(+)
showmessage('O valor total é menor que o valor das vendas');
diferenca:=dados.CDS_VENDASVALOR_TOTAL.Value-valor_total;
// diferenca:=diferenca*-1;
showmessage('A diferença do total a MAIOR vamos + é de: '+currtostr(diferenca));
dados.CDS_ITENS_VENDAS.Edit;
dados.CDS_ITENS_VENDASVAL_C_DESCONTO.Value:=dados.CDS_ITENS_VENDASVAL_C_DESCONTO.Value+(diferenca/dados.CDS_ITENS_VENDASQUANTIDADE.Value);
dados.CDS_ITENS_VENDASTOTAL_C_DESCONTO.Value:=dados.CDS_ITENS_VENDASVAL_C_DESCONTO.Value*dados.CDS_ITENS_VENDASQUANTIDADE.Value;
dados.CDS_ITENS_VENDAS.Post;
dados.CDS_ITENS_VENDAS.ApplyUpdates(0);
end;
valor_total:=0;
dados.CDS_ITENS_VENDAS.First;
while not dados.CDS_ITENS_VENDAS.Eof do
begin
valor_total:=valor_total+dados.CDS_ITENS_VENDASVAL_C_DESCONTO.Value*dados.CDS_ITENS_VENDASQUANTIDADE.Value;
dados.CDS_ITENS_VENDAS.Next;
end;
IF item<dados.CDS_ITENS_VENDAS.RecordCount then
ITEM:=ITEM+1 else
item:=1;
// termina o while
end;
Se alguem tiger uma solução melhor posta ai pra gente blz. |
|
Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|