Флажок Да / Нет Изменить при изменении Dropbox - PullRequest
1 голос
/ 28 мая 2019

У меня есть поле со списком (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

Мои результаты

Ошибка времени выполнения «3061»: слишком мало параметров. Ожидаемый 1.

1 Ответ

1 голос
/ 28 мая 2019

Причина вашей ошибки в том, что вы не оцениваете переменную 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 - это поле text - если это не так, удалите одинарные кавычки из приведенного выше.

Весь ваш код может быть сжат до:

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
...