ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

[Resolvido] Distribuição de Desconto

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
chip_set
Experiente
Experiente


Registrado: Quarta-Feira, 14 de Dezembro de 2005
Mensagens: 448

MensagemEnviada: Seg Jun 27, 2011 12:20 pm    Assunto: [Resolvido] Distribuição de Desconto Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
chip_set
Experiente
Experiente


Registrado: Quarta-Feira, 14 de Dezembro de 2005
Mensagens: 448

MensagemEnviada: Ter Jun 28, 2011 10:13 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9100
Localização: Sinop-MT

MensagemEnviada: Ter Jun 28, 2011 10:30 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Ter Jun 28, 2011 12:51 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
joemil
Moderador
Moderador


Registrado: Quinta-Feira, 25 de Março de 2004
Mensagens: 9100
Localização: Sinop-MT

MensagemEnviada: Ter Jun 28, 2011 3:08 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
chip_set
Experiente
Experiente


Registrado: Quarta-Feira, 14 de Dezembro de 2005
Mensagens: 448

MensagemEnviada: Ter Jun 28, 2011 3:35 pm    Assunto: Responder com Citação

pois é vou corrigir, assim que eu tiver uma solução definitiva eu posto aqui.
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
gilsonnrodrigues
Moderador
Moderador


Registrado: Quinta-Feira, 14 de Abril de 2005
Mensagens: 9009
Localização: Governador Valadares-MG

MensagemEnviada: Ter Jun 28, 2011 7:23 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
chip_set
Experiente
Experiente


Registrado: Quarta-Feira, 14 de Dezembro de 2005
Mensagens: 448

MensagemEnviada: Qui Jul 07, 2011 5:33 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB