Calculos em um campo sem valor...

01/12/2005

e aí ? blz..tenho esta função

procedure T_FORM_CLIENTES.FTCLICALCSERVFEITO;
var
  i,r: integer;
  n: real;
begin
  n:= 0;
  r:= BD_AM_OSOE.RecordCount;
  BD_AM_OSOE.First;
    for i:=1 to r do
    begin
    n:= n + BD_AM_OSOEGS_AMOOEI_VALOR_TOT.asfloat;
    BD_AM_OSOE.Next;
  end;
  Label28.caption:= formatfloat(´R$ ,#,,0.00´,n);
end;


eu tenho um arquivo morto, onde quero somar os valores recebidos só que as vez num exite valor em algum registro, aí temos um erro..aí que vem a dúvida tem como fazer esta função aó ignorar o campo ou uma outra forma de fazer o cálculo ?..flw t+


Gigatel

Respostas

01/12/2005

Massuda

Antes de somar, veja se o campo é IsNull (vazio); seria algo assim...
...
for i:=1 to r do
begin 
  if not BD_AM_OSOEGS_AMOOEI_VALOR_TOT.IsNull then
    n:= n + BD_AM_OSOEGS_AMOOEI_VALOR_TOT.asfloat; 
  BD_AM_OSOE.Next; 
...



Responder Citar

01/12/2005

Emerson

olha, não sei porque está dando erro, mas sugiro uma alteração na sua rotina:

procedure T_FORM_CLIENTES.FTCLICALCSERVFEITO;
var
  i: integer;
  n: double;
begin
  n:= 0;
  BD_AM_OSOE.First;
  while not BD_AM_OSOE.Eof do
  begin
    n := n + BD_AM_OSOEGS_AMOOEI_VALOR_TOT.asfloat;
    BD_AM_OSOE.Next;
  end;
  Label28.caption:= formatfloat(´R$ ,#,,0.00´,n);
end;


evite o uso de recordcount. ele varre todo o dataset para contar os registros. depois você varre novamente para fazer a soma. dependendo do número de registros esse processo pode tornar-se muito lento. da forma acima o dataset é varrido uma única vez.

p.s.: não deveria acontecer nenhum erro no cálculo pois, no caso de campos nulos, o designador de tipo sempre traz o menor valor possível.
por exemplo:
AsFloat, AsInteger, AsCurrency trarão 0
AsString será ´´
AsDate será 01/01/1900 ou 31/12/1899 (depende da janela do S.O.)
e assim por diante.


Responder Citar

01/12/2005

Gigatel

Deu certinho...aproveitei as dicas de todos...tirei o recont e implementei a dica do massuda e deu certo, por algum motivo emerson, continuou dando erro mesmo depois de ter usado sua modificação... más aproveitei sua idéia no q diaz respeito ao recont...ficou assim...

procedure T_FORM_CLIENTES.FTCLICALCSERVFEITO;
var
  i: integer;
  n: double;
begin
  n:= 0; 
  BD_AM_OSOE.First; 
  while not BD_AM_OSOE.Eof do
  begin
    if not BD_AM_OSOEGS_AMOOEI_VALOR_TOT.IsNull then 
    n := n + BD_AM_OSOEGS_AMOOEI_VALOR_TOT.asfloat;
    BD_AM_OSOE.Next; 
  end; 
  Label28.caption:= formatfloat(´R$ ,#,,0.00´,n); 
end;

e deu certinho

vlw...obrigado..t+


Responder Citar