Expression illegal in evaluator

3.3k views Asked by At

I'm trying to code something but there is happening something I don't understand.

I get some values from a database and loop over them and change some of them if needed.

This is what I'm trying to do:

if qryGeneral.fieldbyname('B_PRIJS').IsNull or 
   qryGeneral.fieldbyname('B_PRIJS').Value = 0 then
begin
   if (qryGeneral.fieldbyname('V_PRIJS').Value <> 0) or 
      (qryGeneral.fieldbyname('V_PRIJSEXCL').Value <> 0) then
   //make some calculations and save data
end;

B_PRIJS is a float, null type in a SQL Server DB. When I set a breakpoint and I hover .Value it shows 0,11. When I hover IsNull it shows False, so far so good.

Now I would expect it would NOT enter the if-structure, because it is not null and not equal to 0, but it does enter the if-structure. I don't understand why, I always coded like this.

When I select qryGeneral.fieldbyname('B_PRIJS').Value = 0 while still being in debug mode, I get a message "Expression illegal in evaluator".

I tried replacing Value into AsFloat or changing 0 into 0.0 but it doesn't work.

What am I doing wrong or not understanding here?

1

There are 1 answers

6
Rob Kennedy On BEST ANSWER

Delphi's operator precedence rules mean that your expression is evaluated like this:

if (qryGeneral.fieldbyname('B_PRIJS').IsNull or qryGeneral.fieldbyname('B_PRIJS').Value)
  = 0 then

Put parentheses around your = expression just like you have around you <> expressions, and you should get closer to the results you expect. However, the Value property is a Variant. When comparing a Variant to an Integer, the = operator will cause the Variant to be converted to an Integer. Delphi's variant-type-conversion rules show that a Variant holding a real value will be rounded to the nearest integer when the target type is an integer, so your 0.11 value will be rounded to zero. Consider comparing to 0.0 instead.