MS Access:ConcatRelated 函数适用于源表,但不适用于查询
Posted
技术标签:
【中文标题】MS Access:ConcatRelated 函数适用于源表,但不适用于查询【英文标题】:MS Access: ConcatRelated function works with source table but not with query 【发布时间】:2018-04-12 15:45:44 【问题描述】:我使用 ConcatRelated 函数(由 Allen Browne 制作)来合并 MainTable 中多行的字符串值,按 CategoryNumber 分组:
ConcatRelated("[TextField]", "[MainTable]", "[CategoryNumber] = " & [CategoryNumber])
在这种情况下,函数可以完美运行。但是,我只需要合并某些类别的行。我将这些选定的类别存储在表 2 中。我制作了通过 Tag 字段将 Table2 与 MainTable 连接起来的 Query1。
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 服务器一起使用。我做错了什么?
【问题讨论】:
您可能需要提及 ConcatRelated 的来源和作者。在 Stack Overflow 上发布不是您编写的代码而不透露作者的代码被视为抄袭。 我的帖子的第一句话就提到了作者。他的名字叫 Allen Browne,所有尝试在 Access 中合并数据的人都可能知道唯一的 Allen Browne。现在提到他够了吗? 你还没有提到出处,只是作者... 好的,我已经放置了网址。我相信多年前因为找到耶稣而放弃访问的艾伦会原谅我。你现在可能想回答我的问题。 “你现在可能想回答我的问题”大声笑经典..... 【参考方案1】:我已经想通了。 ConcatRelated 不想读取我的查询,所以我决定使用临时表来提供函数,我将把来自该查询的数据放在其中。这是示例解决方法:
建立临时表:
-
创建与您的查询具有相同结构的表。
将您的查询类型更改为追加查询(暂时不要使用 Concat 函数 - 您将为此构建另一个查询)。
设置附加查询的每一列应将数据发送到临时表的位置。
确保您的临时表有准确的数据:
如果您在特定表单中使用 ConcatRelated,请将 VBA 添加到此表单的打开事件中以从临时表中删除所有记录(如下所示:
DoCmd.RunSQL("DELETE * FROM TempTable;")
现在你的临时表已经很清楚了,所以你可以执行你的追加查询(在同一个表单的事件过程中),用正确的数据来完成临时表:
DoCmd.OpenQuery "YourAppendQuery"
运行另一个查询(带有 ConcatRealted 函数的查询),但这次参考您的临时表。在上述情况下,它看起来像这样:
ConcatRelated("[TextField]", "[TempTable]", "[CategoryNumber] = " & [CategoryNumber])
也许这不是一个漂亮的解决方案,但它对我有用,让我可以在我的项目中走得更远。
【讨论】:
以上是关于MS Access:ConcatRelated 函数适用于源表,但不适用于查询的主要内容,如果未能解决你的问题,请参考以下文章