我尝试编写代码但发生了一件我不理解的事情。
我从数据库中获取一些值并循环遍历它们并在需要时更改其中一些值。
这就是我想要做的事情:
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
是SQL Server数据库中的float,null类型。当我设置一个断点并且我悬停.Value它显示0,11。当我悬停IsNull它显示False,到目前为止一直很好。
现在我希望它不会进入if结构,因为它不是null并且不等于0,但它确实输入了if结构。 我不明白为什么,我总是这样编码。
当我在处于调试模式时选择qryGeneral.fieldbyname('B_PRIJS').Value = 0
时,我收到一条消息&#34;表达式在评估者中是非法的&#34;。
我尝试将Value
替换为AsFloat
或将0更改为0.0,但它不起作用。
我做错了什么或者不在这里理解?
答案 0 :(得分:2)
Delphi's operator precedence rules表示您的表达式的评估如下:
if (qryGeneral.fieldbyname('B_PRIJS').IsNull or qryGeneral.fieldbyname('B_PRIJS').Value)
= 0 then
将括号放在=
表达式周围,就像你在<>
个表达式周围一样,你应该更接近你期望的结果。但是,Value
属性为Variant
。将Variant
与Integer
进行比较时,=
运算符会导致Variant
转换为Integer
。 Delphi's variant-type-conversion rules表示当目标类型为整数时,保持实数值的Variant
将四舍五入为最接近的整数,因此您的0.11值将四舍五入为零。考虑比较0.0而不是。