MS Access:ConcatRelated函数与源表一起使用但不与查询一起使用

时间:2018-04-12 15:45:44

标签: sql-server ms-access concatenation ms-access-2013

我使用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一起使用。我做错了什么?

1 个答案:

答案 0 :(得分:0)

我已经弄明白了。 ConcatRelated不想读我的查询,所以我决定用临时表提供函数,我将从该查询中提取数据。以下是示例解决方法:

构建临时表:

  1. 创建与查询结构相同的表格。
  2. 将您的查询类型更改为附加查询(暂时不使用Concat功能 - 您将为此构建另一个查询)。
  3. 设置附加查询的每一列应将数据发送到临时表的位置。
  4. 确保您的临时表具有准确的数据:

    1. 如果您使用特定形式的ConcatRelated,请将VBA添加到此表单的开启事件中,以删除临时表中的所有记录(如下所示:

      DoCmd.RunSQL(&#34; DELETE * FROM TempTable;&#34;)

    2. 现在您的临时表已清除,因此您可以执行追加查询(在同一表单的事件过程中),以使用适当的数据来实现临时表:

      DoCmd.OpenQuery&#34; YourAppendQuery&#34;

    3. 运行另一个查询(具有ConcatRealted函数的查询),但这次是指你的临时表。在上面的例子中,它看起来像是:

      ConcatRelated(&#34; [TextField]&#34;,&#34; [TempTable]&#34;,&#34; [CategoryNumber] =&#34;&amp; [CategoryNumber])

    4. 也许它不是一个漂亮的解决方案,但它对我有用,并允许我进一步完成我的项目。