Агрегирование текста при группировке в отчете

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Roman Koff
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 495
Зарегистрирован: 17.09.2008 (Ср) 9:22
Откуда: От туда

Агрегирование текста при группировке в отчете

Сообщение Roman Koff » 21.12.2010 (Вт) 17:04

Не могу найти решение для следующей задачи:
Есть отчет по линейному запросу (Ключ, Адрес, Фамилия) с группировкой по полю "Адрес".
Соответственно, в заголовок группы я помещаю адрес, а в область данных фамилию.
При отображении получается бланк с адресом и списком жителей по адресу в столбик.

Как мне в заголовке группы получить список всех жителей объединенных скажем через запятую?
По аналогии с Sum() для числовых данных...
Слава роботам! Убить всех человеков! Bite my shiny metal ass!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Агрегирование текста при группировке в отчете

Сообщение alibek » 21.12.2010 (Вт) 17:56

Строки — это не числа, поэтому никакой аналогии с SUM тут нет.
В зависимости от СУБД, нужно осуществлять построчный обход или использовать XML-представления.
В MSSQL можно сделать примерно так:
Код: Выделить всё
SELECT SUBSTRING(REPLACE(REPLACE(CAST(
  (SELECT ', '+REPLACE(empPerformer.[DisplayString],' ',CHAR(160))
  FROM dbo.[dvtable_{9D09144D-CAEC-4732-AD4D-EB6A3864714A}] tskCurrentPerformers WITH(NOLOCK)
  LEFT JOIN dbo.[dvtable_{DBC8AE9D-C1D2-4D5E-978B-339D22B32482}] empPerformer WITH(NOLOCK)
    ON (tskCurrentPerformers.[PerformerID] = empPerformer.[RowID])
  WHERE tskCurrentPerformers.[InstanceID] = p.[InstanceID] AND tskCurrentPerformers.[PerformerState] IN (0,1,2,3,4,8,9,10,11,14)
  FOR XML PATH('')) AS nvarchar(max)),'&lt;','<'),'&gt;','>'),3,8000)
Lasciate ogni speranza, voi ch'entrate.

Roman Koff
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 495
Зарегистрирован: 17.09.2008 (Ср) 9:22
Откуда: От туда

Re: Агрегирование текста при группировке в отчете

Сообщение Roman Koff » 21.12.2010 (Вт) 19:37

Хотелось чуда от Аксесса, а чуде но вышло ;)
Пошел писать функцию...

Спасиба...

З.С.
Зачетный пример... На выходе что получаетсо? Р2Д2?
Слава роботам! Убить всех человеков! Bite my shiny metal ass!

Roman Koff
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 495
Зарегистрирован: 17.09.2008 (Ср) 9:22
Откуда: От туда

Re: Агрегирование текста при группировке в отчете

Сообщение Roman Koff » 22.12.2010 (Ср) 23:35

Придумал простое и элегантное решение в лоб.

Суть метода, если кому понадобится:
1. В отчете в "области данных" размещаем поля (при желании область можно скрыть)
2. Поле содержащее результат агрегирования необходимо размещать в "примечании группы"
3. В событии Format "заголовка группы" производим очистку поля результата
4. В событии Format "области данных" производим агрегирование необходимых данных (полей) в поле результата
5. В событии Format "примечания группы" производим окончательное форматирование результата

Т.о. все выполняется штатными методами Access без дополнительных запросов и процедур.
Решение достаточно гибкое, имхо. Я таким образом реализовал механизм приветствия для одного и более человек с учетом пола.

На выходе получаются такие результаты:
    - Уважаемые Маргарита Геннадьевна и Владимир Владимирович!
    - Уважаемые Роман Владимирович, Светлана Яковлевна и Анастасия Романовна!
    - Уважаемый Владимир Васильевич!
    - Уважаемая Людмила Николаевна!

Помоему очень неплохой вариант для искуственного интеллекта ;)

Вид отчета в конструкторе:
rep.png


Код модуля отчета:
Код: Выделить всё
Option Compare Database

Private strPeoples As String

Private Sub Report_Activate()
    DoCmd.Maximize
End Sub

Private Sub repGroupHeaderAddress_Format(Cancel As Integer, FormatCount As Integer)
   
    ' очистка
    strPeoples = ""
   
End Sub

Private Sub repDataArea_Format(Cancel As Integer, FormatCount As Integer)
    ' агрегирование подчиненных данных
    strPeoples = strPeoples & ";" & Me.Nam & " " & Me.Otc
End Sub

Private Sub repGroupFooterAddress_Format(Cancel As Integer, FormatCount As Integer)
    Dim A01() As String
    Dim C01 As Integer
    Dim C02 As Integer
    Dim I01 As Integer
    Dim S01 As String
    ' финальное форматирование
    S01 = ""
    If Len(strPeoples) > 0 Then
        A01 = Split(Mid(strPeoples, 2), ";")
        C01 = LBound(A01)
        C02 = UBound(A01)
        If C02 = C01 Then
            S01 = A01(C01)
            Me.SUFFIX = IIf(Me.Sex = "М", "ый ", "ая ") ' определение окончания
        Else
            For I01 = C01 To C02 - 1
                S01 = S01 & ", " & A01(I01)
            Next
            S01 = Mid(S01, 3) & " и " & A01(C02)
            Me.SUFFIX = "ые "
        End If
    End If
    Me.SUM_PEOPLES = S01
End Sub
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось Roman Koff 23.12.2010 (Чт) 10:39, всего редактировалось 2 раз(а).
Слава роботам! Убить всех человеков! Bite my shiny metal ass!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Агрегирование текста при группировке в отчете

Сообщение alibek » 22.12.2010 (Ср) 23:38

Проверь поведение отчета, когда хидер/футер оказывается в конце/начале страницы (когда детали и хидер/футер размещены на разных страницах).
Иногда бывают сюрпризы.
Lasciate ogni speranza, voi ch'entrate.

Roman Koff
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 495
Зарегистрирован: 17.09.2008 (Ср) 9:22
Откуда: От туда

Re: Агрегирование текста при группировке в отчете

Сообщение Roman Koff » 22.12.2010 (Ср) 23:42

Как я понимаю, здесь к разметке страницы ничего не привязано. Привязка с порядку событий генерации отчета.

Так или иначе для поздравительных открыток на один лист работает на ура.
Слава роботам! Убить всех человеков! Bite my shiny metal ass!

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Re: Агрегирование текста при группировке в отчете

Сообщение Andrey Fedorov » 25.01.2011 (Вт) 15:26

Roman Koff писал(а):Как я понимаю, здесь к разметке страницы ничего не привязано. Привязка с порядку событий генерации отчета.

Так или иначе для поздравительных открыток на один лист работает на ура.


Я бы почитал на всякий случай по поводу FormatCount - для случаев когда не один лист...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 112

    TopList