2013-08-21 3 views
2

У меня есть база данных со связанными таблицами - Персонал, Курсы и Training_Record. Каждый сотрудник имеет числовой первичный ключ, как и каждый курс, и каждую запись в таблице Training_Record. Staff_ID и Course_ID в справочной записи Training_Record в персонале и курсах.Доступ к VBA: SQL-запрос вызывает ошибку синтаксиса UPDATE

Когда сотрудник или курс добавлены, 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 это не сработает. Это мой SQL запрос в VBA:

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

Было бы хорошо, чтобы добавить 'Debug.Print strSql' непосредственно перед' DoCmd.RunSql', чтобы посмотреть, как выглядит ваше утверждение. –

ответ

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 являются полями Number. – lhparker

+0

Форматирование даты было необходимо, когда UPDATE работал - без него, даты вводились как раз. Спасибо. – lhparker

Смежные вопросы