Работа с группами отчета

Оценить
(0 голоса)

Одно из требований, предъявляемых к отчету Xtreme Orders, состоит в том, чтобы предоставить пользователю возможность самому определять способ группирования. В форме Print Report (Печать отчета)* имеется элемент управления типа поля со списком, который позволяет пользователю выбрать один из двух способов группировки записей: Quarter (Квартал) и Customer (Заказчик). В окне проектирования RDC изменить поля, на основе которых формируются группы, а также порядок их следования (по возрастанию или убыванию) можно, выбрав в контекстном меню пункт Change Group (Изменить группу). Если труппа базируется на поле даты, таком как поле Order Date (Дата размещения заказа), можно также указать диапазон дат (неделя, месяц, квартал и так далее), который будет учитываться при формировании группы. Различные доступные опции группирования подробно описывались в главе 3.

Имея возможность выбирать разные способы группировки записей во время работы приложения, пользователи получат широкие возможности для составления отчетов. Во многих случаях можно будет имитировать работу с несколькими различными отчетами, зависящими от данных, вводимых пользователем. В действительности приложение будет работать с одним и тем же объектом Report, а группировка записей будет изменяться во время выполнения в соответствии с данными, вводимыми пользователем.

При работе с группами в объектной модели RDC приходится перемещаться по “иерархии объектов”. Судите сами: поле формулы или базы данных, на основе которого сформирована группа, определяется свойством GroupConditionField объекта Area. Отчет содержит коллекцию Areas (Области), которая состоит из объектов Area, представляющих области отчета. Под “областью” отчета понимается каждый отдельный главный раздел отчета, такой как раздел заголовка страницы, раздел подробностей, раздел нижнего колонтитула группы и так далее. Если отчет имеет несколько разделов, например, раздел подробностей Details а и раздел подробностей Details b, эти разделы все равно будут являться частью одной общей области подробностей, и в коллекции Areas им будет соответствовать только один элемент. По сравнению с другими коллекциями в RDC, коллекция Areas имеет одно преимущество: индекс, используемый для ссылки на отдельный элемент коллекции, может быть представлен как в виде строки, так и в виде числового значения. То есть вы в качестве значений индексов можете использовать как строковые значения RH, PH, СНл, D, СЕл, PF или RF, так и начинающиеся с единицы номера индексов. Использование строковых значений при работе с коллекцией Areas делает код более понятным, и при этом вам не придется писать дополнительный код для организации цикла, как было показано выше в примере работы с формулой.

На заметку! Коллекции Areas и Sections похожи, но не идентичны. Как было показано в примере ранее в этой главе (в разделе “Изменение текстовых объектов во время выполнения”),

коллекция Sections также может принимать строковые индексы; однако эта коллекция представляет отдельные разделы отчета, обозначаемые с помощью индексов, таких как РНа для раздела Page Header а и РНЬ для раздела Page Header b. Коллекция Areas содержит только один элемент для области Page Header (ссылка на которую производится с помощью строкового индекса рн), даже если в отчете имеется несколько разделов заголовков

страниц, подобных Page Header а и Page Header b.

Однако после того как вы перейдете к определенному объекту Area для указания свойства GroupConditionField, вам придется выполнить дополнительные действия. Чтобы задать поле, на основе которого вы хотите сформировать группу, недостаточно просто определить строковое значение, соответствующее имени поля (например, {Orders.Order Date} или {Customer.Customer Name}). Вместо этого для свойства GroupConditionField вы должны будете определить объект DatabaseFieldDef inition, поскольку вам не удастся просто передать строку с именем поля.

Объект DatabaseFieldDefinition можно найти в нижней части иерархии объектов — один из этих объектов существует для каждого поля, содержащегося в коллекции DatabaseFieldDefinitions в объекте DatabaseTable. Кроме них, в коллекции DatabaseTables объекта Database, который содержится внутри общего объекта Report, содержится множество объектов DatabaseTable. И это еще не все: ни одна из только что упомянутых коллекций не может принимать строковые значения индексов — вы должны будете использовать числовые индексы, нумерация которых начинается с единицы. Упомянутый ранее метод GetltemByName можно применять для коллекции DatabaseFieldDef initions, но не для коллекции DatabaseTables.

На первый взгляд, все выглядит очень запутанно. Тем не менее, в поисках таблицы базы данных и поля, которые будут переданы свойству GroupConditionField, вы сможете без особых проблем перемещаться по иерархии объекта. Взгляните на следующий фрагмент кода из приложения Xtreme Orders:

1 Настройка группирования

If cboGroupBy = "Quarter" Then

Report.Areas("GH").GroupConditionField = _

Report.Database.Tables(1).Fields(5) 1 Orders.Order Date Report.Areas("GH").GroupCondition = crGCQuarterly

Else

Report.Areas("GH").GroupConditionField = _

Report.Database.Tables(2).Fields(3) 'Customer.Customer Name Report.Areas("GH").GroupCondition = crGCAnyValue

End If 'cboGroupBy = "Quarter"

Обратите внимание на то, что в этом примере группировка основывается на варианте, выбираемом пользователем в списке cboGroupBy, В каждом случае свойству GroupConditionField элемента GH (заголовок группы) коллекции Areas присваивается определенное значение. Если пользователь выбирает вариант Order Date (то есть желает, чтобы группы были сформированы по дате поступления заказа), этому свойству в качестве значения присваивается пятый элемент коллекции Fields, находящийся в первом элементе коллекции Tables. Это означает, что для группирования будет использоваться пятое поле (Order Date) в первой таблице (Orders). А если пользователь выберет вариант Customer (то есть захочет, чтобы группы были сформированы по фамилиям заказчиков), тогда для группирования будет использоваться третье поле (Customer Name) во второй таблице (Customer). Как и в других коллекциях, в которых не применяются строковые индексы, для поиска различных членов коллекции можно использовать быстрые операторы Print в окне Immediate. Номера индексов, которые необходимо использовать для ссылки на поля и таблицы, можно найти в разделе Database (База данных) проводника Field Explorer в окне проектирования RDC. Можно использовать метод GetltemByName, а можно написать функцию, в которой с помощью цикла можно было бы осуществлять поиск соответствующего значения в коллекциях.

Помимо возможности выбора поля базы данных, на основе которого будет сформирована группа, можно выбирать и способ ее формирования, особенно если в качестве поля применяется поле даты или поле булевского значения. Это можно сделать с помощью свойства GroupCondition объекта Area, в котором определяется целочисленное значение или константа, предложенная RDC (о константах и целочисленных значениях можно узнать в пояснениях к объекту Area в оперативной справочной системе для разработчика). В приведенном выше примере группа будет разбиваться на календарные кварталы, если для группирования будет выбран вариант Order Date (константа crGC- Quartery). Если будет выбран вариант формирования группы по фамилии заказчика (Customer Name), тогда будет использоваться константа crGCAnyValue, показывающая, что при изменении значения поля группы будет формироваться новая группа.

 

Условное форматирование и форматирование разделов
Событие Format
Выбор пункта назначения вывода
Изменение источника данных во время выполнения
Несвязанные поля

Добавить комментарий


Защитный код
Обновить