Ir para conteúdo
  • Cadastre-se

dev botao

Problema Com Arredondamento


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

Recommended Posts

Seguinte: Segundo o manual do SPED fiscal exitem campos numéricos com 2, 3 , 4 casas após a virgula.
No meu caso estou mandando 4 casas decimais para o seguinte campo:
ALIQ_PIS Alíquota do PIS(em reais) N 04: campo 30 do registro C170
 
O layout diz que pode ser enviado até 4 casas, porém após o arquivo ser gerado dentro do mesmo este campo vem com apenas 2 casas, e ai fica errado.
 
A empresa que gera SPED utilizando este campo é uma empresa de bebida e ela utiliza 0,1248 como aliquota em reais.
 
Segue um exemplo de calculo:
QUANT_BC_PIS = 2 
ALIQ_PIS  = 0,1248
VL_PIS = QUANT_BC_PIS x ALIQ_PIS  
VL_PIS = 0,2496 = 0,25
 
Quando o componente gera o arquivo ele gera assim:
|2,00|0,12|0,25|
 
Mas está errado!
2 x 0,12 = 0,24
 
Como eu faço para ele aceitar mais casas decimais? Tem uma opção no componente, porém ele coloca para todos os campos, ai da erro na hora de validar, para os campos que pedem apenas duas casas.
Link para o comentário
Compartilhar em outros sites

  • Consultores

   Como o guia prático e o validador (PVA) tratam esse caso? Dizem pra lançar com as quatro casas?

 

   Se esse for o caso, eu já vi esse problema aqui no fórum para alguns registros. Só não lembro se era o C170 e se era do SPED Fiscal ou PIS/COFINS.

   Para corrigir, bastaria apenas fazer uma pequena modificação no componente na hora que ele formata os campos que vão para o arquivo. Mas precisa ter certeza de como o validador e o guia prático trata isto.

   Sugiro que você verifique, e depois faça uma busca no fórum. Assim você mesmo pode postar o código corrigido.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

Consegui solucionar o meu problema da seguinte forma:

 

Alterei o componente unit ACBrEFDBloco_C_Class.

 

Tem comentário ao lado das linhas alteradas com meu nome.

Tive que colocar mascara fixa em dois campos porque, no cliente onde geramos o sped eles utilizam valores muito pequenos, com isso se o valor for só com duas casas fica uma diferença muito grande no final.

Alterei a seguinte procedure: 

procedure TBloco_C.WriteRegistroC170(RegC100: TRegistroC100);

var
  intFor: integer;
  //strCST_IPI: AnsiString;
  //strCST_PIS: AnsiString;
  //strCST_COFINS: AnsiString;
  strLinha: AnsiString;
