3.3.7. OLAP структура в скриптере¶
3.3.7.1. Общее описание¶
Архитектура системы Global заточена на возможность наличия множества средств отображения данных в OLAP-представлении. Для возможности универсального управления соответствующими им контролами организована обобщенная OLAP-структура. Ниже приведена таблица с имеющимися в системе контролами OLAP-структуры.
Название контрола | Поддержка управления OLAP-структурой |
---|---|
OLAP-таблица | нет |
Pivot-таблица | да |
Управление OLAP-структурой возможно из скриптера. При этом внесенные изменения будут применены к физическому OLAP-контролеру выборки. Это позволяет "подсовывать" разные OLAP-контролы без внесения изменений в механизм их управления.
Кроме того, имеется библиотечная выборка, методы которой получают на вход XML-файл конфигурации и вызывают соответствующие скритовые методы OLAP-объекта.
3.3.7.2. Иерархичное представление OLAP-стрктуры¶

3.3.7.3. Скриптовые методы¶
Скриптовые Pascal-методы позволяют определять OLAP-структуру конфигурации данных и применять заданные настройки физическому контролу, не привязываясь к его классу.
3.3.7.3.1. Доступ к OLAP-объекту¶
Методы Olap
и TbtkScriptSelectionObject.Olap
возвращают скриптовый OLAP-объект, однако в зависимости от класса
физического контрола представления OLAP-данных, этот объект может
поддерживать различные возможности. Например, для OLAP-фрейма
реализованы методы OpenColumnDimension
, OpenRowDimension
и др., но не
поддерживаются методы управления OLAP-структурой. Для Pivot-грида
ситуация противоположная: реализованные для OLAP-фрейма методы
программного раскрытия/свертки узлов не работают, однако реализованы
методы OLAP-структуры. Для определения возможности поддержки
используемым контролом OLAP-структуры, используется функция:
TbtkScriptOLAPObject.SupportedGeneralizeOLAPStructure
<PASCAL>
if Selection.OLAP.SupportedGeneralizeOLAPStructure then
begin
//some code
end;
</PASCAL>
3.3.7.3.2. Константы OLAP-структуры¶
// Области данных
TbtkOLAPAreaType = (atRow, atColumn, atFilter, atInvisible);
// Способы агрегации полей данных
TbtkOLAPSummaryType = (ostCount, ostSum, ostMin, ostMax, ostAverage, ostStdDev, ostStdDevP, ostVariance, ostVarianceP, ostCustom);
3.3.7.3.3. TbtkScriptOLAPObject¶
3.3.7.3.3.1. Общие методы OLAP-структуры¶
Для очистки всех настроек OLAP-структуры используется метод:
TbtkScriptOLAPObject.ClearOLAPStructure
Для применения всех сделанных настроек к физическому OLAP-конторолу вызывается:
при этом меняются параметры только тех полей, которые присутствуют в OLAP-структуре. Положение остальных остается прежним.
3.3.7.3.3.2. Управление размерностями¶
3.3.7.3.3.3. Управление полями данных (measures)¶
3.3.7.3.4. TbtkOLAPDimension¶
function TbtkOLAPDimension.AddHierarchy(AHierarchyName: string): TbtkOLAPHierarchy;
function TbtkOLAPDimension.HierarchyByName(AHierarchyName: string): TbtkOLAPHierarchy;
procedure TbtkOLAPDimension.DeleteHierarchy(AHierarchyName: string): TbtkOLAPHierarchy;
procedure TbtkOLAPDimension.DeleteHierarchy(AHierarchyIndex: Integer): TbtkOLAPHierarchy;
procedure TbtkOLAPDimension.Free; // Удаляет размерность из OLAP-структуры вместе со своими дочерними элементами
property TbtkOLAPDimension.HierarchyCount: Integer; // Read-Only
property TbtkOLAPDimension.Hierarchies[Index: Integer]: TbtkOLAPHierarchy; // Read-Only
property TbtkOLAPDimension.AreaType: TbtkOLAPAreaType; // Read-Write
property TbtkOLAPDimension.ActiveHierarchy: TbtkOLAPHierarchy; // Read-Only
// Уникальное непустое имя размерности
property TbtkOLAPDimension.Name: string; // Read-Only
// Порядок следования размерностей в пределах области (Area) определяется по возрастанию значений Order.
// Эти значения могут повторяться, идти с интервалами. При равных Order порядок соответствует порядку добавления в OLAP-структуру.
// Значение по умолчанию - 0.
property TbtkOLAPDimension.Order: Integer; // Read-Write
3.3.7.3.5. TbtkOLAPHierarchy¶
// Добавляет уровень с именем ALevelName и ключевым атрибутом AKeyMemberName. В текущей реализации параметр AKeyMemberName игнорируется.
function TbtkOLAPHierarchy.AddLevel(ALevelName: string; AKeyMemberName: string = ''): TbtkOLAPLevel;
// Добавляет произвольное количество дочерних уровней с возможностью одновременного указания их дочерних полей (members)
procedure TbtkOLAPHierarchy.AddLevels([ALevName1: string, [AMebmerName11, ..., AMemberName1N: string], // Уровень с дочерними полями (members)
ALevName2: string, // Уровень без дочерних полей
...]);
function TbtkOLAPHierarchy.LevelByName(ALevelName: string): TbtkOLAPLevel;
procedure TbtkOLAPHierarchy.DeleteLevel(ALevelName: string);
procedure TbtkOLAPHierarchy.DeleteLevel(ALevelIndex: Integer);
procedure TbtkOLAPHierarchy.Free;
// Делает иерархию активной в своей размерности.
procedure TbtkOLAPHierarchy.Activate;
property TbtkOLAPHierarchy.LevelCount: Integer; // Read-Only
property TbtkOLAPHierarchy.Levels[Index: Integer]: TbtkOLAPLevel; // Read-Only
// Порядок следования - аналогично TbtkOLAPDimension.Order
property TbtkOLAPDimension.Order: Integer; // Read-Write
// Уникальное (в своей размерности) непустое имя иерархии
property TbtkOLAPDimension.Name: string; // Read-Only
3.3.7.3.6. TbtkOLAPLevel¶
// В связи с тем, что уровень Level может состоять из подуровней, следующие методы и свойства повторяют иерархические TbtkOLAPHierarchy
TbtkOLAPLevel. - AddLevel, AddLevels, LevelByName, DeleteLevel, Levels, LevelCount, Order;
// Уникальное (в своей иерархии) непустое имя уровня
function TbtkOLAPLevel.AddMember(AMemberName: string): TbtkOLAPMember;
procedure TbtkOLAPLevel.AddMembers([AMemberName1, ..., AMamberNameN: string]);
function TbtkOLAPLevel.MemberByName(AMemberName: string): TbtkOLAPMember;
procedure TbtkOLAPLevel.DeleteMember(AMemberName: string);
procedure TbtkOLAPLevel.DeleteMember(AMemberIndex: Integer);
procedure TbtkOLAPLevel.Free;
property TbtkOLAPLevel.Members[Index: Integer]: TbtkOLAPMember; // Read-Only
property TbtkOLAPLevel.MemberCount: Integer; // Read-Only
property TbtkOLAPLevel.Name: string; // Read-Only
// Ключевой атрибут. Nil, если не задан.
property TbtkOLAPLevel.KeyMember: TbtkOLAPMember; // Read-Write
3.3.7.3.7. TbtkOLAPMember¶
// Уникальное в пределах размерности (dimension) непустое имя
property TbtkOLAPMember.Name: string; // Read-Only
// Визуальное имя поля. По умолчанию соответствует заголовку атрибута выборки
property TbtkOLAPMember.Caption: string; // Read-Write
// Порядок следования - аналогично TbtkOLAPDimension.Order
property TbtkOLAPMember.Order: Integer; // Read-Write
3.3.7.3.8. TbtkOLAPMeasureItem¶
procedure TbtkOLAPMeasureItem.Free;
property TbtkOLAPMeasureItem.SummaryType: TbtkOLAPSummaryType; // Read-Write
// Уникальное среди полей данных (measures) имя
property TbtkOLAPMeasureItem.Name: string; // Read-Only
// Порядок следования - аналогично TbtkOLAPDimension.Order
property TbtkOLAPMeasureItem.Order: Integer; // Read-Write
// Визуальное имя поля. По умолчанию соответствует заголовку атрибута выборки
property TbtkOLAPMeasureItem.Caption: string; // Read-Write
3.3.7.4. Примеры¶
Наиболее полный пример использования скриптовых методов OLAP-структуры
находится в библиотечной выборке BitecDev SEL_BTK_OLAPLibrary
.
А наиболее наглядный - в выборке SEL_TSG_OLAPStructure_t20874.PivotGridByOLAP
, операция
OLAPStructure
.
<PASCAL>
Selection.PivotGrid.ResetAllSettings;
selOlap := Selection.OLAP;
if not selOlap.SupportedGeneralizeOLAPStructure then
ShowMessage('OLAP выборки не поддерживает управление обобщенной структурой OLAP');
selOlap.ClearOLAPStructure;
selOlap.AddDimension('ProductionDate');
dateDimension := selOlap.DimensionByName('ProductionDate');
dateHierarchy := dateDimension.AddHierarchy('DateHierarchy1');
dateLevel := dateHierarchy.AddLevel('Year');
dateLevel.AddLevel('Month');
dateLevel.AddLevel('Day');
dateHierarchy := dateDimension.AddHierarchy('DateHierarchy2');
dateHierarchy.AddLevels(['BaseDateHierarchyLevel', ['Year', 'Month', 'Day']]);
dateHierarchy.Free;
dateHierarchy := dateDimension.AddHierarchy('DateHierarchy3');
dateHierarchy.AddLevels(['BaseDateHierarchyLevel1', ['Year'], 'BaseDateHierarchyLevel2', ['Day', 'Month', 'CarMark'], 'BaseDateHierarchyLevel3']);
dateDimension.AddHierarchy('DateHierarchy4').AddLevels(['BaseLevel1', ['Year']]);
dateDimension.HierarchyByName('DateHierarchy3').Activate;
dateDimension.AreaType := atRow;
characteristicDimension := selOlap.AddDimension('CarCharacteristic');
characteristicHierarchy := characteristicDimension.AddHierarchy('CharacteristicHierarchy1');
characteristicLevel := characteristicHierarchy.AddLevel('State characteristic');
characteristicLevel.AddLevel('State');
characteristicLevel.AddLevel('RunLength');
characteristicLevel.AddLevel('CarType');
characteristicHierarchy := characteristicDimension.AddHierarchy('CharacteristicHierarchy2');
baseLevel := characteristicHierarchy.AddLevel('BaseCharacteristicLevel');
baseLevel.AddLevels(['BaseLevel', ['State', 'RunLength', 'CarType']]);
characteristicHierarchy.Activate;
selOlap.DimensionByName('CarCharacteristic').AreaType := atRow;
designDimension := selOlap.AddDimension('DesignDimension');
designHierarchy := designDimension.AddHierarchy('DesignHierarchy1');
designHierarchy.AddLevels(['Design', ['Color', 'GlassesColor']]);
designDimension.AreaType := atColumn;
costMeasure := selOlap.AddMeasure('Cost');
costMeasure.SummaryType := ostMax;
countryMeasure := selOlap.AddMeasure('Country');
countryMeasure.Caption := 'Новый заголовок "Страна"';
selOlap.DoUpdate;
</PASCAL>
3.3.7.5. Формат XML-файла¶
Вложенность тегов XML-файла полностью соответствует иерархии OLAP-структуры. Важно помнить, что язык XML регистрозависимый, все имена атрибутов должны начинаться с маленькой буквы.
3.3.7.5.1. Использующиеся теги¶
Имя тега | Описание | Атрибуты | Пример |
---|---|---|---|
<Cube> | Задает OLAP-структуру | нет | |
<Dimension> | Размерность OLAP-структуры | name - уникальное непустое имя area - область положения размерности возможные значения:
order - задает порядок в своей области |
<Dimension name = "ProductionDate" area = "row" order = "1"/> |
<Hierarchy> | Иерархия OLAP-структуры | name - уникальное в своей размерности непустое имя default - флаг активности иерархии | <Hierarchy name = "DateMainHierarchy" default = "True"/> |
<Level> | Уровень OLAP-структуры | name - уникальное в своей иерархии непустое имя keyMember - имя ключевого атрибута order - задает порядок в своей размерности | <level name = "DateSlices" keyMember = "Year" order = "10"/> |
<Member> | Поле OLAP-структуры | name - уникальное в своей иерархии непустое имя caption - непустой заголовок поля, визуально отображаемый order - задает порядок в своем уровне | <member name = "Year" caption = "Год" order = "1"/> |
<Measure> | Поле данных OLAP-структуры | name - уникальное среди полей данных непустое имя caption - непустой заголовок поля, визуально отображаемый aggregator - агрегатор вычисления итогов. возможные значения:
|
<Measure name = "Country" caption = "Страна-производитель" aggregator = "count" order = "0"/> |
<?xml version="1.0" encoding="UTF-8"?>
<Cube xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="btkOlap.xsd">
<Table name="TableWithData"/>
<Dimension name="ProductionDate" area="row">
<Hierarchy name="InactiveHierarchy">
<Level name="Year" keyMember="year" type="Date">
<Member name="Year" caption="Год"/>
</Level>
<Level name="Month" keyMember="month" type="Integer">
<Member name="Month" caption="Месяц"/>
</Level>
<Level name="Day" keyMember="day" type="Integer">
<Member name="Day" caption="Число"/>
</Level>
</Hierarchy>
<Hierarchy name="Warehouse" default="True">
<Level name="Warehouse" keyMember="warehouseId" type="Integer">
<Member name="warehouse mnemo code" caption="Год"/>
<Member name="Month" caption="Месяц"/>
<Member name="Day" caption="Число"/>
</Level>
</Hierarchy>
<Hierarchy name="Debt Direction" default="True">
<Level name="Direction" keyMember="debtdirectionId" type="Integer">
<Member name="warehouse mnemo code" caption="Год"/>
<Member name="Month" caption="Месяц"/>
<Member name="Day" caption="Число"/>
</Level>
</Hierarchy>
</Dimension>
<Dimension name="DesignDimension" area="column">
<Hierarchy name="DesignHierarchy1">
<Level name="Design" keyMember="colorId" type="Integer">
<Member name="Color"/>
<Member name="GlassesColor"/>
</Level>
</Hierarchy>
</Dimension>
<Measure name="Price" aggregator="sum"/>
<Measure name="Country" aggregator="sum"/>
</Cube>