复选框 Yes/No 在 Dropbox 更改时更改
Checkbox Yes/No Change on Dropbox Change
我有一个列出可用项目的组合框 (cbo1
)。当我 select cbo1
中的一个项目时,我希望它将复选框更改为 True(或 Yes)。
cbo1
从 tblLOG
获取数据,其中 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
我有一个列出可用项目的组合框 (cbo1
)。当我 select cbo1
中的一个项目时,我希望它将复选框更改为 True(或 Yes)。
cbo1
从 tblLOG
获取数据,其中 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