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

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Clash
Usuário Nível 2
Usuário Nível 2
Mensagens: 81
Registrado em: 11 Set 2004 11:14
Localização: Divinópolis (MG)

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

Mensagem 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.
Avatar do usuário
Jairo Maia
Moderador
Moderador
Mensagens: 2785
Registrado em: 16 Ago 2010 13:46
Localização: Campinas-SP

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

Mensagem 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 )
 ...
Abraços, Jairo
Harbour / Clipper 5.2e - Blinker 7
(Não respondo dúvidas por MP ou E-mail. Por favor, não encaminhe via mensagem privada ou e-mail, dúvidas que podem ser compartilhadas com todos no fórum)
Avatar do usuário
Clash
Usuário Nível 2
Usuário Nível 2
Mensagens: 81
Registrado em: 11 Set 2004 11:14
Localização: Divinópolis (MG)

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

Mensagem 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.
sambomb
Usuário Nível 3
Usuário Nível 3
Mensagens: 250
Registrado em: 24 Out 2008 17:02
Localização: Itaocara - RJ - Brasil

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

Mensagem 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
Imagem

Rca Sistemas - Itaocara - RJ
Avatar do usuário
ANDRIL
Usuário Nível 5
Usuário Nível 5
Mensagens: 1297
Registrado em: 06 Jul 2004 00:44
Contato:

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

Mensagem 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+
Clipper 5.2e / Blinker 5.1 / Harbour 3.2 / GTwvg
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
rochinha
Administrador
Administrador
Mensagens: 4664
Registrado em: 18 Ago 2003 20:43
Localização: São Paulo - Brasil
Contato:

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

Mensagem 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.
OPS! LINK QUEBRADO? Veja ESTE TOPICO antes e caso não encontre ENVIE seu email com link do tópico para [url=mailto://fivolution@hotmail.com]fivolution@hotmail.com[/url]. Agradecido.

@braços : ? )

A justiça divina tarda mas não falha, enquanto que a justiça dos homens falha porque tarda.
Avatar do usuário
Clash
Usuário Nível 2
Usuário Nível 2
Mensagens: 81
Registrado em: 11 Set 2004 11:14
Localização: Divinópolis (MG)

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

Mensagem 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.
Responder