Глава 23
Многомерное представление данных
Помимо стандартных компонентов отображения данных, в VCL Delphi имеются дополнительные компоненты, которые позволяют представлять данные в виде кросстаба. При этом заставить работать кросстаб с двумя и более полями почти так же просто, как и обычный компонент TDBGrid. Эти компоненты расположены на странице Decision Cube Палитры компонентов.
Кросстабом называется такое табличное представление данных, которое имеет переменную структуру по горизонтали и вертикали. Причем обозначения столбцов и строк соответствуют значениям полей набора данных. В ячейках кросстаба содержатся не данные, а суммарные значения для двух полей, которые пересекаются в этой ячейке.
В этой главе рассматриваются следующие вопросы.
Понятие кросстаба
Обычная таблица данных имеет строго заданное число столбцов, причем каждый столбец всегда предназначен для представления данных из одного поля. Для кросстаба число и назначение столбцов зависит от значений какого-либо поля. Число строк в кросстабе не равно числу строк в таблице БД, а также зависит от значений какого-либо поля. В ячейках кросстаба всегда располагается суммирующая информация по значениям полей исходной таблицы БД, названия которых обозначают строки и столбцы.
Например, простой кросстаб:
|
1997 |
1998 |
1999 |
Geo Tech Inc. |
18470.00 |
19000.00 |
- |
3D-Pad Corp. |
120000.00 |
3400.80 |
93773220.00 |
MPM Corporation |
- |
7349.50 |
76300.00 |
Создать подобную двумерную структуру отображения данных при помощи обычных компонентов со страницы Data Controls очень непросто и хлопотно.
В общем случае горизонтальную и вертикальную структуры кросстаба могут составлять несколько полей одновременно, которые сгруппированы относительно более общих полей. Например, внутри полей годов можно представить более подробную информацию по месяцам или кварталам, а для организаций расшифровать показатели их подразделений в одно общее поле.
Можно сказать, что кросстаб наглядно представляет работу группирующего запроса. Ведь в каждой ячейке кросстаба мы видим суммарную информацию от тех колонок и строк, которые пересекаются в этой ячейке. Чем больше в запросе значений группирующих полей, тем больше размеры кросстаба по вертикали и горизонтали.
Совокупность ячеек, которые относятся к одному группирующему полю запроса, называется размерностью.
Взаимосвязь компонентов многомерного представления данных
При создании в приложении формы для многомерного представления данных следует помнить, что при этом обязательно должны решаться следующие задачи.
Для этого в форме приложения требуется разместить как минимум пять компонентов со страницы Decision Cube Палитры компонентов.
Для создания запроса SQL можно использовать компонент TDecisionQuery или.обычный компонент TQuery.
Запрос должен быть связан с компонентом TDecisionCube, который осуществляет подготовку набора данных запроса к показу.
Для соединения многомерного набора данных с компонентом отображения данных используется компонент TDecisionSource — полный функциональный аналог TDataSource. Этот компонент, в свою очередь, должен связываться и с набором данных, и с инструментом многомерного представления данных.
Непосредственный показ многомерного набора данных проводится при помощи компонентов TDecisionGrid или TDecisionGraph. Они должны поддерживать соединение с компонентом TDesicionSource.
Наконец, управление многомерным представлением данных реализует компонент TDecisionpivot, он также должен быть связан с компонентом TDecisionSource.
Допустим, что в форме расположены следующие компоненты:
Тогда, для того чтобы связать все эти компоненты в единый работающий механизм многомерного представления данных, нужно установить значения для их важнейших свойств. Значения свойств представлены в табл. 23.1.
Таблица 23.1. Как связать компоненты многомерного представления данных
Свойство |
Значение |
Описание |
TDecisionCube DataSet |
DecisionQueryl |
Определяет компонент доступа к данным, который создает набор данных |
TDecisionSource DecisionCube |
DecisionCubel |
Указывает на компонент формирования многомерного набора данных |
TDecisionGrid DecisionSource |
DecisionSourcel |
Ссылается на компонент TDecisionSource |
TDecisionpivot DecisionSource |
DecisionSourcel |
Ссылается на компонент TDecisionSource |
Если задать текст запроса SQL и открыть набор данных, то вся цепочка заработает, причем ее поведение ничем не отличается от поведения во время выполнения приложения.
Теперь, когда мы узнали, как объединить компоненты многомерного представления данных в единую систему, настало время более подробно изучить возможности каждого компонента.
Подготовка набора данных
Компоненты многомерного представления данных работают со специально созданным и подготовленным набором данных. Эта работа выполняется специальным компонентом доступа к данным — TDecisionQuery. Его непосредственным предком является компонент TQuery.
Набор данных формируется при помощи запроса, который основан на стандартном синтаксисе SQL 92. Для обеспечения работы многомерного представления данных запрос должен удовлетворять ряду требований.
Компонент TDecisionQuery должен только обеспечить выполнение запроса и создание набора данных, поэтому он не имеет никаких дополнительных свойств или методов. Поэтому для создания набора данных можно использовать и обычный компонент TQuery. Преимущество компонента TDecisionQuery состоит в том, что он имеет специализированный редактор для создания текста запроса (рис. 23.1). Он вызывается командой Decision Query Editor из всплывающего меню компонента или двойным щелчком на компоненте.
Рис. 23.1. Специализированный редактор компонента TDecisionQuery
Элементы управления страницы Dimensions/Summaries позволяют создавать текст запроса, манипулируя именами полей таблиц. Псевдоним базы данных выбирается в комбинированном списке Database. После этого в списке Table задается нужная таблица. Если в запросе требуется использовать несколько таблиц, то для их выбора можно воспользоваться утилитой SQL Builder, которая вызывается щелчком на одноименной кнопке.
Из списка доступных полей при помощи кнопок Add требуемые поля можно перенести в список полей-размерностей Dimensions и список суммирующих полей Summaries. Поля из этих списков используются при создании запроса.
Запрос формируется автоматически при работе с описанными элементами управления. Текст запроса доступен для просмотра и редактирования на странице SQL Query.
Подготовка набора данных к многомерному представлению осуществляется компонентом TDecisionCube. Его основная задача — создание размерностей для многомерной структуры данных на основе каждого поля набора данных. Для каждой размерности в компоненте можно задать ряд параметров, которые определяют ее поведение и внешний вид.
Компонент TDecisionCube формирует размерности при открытии набора данных, причем созданное многомерное представление данных полностью работоспособно уже во время разработки. Для этого достаточно присвоить свойству Active компонентов TDecisionQuery или TQuery значение True. ;. После этого любой визуальный компонент многомерного представления начинает работать так же, как и во время выполнения.
Компонент TDecisionCube также позволяет управлять использованием памяти многомерным представлением данных. Дело в том, что при добавлении к многомерному представлению новой размерности объем занимаемой памяти возрастает в арифметической прогрессии. Поэтому возможность ограничения размеров используемой памяти особенно актуально для больших наборов данных.
Все основные настройки компонента выполняются при помощи специализированного редактора свойства DecisionMap (рис. 23.2).
Для настроек размерностей используется страница Dimensions Setting этого редактора. В расположенном слева списке Available Fields содержатся все поля набора данных. В элементах управления справа приведены параметры размерности для выбранного поля.
В однострочном редакторе Display Name задается название поля, которое будет присутствовать в визуальных компонентах многомерного просмотра.
Неактивный список выбора Type показывает, является ли поле основой для размерности или суммы.
Рис. 23.2. Специализированный редактор свойства DecisionMap компонента TDecisionCube (страница Dimensions Settings) (вызов из контекстного меню)
Список выбора Active Type определяет, когда данные поля появляются в визуальных компонентах. Его элементы обозначают следующее:
Однострочный редактор Format содержит строку форматирования для данных поля.
Комбинированный список Grouping необходим для того, чтобы определить, какие значения будут показаны. Варианты Year, Quarter, Month возможны только для полей с календарным типом данных.
Однострочный редактор Initial Value задает начальное значение для поля.
Страница Memory Control используется для управления расходом памяти, выделяемой на нужды компонента. Однострочные редакторы Dimensions, Summaries и Cells в ряду Maximum позволяют задать максимальное число размерностей, сумм и ячеек, соответственно.
Аналогичные значения в ряду Current показывают текущее число этих структур.
Аналогичные значения в ряду Active+Needed показывают общее возможное число размерностей, сумм и ячеек.
Значения в ряду Active показывают число видимых размерностей, сумм и ячеек.
Кнопка GetCeIlCoant выполняет запрос, который возвращает число ячеек в кросстабе.
Группа переключателей Designer Data Options задает режим показа данных во время разработки:
Подготовленный к использованию для многомерного отображения набор данных необходимо связать с визуальными компонентами. Это делается при помощи компонента TDecisionSource. Через один такой компонент с набором данных можно связать несколько визуальных компонентов (табл. 23.1).
Кроме этого, компонент TDecisionSource позволяет разработчику установить общие для всех связанных с ним визуальных компонентов многомерного представления данных настройки отображения данных.
Компонент TDecisionQuery
Компонент доступа к данным TDecisionQuery предназначен для создания набора данных, который был бы пригоден для многомерного представления. Для создания набора данных используется запрос SQL. Требования к запросу приведены выше.
Этот компонент является прямым наследником компонента TQuery и не имеет собственных свойств и методов. Для создания запросов можно воспользоваться специализированным редактором, который автоматизирует этот процесс.
Компонент TDecisionCube
Компонент TDecisionCube (табл. 23.2) осуществляет преобразование набора данных, который содержится в компоненте TDecisionQuery, к виду, доступному для отображения визуальными компонентами многомерного представления данных. Обычную таблицу набора данных компонент преобразует в многомерный кросстаб. Число размерностей создаваемого кросстаба зависит от числа полей данных набора данных. Значения в ячейках кросстаба зависят от типа агрегатной функции в запросе SQL.
Таблица 23.2. Свойства и методы компонента TDecisionCube
Объявление |
Тип |
Описание |
Свойства |
||
property Active: Boolean; |
Pu |
Разрешает или запрещает преобразование набора данных в кросстаб |
property BinData: Boolean; |
Ro |
Значение True означает, что хотя бы одна размерность находится в свернутом состоянии (данные не отображаются) |
property Capacity: Integer; |
Pu |
Определяет число байтов, используемых для хранения многомерного массива |
property CurrentSummary: Integer; |
Pu |
Содержит индекс текущей суммы кросстаба |
property DataSet: TDataSet; |
Pb |
Ссылка на экземпляр набора данных, который отображается в кросстабе |
Свойства |
||
type TCubeDesignState = (dsNoData, dsMetaData, dsDimcnsionData, dsAllData ! ; property DesignState: TCubeDesignState; |
Pu |
Задает режим отображения данных в кросстабе. dsNoData — во время разработки данные не видны dsMetaData — видны названия размерностей dsDimensionData — видны названия размерностей и значения, суммы не видны dsAllData — видны все данные |
property DimensionCount: Integer; |
Ro |
Возвращает число размерностей |
property DimensionMap: TCubeDims; |
Pb |
Индексированный список ссылок на объекты параметров размерностей |
property DimensionMapCount: Integer; |
Ro |
Общее число полей набора данных, включая поля размерностей и сумм |
property MaxCeils: Integer; . |
Pb |
Задает максимальное число ячеек кросстаба |
property MaxDimensions: Integer; |
Pb |
Задает максимальное число размерностей |
property MaxSummaries: Integer; |
Pb |
Задает максимальное число сумм |
property ShowProgressDialog: Boolean- |
Pb |
При значении True при подготовке кросстаба отображается индикатор |
property SummaryCount: Integer; |
Ro |
Возвращает число активных сумм кросстаба |
Методы |
||
function GetDetaiiSQL (ValueArray: TSmallIntArray; SelectList: string; bActive: Boolean): string; |
Pu |
Возвращает текст запроса SQL, который может быть использован для создания набора данных, включающего данные из кросстаба без сумм |
function GetSQL (ValueArray: TSmallIntArray; bActive: Boolean): string; |
Pu |
Возвращает текст запроса SQL, который может быть использован для создания набора данных, включающего данные из кросстаба без сумм |
procedure ShowCubeDialer; |
Pb |
Вызывает специализированный редактор компонента |
procedure Refresh (DimensionMap: TCubeDims; bForce: Boolean); |
Pb |
Обновляет список объектов параметров размерностей |
Методы-обработчики событий |
||
type TCubeRefreshEvent Pb = procedure (DataCube: TCustomDataStore; DimMap: TCubeDims) of object; |
Pb |
Вызывается сразу после закрытия компонента (Active := False) |
property OnRefresh: TCubeRefreshEvent;prope rty AfterClose: TCubeNotifyEvent; |
||
property AfterOpen: TCubeNotifyEvent; |
Pb |
Вызывается сразу после открытия компонента (Active := False) |
property BeforeClose: TCubeNotifyEvent; |
Pb |
Вызывается перед закрытием компонента (Active := False) |
property BeforeOpen: TCubeNotifyEvent; |
Pb |
Вызывается перед открытием компонента (Active := False) |
TErrorAction = (eaFail, eaContinue); TCapacityErrorEvent = procedure (var EAction: TErrorAction) of objects- |
Pb |
Вызывается после того, как занимаемый кросстабом объем памяти превысит заданный предел |
property OnLowCapacity: TCapacityErrorEvent ; |
||
property OnRefresh: TCubeRefreshEvent; |
Pb |
Вызывается перед изменением состояния размерностей |
При помощи методов GetDetailSQL и GetSQL можно получить тексты запросов, которые возвращают набор данных, соответствующий кросстабу с состояниями, заданными параметрами. Массив valueArray содержит условия для полей размерностей. Первой размерности соответствует первый элемент массива, второй размерности — второй элемент и т. д. Если значение элемента меньше нуля, то в результат запроса попадают все значения поля размерности. Значение элемента равное или больше нуля определяет индекс
значения поля размерности. Параметр selectList содержит разделенный запятыми список дополнительных полей, которые нужно включить в запрос. Параметр bActive накладывает дополнительное ограничение на размерности. При значении True в результат запроса автоматически (без использования параметра SelectList) попадают только активные размерности.
Ключевым свойством компонента является свойство DecisionMap, которое позволяет установить параметры размерностей и максимальный размер используемой памяти. Для этих целей применяется специализированный редактор (см. рис. 23.2, 23.3).
Это свойство представляет собой экземпляр объекта TCubeDims, который инкапсулирует индексированный список экземпляров объектов TCubeDim, каждый из которых содержит информацию о параметрах одной размерности. Основные свойства этого класса представлены в табл. 23.3.
Таблица 23.3. Основные свойства класса TCubeDim
Объявление |
Тип |
Описание |
|
Свойства |
|||
type TActiveFlags = (diActive, diAsNeeded, riilnactive); |
Рb |
Определяет режим отображения данных размерности |
|
property ActiveFlag: TActiveFlags; |
|
|
|
property BaseName: string; |
Pb |
Содержит имя поля размерности в таблице базы данных |
|
property BinFormat: string; |
Pu |
Определяет способ форматирования диапазона значений размерности |
|
type TBinType = (binNone, binYear, binQuarter, binMonth, binSet, binCustom) ; |
Pb |
Определяет способ группирования данных в размерности |
|
property BinType: TBinType; |
|
|
|
type TDimFlags = (dimDimension, dimSum, dimCount, dimAverage, dimMin, dimMax, dimGenericAgg, dimUnknown) ; |
Pb |
Определяет тип размерности |
|
property DimensionType: TDimFlags; |
|
|
|
property FieldName: String; |
Pb |
Содержит имя поля в наборе данных |
property FieldType: TFieldType; |
Pu |
Определяет тип поля |
|
property Format: String; |
Pu |
Задает форматирование данных размерности |
|
property Loaded: Boolean; |
Ro |
Значение True говорит о том, что данный элемент загружен в многомерный набор данных |
|
property StartDate: TDate; |
Pu |
Определяет начальный элемент для группировки по дате |
|
property StartValue: String; |
Pu |
Определяет начальный элемент для группировки по значению |
|
property VaiueCount: Integer; |
Pb |
Возвращает число уникальных элементов в размерности |
Компонент TDecisionSource
Компонент TDecisionSource предназначен для связывания визуальных компонентов многомерного представления с компонентом TDecisionCube (табл. 23.4). Кроме этого, за счет возможности подключения к этому компоненту нескольких визуальных компонентов одновременно, при изменении состояния одного визуального компонента осуществляется синхронизация многомерного представления во всех остальных компонентах.
От набора данных в визуальные компоненты передаются данные, обратно транслируются команды пользователя по управлению многомерным представлением данных.
Таблица 23.4. Основные свойства компонента TDecisionSource
Объявление |
Тип |
Описание |
Свойства |
||
type TDecisionControlType = (xtCheck, xtRadio, xtRadioEx) ; |
|
Определяет способ управления отдельной размерностью в компоненте TDecisionGrid |
property ControlType: TDecisionControlType; |
|
|
property CurrentSum: Integer; |
|
Содержит индекс текущей суммы в компоненте TDecisionGrid |
property DecisionCube: TDecisionCube; |
Связывает данный компонент с компонентом TDecisionCube. Содержит ссылку на экземпляр компонента TDecisionCube |
|
property Ready: Boolean; |
Значение True означает, что данный компонент связан с активным компонентом TDecisionCube |
|
property SparseCols: Boolean; |
При значении True из компонента TDecislonGrid удаляются пустые столбцы |
|
property SparseRows: Boolean; |
При значении True из компонента TDecisionGrid удаляются пустые строки |
Компонент имеет средства для управления состоянием многомерного представления в визуальных компонентах. Для этого используется свойство соntrolType. Возможные значения имеют следующий смысл:
данной размерности и закрытию или открытию всех остальных размерностей в этом направлении.
Отображение данных
При работе с кросстабом пользователь имеет дело с двумя визуальными компонентами многомерного представления данных. Это компонент TDecisionGrid, который представляет данные в табличном виде, и компонент TDecisionGraph, который представляет данные в виде графика.
С компонентом TDecisionCube они связаны при помощи компонента TDecisionSource (см. выше).
Данные в визуальных компонентах появляются после открытия набора данных в соответствующем компоненте TDecisionQuery. Причем эти компоненты полностью работоспособны уже во время разработки приложения.
Компонент TDecisionGrid
Компонент TDecisionGrid предназначен для многомерного представления данных в табличном виде. Параметры отображаемого набора данных (какие размерности будут видны при открытии, как группировать данные, как управлять размерностями) настраиваются при помощи других компонентов многомерного представления. В компоненте TDecisionGrid можно настроить только свойства самой сетки.
Для управления графиком во время выполнения можно использовать компонент TDecisionPivot.
В табл. 23.5 приведены основные свойства и методы компонента.
Таблица 23.5. Свойства и методы компонента TDecisionGrid
Объявление |
Описание |
Свойства |
||
property Cells [ACol, ARow: Integer]: string; |
Индексированный массив значений всех ячеек компонента в строковом формате |
|
property ColCount: Integer; |
Возвращает общее число колонок в сетке |
|
property Decisionsource: TDecisionSource ; |
Указывает на компонент TDecisionSource, через который осуществляется связь с набором данных |
|
property Dimensions: TDisplayDims; |
Объект TDisplayDims представляет индексированный список объектов визуальных свойств размерностей |
|
property FixedCols: Integer; |
Возвращает число фиксированных колонок, которые используются для отображения информации о размерностях (названия, значения, обозначения) |
|
property FixedRows: Integer; |
Возвращает число фиксированных строк, которые используются для отображения информации о размерностях (названия, значения, обозначения) |
|
type TDecisionGridOption = (cgGridLines, cgOutliner, cgPivotable) ; TDecisionGridOptions = set of TDecisionGridOption; property Options: TDecisionGridOptions; |
Определяет общие настройки компонента. CgGridLines — отображаются вертикальные и горизонтальные разделительные линии CgOutliner — отображаются элементы управления в виде знаков "+" и "-" для открытия и закрытия размерностей CgPivotable — размерности можно переупорядочивать при помощи перетаскивания |
|
property RowCount: Integer; |
Возвращает общее число строк в сетке |
|
property ShowCubeEditor: Boolean; |
Разрешает или запрещает использование специализированного редактора компонента TdecisionCube |
|
property Totals: Boolean; |
При значении True сетка имеет промежуточные суммы по каждым колонке и строке |
|
Методы |
||
type TDecisionDrawStates = (dsGroupStart, . dsRowCaption, dsColCaption, dsSum, dsRowValue, dsColValue, dsData, dsOpenAfter, dsCloseAfter, dsCloseBefore, dsOpenBefore, dsRowIndicator, dsCol Indicator, dsRowPlus, dsColPlus, dsNone) ; TDecisionDrawState = set of TDecisionDrawStates; function CellDrawState (ACol, ARow: Integer; var Value: string; var DrawState: TDecisionDrawState): boolean; |
Позволяет определить назначение любой ячейки сетки. Параметры ACol и ARow определяют положение ячейки в сетке. В параметре value возвращается строка, содержащая значение в том виде, в каком оно представлено в ячейке. Параметр DrawState возвращает информацию о назначении ячейки |
|
function CellValueArray (ACol, ARow: Integer; var ValueArray: TValueArray): boolean; |
Возвращает индексы всех полей, данные которых суммированы в ячейке. Параметр ValueArray содержит индексы полей
|
Компонент TDecisionGrid является предком класса TCustomGrid, и поэтому обладает всеми базовыми свойствами и методами, присущими сетке.
Для доступа к значению каждой ячейки используется свойство cells. Адресация ячеек осуществляется с левой верхней ячейки, которая имеет индексы [0,0].
Свойство Dimensions является экземпляром объекта TDisplayDims, который инкапсулирует индексированный список указателей на экземпляры объектов TDisplayDim. Каждый такой объект содержит важнейшие визуальные свойства размерностей. При щелчке на кнопке в однострочном редакторе свойства в Инспекторе объектов разворачивается список всех таких объектов.
Компонент TDecisionGraph
Компонент TDecisionGraph создает график на основе многомерного представления набора данных. Конкретный вид графика (назначение горизонтальной и вертикальной оси) зависит от настроек компонентов TDecisionCube и TDecisionPivot. По умолчанию к оси абсцисс привязывается первая вертикальная размерность, к оси ординат — первая сумма. Первая горизонтальная размерность отображается в легенде графика.
Одним из предков компонента TDecisionGraph является класс TChart, от которого унаследованы все многочисленные свойства и методы для настройки графика,
Для подключения к графику набора данных используется свойство property DecisionSource: TDecisionSource;
которое ссылается на экземпляр компонента источника данных.
Сразу после подключения автоматически строится график с осями, заданными по умолчанию.
Для управления графиком во время выполнения можно использовать компонент TDecisionPivot.
Управление данными
Несомненное преимущество многомерного представления данных в том, что пользователь может легко изменить взаимное положение размерностей одной стороны между собой и переносить размерности с горизонтали на вертикаль и обратно. Для того чтобы сделать размерность видимой или невидимой, пользователю достаточно щелкнуть на кнопке.
Взаимное расположение размерностей по сторонам кросстаба никак не связано с местом полей в запросе компонента TDecisionQuery.
Все операции по управлению многомерным представлением сосредоточены в одном компоненте — TDecisionPivot. В некоторой степени это аналог компонента TDBNavigator, только TDecisionPivot управляет не записями набора данных, а размерностями многомерного представления данных.
Этот компонент подключается к общей цепочке компонентов многомерного представления данных через компонент TDecisionSource. Поэтому любые
действия с компонентом TDecisionpivot немедленно отражаются во всех визуальных компонентах, которые также подключены к этому экземпляру TDecisionSource.
Компонент TDecisionpivot
Компонент TDecisionpivot предоставляет пользователю средства управления размерностями многомерного представления данных (табл. 23.6). В стандартном состоянии компонент представляет собой панель, разделенную на три части (см. рис. 24.3). Каждая часть имеет собственный набор кнопок.
Левая часть имеет единственную кнопку, щелчок на которой позволяет сделать выбор суммирующего поля из выпадающего списка. Элементы списка соответствуют вычисляемым полям с использованием агрегатных функций из запроса соответствующего компонента TDecisionQuery.
Выбор поля приводит к изменению значений в ячейках кросстаба. Например, выбор поля с функцией sum изменит значения в ячейках на суммы полей, поле с функцией count произведет подсчет количества элементов в полях.
Средняя часть панели предназначена для размещения кнопок, соответствующих горизонтальным размерностям.
Правая часть панели используется для кнопок, соответствующих вертикальным размерностям.
Кнопка в нажатом состоянии показывает размерность. Одновременно отображается и общая сумма по размерности.
Размерности можно менять местами и перемещать с вертикали на горизонталь и обратно. Для этого можно выбрать команду Moved to Column Area из всплывающего меню кнопки. Во время выполнения можно использовать обычное перетаскивание кнопок при помощи мыши.
Всплывающее меню кнопки размерности имеет еще одну команду — Drilled In. По этой команде размерность переходит в режим детального просмотра по каждому значению поля. Конкретное значение можно выбрать из списка, который открывается при щелчке на кнопке. В этом случае суммы в ячейках кросстаба рассчитываются не по всей размерности, а только по выбранному значению.
Таблица 23.6. Свойства и методы компонента TDecisionPivo;
Объявление |
Тип |
Описание |
property DecisionSource: TDecisionSource; |
Pb |
Определяет компонент TDecisionSource, через который осуществляется управление многомерным представлением данных. |
type ТDeсisionButtonPosition = (xtHorizontal, xtVertical, xtLeftTop); property GroupLayout: TDecisionButtonPosition; |
Pb |
Задает способ расположения кнопок в панели. xtHorizontal — в ряд слева направо xtVertical — в колонку сверху вниз xtLeftTop — кнопки вертикальных размерностей вдоль верхнего края, кнопки горизонтальных размерностей вдоль левого края, кнопка сумм в левом верхнем углу |
Type TDecisionPivotOption = (xtRows, xtColumns, xtSummaries) ; TDecisionPivotOptions = set of TDecisionPivotOption; property Groups: TDecisionPivotOptions ; |
Pb |
Управляет видимостью трех групп кнопок |
property GroupSpacing: Integer; |
Pb |
Определяет размер в пикселах промежутка между группами кнопок |
Методы |
||
procedure SetBounds (Left, Top, Height, Width: Integer); override; |
Pb |
Переустанавливает размеры компонента в соответствии с параметрами метода |
Методы-обработчики компонента унаследованы от класса TwinControi.
Пример многомерного представления данных
В качестве примера использования многомерного представления данных рассмотрим демонстрационное приложение DemoMDCube.
В качестве исходного набора данных используется запрос к таблицам SALES и CUSTOMER общедоступной базы данных EMPLOYEE.GDB в составе поставки InterBase следующего вида:
SELECT С.CUSTOMER, S.ORDER_DATE, SUM( S.DISCOUNT ) FROM SALES S
INNER JOIN CUSTOMER С ON (C.CUST_NO - S.CUST_NO) GROUP BY C.CUSTOMER, S.ORDER_DATE
Запрос удовлетворяет всем требованиям для обеспечения многомерного представления данных. Для выполнения запроса и создания набора данных в проекте существует компонент DecisionQueryi.
Набор данных компонента открыт во время разработки, поэтому все компоненты многомерного представления в проекте ведут себя так же, как и во время выполнения программы.
С ним связан компонент DecisionCubel, для которого свойство имеет следующее значение:
DecisionCubel.DataSet := DecisionQueryi;
Рис. 23.3. Главная форма проекта DemoMDCube
Компонент DecisionCubel выполняет всю работу по созданию многомерного представления набора данных компонента DecisionQueryi. Причем практически все делается без вмешательства пользователя.
При настройке компонента был использован специализированный редактор свойства DecisionMap. В нем были заданы названия для размерностей и значения для расчета максимального размера используемой памяти. Все заданные значения соответствуют рекомендованным.
Для связывания набора данных с визуальными компонентами использован компонент DecisionSourcel. На него замыкаются все три использованные в проекте визуальных компонента многомерного представления.
Управление осуществляется компонентом DecisionPivot1. Основной визуальный компонент DecisionGridi представляет многомерный'набор данных в табличном виде. В исходном состоянии по горизонтали расположены размерности номеров накладных и наименований, по вертикали размещаются размерности дат заказов и покупателей.
Дополнительного программного кода проект не имеет.
Резюме
Многомерное представление данных позволяет проводить сложный анализ информации, содержащейся в базах данных. Основой многомерного представления является группирующий запрос (с оператором group by). С точки зрения пользователя анализ с помощью многомерного представления данных очень прост в применении.