1.2.6. OLAP фреймы

1.2.6.1. Общее описание

Архитектура системы Global заточена на возможность наличия множества средств отображения данных в OLAP-представлении. Для возможности универсального управления соответствующими им контролами организована обобщенная OLAP-структура. Ниже приведена таблица с имеющимися в системе контролами OLAP-структуры.

Название контрола Поддержка управления OLAP-структурой
OLAP-таблица нет
Pivot-таблица да

Управление OLAP-структурой возможно из скриптера. При этом внесенные изменения будут применены к физическому OLAP-контролеру выборки. Это позволяет “подсовывать” разные OLAP-контролы без внесения изменений в механизм их управления.

Кроме того, имеется библиотечная выборка, методы которой получают на вход XML-файл конфигурации и вызывают соответствующие скритовые методы OLAP-объекта.

1.2.6.2. OLAP структура в скриптере

1.2.6.2.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>

1.2.6.2.2. Константы OLAP-структуры

Области данных:

  • atRow - строки.
  • atColumn - колонки.
  • atFilter - фильтр.
  • atInvisible - скрытые поля.

Способы агрегации полей данных:

  • ostCount - количество.
  • ostSum - сумма.
  • ostMin - минимум.
  • ostMax - максимум.
  • ostAverage - среднее значение.
  • ostStdDev - среднее квадратическое отклонение.
  • ostStdDevP - среднее квадратическое отклонение на основании смещенной дисперсии.
  • ostVariance - дисперсия.
  • ostVarianceP - смещенная дисперсия.
  • ostCustom - пользовательское вычисление.

1.2.6.2.3. Иерархичное представление OLAP-стрктуры

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

1.2.6.2.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>

1.2.6.2.5. Формат XML-файла

Вложенность тегов XML-файла полностью соответствует иерархии OLAP-структуры. Важно помнить, что язык XML регистрозависимый, все имена атрибутов должны начинаться с маленькой буквы.

Имя тега Описание Атрибуты Пример
<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>

1.2.6.3. OLAP-таблица

Класс фрейма:

class btkFrame.TbtkLookUpOLAPFrame

1.2.6.3.1. Механизм детализации

OLAP фрейм предоставляет возможность раширенной детализации (DrillDown).

Детализацию можно выполнить по двойному клику на ячейку. По двойному клику предоставляется две возможности:

  1. Выбрать поле из сводной таблице фактов, по которому и будет выполнена детализация. Детализируется активная запись. Окном детализации является новый OLAP фрейм. Новый OLAP фрейм может открываться в двух режимах: с копированием данных текущего OLAP фрейма в новую выборку либо использование текущей выборки. При использование текущая выборки нельзя закрыть мастер фрейм, пока не будут закрыты все фреймы детализации. При использовании копирования на больших объемах данных могут возникнуть проблемы с производительностью приложения. За режим открытия отвечает свойство фрейма “Копировать данные куба при детализации”. По умолчанию свойство установлено в состояние “Включено”.
  2. Открыть сводную таблицу таблицу фактов, по пункту “Перейти к фактическим данным…”. Двойным кликом на таблице фактов вызывается операция указанная в свойстве “Операция, выполняемая на двойной щелчок в таблице фактов” OLAP фрейма. В операции происходит открытие карточки объекта таблицы фактов. Если операция не указана, то будет попытка загрузить операцию DefaultOLAPDblClickOper из списка настраиваемых операций(Сервис->Настройка Действий->Настраиваемые операции). Пример операции смотреть ниже.
Пример операции на двойной клик в таблице фактов
<sql>
 <GetProp>
 [out svModalType, svSelName, svSelRepresent]
 begin
   :svModalType := BTK_ClientGate.GetClassModalType(:idvClass);
   :svSelName := BTK_ClientGate.GetClassProperty(:idvClass, :svPropSelName);
   :svSelRepresent := BTK_ClientGate.GetClassProperty(:idvClass, :svPropRepresent);
 end;
 </GetProp>
 </sql>

<PASCAL>
  idvClass := GetVar('IdClass');
  DebugMsg(idvClass);

  // Получем Имя выборки и отображение карточки по Id класса
  v := execsqlEx('GetProp', 'svModalType; svSelName; svSelRepresent; idvClass; svPropSelName; svPropRepresent', [ftString, ftString, ftString, ftFloat, ftString, ftString], ['', '', '', idvClass, 'CardEditor.Selection', 'CardEditor.Representation']);
  DebugMsg(v[1] + '.' + v[2] + '.' + v[0]);

  // Преобразвоание типа открытия карточки(Модально или MDI)
  if UpperCase(v[0]) = UpperCase('fcfMDI') then
    ModalType := fcfMDI
  else
    if UpperCase(v[0]) = UpperCase('fcfModal') then
      ModalType := fcfModal;

  // СОздание формы карточки
  CreateFormEx('', v[1], ModalType, ['Representation', 'idItem#'],[v[2], GetVar('id')]);
</PASCAL>

1.2.6.3.2. Открытие карточки измерения

Кроме того, OLAP фрейм предоставляет возможность открыть карточку измерения. Открыть карточку активного измерения можно двойным кликом на измерении, либо через пункт всплывающее меню “Открыть карточку измерения…”. Карточку измерения можно будет открыть, если в записе с измерением возвращаемое SQL запросом присутсвуеют ID и IdClass измерения. Шаблон размещения идентификаторов в записе поля: ИмяИзмерения|ID|IDClass.

1.2.6.3.3. Дополнительная информация

  1. Сколько максимально измерений может быть в области данных? Это зависит от количества данных в измерениях. Количество членов в одном измерение (уникальных значений в измерение) не должно превышать 2^32. А перемножение всех членов всех измерений не должно превышать 2^64.
  2. Максимальное количество измерений должно быть не больше 32.

Документация компонентов используемых нами

1.2.6.3.4. Свойства фрейма

Раздел находится в разработке.

Пока описаны не все свойства.

Свойство Описание
ActiveSheetIndex Задаёт индекс активной вкладки фрейма.
HeaderVisible Управляет видимостью заголовка.
ToolBarVisible Управляет видимостью панели управления.

1.2.6.4. Pivot-таблица

Класс фрейма:

class btkFrame.TbtkLookUpPivotGridFrameUnit

1.2.6.4.1. Общее описание

../../../_images/PivotGrid.jpg

Пример Pivot-таблицы

Pivot-таблица позволяет представлять многомерные отчеты по заданным параметрам.

Пример использования можно посмотреть на выборке SEL_TSG_PivotGrid в отображении PivotGrid.

1.2.6.4.2. Свойства фрейма

Настройки фрейма Возможные значения Описание
Отображение заголовков измерений строк Область итогов снизу / Область итогов сверху / Древовидное, область итогов снизу Свойство определяет порядок и способ группировки строк Pivot-грида.
Отображение заголовков измерений столбцов Область итогов слева / Область итогов справа Свойство определяет порядок и способ группировки столбцов Pivot-грида.

Для возможности динамического использования Pivot-грида в скриптовый язык добавлен класс TbtkScriptPivotGridObject, предоставляющий доступ к свойствам Pivot-грида.

Получить доступ к этому объекту можно через скриптовый метод выборки TbtkScriptSelectionObject.PivotGrid

1.2.6.4.3. Управление конфигурацией и сохранение настроек

Pivot-грид поддерживает управление универсальной OLAP-структурой (см. OLAP-структура). Все функции по сохранению, восстановлению и управлению настройками конфигурации возлагаются на нее.