Показать результат в одной строке SQL Access [дубликат]

Я столкнулся с аналогичным типом проблемы: Code Snippet:

<c:forEach items="${orderList}" var="xx"> ${xx.id} <br>
</c:forEach>

После списка заказов было следующее: «$ {orderList}», из-за чего переменная xx скрывалась в String и не могла вызвать xx.id.

Поэтому убедитесь, что в пространстве. Иногда они играют решающую роль. : Р

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

4 ответа

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

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

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

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

  strOutput = strOutput & ", " & NewValue

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

  strOutput = Mid(strOutput, 3)

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

3
ответ дан David-W-Fenton 20 August 2018 в 12:50
поделиться

Нет. Доступ не имеет функции 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
ответ дан DavidDraughn 20 August 2018 в 12:50
поделиться
  • 1
    При написании кода для Access мне кажется, что он имеет смысл написать его в DAO, поскольку ADO в значительной степени мертв, за исключением взаимодействия с SQL Server. – David-W-Fenton 19 May 2010 в 00:15
  • 2
    @ David-W-Fenton - Ну, можно утверждать, что DAO тоже очень мертв, но я понимаю вашу точку зрения. Код легко изменить для DAO. IIRC, дата в этом коде была где-то в 97 году, так что, возможно, это было то, что я работал с ADO в Access, поскольку в то время я все еще занимался ASP Classic. – Thomas 19 May 2010 в 01:50
  • 3
    Невозможно утверждать, что DAO мертв, поскольку он активно развивается в Access, получая изменения и усовершенствования, чтобы идти вместе с изменениями в ACE в A2007 и A2010. Это классика ADO, которая полностью мертва, заменена ADO.NET, которая не может использоваться в Access (по крайней мере, на данный момент). – David-W-Fenton 20 May 2010 в 01:50
  • 4
    @Thomas вы можете ответить на последний комментарий dave – l--''''''---------'''''''''''' 1 May 2012 в 19:32
  • 5
    @ Артём Царионов - Конечно. Мы не согласны. DAO в VBA ориентирован на непосредственно связанные настройки (т. Е. Связанные таблицы). ADO была ориентирована на отключенный подход и, таким образом, была и остается IMO превосходным подходом. На этом этапе обеим портам будет сложно переносить среду .NET. Тем не менее, системная идея проектирования вашего интерфейса с вызовами db для соединения с разъемом connect-get лучше и будет проще переносить, чем один из «всегда подключенных». В этой конкретной проблеме либо DAO, либо ADO будут работать, но утверждая, что ADO мертв, но DAO не является сомнительным. – Thomas 1 May 2012 в 20:50

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


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

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

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

2
ответ дан Mark Byers 20 August 2018 в 12:50
поделиться

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

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

1
ответ дан mdma 20 August 2018 в 12:50
поделиться
Другие вопросы по тегам:

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