Field com Valor diferente do exibido no DBEdit. Porque??

06/01/2006

0

Boa Tarde,
Meu nome é Bruno e preciso da ajuda de voces para um caso em particular que nao encontrei solução. Estou desenvolvendo um sistema em delphi 7 e firebird com uso do IBDataSet.
Bom vamos lá.
Estou fazendo um calculo de porcentagem, e atribuo ao campo com (FieldByName().Value) 33,33¬ sobre 90,00 (133,33) sendo esta formula (90,00 * (33,33 / 100 + 1)).
O Resultado é 119,997, sendo arrendondado conforme o DisplayField = (´#,0.´), só que no DbEdit esta sendo exibido 12, quando era para exibir 120,00. Observei pelo debug que o field está com 120,00. já postei o resultado e a confução permanece, nao quero ultilizar função para arredondar o valor.
Todos os valores arredodados (pelo displayField) terminados em 0 como (10 = 9,997), (100 = 99,997) ele gera essa confução no DbEdit. Caso eu digite 119,997 ele arredonda para 119,99 e nao gera esse erro.
Já ultilizei varios tipos de mascara para o displayfield e nao resolveu meu problema.
Todo o processo de calculo ultilizo uma funcao que usa somente FieldByName pois é uma funcao de impostos e alem de ser meio complexa, usarei em demais processos.
Quando eu libero para 3 casas decimais ele nao gera essa confução e atribui 119,997 ao DBEdit tando como ao Field, pois nao arredonda.
As casas decimais tambem tem que ficar flexivel entre 2 a 6 ou 8, pois posso no futuro ultilizar varios digitos. hoje tenho uma configuração para isso.
Bom é isso ai se alguem já passou por isso e puder me ajudar.

//funcao que calcula a porcentagem deixei simples pois o resto nao é necessario.
function CalculaValorPelaPorc(vValorBase: Extended; pPorcBase: Extended) : Extended;
begin
Result := 0;
if (vValorBase > 0) then
Result := vValorBase * (pPorcBase / 100 + 1);
end;


O campo no Firebird é um Numeric(18,8).

//Como está setado as propriedades do Field.
TBCDField(oCampo).Currency := True;
TBCDField(oCampo).EditFormat := ´#,0.´;
TBCDField(oCampo).DisplayFormat := ´,0.´;
TBCDField(oCampo).DefaultExpression := 0;
oCampo.DisplayWidth := 18;
Presicion := 18;
Size := 8;
oCampo.EditMask := ´´;


Grato Bruno Terossi.


Bterossi

Bterossi

Responder

Posts

06/01/2006

Emerson Nascimento

suas mascaras estão erradas. você não está informando quantos zeros deverão aparecer depois do sinal decimal.

//Como está setado as propriedades do Field.
TBCDField(oCampo).Currency := True;
TBCDField(oCampo).EditFormat := ´#,0.[size=18:a4b1da8283]00[/size:a4b1da8283]´;
TBCDField(oCampo).DisplayFormat := ´,0.[size=18:a4b1da8283]00[/size:a4b1da8283]´;
TBCDField(oCampo).DefaultExpression := 0;

//funcao que calcula a porcentagem deixei simples pois o resto nao é necessario.
//para usar a função RoundTo() acrescente a unit Math à cláusula uses
function CalculaValorPelaPorc(vValorBase: Extended; pPorcBase: Extended) : Extended;
begin
  if (vValorBase > 0)
  then Result := RoundTo(vValorBase * (pPorcBase / 100 + 1),-2)
  else Result := 0;
end;



Responder

Que tal ter acesso a um e-book gratuito que vai te ajudar muito nesse momento decisivo?

Ver ebook

Recomendado pra quem ainda não iniciou o estudos.

Eu quero
Ver ebook

Recomendado para quem está passando por dificuldades nessa etapa inicial

Eu quero

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar