2016-01-13 42 views
2

我在这一个完全难住了..跳到底部阅读问题UPDATE SET WHERE部分工作列表框 - Microsoft Access中VBA

这里是我的列表框(DocumentList),其采用从“领域文件'表:

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事件设置,以便当您从列表框中选择一行时,它的每个字段分配到一个文本框/组合框。

文本框/组合框的名字:为每一个在 'DocumentList' click事件

txtDocument 
StatusCombo 
txtNotes 
txtConNotes 

代码:将数据从列表框中赋予它们

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 

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

任何想法,为什么这个代码更新的一些文件,但不更新其他人?

+0

将'UPDATE'语句文本存储在字符串变量* strUpdate *中。然后添加'Debug.Print strUpdate'并像下面这样执行它:'CurrentDb.Execute strUpdate,dbFailOnError' Access会给你提供关于失败更新的更多信息吗? – HansUp

+0

我找到了这个错误..有些文件没有在最后一个字段'Consultation Notes'中存储任何内容。这些文件是我无法更新的文件。但是,如果我直接将值放入该表字段中,则尝试从其工作的表单中更新它们。我不明白的是;然后我可以将该值设置为无效,但可以继续正常更新 – Alex

+1

当[[Consultation Notes]]为空时,它不等于'''“&DocumentList.Column(3)&”'“'如果将自动编号主键* ID *添加到'[Documents]'表格中,我认为您的任务会更简单。然后在列表框中包含* ID *(不必是可见的),并在WHERE子句中使用该值来定位要更新的行。这应该比现在的WHERE条款更简单,避免“空不等于任何东西,甚至不是另一个空”的复杂性。还要考虑'UPDATE'参数查询 – HansUp

回答

0

[Documents].[Consultation Notes]为空时,没有更新,因为WHERE子句的目标是空字符串,而不是"'" & DocumentList.Column(3) & "'" ...因此没有找到匹配的行。

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

然后你WHERE子句可以是简单得多:只是针对其ID记录匹配所选列表框行的ID列值。该策略也将避免的复杂性“零不等于任何东西,甚至不是另一个零”

最后,考虑为UPDATE而不将值转换成一个字符串变量参数查询。

相关问题