Я столкнулся с аналогичным типом проблемы: Code Snippet:
<c:forEach items="${orderList}" var="xx">
${xx.id} <br>
</c:forEach>
После списка заказов было следующее: «$ {orderList}», из-за чего переменная xx скрывалась в String и не могла вызвать xx.id.
Поэтому убедитесь, что в пространстве. Иногда они играют решающую роль. : Р
Вы должны спросить себя, нужно ли вам общее решение ( другое - Аллен Браун ), или если вам это нужно только для этой цели. Если вы действительно нуждаетесь в этом только один раз, сделайте это простым способом.
На стороне примечания, при объединении списков в коде VBA, воспользуйтесь трюком, которым меня научил давний гуру доступа Trevor Best , и это нужно придерживать разделитель в начале каждого значения, а затем использовать Mid (), чтобы отключить его. Вместо этого внутри вашей петли через дочерние записи:
If Len(strOutput) = 0 Then
strOutput = NewValue
Else
strOutput = strOutput & ", " & NewValue
End If
... используйте это внутри цикла:
strOutput = strOutput & ", " & NewValue
... и затем, когда вы выходите из цикла , отделите главный разделитель:
strOutput = Mid(strOutput, 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
. Исходный код (который я частично изменил) имел ограничение на количество строк и столбцов, которые могли бы использоваться, что и есть константы.
Я нашел этот пост Duane Hookum (Microsoft MVP), который утверждает, что способен делать то, что вы хотите. Я не тестировал его, хотя.
Кстати, в случае, если вас это интересует, вот как я его нашел:
Первый поиск: group_concat access привел меня к этой записи с этим ответом , но ссылка была сломана .
Затем я снова искал после содержимое, на которое пытался найти ответ, и нашел его: сайт: http: //www.rogersaccesslibrary.com/ concatenate .
Есть функция доступа для группировки нескольких значений в одно значение (как мне кажется.) Ссылка http://www.rogersaccesslibrary.com/Otherdownload.asp?SampleName='Generic%20Function% 20To% 20Concatenate% 20Child% 20Records '
, но сайт пока отсутствует. Если вы google href, вы найдете много ссылок и примеров.