【问题标题】:MSAccess: Proper use of Nz in a query?MSAccess:在查询中正确使用 Nz?
【发布时间】:2014-03-17 20:46:25
【问题描述】:

我正在尝试在我的 AccessDB 中构造一个 UPDATE 查询字符串 (strSQL)。我的查询中的属性之一可以合法地 = NULL。

我已经用 Nz([ID]) 包围了属性,如下 - 注意:[ID] 是一个整数值:

strSQL = "UPDATE Table... " & _
    "WHERE ((Table.Attr1 = " &  nz(forms!form1!subForm1.Form![ID]) & ") AND (Table.Attr2 = 'Test'));"
db.execute strSQL

Access 在我的查询表达式中抱怨“额外的 )”。注意:当 [ID] Null

时,当前查询工作得很好

我还尝试用 Nz([ID],0​​) 包围 [ID] - Access 不再抱怨,但不返回任何结果,因为 [ID] 在我的表中从不为 0。

对于在这种情况下正确使用 Nz() 有什么建议吗?

谢谢!

这是 debug.print 的实际 strSQL 结果 - 很容易看到有问题的 WHERE 子句:

UPDATE TblMatchedTb SET TblMatchedTb.FLAG_UNMATCHED = 'CLP', TblMatchedTb.UNM_ID = Null, TblMatchedTb.ITEM = Null, TblMatchedTb.COST = 0, TblMatchedTb.PACK = 1, TblMatchedTb.UOM = 'EA', TblMatchedTb.LastUpdated = #3/17/2014 8:14:48 PM#, TblMatchedTb.LastUpdatedby = '22' WHERE ((TblMatchedTb.UNM_ID= ) AND ((TblMatchedTb.ITEM)= '') AND ((TblMatchedTb.COST)= 6.882) AND ((TblMatchedTb.PACK)= 1) AND ((TblMatchedTb.UOM)= 'EA'));

【问题讨论】:

  • db.execute strSQL 之前添加一行Debug.Print strSQL。运行代码,当它抛出该错误时,复制即时窗口中的Debug.Print 输出并将其粘贴到您的问题中。
  • 如果那是你的真实代码,UPDATE Table... 是怎么回事? (如果这不是您的真实代码 - 您可能会发现很难获得帮助。)
  • 为了讨论,我尝试简单地使用 strSQL...上面发布了完整的 strSQL 结果...
  • 谢谢,马克。这段查询应该是什么样的? ... WHERE ((TblMatchedTb.UNM_ID= ) 应该是UNM_ID Is Null 还是UNM_ID=<some number>
  • 指定一个变量来保存forms!form1!subForm1.Form![ID] 的值。开始找出那部分出了什么问题。

标签: ms-access vba


【解决方案1】:

使用SELECT 查询来计算WHERE 子句逻辑。在您正常工作后,在您的 UPDATE 查询中使用相同的 WHERE 子句。

我想你是说当文本框不为 Null 时,你想要 UNM_ID 值等于文本框 ID 的行。但是,当文本框为 Null 时,您需要 UNM_ID 为 Null 的行。

如果正确,请按照 Smandoli 的建议使用变体变量来保存 ID 值。然后,您可以使用IIf 表达式来决定等于还是空。

Dim strSQL As String
Dim varID As Variant

varID = Forms!form1!subForm1!ID.Value

strSQL = "SELECT * FROM TblMatchedTb AS m" & vbCrLf & _
    "WHERE m.UNM_ID " & _
    IIf(IsNull(varID), "Is Null", "=" & varID) & _
    " AND ..."
Debug.Print strSQL

【讨论】:

  • 是的,完美!再次感谢 HansUp。我在这条路上测试 NULL 并有条件地构造 strSQL。 IIF 效率更高。
猜你喜欢
  • 1970-01-01
  • 2017-10-11
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
相关资源
最近更新 更多