Access - 使用多选列表框从表单值更新查询 VBA

Access - Update Query from Form Values with Multiselect Listbox VBA

我有一个问题,我觉得我快要解决了,但我遗漏了一些东西。我有一个包含五个对象的未绑定表单。

'SSN'是一个标准的文本框。 'Appointment State' 是一个启用了 multiselect 的列表框。源是一个 table 命名的状态。 'Carrier' 是一个组合框。 'Appointment Status' 是一个组合框。 'Appt Request Date' 是一个日期字段。

一旦值在所有五个对象中,我就有一个运行下面代码的按钮。我想将值传递给更新查询以用作条件。

正在更新的字段是 'Appointment Status' 和 'Appt Request Date'。其他字段 select 正确的记录。

当前代码运行,更新查询接收大部分条件。唯一没有正确填充的字段是 'Appointment State',我认为它会从 strCriteria 中提取。

当代码运行时,它要求用户在需要从 'Appointment States' 列表框中拉取时填充 strCriteria 值。

我从一个站点找到了代码,该代码告诉我们如何从多 select 列表框中获取值,然后为一个条件 Select 查询创建 SQL。我已尽力适应它。主要区别在于 SQL 构建。当我使用原件时,它有效。

我修改的操作更新查询的代码:

Private Sub Command35_Click()

Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim varItem As Variant
Dim strCriteria As String
Dim strSQL As String
Set db = CurrentDb()
Set qdf = db.QueryDefs("Appointment Update Query")

If Me![Appointment State].ItemsSelected.Count > 0 Then
  For Each varItem In Me![Appointment State].ItemsSelected
     strCriteria = strCriteria & "States.States = " & Chr(34) _
                   & Me![Appointment State].ItemData(varItem) & Chr(34) &  " OR "
  Next varItem
  strCriteria = Left(strCriteria, Len(strCriteria) - 3)
Else
  strCriteria = "States.States Like '*'"
End If
strSQL = "UPDATE [Appointment Query]" _
& " SET [Appointment Query].[Appointment Status] = [Forms].[Appointment Update].[Appointment Status], [Appointment Query].[Appt Request Date] = [Forms]![Appointment Update].[Appt Request Date]" _
& " WHERE ((([Appointment Query].SSN)=[Forms]![Appointment Update].[SSN]) AND (([Appointment Query].[Appointment State])=" & strCriteria & ") AND (([Appointment Query].Carrier)=[Forms]![Appointment Update].[Carrier]));"

qdf.SQL = strSQL
qdf.Close  

DoCmd.OpenQuery "Appointment Update Query"

Set db = Nothing
Set qdf = Nothing

End Sub

原代码:

    Private Sub cmdOK_Click()
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Dim varItem As Variant
Dim strCriteria As String
Dim strSQL As String
Set db = CurrentDb()
Set qdf = db.QueryDefs("qryMultiSelect")
If Me!lstRegions.ItemsSelected.Count > 0 Then
  For Each varItem In Me!lstRegions.ItemsSelected
     strCriteria = strCriteria & "tblData.Region = " & Chr(34) _
                   & Me!lstRegions.ItemData(varItem) & Chr(34) & "OR "
  Next varItem
  strCriteria = Left(strCriteria, Len(strCriteria) - 3)
Else
  strCriteria = "tblData.Region Like '*'"
End If
strSQL = "SELECT * FROM tblData " & _
        "WHERE " & strCriteria & ";"
qdf.SQL = strSQL
DoCmd.OpenQuery "qryMultiSelect"
Set db = Nothing
Set qdf = Nothing
End Sub

关于如何让它正常工作有什么想法吗?

Debug.Print海峡SQL:

    UPDATE [Appointment Query] SET [Appointment Query].[Appointment Status] = [Forms].[Appointment Update].[Appointment Status], [Appointment Query].[Appt Request Date] = [Forms]![Appointment Update].[Appt Request Date] WHERE ((([Appointment Query].SSN)=[Forms]![Appointment Update].[SSN]) AND (([Appointment Query].[Appointment State])=States.States = "AL" OR States.States = "AZ") AND (([Appointment Query].Carrier)=[Forms]![Appointment Update].[Carrier]));

Debug.Print strCriteria:

    States.States = "AL" OR States.States = "AZ"

States 是 table 州缩写所在的名称,第二个 States 是字段名称。

首先,您需要在 SQL 中的串联字符串之间添加 spaces - 我刚刚在 SET 和 WHERE 之前添加了一个 space。您收到错误消息了吗?

你能Debug.print strSQL吗?

strSQL = "UPDATE [Appointment Query]" _
& " SET [Appointment Query].[Appointment Status] = [Forms].[Appointment Update].[Appointment Status], [Appointment Query].[Appt Request Date] = [Forms]![Appointment Update].[Appt Request Date]" _
& " WHERE ((([Appointment Query].SSN)=[Forms]![Appointment Update].[SSN]) AND (([Appointment Query].[Appointment State])=strCriteria) AND (([Appointment Query].Carrier)=[Forms]![Appointment Update].[Carrier]));"

而且您似乎在更新 SQL 之前没有关闭 qdf。

qdf.SQL = strSQL
qdf.Close
DoCmd.OpenQuery "Appointment Update Query"

这也会破坏您构建 strCriteria 的方式的查询

(([Appointment Query].[Appointment State])=strCriteria) 

如果您的任何单个字段是文本字段,您需要将它们用转义双引号引起来

我认为它与不使用变量 strCriteria 有关系,您使用的是文字文本。

你现在拥有的:

"WHERE ((([Appointment Query].SSN)=[Forms]![Appointment Update].[SSN]) AND (([Appointment Query].[Appointment State])=strCriteria) AND (([Appointment Query].Carrier)=[Forms]![Appointment Update].[Carrier]));"

要使用变量内容,您需要将其转义作为查询的一部分,如下所示:

"WHERE ((([Appointment Query].SSN)=[Forms]![Appointment Update].[SSN]) AND (([Appointment Query].[Appointment State])=" & strCriteria & ") AND (([Appointment Query].Carrier)=[Forms]![Appointment Update].[Carrier]));"

此外,正如 dbmitch 所注意到的,您可能还需要在 WHERE 之前添加一个 space。

您应该向我们展示您的查询中的 SQL - 我看不出您尝试使用 States.State 的原因,所以我建议进行此更改,但这真的很难提供帮助现在远不止这些

If Me![Appointment State].ItemsSelected.Count > 0 Then
  strCriteria = "IN ("
  For Each varItem In Me![Appointment State].ItemsSelected
     strCriteria = strCriteria & Chr(34) _
                   & Me![Appointment State].ItemData(varItem) & Chr(34) &  ","
  Next varItem
  strCriteria = Left$(strCriteria, Len(strCriteria)-1) & ")" ' Remove last comma
Else
  strCriteria = "= """ & Me![Appointment State] & """"
End If

EDIT: Updated SQL Statement with double quotes

strSQL = "UPDATE [Appointment Query]" _
& " SET [Appointment Query].[Appointment Status] = [Forms].[Appointment Update].[Appointment Status], [Appointment Query].[Appt Request Date] = [Forms]![Appointment Update].[Appt Request Date]" _
& " WHERE ((([Appointment Query].SSN)=""" & [Forms]![Appointment Update].[SSN] & """) AND (([Appointment Query].[Appointment State]) " & strCriteria & _
") AND (([Appointment Query].Carrier)=""" & [Forms]![Appointment Update].[Carrier] & """));"