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-стрктуры

../../../_images/ScriptOLAPStructure.jpg

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-конторолу вызывается:

TbtkScriptOLAPObject.DoUpdate

при этом меняются параметры только тех полей, которые присутствуют в OLAP-структуре. Положение остальных остается прежним.

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 - область положения размерности возможные значения:

  • row
  • column
  • filter
  • 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 - агрегатор вычисления итогов. возможные значения:

  • Count
  • Sum
  • Min
  • Max
  • Average
  • StdDev
  • StdDevP
  • Variance
  • VarianceP
  • Custom
<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>