MS Access更新查询(多个条件)

时间:2017-10-16 18:41:05

标签: ms-access access-vba

我在分割表单上有一个文本框[ScanItem],它带有两个不同的条形码值,Works真的很光滑!

字母数字,Len 11
  数字,Len 12

我的更新查询有效,但仅适用于一个WHERE条件。我希望使用Len功能来组合WHERE功能,但无法使其工作。

更新字母数字Len 11的查询(例如:019-WMD-001):

strSQL = "UPDATE [Location Table]" & _
         "SET [Location]='" & Me.Location1.Value & "'" & _
         "WHERE [Location Table].[Custom Label] = [ScanItem]"

更新数字Len 12的查询

"WHERE [Location Table].[Item ID] = [ScanItem]"

我理解表格空间是禁止的,但我无法控制。如果这不起作用,任何其他解决方案都会受到欢迎。

2 个答案:

答案 0 :(得分:0)

对于第一个WHERE条件,您已使用字符串连接处理它。

然而,对于第二个,你只是指这个领域。

使用字符串连接的解决方案(存在SQL注入的风险):

strSQL = "UPDATE [Location Table]" & _
         " SET [Location]='" & Me.Location1.Value & "'" & _
         " WHERE [Location Table].[Custom Label] = '" & Me.ScanItem.Value &  "'"

使用参数的更合适的解决方案:

strSQL = "UPDATE [Location Table]" & _
         " SET [Location]= paramLocation" & _
         " WHERE [Location Table].[Custom Label] = paramLabel"
Set qdf = CurrentDb.CreateQueryDef("", strSQL)
qdf.Parameters("paramLocation").Value = Me.Location1.Value
qdf.Parameters("paramLabel").Value = Me.ScanItem.Value
qdf.Execute

答案 1 :(得分:0)

如果我正确理解了您的问题,您想要在[ScanItem]的长度= 11(在这种情况下使用[自定义标签]进行比较)时应用一个WHERE子句评估,如果[ScanItem]的长度= 12则另一个WHERE子句评估(在这种情况下使用[项目ID]进行比较)。有多种方法可以做到这一点。我不是解决SQL注入问题 - 只是查询逻辑,但你总是可以使用参数重写它(推荐的最佳实践)。您可以编写查询以使用条件逻辑,或者您的vba可以使用条件逻辑(假设只有可能的长度条件为11和12)。我是情景2的粉丝。

场景1(查询使用条件逻辑):

strSQL = "UPDATE [Location Table] " & _
"SET [Location]='" & Me.Location1.Value & "' " & _
"WHERE ([Location Table].[Custom Label] = '" & Me.ScanItem.Value & "' AND LEN('" & Me.ScanItem.Value & "') = 11) " & _
"  OR ([Location Table].[Item ID] = '" & Me.ScanItem.Value & "' AND LEN('" & Me.ScanItem.Value & "') = 12)"

场景2(vba使用条件逻辑 - 假设只有2个可能的长度为11而不是11):

strSQL = "UPDATE [Location Table] " & _
"SET [Location]='" & Me.Location1.Value & "' " & _
"WHERE ([Location Table]." & IIF(Len(Me.ScanItem.Value)=11,"[Custom Label]","[Item ID]") & " = '" & Me.ScanItem.Value & "'"