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 函数适用于源表,但不适用于查询的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 选择不同的随机值

MS Access:如何找到“限定符”和“所有者”

ConcatRelated 返回多个值

concatrelated vba excel的使用

将 ConcatRelated() 与变量一起使用

ms-access:双链表