2013-08-21 44 views
2

我有一個數據庫與鏈接表 - 工作人員,課程和Training_Record。每個工作人員都有一個數字主鍵,每個課程和Training_Record表中的每個條目都有一個數字主鍵。 Training_Record中的Staff_ID和Course_ID參考員工和課程記錄。訪問VBA:SQL查詢導致更新語法錯誤

當添加一個工作人員或課程時,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當然了4月12/12/12。但是,在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聲明繼query.The整個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我不能讓一個SQL UPDATE查詢運行在VBA

我有感覺這是某處語法錯誤,但我找不到在哪裏。任何想法/建議將不勝感激,謝謝。

+2

將是一件好事只是'DoCmd.RunSql'前添加一個'debug.Print strSql'數值,爲了看看你的陳述看起來像什麼。 –

回答

2

我認爲你只是在該行的末尾缺少空格

你舊的查詢打印出來

UPDATE Training_RecordSET Date_Taken =()WHERE Staff_ID IN() AND Course_ID =() 

你可以看到會有關鍵字SET之前名稱衝突和WHERE因此

更改strSQL

strSQL = "UPDATE Training_Record " _ 
     & "SET Date_Taken = (" & strDate & ") " _ 
     & "WHERE Staff_ID IN (" & strCriteria & ") AND Course_ID = (" & strCourse & ")" 

打印出的(與提供沒有值)

UPDATE Training_Record SET Date_Taken =() WHERE Staff_ID IN() AND Course_ID =() 

它在SQL語法方面是正確的

如果我是你,我也查列的數據類型在你Training_Record

通常(這適用於類型不匹配錯誤),

的日期你包兩側的變量或值與#

例如& "SET Date_Taken = (#" & strDate & "#) ...

字符串使用單引號'

例如WHERE Operator_Name = ('" & operName & "') ...

你不需要使用任何東西,但澆鑄,從而正確的數據類型

0

我的猜測:

strSQL = "UPDATE Training_Record" _ 
     & "SET Date_Taken = (#" & Format(strDate, "mm\/dd\/yyyy") & "#)" _ 
     & "WHERE Staff_ID IN (" & strCriteria & ") AND Course_ID = (" & strCourse & ")" 

如果staff_ID是一個字符串:

strSQL = "UPDATE Training_Record" _ 
     & "SET Date_Taken = (#" & Format(strDate, "mm\/dd\/yyyy") & "#)" _ 
     & "WHERE Staff_ID IN ('" & strCriteria & "') AND Course_ID = (" & strCourse & ")" 
+0

謝謝,但不幸的是,這些查詢都給UPDATE語法中的錯誤。在Training_Record表中,Staff_ID和Course_ID是數字字段。 – lhparker

+0

UPDATE工作時需要格式化日期,如果沒有它,日期將作爲時間輸入。謝謝。 – lhparker