есть ли функция group_concat в ms-access? - PullRequest
20 голосов

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

Ответы [ 4 ]

3 голосов
/ 19 мая 2010

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

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

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

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

  strOutput = strOutput & ", " & NewValue

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

  strOutput = Mid(strOutput, 3)

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

2 голосов
/ 18 мая 2010

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


Кстати, если вам интересно, вот как я это нашел:

Первый поиск: group_concat access привело меня к этому сообщению с этим ответом , но ссылка была разорвана .

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

1 голос
/ 18 мая 2010

Существует функция доступа, позволяющая сгруппировать несколько значений в одно значение (я полагаю, пользовательский агрегат). Ссылка: http://www.rogersaccesslibrary.com/Otherdownload.asp?SampleName='Generic%20Function%20To%20Concatenate%20Child%20Records'

но сайт пока недоступен. Если вы загляните в Google, вы найдете много ссылок и примеров.

1 голос
/ 18 мая 2010

Нет. Доступ не имеет функции 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 класса. В исходном коде (который я частично изменил) было ограничено количество строк и столбцов, которые можно использовать, и это то, что представляют собой константы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...