в доступе мс существует ли функция group_concat?

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

20
задан l--''''''---------'''''''''''' 17 May 2010 в 21:20
поделиться

4 ответа

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

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

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

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

  strOutput = strOutput & ", " & NewValue

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

  strOutput = Mid(strOutput, 3)

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

3
ответ дан 30 November 2019 в 01:34
поделиться

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


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

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

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

2
ответ дан 30 November 2019 в 01:34
поделиться

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

, но сайт пока не работает. Если вы погуглите href, вы найдете множество ссылок и примеров.

1
ответ дан 30 November 2019 в 01:34
поделиться

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

1
ответ дан 30 November 2019 в 01:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: