我有一个包含链接表的数据库——员工、课程和 Training_Record。每个工作人员都有一个数字主键,每个课程和 Training_Record 表中的每个条目也是如此。员工和课程的 Training_Record 参考记录中的 Staff_ID 和 Course_ID。
添加工作人员或课程时,Training_Record(字段:Staff_ID、Course_ID、Date_Taken、Notes)插入了工作人员、课程记录 - 因此添加工作人员 1 将插入记录 (1,1,,,), (1,2 ,,,) 等,添加课程 8 将插入记录 (1,8,,,), (2,8,,,) 等等。这行得通。
然后我有一个表格来记录培训。用户选择课程,输入日期并从列表框中选择工作人员。我有一个触发 VBA 代码的保存按钮。日期和课程从框中拉出,我在列表框周围循环,将选定的员工连接成一个字符串。这一切正常,并显示一个消息框,验证这一点。然后,应该运行更新 SQL 查询,更新 Training_Record。
我遇到的问题是 SQL 更新。我有一个可以在 SQL 查询编辑器中使用的更新查询,尽管它使用写入变量:
UPDATE Training_Record
SET Date_Taken = '12/12/12'
WHERE Staff_ID IN (1,2,3,4,5) AND Course_ID = 4
这将更新 Training_Record 以显示员工 1、2、3、4 和 5 于 2012 年 12 月 12 日参加了课程 4。但是,在 VBA 中这不起作用。这是我在 VBA 中的 SQL 查询:
strSQL = "UPDATE Training_Record" _
& "SET Date_Taken = (" & strDate & ")" _
& "WHERE Staff_ID IN (" & strCriteria & ") AND Course_ID = (" & strCourse & ")"
DoCmd.RunSQL strSQL
代码生成的错误是“运行时错误'3144':UPDATE 语句中的语法错误”。并且调试器突出显示查询后的 DoCmd.RunSQL 语句。整个 VBA 代码:
Private Sub SaveTraining_Click()
Dim db As DAO.Database
Dim VarItem As Variant
Dim strCriteria As String
Dim strDate As Variant
Dim strCourse As Variant
Dim strSQL As String
Set db = CurrentDb()
'Extract the course ID and the training date from the form
strCourse = Me!CourseID.Value
strDate = Me!TrainingDate.Value
'Dealing with empty boxes- zero length
If IsNull(strCourse) Then
MsgBox "Please select a course." _
, vbOKOnly, "No course selected"
End If
If IsNull(strDate) Then
MsgBox "Please enter a date." _
, vbOKOnly, "No date given"
End If
If StaffMembers.ItemsSelected.Count = 0 Then
MsgBox "Please select staff members." _
, vbOKOnly, "No staff members"
End If
If (Not IsNull(strCourse)) And (Not IsNull(strDate)) And (StaffMembers.ItemsSelected.Count > 0) Then
'Extract each selected member and concatenate into a string for sql query
For Each VarItem In Me!StaffMembers.ItemsSelected
strCriteria = strCriteria & "," & Me!StaffMembers.ItemData(VarItem)
Next VarItem
'Gets rid of extra comma on query string
strCriteria = Right(strCriteria, Len(strCriteria) - 1)
'Message box
MsgBox ("Staff: " & strCriteria & vbNewLine & "Date: " & strDate & vbNewLine & "Course: " & strCourse & vbNewLine & "No. Selected staff: " & StaffMembers.ItemsSelected.Count)
strSQL = "UPDATE Training_Record" _
& "SET Date_Taken = (" & strDate & ")" _
& "WHERE Staff_ID IN (" & strCriteria & ") AND Course_ID = (" & strCourse & ")"
DoCmd.RunSQL strSQL
End If
Set db = Nothing
End Sub
TL;DR 我无法在 VBA 中运行 SQL UPDATE 查询
我有一种感觉,这是某个地方的语法错误,但我找不到在哪里。任何想法/建议将不胜感激,谢谢。