Access VBA, уровни группировки в отчёте

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
BOPOH
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 25.05.2007 (Пт) 6:12
Откуда: Красноярск

Access VBA, уровни группировки в отчёте

Сообщение BOPOH » 25.05.2007 (Пт) 6:48

Для начала общая информация.
Есть несколько финансовых показателей (4-5).
У каждой строки показателя существует классификация, она определена 8-ью полями.

Задача.
Необходимо написать код обеспечивающий генерацию отчёта (финансовые показатели могут комбинироваться).
Классификация - 8 полей.
Выборка и группировка могут производиться по разному количеству полей классификации и в любом порядке по велению пользователя.

Что сделано.
Создана форма для управления этим действием.
Создана генерация запроса на выборку, обеспечивающая данные для отчёта.

Теперь главная проблема.
Количество полей классификации в отчёте может меняться, как и количество уровней группировки.
Отчёт создаю с помощью CreateReport.
Поля создаю с помощью CreateReportControl.
Уровень группировки создаю с помощью CreateGropeLevel

Когда добавляю поля для вывода промежуточных итогов и другой вспомогающей информацию, они добавляются в первый уровень группировки.
Как приваязать поля к конкретному уровню группировки?

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

Сообщение alibek » 25.05.2007 (Пт) 7:00

Когда ты задаешь группировку в отчете, для каждой группы есть заголовок и сноска (header и footer). Заголовок выводится перед началом группы, сноска, соответственно, после группы.
Так что проверь, что во-первых, у тебя включено отображение сносок для других групп (помимо первого уровня), а во-вторых, что промежуточные поля выводятся именно в соответствующей сноске.
Можешь сделать скриншот своего отчета в режиме дизайна?
Lasciate ogni speranza, voi ch'entrate.

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

Сообщение alibek » 25.05.2007 (Пт) 7:00

И на всякий случай покажи SQL-код запроса.
Может ты группировку в SQL делаешь?
Lasciate ogni speranza, voi ch'entrate.

BOPOH
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 25.05.2007 (Пт) 6:12
Откуда: Красноярск

Сообщение BOPOH » 28.05.2007 (Пн) 15:57

Запрос формируется у меня в VBA на основе формы.
Этот вариант упрощённый. Далее туда прибавятся фильтры по всем полям классификации, которые существуют. А также наименования кодов классификации (по желанию пользователя). Т.е. в заголовках групп, могут появляться (быть\отображаться\скрываться) дополнительные текстовые поля описания кодов.
Код: Выделить всё

nSel = 0
For i = 0 To (nElem - 1)
    If [Группы].Selected(i) Then
        nSel = nSel + 1
        ReDim Preserve gruppa(nSel)
        gruppa(nSel - 1) = [Группы].Column(1, i)
        If (nSel = 1) Then
                    strSQL = "SELECT " & gruppa(nSel - 1)
                    strSQLgr = " GROUP BY " & gruppa(nSel - 1)
                    strSQLsort = " ORDER BY " & gruppa(nSel - 1)
                 Else
                    strSQL = strSQL & "," & gruppa(nSel - 1)
                    strSQLgr = strSQLgr & "," & gruppa(nSel - 1)
                    strSQLsort = strSQLsort & "," & gruppa(nSel - 1)
        End If
    End If
Next i
If nSel = 0 Then
    MsgBox ("Должен быть выбран хотя бы один уровень группировки")
    Exit Sub
End If
strSQL = strSQL & ", Sum([КВ1]+[КВ2]+[КВ3]+[КВ4]) AS сумма FROM Роспись" & strSQLgr & strSQLsort

Sum([КВ1]+[КВ2]+[КВ3]+[КВ4]) - сложение поквартальных сумм.
Поля группировки в одном списке.
Поля промежуточных итогов во втором.

Вот примерный код (так как я искал решение - он далёк от первоначального).
Этот фрагмент должен отвечать за построение отчёта

Код: Выделить всё

nElem = [Итоги].ListCount
For i = 0 To nElem
    If [Итоги].Selected(i) Then
        Set rst = CurDB.OpenRecordset("SELECT * FROM Группировка WHERE Имя='" & [Итоги].Column(0, i) & "'")
        grItog = CreateGroupLevel(rep.Name, [Итоги].Column(0, i), True, False)
        'rep.GroupLevel(grItog).Height = rst!высота
        'MsgBox (grItog + 9)
        Set elTextBox = CreateReportControl(rep.Name, acTextBox, acGroupLevel1Header, , , 0, 0, rst!длина, "300")
            elTextBox.ControlSource = [Итоги].Column(0, i)
            'rep.GroupLevel(i).ControlSource = elTextBox
        Set elTextBox = CreateReportControl(rep.Name, acTextBox, acGroupLevel1Header, , , "7000", "0", "1600", "300")
            elTextBox.ControlSource = "=sum(сумма)"
            elTextBox.format = format
            elTextBox.DecimalPlaces = 2
            'Me.GroupLevel(i).ControlSource = elTextBox
           
        rst.Close
    End If
Next i


acGroupLevel1Header - использую эту константу в CreateReportControl только потому что не могу сослаться на заголовок группы. Это моя текущая проблема.

В таблице "Группировка" будут данные о формате, в котором нужно будет отображать итог.

P.S. На сегодня у меня в голове наметилось такое решение, но не пробывал.
Создать отчёт с "обезличенными" полями, типа "Поле0", "Поле1"...
А после им присваивать источник. Ненужные скрывать.

Отчёт формируется такой:
(Я специально растащил поля в заголовке, чтобы отобразить их все.
По идее они должны быть в соответствующих заголовках.)
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось BOPOH 29.05.2007 (Вт) 9:34, всего редактировалось 1 раз.

BOPOH
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 25.05.2007 (Пт) 6:12
Откуда: Красноярск

Сообщение BOPOH » 29.05.2007 (Вт) 7:53

Опробывал свою идею.
Теперь не могу скрыть, удалить заголовки других (ненужных) уровней.


Всё-таки, думаю, лучше остановится на первом варианте, так как количество столбцов может меняться.

Неужели ни у кого нет ни каких идей?

P.s. Подскажите как сделать, чтобы по умолчанию отчёт загружался в альбомном формате.

BOPOH
Начинающий
Начинающий
 
Сообщения: 4
Зарегистрирован: 25.05.2007 (Пт) 6:12
Откуда: Красноярск

Наконец то!!

Сообщение BOPOH » 05.06.2007 (Вт) 14:54

Решил эту проблему!
Прикол в том, что константа
acGroupLevel1Header , определящая заголовок 1-ого уровня, равна 5., т.е. имя константы можно заменить числом.
acGroupLevel1Footer , определящая примечание 1-ого уровня, равна 6.

Как легко догадаться, константу (она же ссылка) определяющую раздел отчёта, можно найти по формуле:

Заголовок группы n-го уровня
=n*2+3

Примечание группы n-го уровня
=n*2+4

И всё! Промлемы решились сами собой. :)
Думать это хорошо.
А вот делать лучше.


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

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

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

    TopList