Página 1 de 1

Comparação de Campos Númericos não funciona direito

Enviado: 19 Dez 2014 12:09
por Clash
Olá amigos colaboradores do fórum.
Uma ajuda/esclarecimento por favor.

Em uma comparação de variáveis numéricas, as vezes, repito, apenas as vezes, o sistema não faz a comparação corretamente.

Na rotina do Contas a Receber, onde o usuário seleciona o cliente e assim executa a busca de documentos não quitados para efetuar a baixa/quitação, me deparo com o seguinte cenário:
1.Efetuo a soma dos documentos abertos e atribuo a variável M->nReceber.
2.Em seguida solicito na tela o valor RECEBIDO atribuindo a variável M->nRecebido.
3.E então comparo se o valor recebido é menor do que o valor a receber, verificando se é uma quitação com desconto.
4.O erro da comparação surge as vezes quando os valores são idênticos, mas o sistema os reconhece mesmo assim como um menor que o outro, entrando na condição de Quitação com desconto sem ela ser. Exemplo:
M->nReceber = 500,00 e M->nRecebido = 500,00

Código: Selecionar todos

M->nCodClie  := 1519  &&-->Exemplo apenas. Ele é obtido através de função de busca.
M->nRecebido := nReceber := 0
*
Select RECEBER
OrdSetFocus("COD_CLIE")
OrdScope(0, M->nCodClie)
OrdScope(1, M->nCodClie)
Go Top
*
Do While !Eof()
    If RECEBER->PAGO <> "Q"
        M->nReceber := M->nReceber + ( RECEBER->VALOR + RECEBER->MULTA)
    EndIf
    Skip
EndDo
@ 12,11 Say "Valor a Receber:" 
@ 12,28 Say M->nReceber Pict "@E 999,999.99" Color "Gr+/B"
*
@ 14,11 Say "Valor Recebido:" Get M->nRecebido Pict "@E 999,999.99"
Read
If M->nRecebido < M->nReceber
   M->tConfirma := "N"
   Pergunta("Quitação com desconto (S/N)?", M->tConfirma)
   ...
   ...
   ...
EndIf
...
...
...
...
Pessoal, agradeço desde já.

Abraço.

Comparação de Campos Númericos não funciona direito

Enviado: 19 Dez 2014 13:19
por Jairo Maia
Olá Clash,

Enfrentei esse problema numa função de pagamento misto (parte cartão débito, parte cartão crédito, parte dinheiro, etc.), e mesmo em Harbour isso também aconteceu ao usar a Picture "@E". Salvo se algum colega possa explicar a razão, a solução que encontrei no caso de uso desta Picture, foi usar a função Round() para comparar os valores. Exemplo:

Código: Selecionar todos

If Round( M->nRecebido, 2 ) < Round( M->nReceber, 2 )
 ...

Comparação de Campos Númericos não funciona direito

Enviado: 19 Dez 2014 14:24
por Clash
Olá Jairo, quanto tempo.

Obrigado pela prontidão.

Eu imaginei ser algo de atribuição/declaração de tipo das variáveis, até comprimento, pois as "joguei" na tela após receber valores e uma tem o comprimento (Len) maior que a outra. Mas pensei, poxa, valores???? Comprimento??

Valeu pela dica do round. Vou testar e posto o retorno.

Mais uma vez, muito obrigado.

Abraço.

Comparação de Campos Númericos não funciona direito

Enviado: 19 Dez 2014 17:04
por sambomb
Converta para texto antes de comparar e use o ==

nVal1 := Funcao1() //-- Resultado 10
nVal2 := Funcao2() //-- Resultado 10

If AllTrim(Str(nVal1)) == AllTrim(Str(nVal2)) //-- São idênticos
? "Igual"
else //-- Existe alguma diferença
? "Diferente"
End

Comparação de Campos Númericos não funciona direito

Enviado: 19 Dez 2014 19:12
por ANDRIL
sambomb escreveu:Converta para texto
Apenas complementando, para caso de numero decimal.

Código: Selecionar todos

if alltrim(str(vlr1,10,2))==alltrim(str(vlr2,10,2))
? "igual"
else
? "diferente"
endif
Ate+

Comparação de Campos Númericos não funciona direito

Enviado: 21 Dez 2014 11:21
por JoséQuintas
Faltou só a explicação:
Não importa a lingugem de programação: números decimais em binários não tem uma representação exata.
Acaba sempre tendo diferença de arredondamento, mesmo em se tratando apenas de soma.
Na maioria dos casos não faz diferença, porque é um valor muito pequeno, mas na comparação, pode atrapalhar.
Algo do tipo 0.000000000000001

Comparação de Campos Númericos não funciona direito

Enviado: 22 Dez 2014 15:39
por rochinha
Amiguinhos,

Complementando todos os raciocínios, quando usamos variáveis ou campos, mesmo que apresentemos os valores usando pictures, este valores "visíveis" são apenas Pra Inglês Ver.

Os números relacionados a campos numéricos vão ainda levar em consideração seu tamanho e decimais na tabela.

As variáveis numéricas podem assumir algum padrão da linguagem referente aos tamanhos máximos de valores e decimais.

Portanto buscar algum comando tipo SET DECIMAL TO para melhorar esta performance numérica é boa pedida.

Comparação de Campos Númericos não funciona direito

Enviado: 29 Dez 2014 12:44
por Clash
Olá pessoal.

Agradeço muito pelo apoio de todos vocês. Realmente a idéia do amigo Jairo funcionou. Bem, eu esperei mais alguns dias para confirmar. Como relatei no tópico, acontecia AS VEZES, mas sempre todo dia, diante de tantas baixas no Ct.Receber. Agora desde sexta, 19/12, não aconteceu mais.

Andril, grato pela prontidão, mas eu preciso saber se é menor, não igual ou diferente. Assim como seria possível com texto?!

Rochinha, sempre aí neh amigo, rsrsrs... eu havia tentando com set decimals, mas hora sim hora não.

Como disse até agora com o round tá indo. O que me espanta é que jamais havia me deparado com isso. Muita coisa "mudou" no funcionamento do meu sistema, que vinha do Clipper 5.2e/Blinker 6, para agora que migrei pro 5.3/blinker 7.0 . Também após adotar certas tipagens... := ==

Mesmo assim, gente agradeço à vocês. Boas festas, um ano novo com muito sucesso.