复选框 Yes/No 在 Dropbox 更改时更改

Checkbox Yes/No Change on Dropbox Change

我有一个列出可用项目的组合框 (cbo1)。当我 select cbo1 中的一个项目时,我希望它将复选框更改为 True(或 Yes)。

cbo1tblLOG 获取数据,其中 Box(复选框)为 NO Query

我试过使用

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 是一个 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 injection, and so a better practice is to 开放,例如:

With CurrentDb.CreateQueryDef("", "update tbllog t set t.box = true where t.serial = myserial;")
    .Parameters!myserial = cbo1
    .Execute
End With