Обзор процесса создания приложений. Моделирование данных отчета, страница 7

Каждый отчет Developer/2000 представляет собой совокупность столбцов, структурированных определенным образом. Запрос связывает некоторые из этих столбцов, а именно столбцы базы данных (database columns), с информацией базы данных. Группа (group) - это объект модели данных, который структурирует столбцы отчета, включая столбцы базы данных, формульные столбцы, итоговые столбцы и заполнители.

Существует два типа групп: группы записей и группы разбиения. Группа записей (record group) - это записи, возвращаемые запросом. Эта группа во многом схожа с блоком данных базовой таблицы Forms. В группе записей, объединяются столбцы, содержащие данные, важные для отчета. Группа разбиения (break group) - нечто среднее между группой записей и ее запросом. Эта группа определяет иерархическую структуру отчета. Обычно такие группы применяются для разбиения записей группы записей на сегменты для получения некоторых результатов . В каждой группе разбиения должен быть по меньшей мере один столбец с установленным свойством Break Order (порядок разбиения) и соответствующим ему свойством Set Break Order (установить порядок разбиения).

Рис. 16. Модель данных отчета "Вес овощных блюд"

На рис. 16 представлена модель данных отчета "Вес овощных блюд" из предыдущей главы. G_Продукт - это группа записей, в которой информация столбцов базы данных Продукт и Вес организована нужным образом. В G_Продукт содержатся основные данные отчета, полученные в базе данных в результате выполнения отчета Q_1. Группа G_Блюдо, находящаяся между G_Продукт и Q_1, вносит в иерархию отчета дополнительный уровень в виде группы разбиения. Столбец базы данных Блюдо, имеющий набор свойств Break Order, является столбцом разбиения в этой группе разбиения. SumВесPerБлюдо - итоговый столбец, в котором вычисляются промежуточные результаты для каждого разбиения отчета.

Если дважды щелкнуть мышью на группе в редакторе Data Model Editor или в Object Navigator, появится очень ограниченная палитра свойств для группы. Здесь, помимо свойств Name и Comment, находится также свойство Filter Type (тип фильтра), представляющее собой раскрывающийся список со значениями None (нет). First (первые), Last (последние) и PL/SQL, которые могут быть установлены для свойства.

При установке свойства в First или Last на экране появится другое свойство - Number of Records (число записей). Если указать в этом свойстве какое-либо число, Developer/2000 отбросит все записи, за исключением указанного числа первых или последних записей. Например, если для Number of Records установить значение 10, а для Filter Type - First, то отображены окажутся только первые 10 записей, независимо от того, сколько записей возвращает запрос.

При установке этого свойства в PL/SQL появится свойство PL/SQL Filter. Если щелкнуть на нем мышью, возникнет окно редактора Program Unit Editor (редактор программных единиц) с функцией-шаблоном, возвращающей логическое значение True (истина) или False (ложь). Решая, что возвращать - True или False, можно использовать любые логические схемы. Считывая строку, Developer/2000 вызывает эту функцию. Если функция возвращает False, Developer/2000 не включает запись в отчет, если же True - включает.

Формульные столбцы

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

(Белки+Углеводы)*4.1 + Жиры*9.3.

Формульный столбец (formula column) - это столбец отчета, значение которого определяется при выполнении некоторой функции, а не считывается в базе данных.

Используя программный текст PL/SQL, определяющий значения формульного столбца, можно выполнять самые разнообразные операции. В большинстве случаев это же позволяют делать и SQL или функции базы данных. PL/SQL обычно применяется тогда, когда выполнение какой-либо операции с помощью SQL затруднено, например вычисление, в котором используется условный оператор (if-then-else). Но если операция сложна, зачем же тогда выполнять ее в функциях отчета? На то есть три причины.