begin
  if Assigned( RegC100.RegistroC170 ) then
  begin
     //-- Before
     strLinha := '';
     if Assigned(FOnBeforeWriteRegistroC170) then
     begin
        FOnBeforeWriteRegistroC170(strLinha);
        if strLinha <> EmptyStr then
           Add(strLinha);
     end;


     for intFor := 0 to RegC100.RegistroC170.Count - 1 do
     begin
        with RegC100.RegistroC170.Items[intFor] do
        begin
          strLinha :=  LFill('C170') +
                       LFill( NUM_ITEM ) +
                       LFill( COD_ITEM ) +
                       LFill( DESCR_COMPL ) +
                       LFILL(QTD, 0, 4, False, '0', '#0.00000') +
                       LFill( UNID ) +
                       LFill( VL_ITEM, 0, 2 ) +
                       LFill( VL_DESC, 0, 2 ) +
                       LFill( Integer(IND_MOV), 0 ) +
                       LFill( CST_ICMS, 3 ) +
                       LFill( CFOP, 4 ) +
                       LFill( COD_NAT ) +
                       LFill( VL_BC_ICMS, 0, 2 ) +
                       LFill( ALIQ_ICMS,  0, 2 ) +
                       LFill( VL_ICMS, 0, 2 ) +
                       LFill( VL_BC_ICMS_ST, 0, 2 ) +
                       LFill( ALIQ_ST, 0, 2 ) +
                       LFill( VL_ICMS_ST, 0, 2 ) +
                       LFill( Integer(IND_APUR), 0 ) +
                       // LFill( strCST_IPI ) +
                       LFill( CST_IPI ) +
                       LFill( COD_ENQ ) +
                       LFill( VL_BC_IPI, 0, 2 ) +
                       LFill( ALIQ_IPI,  0, 2 ) +
                       LFill( VL_IPI, 0, 2 ) +
                       // LFill( strCST_PIS ) +
                       LFill( CST_PIS ) +
                       LFill( VL_BC_PIS, 0, 2 ) +
                       LFill( ALIQ_PIS_PERC, 0, 4 ) +
                       LFill( QUANT_BC_PIS,  0, 3 ) +
                       LFill( ALIQ_PIS_R, 0, 4, False, '0', '#0.0000') + //Coloquei mascara fixa de 4 casa para este campo: Jocimar Sartori
                       LFill( VL_PIS, 0, 2 ) +
                       // LFill( strCST_COFINS ) +
                       LFill( CST_COFINS ) +
                       LFill( VL_BC_COFINS, 0, 2 ) +
                       LFill( ALIQ_COFINS_PERC, 0, 4 ) +
                       LFill( QUANT_BC_COFINS,  0, 3 ) +
                       LFill( ALIQ_COFINS_R, 0, 4, False, '0', '#0.0000') +  //Coloquei mascara fixa de 4 casa para este campo: Jocimar Sartori
                       LFill( VL_COFINS, 0, 2 ) +
                       LFill( COD_CTA );
          //-- Write
          if Assigned(FOnWriteRegistroC170) then
             FOnWriteRegistroC170(strLinha);


          Add(strLinha);
        end;
        /// Registro FILHOS do FILHO
        WriteRegistroC171( RegC100.RegistroC170.Items[intFor] ) ;
        WriteRegistroC172( RegC100.RegistroC170.Items[intFor] ) ;
        WriteRegistroC173( RegC100.RegistroC170.Items[intFor] ) ;
        WriteRegistroC174( RegC100.RegistroC170.Items[intFor] ) ;
        WriteRegistroC175( RegC100.RegistroC170.Items[intFor] ) ;
        WriteRegistroC176( RegC100.RegistroC170.Items[intFor] ) ;
        WriteRegistroC177( RegC100.RegistroC170.Items[intFor] ) ;
        WriteRegistroC178( RegC100.RegistroC170.Items[intFor] ) ;
        WriteRegistroC179( RegC100.RegistroC170.Items[intFor] ) ;


        RegistroC990.QTD_LIN_C := RegistroC990.QTD_LIN_C + 1;
     end;
     //-- Before
     strLinha := '';
     if Assigned(FOnAfterWriteRegistroC170) then
     begin
        FOnAfterWriteRegistroC170(strLinha);
        if strLinha <> EmptyStr then
           Add(strLinha);
     end;
     /// Variavél para armazenar a quantidade de registro do tipo.
     FRegistroC170Count := FRegistroC170Count + RegC100.RegistroC170.Count;
  end;
end;
Editado por EMBarbosa
Adicionada tag CODE
Link para o comentário
Compartilhar em outros sites

  • Consultores

Estranho, o campo já está com o parâmetro para 4 casas no método LFill... Você chegou a ver o motivo disso não funcionar?

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

 Tive que alterar por este motivo:

 

strCurMascara := FCurMascara;
  // Se recebeu uma mascara como parametro substitue a principal
  if Mascara <> '' then
     strCurMascara := Mascara;
 
Por causa deste código dentro do método LFill. O Componente tem uma mascara padrão #0.00, porém para este campo eu preciso de uma precisão maior #0.0000.
Se não é passado mascara para o método LFill ele pega a padrão do componente.
Link para o comentário
Compartilhar em outros sites

  • Consultores

Poderia anexar o arquivo alterado? Acho que tem razão. Só precisamos verificar que isso não causa nenhum problema quando o usuário passa valores com uma precisão menor.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

No exemplo que te passei coloquei a seguinte mascara #0.0000

