У меня есть поле со списком (cbo1
), в котором перечислены доступные элементы. Когда я выбираю элемент в cbo1
, я хочу, чтобы он менял флажок на True (или Да).
cbo1
получает данные из tblLOG
, где поле (флажок) НЕТ запроса
я пытался использовать
UPDATE tblLOG
Set Box = True
WHERE Serial = cboSerial
Фактический код.
Private Sub cbo1_Change()
Dim strSQL As String
Dim i As Integer
Dim Msg As String
Dim Assm As String
Assm = cbo1.Value
'Exit this sub if the combo box is cleared
Msg = "Make Update" & vbCr & vbCr
i = MsgBox(Msg, vbQuestion + vbYesNo, "UPDATE VALUE?")
If i = vbYes Then
strSQL = "UPDATE tblLOG " _
& "SET Box= True " _
& "WHERE Serial = Assm;"
CurrentDb.Execute strSQL, dbFailOnError
Response = acDataErrAdded
End If
End Sub
Мои результаты
Run-time error '3061': Too few parameters. Expected 1.
Причина вашей ошибки в том, что вы не оцениваете свою переменную VBA Assm
, а скорее объединяете строку "Assm"
со своим SQL-запросом.
strSQL = "UPDATE tblLOG " _
& "SET Box= True " _
& "WHERE Serial = Assm;"
Если бы вы Debug.Print
переменную strSQL
вывели в консоль, вы бы увидели строку:
"UPDATE tblLOG SET Box= True WHERE Serial = Assm;"
Однако, поскольку Assm
не является строкой в SQL-запросе (т. е. не заключен в одинарные или двойные кавычки), он интерпретируется как параметр, значение которого не было указано при последующем выполнении SQL-запроса.
Чтобы решить эту проблему, вы можете объединить оценочное значение переменной Assm
, например:
strSQL = "UPDATE tblLOG " _
& "SET Box= True " _
& "WHERE Serial = '" & Assm & "';"
Это предполагает, что Serial
является полем текст — если это не так, удалите одинарные кавычки из приведенного выше.
Весь ваш код может быть несколько сокращен до:
Private Sub cbo1_Change()
If MsgBox("Make Update", vbQuestion + vbYesNo, "UPDATE VALUE?") = vbYes Then
CurrentDb.Execute "update tbllog set box = true where serial = '" & cbo1 & "';", dbFailOnError
Response = acDataErrAdded
End If
End Sub
Тем не менее, это по-прежнему открыто для SQL-инъекция, поэтому лучше использовать параметризовать запрос, например:
With CurrentDb.CreateQueryDef("", "update tbllog t set t.box = true where t.serial = myserial;")
.Parameters!myserial = cbo1
.Execute
End With