在IIF语句中评估NULL的问题(Access)

时间:2010-04-30 21:58:42

标签: ms-access vba null iif-function

记录集中的项目rstImportData(“Flat Size”)= = Null

有了这个,给出以下声明:

IIF(IsNull(rstImportData("Flat Size")), Null, cstr(rstImportData("Flat Size")))
Result: Throws error 94: Invalid use of Null

如果我通过在错误比较时删除类型转换来更改语句:

IIF(IsNull(rstImportData("Flat Size")), Null, 0)
Result: Null

它返回Null,因为它应该是第一次。看来我无法在IIF中进行类型转换,如果传入的值即使通过IIF测试也应为null,它仍然会尝试在真假答案中对其进行评估。我这样使用IIF的唯一原因是因为我有25行比较来比较Import中的数据和数据库中的匹配记录,看看我是否需要追溯历史记录。

有什么想法?导入数据的方式将是空日期,并且电子表格导入的字符串格式我必须将任一方转换为另一方以正确比较值,但如果任何一方为空,则会发生此异常:(

修改的 我使用IIF(并考虑使用通用功能)的原因示例

If master("one") <> import("one") Or _
   master("two") <> import("two") Or _
   master("date") <> import("date") Or _  //import("date") comes from a spreadsheet, it comes in as string, CAN be a null value
   master("qty") <> import("qty") Or _    //import("qty") comes from spreadsheet, comes in as a string can CAN be null
   master("etc") <> import("etc") Then

....stuff....

End If

此代码扩展了大约20列,以便在数据库中进行比较。我更愿意查看作为声明的一部分。我可以想到一堆解决方案,但它们涉及添加更多代码。如果这就是它的权力,那么我不是那么容易屈服的人。

我看到的选项是

  • 在比较和使用这些新变量而不是记录集
  • 之前创建临时变量来完成工作
  • 创建一个对象以将记录传递到预格式并使用,尽管额外的工作会为每个导入类型提供此功能,因为存在具有相似字段的不同文件

我在这里是为了提出想法,我愿意接受任何有趣的作品,因为我决定如何做,我正在寻找最可重复使用的方法。

2 个答案:

答案 0 :(得分:3)

您描述的行为是IIf在VBA下运行的标准方式。这是Access 2003帮助所说的内容的一部分:

IIf 始终评估 truepart falsepart ,即使它因此,您应该注意不良副作用。例如,如果评估 falsepart 导致除零错误,则甚至会出现错误如果 expr True 。“

但是,如果您在查询中使用IIf语句,那么当 expr 之后,评估会在 truepart 之后短路 True --- falsepart 在这种情况下不会被评估。不幸的是,这些信息对您没用...除非您可以在查询中加入查询。

我不知道有任何其他方法可以避免IIf的错误。我会尝试将Excel数据附加到一个表中,该表的结构与您要比较的表的结构相匹配,从而无需在进行比较的同时进行字符串转换。

答案 1 :(得分:3)

将值更改为字符串的简单权宜之计有很大帮助。诀窍是修剪一个NULL字符串将得到一个空字符串。然后可以对其进行操作,就像它不是数据库null一样 我经常使用表格:

CInt("0" & Trim(SomeVariant & " "))

获得有效数字而无需经过一堆hijinks。 null对于这个问题是无关紧要的。