Ir para conteúdo
  • Cadastre-se

dev botao

Solução Para O Erro "numero Máximo De Casas Decimais Permitidas 2" - Alteração Na Unit Pcn2


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

Recommended Posts

  • Membros Pro

Boa Tarde a todos.
Depois de alguns problemas com clientes com o erro "Numero máximo de casas decimais permitidas 2" (esse erro ocorre em varias tags, nesse exemplo usarei a vCarga).

 

Pelos testes que realizei o erro parece acontecer principalmente com valores altos.

Alimentava o componente com o valor da tag como no exemplo abaixo:

        vCarga   := 525654.69;

 

O erro ocorre na Unit pcnGerador na procedure wCampo.

Trecho retirado da Unit pcnGerador  linhas de 847 a 855

                  case Tipo of

                    tcDe2 : NumeroDecimais :=  2;
                    tcDe3 : NumeroDecimais :=  3;
                    tcDe4 : NumeroDecimais :=  4;
                    tcDe6 : NumeroDecimais :=  6; // Incluido por Italo em 30/09/2010
                    tcDe10: NumeroDecimais := 10;
                  end;
                  //VlrExt := StrToFloat(valor);
                  ConteudoProcessado  := FormatFloat('0.0000000000', valor);
 
----------------------------------------------------------------------------------------------------
 
Simulando a tag vCarga com o valor usado no exemplo acima:

                    ConteudoProcessado  := FormatFloat('0.0000000000', 525654.69);
Resultado    ConteudoProcessado  = '525654,6899999999'
 
Alterando o Código...
 
                    ConteudoProcessado  := FormatFloat('0.00', 525654.69);
Resultado    ConteudoProcessado  = '525654,69'
 
A conclusão é que o FormatFloat não tem o resultado esperado quando tratamos de valores altos sem especificar corretamente as casas decimais, e quando isso acontece o componente da o alerta das casas decimais nas linhas seguintes da procedure "wCampo".
 
Para que esse erro não aconteça a Unit pcnGerador foi alterada deixando o trecho acima da seguinte forma:
 
                  case Tipo of
                    tcDe2 : begin
                      NumeroDecimais :=  2;
                      ConteudoProcessado  := FormatFloat('0.00', valor);
                    end;
                    tcDe3 : begin
                      NumeroDecimais :=  3;
                      ConteudoProcessado  := FormatFloat('0.000', valor);
                    end;
                    tcDe4 : begin
                      NumeroDecimais :=  4;
                      ConteudoProcessado  := FormatFloat('0.0000', valor);
                    end;
                    tcDe6 : begin
                      NumeroDecimais :=  6; // Incluido por Italo em 30/09/2010
                      ConteudoProcessado  := FormatFloat('0.000000', valor);
                    end;
                    tcDe10: begin
                      NumeroDecimais := 10;
                      ConteudoProcessado  := FormatFloat('0.0000000000', valor);
                    end;
                  end;

 

Estou compartilhando a informação para que se alguém passar por algo assim saiba como resolver, e caso achem interessante que seja feita a alteração na Unit disponibilizando as alterações para todos os usuarios.

Link para o comentário
Compartilhar em outros sites

  • Consultores

Me parece um problema semelhante ao do LFill que foi relatado

[]'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

  • Membros Pro

Bom Dia!

 

Realmente o problema é parecido e fiz o teste trocando o tipo de variável que originalmente é Variant para Currency e funcionou, porém com os outros tipos (Double e Extended) o resultado ainda fica errado.

 

O problema e que a procedure wCampo é usada para todas as tags, recebendo valores de todos os tipos, dessa forma creio que a variável valor deva permanecer do tipo Variant mesmo, uma vez que apenas fazendo um case mandando o FormatFloat já no padrão da quantidade de casas decimais corretas resolveria o problema.

 

Mesmo havendo semelhanças entre os casos eu não entendi como o tópico indicado poderia me ajudar nesse caso, se tiver alguma outra sugestão de como resolver o problema sem ser a que apresentei acima me explique por favor para que eu possa fazer os testes e informar os resultados.

Link para o comentário
Compartilhar em outros sites

  • Consultores

Bem, usar Currency não é opção para nenhuma variável cuja precisão passe de 4 casas. Por isso não é mesmo uma opção para esta função. O tópico não sugere isso.

 

O tópico indicado contem dois métodos de tratamento de float para string que poderiam ser úteis ao lidar com as imprecisões do tipo de ponto flutuante. Note também que o problema não é a função FormatFloat. Ela funciona do jeito que foi projetada. Nós é que "achamos" que ela deveria funcionar de outra maneira.

 

O tópico também possui no final um aplicativo em console para testar o comportamento de algorítimos para que possa-se validar o comportamento de maneira mais fácil.

[]'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

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