0

我有下面的公式,但公式的 AND 部分无法识别。任何人都可以看一下并提供正确的版本吗?

If DCount("*", "AssetTagTable", "SerialNumber='" & Me.SerialNumber & "'") > 6 Or _
        DCount("*", "AssetTagTable", "SerialNumber='" & Me.SerialNumber & "' And _
        [DMax P/N]='" & DLookup("[DMS P/N]", "InventoryList", "Category In('PC','Terminal')") & "'") > 3 Then
4

3 回答 3

0

我得到了这个工作。出于某种原因,它不喜欢在 DCount 中分隔两个字符串的下划线,但是如果将它移到 & 之前,我不会收到“列表分隔符或 )”错误。

            If DCount("*", "AssetTagTable", "SerialNumber='" & Me.SerialNumber & "'") > 6 Or _
            DCount("*", "AssetTagTable", "SerialNumber='" & Me.SerialNumber & "' And [DMax P/N]='" _
            & DLookup("[DMS P/N]", "InventoryList", "Category In('PC','Terminal')") & "'") > 3 Then

这是如何运作的?

于 2013-11-14T18:56:07.590 回答
0

里卡多;您没有提及这是否是表单或报告文本框中的公式;或者如果您正在编写 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 来处理这个问题。如果这超出了您的代码编写能力,您可以联系我进行专业咨询。

于 2014-02-27T20:42:04.090 回答
0
If DCount("*", "AssetTagTable", "SerialNumber='" & Me.SerialNumber & "'") > 6 Or _
        DCount("*", "AssetTagTable", "SerialNumber='" & Me.SerialNumber & "' And " _
        " [DMax P/N]='" & DLookup("[DMS P/N]", "InventoryList", "Category In('PC','Terminal')") & "'") > 3 Then

我现在没有打开 VBA,但试试这个,第二行没有正确结束。

于 2013-10-15T16:25:05.497 回答