Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado

Boa tarde sobre os desconto de eu faço um rateio nos itens, ate tudo bem mais em nota de 511,51 com desconto de 3,76  total da nota de 507,75

com 8 itens, está me dando erro 537 por causa do arredondamento da sefaz como vocês faz para isso não acontecer pega a diferença algo do tipo? 

Postado

Boa tarde BigWings

esta informação não ajudou muito, estou tentando adaptar esse código de rateio mas ta dificil.

 

procedure Tfrmnotafiscal.brateioClick(Sender: TObject);
var
  vdesc_item: Real;
begin

  vtotal_produtos := 0;
  vtotal_nota := 0;

  if check_desconto.Checked = True then
  begin
    qrnotafiscal_item.first;
    while not qrnotafiscal_item.eof do
    begin
      if (frmnotafiscal_menu.qrnota.fieldbyname('desconto').AsFloat +
        frmnotafiscal_menu.qrnota.fieldbyname('desconto_item').AsFloat) > 0 then
      begin
        query.close;
        query.sql.clear;
        query.sql.add('update c000062 set');
        query.sql.add('desconto = :descontox, total = :totalx');
        if qrnotafiscal_item.fieldbyname('codigo').AsString = '' then
        begin
          query.sql.add(',codigo = ''' + frmprincipal.Codifica
            ('000062',10) + '''');
          query.sql.add
            (' where codproduto = :codproduto and codnota = :codnota and total = :total and codlancamento = :codlancamento');
          query.params.parambyname('total').AsFloat :=
            qrnotafiscal_item.fieldbyname('total').AsFloat;
          query.params.parambyname('codproduto').AsString :=
            qrnotafiscal_item.fieldbyname('codproduto').AsString;
          query.params.parambyname('codnota').AsString :=
            qrnotafiscal_item.fieldbyname('codnota').AsString;
          query.params.parambyname('codlancamento').AsString :=
            qrnotafiscal_item.fieldbyname('codlancamento').AsString;
        end
        else
        begin
          query.sql.add(' where codigo = ''' + qrnotafiscal_item.fieldbyname
            ('codigo').AsString + '''');
        end;

        if frmnotafiscal_menu.qrnotaDESCONTO.AsFloat > 0 then
          vdesc_item := frmnotafiscal_menu.qrnotaDESCONTO.AsFloat
        else
          vdesc_item := frmnotafiscal_menu.qrnotaDESCONTO_ITEM.AsFloat;

        if frmnotafiscal_menu.qrnotaVALOR_PRODUTOS.AsFloat > 0 then
          query.params.parambyname('descontox').AsFloat :=
            RoundTo(qrnotafiscal_item.fieldbyname('subtotal').AsFloat * vdesc_item /
            frmnotafiscal_menu.qrnotaVALOR_PRODUTOS.AsFloat,-2)
        else
          query.params.parambyname('descontox').AsFloat := 0;

        query.params.parambyname('totalx').AsFloat :=
          (qrnotafiscal_item.fieldbyname('unitario').AsFloat *
          qrnotafiscal_item.fieldbyname('qtde').AsFloat) -
          query.params.parambyname('descontox').AsFloat;

        query.ExecSQL;

        vdesconto_atual := vdesconto_atual +
          RoundTo((qrnotafiscal_item.fieldbyname('subtotal').AsFloat * vdesc_item /
          frmnotafiscal_menu.qrnotaVALOR_PRODUTOS.AsFloat), -2);
      end
      else
      begin
        vdesconto_atual := vdesconto_atual + qrnotafiscal_item.fieldbyname
          ('desconto').AsFloat;
      end;

      vtotal_produtos := vtotal_produtos + qrnotafiscal_item.fieldbyname
        ('subtotal').AsFloat;
      vtotal_nota := vtotal_nota + qrnotafiscal_item.fieldbyname
        ('total').AsFloat;

      qrnotafiscal_item.Next;
      Application.ProcessMessages;
    end;

    frmnotafiscal_menu.qrnota.fieldbyname('valor_produtos').AsFloat :=
      vtotal_produtos;
    frmnotafiscal_menu.qrnota.fieldbyname('total_nota').AsFloat := vtotal_nota;

    if check_desconto.Checked = True then
    begin
      frmnotafiscal_menu.qrnota.fieldbyname('desconto_item').AsFloat :=
        vdesconto_atual;
      frmnotafiscal_menu.qrnota.fieldbyname('desconto').AsFloat := 0;
    end
    else
    begin
      frmnotafiscal_menu.qrnota.fieldbyname('desconto').AsFloat :=
        vdesconto_atual;
      frmnotafiscal_menu.qrnota.fieldbyname('desconto_item').AsFloat := 0;
    end;

    frmmodulo.Conexao.Commit;

    qrnotafiscal_item.Close;
    qrnotafiscal_item.sql.Clear;
    qrnotafiscal_item.sql.add('select item.*, pro.produto, pro.unidade');
    qrnotafiscal_item.sql.add('from c000062 item, c000025 pro');
    qrnotafiscal_item.sql.add('where item.codproduto = pro.codigo and');
    qrnotafiscal_item.sql.add('item.codnota = ''' +
      frmnotafiscal_menu.qrnota.fieldbyname('codigo').AsString +
      ''' order by item');
    qrnotafiscal_item.Open;
  end
  else
  begin
    {
    vdesconto_atual := 0;
    qrnotafiscal_item.First;
    while not qrnotafiscal_item.eof do
    begin
      vdesconto_atual := vdesconto_atual + qrnotafiscal_item.fieldbyname
        ('desconto').AsFloat;
      qrnotafiscal_item.Next;
    end;

    Application.ProcessMessages;

    if vdesconto_atual > 0 then
      frmnotafiscal_menu.qrnota.fieldbyname('desconto').AsFloat :=
        vdesconto_atual
    else }
    begin
      qrnotafiscal_item.First;
      while not qrnotafiscal_item.eof do
      begin
        query.close;
        query.sql.clear;
        query.sql.add('update c000062 set');
        query.sql.add('desconto = :descontox, total = :totalx');
        if qrnotafiscal_item.fieldbyname('codigo').AsString = '' then
        begin
          query.sql.add(',codigo = ''' + frmprincipal.Codifica
            ('000062',10) + '''');
          query.sql.add
            (' where codproduto = :codproduto and codnota = :codnota and total = :total and codlancamento = :codlancamento');
          query.params.parambyname('total').AsFloat :=
            qrnotafiscal_item.fieldbyname('total').AsFloat;
          query.params.parambyname('codproduto').AsString :=
            qrnotafiscal_item.fieldbyname('codproduto').AsString;
          query.params.parambyname('codnota').AsString :=
            qrnotafiscal_item.fieldbyname('codnota').AsString;
          query.params.parambyname('codlancamento').AsString :=
            qrnotafiscal_item.fieldbyname('codlancamento').AsString;
        end
        else
        begin
          query.sql.add(' where codigo = ''' + qrnotafiscal_item.fieldbyname
            ('codigo').AsString + '''');
        end;

        if frmnotafiscal_menu.qrnotaDESCONTO.AsFloat > 0 then
          vdesc_item := frmnotafiscal_menu.qrnotaDESCONTO.AsFloat
        else
          vdesc_item := frmnotafiscal_menu.qrnotaDESCONTO_ITEM.AsFloat;

        if frmnotafiscal_menu.qrnotaVALOR_PRODUTOS.AsFloat > 0 then
          query.params.parambyname('descontox').AsFloat :=
            RoundTo(qrnotafiscal_item.fieldbyname('subtotal').AsFloat * vdesc_item /
            frmnotafiscal_menu.qrnotaVALOR_PRODUTOS.AsFloat, -2)
        else
          query.params.parambyname('descontox').AsFloat := 0;

        query.params.parambyname('totalx').AsFloat :=
          (qrnotafiscal_item.fieldbyname('unitario').AsFloat *
          qrnotafiscal_item.fieldbyname('qtde').AsFloat) -
          query.params.parambyname('descontox').AsFloat;

        query.ExecSQL;

        vdesconto_atual := vdesconto_atual +
          RoundTo((qrnotafiscal_item.fieldbyname('subtotal').AsFloat * vdesc_item /
          frmnotafiscal_menu.qrnotaVALOR_PRODUTOS.AsFloat), -2);

        vtotal_produtos := vtotal_produtos + qrnotafiscal_item.fieldbyname
          ('subtotal').AsFloat;
        vtotal_nota := vtotal_nota + qrnotafiscal_item.fieldbyname
          ('total').AsFloat;

        qrnotafiscal_item.Next;
        Application.ProcessMessages;
      end;

    end;

    frmnotafiscal_menu.qrnota.fieldbyname('valor_produtos').AsFloat :=
      vtotal_produtos;
    frmnotafiscal_menu.qrnota.fieldbyname('total_nota').AsFloat := vtotal_nota;

    if check_desconto.Checked = True then
    begin
      frmnotafiscal_menu.qrnota.fieldbyname('desconto_item').AsFloat :=
        vdesconto_atual;
      frmnotafiscal_menu.qrnota.fieldbyname('desconto').AsFloat := 0;
    end
    else
    begin
      frmnotafiscal_menu.qrnota.fieldbyname('desconto').AsFloat :=
        vdesconto_atual;
      frmnotafiscal_menu.qrnota.fieldbyname('desconto_item').AsFloat := 0;
    end;

    frmmodulo.Conexao.Commit;

    qrnotafiscal_item.close;
    qrnotafiscal_item.sql.clear;
    qrnotafiscal_item.sql.add('select item.*, pro.produto, pro.unidade');
    qrnotafiscal_item.sql.add('from c000062 item, c000025 pro');
    qrnotafiscal_item.sql.add('where item.codproduto = pro.codigo and');
    qrnotafiscal_item.sql.add('item.codnota = ''' +
      frmnotafiscal_menu.qrnota.fieldbyname('codigo').AsString +
      ''' order by item');
    qrnotafiscal_item.Open;

  end;
end;

 

  • Moderadores
Postado
2 horas atrás, Dfox disse:

query.params.parambyname('descontox').AsFloat := RoundTo(qrnotafiscal_item.fieldbyname('subtotal').AsFloat * vdesc_item / frmnotafiscal_menu.qrnotaVALOR_PRODUTOS.AsFloat,-2)

Nessa linha você precisa fazer o mesmo cálculo mas sem a chamada do RoundTo, depois chamar o RoundTo e ver qual a diferença entre os dois cálculos. Essa diferença é o resíduo que você acumula em outra variável, ao final do loop você volta no item de maior valor e soma esse acumulado ao desconto.

Equipe ACBr BigWings
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr

 

 

Postado
11 minutos atrás, BigWings disse:

Nessa linha você precisa fazer o mesmo cálculo mas sem a chamada do RoundTo, depois chamar o RoundTo e ver qual a diferença entre os dois cálculos. Essa diferença é o resíduo que você acumula em outra variável, ao final do loop você volta no item de maior valor e soma esse acumulado ao desconto.

acho que consegui

procedure Tfrmnotafiscal.brateioClick(Sender: TObject);
var
  vdesc_item, vdesc_itemtotal, vdesc_itemdif :Real;
begin

  vtotal_produtos := 0;
  vtotal_nota := 0;

  if check_desconto.Checked = True then
  begin
    qrnotafiscal_item.first;
    while not qrnotafiscal_item.eof do
    begin
      if (frmnotafiscal_menu.qrnota.fieldbyname('desconto').AsFloat +
        frmnotafiscal_menu.qrnota.fieldbyname('desconto_item').AsFloat) > 0 then
      begin
        query.close;
        query.sql.clear;
        query.sql.add('update c000062 set');
        query.sql.add('desconto = :descontox, total = :totalx');
        if qrnotafiscal_item.fieldbyname('codigo').AsString = '' then
        begin
          query.sql.add(',codigo = ''' + frmprincipal.Codifica
            ('000062',10) + '''');
          query.sql.add
            (' where codproduto = :codproduto and codnota = :codnota and total = :total and codlancamento = :codlancamento');
          query.params.parambyname('total').AsFloat :=
            qrnotafiscal_item.fieldbyname('total').AsFloat;
          query.params.parambyname('codproduto').AsString :=
            qrnotafiscal_item.fieldbyname('codproduto').AsString;
          query.params.parambyname('codnota').AsString :=
            qrnotafiscal_item.fieldbyname('codnota').AsString;
          query.params.parambyname('codlancamento').AsString :=
            qrnotafiscal_item.fieldbyname('codlancamento').AsString;
        end
        else
        begin
          query.sql.add(' where codigo = ''' + qrnotafiscal_item.fieldbyname
            ('codigo').AsString + '''');
        end;

        if frmnotafiscal_menu.qrnotaDESCONTO.AsFloat > 0 then
          vdesc_item := frmnotafiscal_menu.qrnotaDESCONTO.AsFloat
        else
          vdesc_item := frmnotafiscal_menu.qrnotaDESCONTO_ITEM.AsFloat;

        if frmnotafiscal_menu.qrnotaVALOR_PRODUTOS.AsFloat > 0 then
          query.params.parambyname('descontox').AsFloat :=
            RoundTo(qrnotafiscal_item.fieldbyname('subtotal').AsFloat * vdesc_item /
            frmnotafiscal_menu.qrnotaVALOR_PRODUTOS.AsFloat,-2)
        else
          query.params.parambyname('descontox').AsFloat := 0;

        query.params.parambyname('totalx').AsFloat :=
          (qrnotafiscal_item.fieldbyname('unitario').AsFloat *
          qrnotafiscal_item.fieldbyname('qtde').AsFloat) -
          query.params.parambyname('descontox').AsFloat;

        query.ExecSQL;

        vdesconto_atual := vdesconto_atual +
          (qrnotafiscal_item.fieldbyname('subtotal').AsFloat * vdesc_item /
          frmnotafiscal_menu.qrnotaVALOR_PRODUTOS.AsFloat);

        vdesc_itemtotal := vdesc_itemtotal +
          RoundTo((qrnotafiscal_item.fieldbyname('subtotal').AsFloat * vdesc_item /
          frmnotafiscal_menu.qrnotaVALOR_PRODUTOS.AsFloat), -2);  
      end
      else
      begin
        vdesconto_atual := vdesconto_atual + qrnotafiscal_item.fieldbyname
          ('desconto').AsFloat;
      end;

      vtotal_produtos := vtotal_produtos + qrnotafiscal_item.fieldbyname
        ('subtotal').AsFloat;
      vtotal_nota := vtotal_nota + qrnotafiscal_item.fieldbyname
        ('total').AsFloat;

      qrnotafiscal_item.Next;
      Application.ProcessMessages;
    end;

    if check_desconto.Checked = True then
    begin
      frmnotafiscal_menu.qrnota.fieldbyname('desconto_item').AsFloat :=
        vdesconto_atual;
      frmnotafiscal_menu.qrnota.fieldbyname('desconto').AsFloat := 0;
    end
    else
    begin
      frmnotafiscal_menu.qrnota.fieldbyname('desconto').AsFloat :=
        vdesconto_atual;
      frmnotafiscal_menu.qrnota.fieldbyname('desconto_item').AsFloat := 0;
    end;
    frmnotafiscal_menu.qrnota.fieldbyname('valor_produtos').AsFloat := vtotal_produtos;
    frmnotafiscal_menu.qrnota.fieldbyname('total_nota').AsFloat := vtotal_nota;

    {verifico a diferença de desconto}
    vdesc_itemdif := vdesc_itemtotal - vdesconto_atual;
    if vdesc_itemdif <> 0 then
    begin
      query.close;
      query.sql.clear;
      query.sql.add('update c000062 set');
      if vdesc_itemtotal > vdesconto_atual then query.sql.add('desconto = desconto - :vdesc_itemdif, total = total - :vdesc_itemdif');
      if vdesc_itemtotal < vdesconto_atual then query.sql.add('desconto = desconto + :vdesc_itemdif, total = total + :vdesc_itemdif');
      query.sql.add('where total = (select Max(total) from c000062 where codnota = :codnota) and codnota = :codnota rows 1');
      query.params.parambyname('vdesc_itemdif').AsFloat := vdesc_itemdif;
      query.params.parambyname('codnota').AsString := frmnotafiscal_menu.qrnota.fieldbyname('codigo').AsString;
      query.ExecSQL;
    end;
    
    frmmodulo.Conexao.Commit;

    qrnotafiscal_item.Close;
    qrnotafiscal_item.sql.Clear;
    qrnotafiscal_item.sql.add('select item.*, pro.produto, pro.unidade');
    qrnotafiscal_item.sql.add('from c000062 item, c000025 pro');
    qrnotafiscal_item.sql.add('where item.codproduto = pro.codigo and');
    qrnotafiscal_item.sql.add('item.codnota = ''' +
      frmnotafiscal_menu.qrnota.fieldbyname('codigo').AsString +
      ''' order by item');
    qrnotafiscal_item.Open;
  end
  else
  begin
    {
    vdesconto_atual := 0;
    qrnotafiscal_item.First;
    while not qrnotafiscal_item.eof do
    begin
      vdesconto_atual := vdesconto_atual + qrnotafiscal_item.fieldbyname
        ('desconto').AsFloat;
      qrnotafiscal_item.Next;
    end;

    Application.ProcessMessages;

    if vdesconto_atual > 0 then
      frmnotafiscal_menu.qrnota.fieldbyname('desconto').AsFloat :=
        vdesconto_atual
    else }
    begin
      qrnotafiscal_item.First;
      while not qrnotafiscal_item.eof do
      begin
        query.close;
        query.sql.clear;
        query.sql.add('update c000062 set');
        query.sql.add('desconto = :descontox, total = :totalx');
        if qrnotafiscal_item.fieldbyname('codigo').AsString = '' then
        begin
          query.sql.add(',codigo = ''' + frmprincipal.Codifica
            ('000062',10) + '''');
          query.sql.add
            (' where codproduto = :codproduto and codnota = :codnota and total = :total and codlancamento = :codlancamento');
          query.params.parambyname('total').AsFloat :=
            qrnotafiscal_item.fieldbyname('total').AsFloat;
          query.params.parambyname('codproduto').AsString :=
            qrnotafiscal_item.fieldbyname('codproduto').AsString;
          query.params.parambyname('codnota').AsString :=
            qrnotafiscal_item.fieldbyname('codnota').AsString;
          query.params.parambyname('codlancamento').AsString :=
            qrnotafiscal_item.fieldbyname('codlancamento').AsString;
        end
        else
        begin
          query.sql.add(' where codigo = ''' + qrnotafiscal_item.fieldbyname
            ('codigo').AsString + '''');
        end;

        if frmnotafiscal_menu.qrnotaDESCONTO.AsFloat > 0 then
          vdesc_item := frmnotafiscal_menu.qrnotaDESCONTO.AsFloat
        else
          vdesc_item := frmnotafiscal_menu.qrnotaDESCONTO_ITEM.AsFloat;

        if frmnotafiscal_menu.qrnotaVALOR_PRODUTOS.AsFloat > 0 then
          query.params.parambyname('descontox').AsFloat :=
            RoundTo(qrnotafiscal_item.fieldbyname('subtotal').AsFloat * vdesc_item /
            frmnotafiscal_menu.qrnotaVALOR_PRODUTOS.AsFloat, -2)
        else
          query.params.parambyname('descontox').AsFloat := 0;

        query.params.parambyname('totalx').AsFloat :=
          (qrnotafiscal_item.fieldbyname('unitario').AsFloat *
          qrnotafiscal_item.fieldbyname('qtde').AsFloat) -
          query.params.parambyname('descontox').AsFloat;

        query.ExecSQL;

        vdesconto_atual := vdesconto_atual +
          (qrnotafiscal_item.fieldbyname('subtotal').AsFloat * vdesc_item /
          frmnotafiscal_menu.qrnotaVALOR_PRODUTOS.AsFloat);

        vdesc_itemtotal := vdesc_itemtotal +
          RoundTo((qrnotafiscal_item.fieldbyname('subtotal').AsFloat * vdesc_item /
          frmnotafiscal_menu.qrnotaVALOR_PRODUTOS.AsFloat), -2);  

        vtotal_produtos := vtotal_produtos + qrnotafiscal_item.fieldbyname
          ('subtotal').AsFloat;
        vtotal_nota := vtotal_nota + qrnotafiscal_item.fieldbyname
          ('total').AsFloat;

        qrnotafiscal_item.Next;
        Application.ProcessMessages;
      end;

    end;

    if check_desconto.Checked = True then
    begin
      frmnotafiscal_menu.qrnota.fieldbyname('desconto_item').AsFloat :=
        vdesconto_atual;
      frmnotafiscal_menu.qrnota.fieldbyname('desconto').AsFloat := 0;
    end
    else
    begin
      frmnotafiscal_menu.qrnota.fieldbyname('desconto').AsFloat :=
        vdesconto_atual;
      frmnotafiscal_menu.qrnota.fieldbyname('desconto_item').AsFloat := 0;
    end;
    frmnotafiscal_menu.qrnota.fieldbyname('valor_produtos').AsFloat := vtotal_produtos;
    frmnotafiscal_menu.qrnota.fieldbyname('total_nota').AsFloat := vtotal_nota;

    {verifico a diferença de desconto}
    vdesc_itemdif := vdesc_itemtotal - vdesconto_atual;
    if vdesc_itemdif <> 0 then
    begin
      query.close;
      query.sql.clear;
      query.sql.add('update c000062 set');
      if vdesc_itemtotal > vdesconto_atual then query.sql.add('desconto = desconto - :vdesc_itemdif, total = total - :vdesc_itemdif');
      if vdesc_itemtotal < vdesconto_atual then query.sql.add('desconto = desconto + :vdesc_itemdif, total = total + :vdesc_itemdif');
      query.sql.add('where total = (select Max(total) from c000062 where codnota = :codnota) and codnota = :codnota rows 1');
      query.params.parambyname('vdesc_itemdif').AsFloat := vdesc_itemdif;
      query.params.parambyname('codnota').AsString := frmnotafiscal_menu.qrnota.fieldbyname('codigo').AsString;
      query.ExecSQL;
    end;

    frmmodulo.Conexao.Commit;

    qrnotafiscal_item.close;
    qrnotafiscal_item.sql.clear;
    qrnotafiscal_item.sql.add('select item.*, pro.produto, pro.unidade');
    qrnotafiscal_item.sql.add('from c000062 item, c000025 pro');
    qrnotafiscal_item.sql.add('where item.codproduto = pro.codigo and');
    qrnotafiscal_item.sql.add('item.codnota = ''' +
      frmnotafiscal_menu.qrnota.fieldbyname('codigo').AsString +
      ''' order by item');
    qrnotafiscal_item.Open;

  end;
end;

estou testando aqui 

Postado

eu alterei essas linha e funciono perfeitamente

      if vdesc_itemtotal > vdesconto_atual then query.sql.add('desconto = desconto - :vdesc_itemdif, total = total + :vdesc_itemdif');
      if vdesc_itemtotal < vdesconto_atual then query.sql.add('desconto = desconto + :vdesc_itemdif, total = total - :vdesc_itemdif');

 

Postado

Obrigado pelo esclarecimento BigWings

eu alterei essa linha com abs para a diferença sempre ficar positiva, Resolvido.

vdesc_itemdif := Abs(vdesc_itemtotal - vdesconto_atual);

 

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

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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.

The popup will be closed in 10 segundos...