Подтвердить что ты не робот

Есть ли функция group_concat в ms-access?

есть ли функция group_concat в ms-доступе или что-то подобное?

4b9b3361

Ответ 1

Вы должны спросить себя, нужно ли вам общее решение (другое - Аллен Браун), или если вам это нужно только для настоящей цели, Если вы действительно нуждаетесь в этом только один раз, сделайте это легко.

На стороне примечания, при объединении списков в коде VBA, воспользуйтесь трюком, которым научил долговременный гуру доступа Trevor Best, и чтобы придерживаться разделителя в начале каждого значения, а затем использовать Mid() снять его. Вместо этого внутри вашей петли через дочерние записи:

  If Len(strOutput) = 0 Then
     strOutput = NewValue
  Else
     strOutput = strOutput & ", " & NewValue
  End If

... используйте это внутри цикла:

  strOutput = strOutput & ", " & NewValue

... и затем, когда вы выходите из цикла, отделите главный разделитель:

  strOutput = Mid(strOutput, 3)

Это имеет последствия повсеместно и упрощает код для конкатенации во множестве контекстов.

Ответ 2

Я нашел этот пост от Duane Hookum (Microsoft MVP), который утверждает, что способен делать то, что вы хотите. Я не тестировал его, хотя.


Кстати, на случай, если вас это интересует, вот как я его нашел:

Первый поиск: доступ к группе_concat приведет меня к this post с этот ответ, но ссылка была сломана.

Затем я снова искал содержимое, на которое пытался ответить ответ, и нашел его: site: http://www.rogersaccesslibrary.com/concatenate.

Ответ 3

Нет. Доступ не имеет функции GROUP_CONCAT. Тем не менее, можно создать функцию VBA, которая позволит вам передать строку, содержащую инструкцию SQL, и получить эквивалентную функциональность (не то, что я бы рекомендовал, но это возможно).

Принимая мою личную машину обратного пути, вот какой код я написал, когда динозавры правили Землей:

Public Function ListQuery(SQL As String _
                            , Optional ColumnDelimiter As String = " " _
                            , Optional RowDelimter As String = vbCrLf) As String
'PURPOSE: to return a combined string from the passed query
'ARGS:
'   1. SQL is a valid Select statement
'   2. ColumnDelimiter is the character(s) that separate each column
'   3. RowDelimiter is the character(s) that separate each row
'RETURN VAL:
'DESIGN NOTES:

Const PROCNAME = "ListQuery"
Const MAXROWS = 100
Const MAXCOLS = 10
Dim oConn As ADODB.Connection
Dim oRS As ADODB.Recordset
Dim oField As ADODB.Field
Dim sRow As cString
Dim sResult As cString

On Error GoTo ProcErr

Set sResult = New cString
Set sRow = New cString
Set oConn = GetADOConn()

sResult.Clear
Do Until oRS.EOF
    sRow.Clear

    For Each oField In oRS.Fields
        With sRow
            If .Length > 0 Then
                .Append ColumnDelimiter
            End If

            .Append Nz(oField.Value)
        End With
    Next oField

    sRow.Trim
    If sRow.Length > 0 Then
        With sResult
            .Append sRow
            .Append RowDelimter
        End With
    End If

    oRS.MoveNext
Loop
oRS.Close
oConn.Close

With sResult
    If .Right(Len(RowDelimter)).Value = RowDelimter Then
        .Length = .Length - Len(RowDelimter)
    End If
End With

FunctionResult:
    ListQuery = sResult.Value

CleanUp:
    Set sResult = Nothing
    Set sRow = Nothing
    Set oField = Nothing
    Set oRS = Nothing
    Set oConn = Nothing

Exit Function
ProcErr:
    ' logging  code...
    Resume CleanUp

End Function

Функция GetADOConn является централизованной функцией для получения текущего соединения с базой данных. cString - это класс, который имитирует поведение класса .NET StringBuilder, но был написан задолго до того, как .NET был чем-то иным, чем TLD и маркетинговой рекламой. Поскольку этот вызов вызывается в каждой строке, встроенная конкатенация строк VBA будет медленной и, следовательно, что-то вроде класса StringBuilder. Исходный код (который я частично изменил) имел ограничение на количество строк и столбцов, которые могли бы использоваться, что и есть константы.