我使用ConcatRelated函数(由Allen Browne制作)来合并MainTable中多行的字符串值,按CategoryNumber分组:
ConcatRelated("[TextField]", "[MainTable]", "[CategoryNumber] = " & [CategoryNumber])
在那种情况下,功能完美无缺。但是,我需要仅使用某些类别合并行。我将这些选定的类别存储在Table2中。我创建了Query1,通过Tag字段将Table2与MainTable连接起来。
SELECT MainTable.CategoryNumber, MainTable.TextField
FROM Table2 INNER JOIN MainTable ON Table2.Tag = MainTable.ConnectedTag;
现在我只选择了要用于Concat功能的行。我试着以与前一个相同的方式使用它:
ConcatRelated("[TextField]", "[Query1]", "[CategoryNumber] = " & [CategoryNumber])
然后发生错误3061:参数太少。预期1。
我也尝试使用Concat作为表单中的事件过程。 结果我看到运行时错误' 2465'无法找到字段' | 1'
ConcatRelated模块看起来像这样,如前所述,它在许多其他情况下都可以正常工作:
Public Function ConcatRelated(strField As String, _
strTable As String, _
Optional strWhere As String, _
Optional strOrderBy As String, _
Optional strSeparator = ", ") As Variant
On Error GoTo Err_Handler
Dim rs As DAO.Recordset
Dim rsMV As DAO.Recordset
Dim strSQL As String
Dim strOut As String
Dim lngLen As Long
Dim bIsMultiValue As Boolean
ConcatRelated = Null
strSQL = "SELECT " & strField & " FROM " & strTable
If strWhere <> vbNullString Then
strSQL = strSQL & " WHERE " & strWhere
End If
If strOrderBy <> vbNullString Then
strSQL = strSQL & " ORDER BY " & strOrderBy
End If
Set rs = DBEngine(0)(0).OpenRecordset(strSQL, dbOpenDynaset)
bIsMultiValue = (rs(0).Type > 100)
Do While Not rs.EOF
If bIsMultiValue Then
'For multi-valued field, loop through the values
Set rsMV = rs(0).Value
Do While Not rsMV.EOF
If Not IsNull(rsMV(0)) Then
strOut = strOut & rsMV(0) & strSeparator
End If
rsMV.MoveNext
Loop
Set rsMV = Nothing
ElseIf Not IsNull(rs(0)) Then
strOut = strOut & rs(0) & strSeparator
End If
rs.MoveNext
Loop
rs.Close
lngLen = Len(strOut) - Len(strSeparator)
If lngLen > 0 Then
ConcatRelated = Left(strOut, lngLen)
End If
Exit_Handler:
Set rsMV = Nothing
Set rs = Nothing
Exit Function
Err_Handler:
MsgBox "Error " & Err.Number & ": " & Err.Description, vbExclamation, "ConcatRelated()"
Resume Exit_Handler
End Function
我将Access 2013与SQL Server一起使用。我做错了什么?
答案 0 :(得分:0)
我已经弄明白了。 ConcatRelated不想读我的查询,所以我决定用临时表提供函数,我将从该查询中提取数据。以下是示例解决方法:
构建临时表:
确保您的临时表具有准确的数据:
如果您使用特定形式的ConcatRelated,请将VBA添加到此表单的开启事件中,以删除临时表中的所有记录(如下所示:
DoCmd.RunSQL(&#34; DELETE * FROM TempTable;&#34;)
现在您的临时表已清除,因此您可以执行追加查询(在同一表单的事件过程中),以使用适当的数据来实现临时表:
DoCmd.OpenQuery&#34; YourAppendQuery&#34;
运行另一个查询(具有ConcatRealted函数的查询),但这次是指你的临时表。在上面的例子中,它看起来像是:
ConcatRelated(&#34; [TextField]&#34;,&#34; [TempTable]&#34;,&#34; [CategoryNumber] =&#34;&amp; [CategoryNumber])
也许它不是一个漂亮的解决方案,但它对我有用,并允许我进一步完成我的项目。