Problema com Somatório

Meus diletos amigos,

Estou enfrentando um problema que pra mim é um total mistério, é o seguinte:

Eu tenho um formulário mestre-detalhe, onde no mestre eu faço um lançamento de pagamento com um cheque de valor R$ 120,00 por exemplo, e no detalhe eu tenho que classificar orçamentariamente essa despesa, podendo fazer mais de um lançamento para isso.

Eu tenho que consistir se a soma dos sub-lançamento no formulário detalhe não ultrapasse o valor do cheque registrado no formulário mestre.

O que ocorre eventualmente é que a consistência não funciona corretamente, as vezes o sistema informa que a soma ultrapassa o valor do cheque quando na verdade não acontece isso, e a diferença é sempre de 1 centavo.

Esta consistência é feita no evento validate, e eu somo todos os sub-lançamentos já feitos no banco de dados mais o valor do campo do lançamento que está sendo efetuado naquele instante, vejam o código abaixo.

A pergunta é: Alguem mais já teve esse tipo de problema, é um bug do SC, ou o meu código está errado ?

Qual a solução para isso ?

// Validar Valor Total x Valor Bancário
$sql=“Select Sum(valor) from movimento_orcamentario where (IDRegistroBanc=’{IDRegistroBanc}’) AND (NOT IDRegistroOrca=’{IDRegistroOrca}’)”;
sc_lookup(dataset,$sql);
$vlrtot = {dataset[0][0]};
$vlrsub = {Valor};
if (($vlrtot+$vlrsub)>[valorbanco])
{
sc_error_message("Valor Total dos Sub-Lançamentos é Maior que o Valor Bancário! ");
}

Coloca essa validação dentro do detalhe.

Att,

Tulio

Esta dentro do evento onValidate do detalhe, só pode ser nele.

Ola Ronaldo,

Dê uma olhada nesse tópido:

http://www.scriptcase.com.br/forum/index.php?topic=4114.0

Att,

Tulio.

Tulio,

Eu já tinha lido este tópico, no meu caso eu uso campo Numeric no banco MySQL, então não é o caso, o meu problema deve ser outro, eo pior é que isso ocorre apenas eventualmente, na maioria das vezes a soma fica correta, mas uma vez ou outra dá essa diferença de 1 centavo a mais e fura a validação.

Tenta isso,

if( bccomp(bcadd($vlrtot, $vlrsub, 4), [valorbanco], 4) == 1)
{
sc_error_message("Valor Total dos Sub-Lançamentos é Maior que o Valor Bancário! ");
}

Att,

Tulio

Caro Tulio,

Obrigado pela dica, vou implementar e vamos ver se isso para de ocorrer.

Abração.

Antes de gravar estes laçamentos você faz operaçoes com eles?
Exemplo: recebimentos parcelados?
Pois se usar o php puro para fazer os parcelamentos e guardar no banco de dados a
chance de ter erro ao trazer estees dados do banco é muito grande.
Veja:
http://www.php.net/manual/pt_BR/language.types.float.php
http://phpms.com.br/2012/07/ponto-flutuante-e-o-php/
Cálculos de precisão devem ser feitos no php com bcmath.

Alexandre,

Não meu caro, não faço nenhuma operação desses valores, são informados pelo usuário e armazenados no banco diretamente.