Esta sempre vai jogar 4 casas independente de qual for a precisão, mas podemos usar a seguinte mascara #0.00##

Com esta máscara o valor sempre terá no minimo duas casas após a virgula, mas podendo aceitar até 4 casas.

O que você acha?

Link para o comentário
Compartilhar em outros sites

  • Consultores

Eu tinha certeza que já tinha visto esse problema antes. Veja:

 

Acho que foi alguma correção no LFill que modificou a situação e agora se faz necessário passar o a máscara manualmente. Se isso for assim, vários outros campos que precisam de uma precisão maior (com 3 ou mais casas) começarão a dar problema. Por exemplo, no Registro C170, esse é o caso dos campos ALIQ_PIS_PERC, QUANT_BC_PIS, ALIQ_PIS_R, ALIQ_COFINS_PERC, QUANT_BC_COFINS e ALIQ_COFINS_R. Só por garantia, você pode fazer um teste com esses campos e verificar se eles estão sendo gerados com o número de corretas?

 

No exemplo que te passei coloquei a seguinte mascara #0.0000

Esta sempre vai jogar 4 casas independente de qual for a precisão, mas podemos usar a seguinte mascara #0.00##

Com esta máscara o valor sempre terá no minimo duas casas após a virgula, mas podendo aceitar até 4 casas.

O que você acha?

Não vejo necessidade. Acabei de conferir no Guia Prático e deve ser gerado com 4 casas. Então, dado a situação acima, sua correção está correta. Queira anexar o arquivo atualizado e corrigido, por favor.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • Consultores

Pelo que pude entender agora todos os campos com precisão maior que duas casas podem dar problema.

   Foi o que eu disse. Por isso pedi para testar aqueles outros campos. Caso aconteça erro, vamos ter que revisar todos os campos de todos os registros... :(

 

Segue a unit em anexo.

   Coloquei aqui na minha lista de afazeres. Se nenhum outro desenvolvedor fizer isso na minha frente, vou analisar e subir ao SVN logo no início da semana que vem.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

O que você acha de eu verificar todos os campos que tem precisão maior que duas casas e já passar a mascara conforme o layout do SPED? (a principio apenas para o C170 senão vou passar um mês alterando)

Com isso ao menos o C170 ficaria certo!

Editado por jocimar
Link para o comentário
Compartilhar em outros sites

  • Consultores

Fique a vontade. Esse tipo de iniciativa é o que nós mais precisamos no momento. Se puder testar, já adianta o serviço e garante o funcionamento pra você e para os outros. Mesmo sendo "a principio apenas para o C170", como você disse, é um trabalho necessário que já ajuda muito.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

Bom dia, estou acamado deste terça, começando a melhor hoje, assim que tiver melhor por completo darei um analisada tb, junto ao Elton, e se puder fazer essa checagem geral de quais campos devem ser 2, 3 e 4  decimais será de grande ajuda.

--
Isaque Pinheiro
Aracruz/ES - Brasil
___________________________________________________________________________
Site Oficial: www.isaquepinheiro.com.br 
Youtube: youtube.com/isaquepinheirooficialbr
Facebook: facebook.com.br/isaquepinheirooficialbr
Instagram: instagram.com/isaquepinheirooficialbr
Linkdin: https://www.linkedin.com/in/isaquepinheirooficialbr

Conheça o Projeto ORMBr Framework for Delphi - https://www.ormbr.com.br

 

Link para o comentário
Compartilhar em outros sites

  • Consultores

Olá Jocimar,

 

   Subi suas alterações para o SVN na Revisão  5842.
   Pelo que vi está tudo certo.
   Favor testar e reportar qualquer problema.
   Obrigado.

[]'s

Consultor SAC ACBr

Elton
Profissionalize o ACBr na sua empresa, conheça o ACBr Pro.

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Um engenheiro de Controle de Qualidade(QA) entra num bar. Pede uma cerveja. Pede zero cervejas.
Pede 99999999 cervejas. Pede -1 cervejas. Pede um jacaré. Pede asdfdhklçkh.
Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 3853 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.