里卡多;您没有提及这是否是表单或报告文本框中的公式;或者如果您正在编写 VBA 代码。对于这两种情况,我的回答会非常不同。一般来说,当我看到人们使用旧的(Access 2003)功能时,它是能够在表单中编写所有内容。所以,我会假设是这种情况。
有几个问题:1)您使用 SQL Syntax("Category In()") 作为 MS DLookUp 函数中的第三个参数(..."Category In('PC','Terminal')...)。我找不到 Microsoft 支持这种跨语言表达式的提及。此外,MS 定义的 DLookup 函数返回单个值。正如您所写的那样,您似乎在要求引擎查找多个记录。查看我从http://support.microsoft.com/kb/208786复制的这条语句:即使有多个记录满足条件,DLookup() 函数也会从单个字段返回一个值。如果没有记录满足条件,或者如果域不包含任何记录,DLookup() 返回 Null。
那么,如果您的表达式返回 Null 值怎么办?你的第二个 DCount 函数的英文翻译是这样的:给我 AssetTagTable 中的记录数,其中列“SerialNumber”= 1732 并且列“[DMax P/N]”= Null。然后将该记录数与数字 3 进行比较。您看到问题了吗?
2)在处理意外结果时,简化代码并将值分配给变量总是一个好主意,或者在你的情况下,给文本框。因此,在表单上放置 2 个文本框并为每个文本框分配一个值。EG 创建 2 个文本框:txtNumRecs 和 txtCategory 给文本框 txtNumRecs,分配这个值:DCount("*", "AssetTagTable", "SerialNumber='" & Me.SerialNumber & "'")。为文本框 txtCategory 分配以下值: DLookup("[DMS P/N]", "InventoryList", "Category='PC' OR Category='Terminal')") 运行您的表单。第一个文本框将有一个值,表示 SerialNumber = Me.SerialNumber 的记录数。您可能会对第二个文本框中的值感到惊讶。考虑对 Category = 'PC' OR Category = 'Terminal' 的所有记录的一般 SQL 查找可能会返回许多记录。既然我们知道这个函数只会返回 1 条记录,我们怎么可能知道它会返回所有可能的记录中的哪一条呢?假设它返回 Category='PC' 的记录的 [DMS P/N] 值,但您引用的第一个 [DMS P/N] 值是 Category='Terminal' 的记录。或相反亦然。这部分条件检查可能永远不会返回 True。但是您引用的第一个 [DMS P/N] 值是针对 Category='Terminal' 的记录。或相反亦然。这部分条件检查可能永远不会返回 True。但是您引用的第一个 [DMS P/N] 值是针对 Category='Terminal' 的记录。或相反亦然。这部分条件检查可能永远不会返回 True。
如果您确实希望检查 InventoryList 中 Category='PC' OR Category='Terminal' 中的所有记录,并将每个记录的 [DMS P/N] 值与您的值进行比较,那么您必须在VBA 来处理这个问题。如果这超出了您的代码编写能力,您可以联系我进行专业咨询。