【问题标题】:UPDATE SET WHERE Partially working on listbox - Microsoft Access VBAUPDATE SET WHERE Partially working on listbox - Microsoft Access VBA
【发布时间】:2016-01-13 13:41:50
【问题描述】:

我完全被这个难住了。跳到底部阅读问题

这是我的列表框 (DocumentList),它从“Documents”表中获取字段:

Document Name   Status         Notes                  Consultation Notes
Doc A           Started        Document Started       Aim to process on 05/05/16
Doc B           Processing     Document Processing    Aim to complete on 05/05/16
Doc C           Complete       Complete on 01/01/16   N/A

我设置了 onclick 事件,因此当您从列表框中选择一行时,它会将每个字段分配给一个文本框/组合框。

文本框/组合框名称:

txtDocument
StatusCombo
txtNotes
txtConNotes

'DocumentList'点击事件中每一个的代码:

Private Sub DocumentList_Click()

txtDocument = DocumentList.Column(0)
StatusCombo = DocumentList.Column(1)
txtNotes = DocumentList.Column(2)
txtConNotes = DocumentList.Column(3)

从列表框中将数据分配给它们后,您可以对其进行编辑。我有一个更新按钮,按下该按钮时会将数据库中的所有内容替换为文本框/组合框中的所有内容。然后重新查询列表框并显示更新的数据。

这是我的更新按钮的代码:

Private Sub UpdateButton_Click()

CurrentDb.Execute "UPDATE [Documents] " & _
"SET [Document Name] = '" & Me.txtDocument & "'" & _
", [Status] = '" & StatusCombo.Value & "'" & _
", [Notes] = '" & Me.txtNotes & "'" & _
", [Consultation Notes] = '" & Me.txtConNotes & "'" & _
"WHERE [Document Name] =  '" & DocumentList.Column(0) & "'" & _
"AND [Status] =  '" & DocumentList.Column(1) & "'" & _
"AND [Notes] =  '" & DocumentList.Column(2) & "'" & _
"AND [Consultation Notes] =  '" & DocumentList.Column(3) & "'"


DocumentList.Requery
End Sub

我的问题是代码仅适用于 3 个文档中的 2 个。代码的所有方面都有效,但仅适用于某些文档。这对我来说没有任何意义。起初我以为可能是拼写错误,但即使是这样,也不应该更新任何文档。但其中一些会,1 不会。..

知道为什么这段代码会更新一些文档,但不更新其他文档吗?

【问题讨论】:

  • 将您的 UPDATE 语句文本存储在字符串变量 strUpdate 中。然后添加Debug.Print strUpdate 并像这样执行它:CurrentDb.Execute strUpdate, dbFailOnError Access 是否会为您提供有关失败更新的更多信息?
  • 我发现了错误。有些文档在最后一个字段“咨询说明”中没有存储任何内容。这些文件是我无法更新的。但是,如果我直接在该表字段中输入一个值,然后尝试从它的工作形式更新它们。我不明白的是;然后我可以将该值设置回无,但可以继续正常更新它
  • [Consultation Notes] 为Null 时,它不等于"'" & DocumentList.Column(3) & "'" 我认为如果您将自动编号主键ID 添加到@,您的任务会更简单987654330@ 表。然后在列表框中包含ID(不必可见),并在WHERE 子句中使用该值来定位您要更新的行。这应该比您现在拥有的WHERE 子句更简单,并且避免“Null 永远不等于任何东西,甚至不等于另一个 Null”的复杂性。还要考虑UPDATE的参数查询
  • @HansUp 非常感谢您通知我;我认为空字段与空字符串的值相同,例如"";我想这就是问题所在。您的替代解决方案帮助很大,也简化了我的代码,因为我不需要所有那些 WHERE 子句,只需要一个。如果您想将其作为答案,我可以随意接受

标签: ms-access listbox vba sql-update


【解决方案1】:

[Documents].[Consultation Notes] 为 Null 时,不会更新任何内容,因为 WHERE 子句改为以空字符串为目标..."'" & DocumentList.Column(3) & "'" ...因此找不到匹配的行。

如果您将自动编号主键 ID 添加到 [Documents] 表,任务会更简单。然后在列表框 Row Source 中包含 ID,并在 WHERE 子句中使用该值来定位您要更新的行。 (ID 列不必在列表框中可见;您可以将其列宽属性设置为零。)

那么您的WHERE 子句可以简单得多:只需定位其ID 与所选列表框行的ID 列值匹配的记录。该策略还可以避免“Null 永远不等于任何东西,甚至不等于另一个 Null” 的复杂性。

最后,考虑对UPDATE 进行参数查询,而不是将值连接到字符串变量中。

【讨论】:

    猜你喜欢
    • 2021-02-16
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多