在我的项目中,我有一个table1
,其中有一个ID和一个文本字段。 table2
有一个multi-valued field multifield
,其中我可以通过搜索从table
中选择多个值。
现在,我有query1
,我想从multifield
中提取值,而不是multifield.value
,并将其传递给VBA函数,例如:IDsToNames: table2.multifield
。问题是VBA给我这个错误:
The multi-valued field 'table2.multifield` is not valied in the expression IDsToNames(table2.multifield)
现在,我尝试使用IDsToNames([table2].[multifield])
获得相同的结果。
这是我查询的SQL:
SELECT table2.Title, table2.multifield, IDstoNames(table2.multifield) AS FieldNames
FROM table2;
如果我从SQL中删除了IDsToNames
函数,那么table2.multifield
本身将正确返回ID,例如:5, 4, 1
。我正在尝试获取table1
的第二列,而不是包含ID的第一列。所以我想我会尝试将该字段传递给函数并执行字符串拆分,然后他们在循环中使用dlookup查找它们。但是我无法将字段数据输入到函数中。
有没有办法做到这一点?
答案 0 :(得分:1)
有没有一种方法可以将多值字段直接从SQL语句传递给VBA函数?不,很遗憾。
但是,可以使用多种替代方法来获取存储在字段中的值列表。在Access多值字段的优缺点上徘徊很容易。我将不做详细说明,但是值得一提的是,多值字段的主要好处是Access接口的方便性和明显的简单性,它能够自动列出并允许选择一对多关系的多个值。试图模仿Access中的行为可能非常笨拙且麻烦(通常是不可能的)。多值字段的许多实现细节都是“隐藏的”(即没有充分记录或没有暴露于标准SQL或VBA编程接口)。这包括将多值字段从SQL语句中传递给VBA函数的功能。不管预期行为看起来多么直观,Access都不会简单地将它显示的相同的串联值列表传递给另一个函数。但是,有时仍然只需要一个简单列表中的值列表即可。信息linked to by Gustav是有用的,在查询多值字段时应该很好理解,但是它仍然不能解决多个值所需的其他完全合理的操作。希望以下指针有用。
sSQL = "SELECT table2.key, table2.multifield.value, UserTable.Username " & _
" FROM UserTable INNER JOIN table2 ON UserTable.ID = table2.multifield.Value" & _
" WHERE (table2.key = [KeyParameter])"
Set qry = CurrentDb.CreateQueryDef(, sSQL)
qry.Parameters("KeyParameter") = keyPassedToFunction
Set rs = qry.OpenRecordset
Dim rs as Recordset2
Set rs = CurrentDB.OpenRecordset("SELECT table2.multifield ... FROM ...")
Dim sList As String
sList = ""
If TypeOf rs![multifield] Is Recordset2 Then
Dim rsMVF As Recordset2
Set rsMVF = rs![multifield]
Dim bFirst As Boolean
bFirst = True
rsMVF.MoveFirst
Do Until rsMVF.EOF
If bFirst Then
sList = rsMVF.Fields(0)
bFirst = False
Else
sList = sList & "," & rs.Fields(0)
End If
rsMVF.MoveNext
Loop
'* DO NOT CLOSE the Recordset based on the Multivalue field.
'* Access will close it automatically.
End If
'* sList will contain comma-separated list of values