MDA-таблица#
Основные положения#
MDA-таблица (Multi-Dimension Analysis) - средство, позволяющее реализовать список, управляемый пользователем с возможностью анализа данных и их группировки.
Основной особенностью MDA-таблиц является работа с данными вне базы данных. При первом запросе данных, будет выполнен запрос к базе данных, далее, если не изменялся порядок сортировки данных, то запросы к базе не выполняются.
Для проектирования MDA-таблицы разработчик определяет запрос данных и описывает колонки этого запроса, часть колонок могут быть измерениями, другие колонки - показатели.
Измерения- колонки, по которым данные группируются;Показатели- колонки, к которым применяются функции агрегации.
Пользователь имеет возможность управлять сортировкой данных, порядком вывода колонок, способом агрегации значений, выводить под-итоги. Сохранять эти настройки в виде приватных и публичных, назначать настройку по умолчанию.
Построение и отображение данных делится на две части:
Модель запроса- описывает правила получения данных изБД,измеренияипоказатели.Представление данных- описывает правила сортировки, агрегации и порядок вывода данных на экран.
Модель запроса#
Описывает правила получения данных, измерения и показатели.
Класс ru.bitec.app.btk.sel.mda.model.MdaModel.
Для построения модели создан класс-builder ru.bitec.app.btk.sel.mda.model.MdaModelBuilder
Текст запроса#
Текст запроса - строка, в которой содержится текст sql-запроса. Этот запрос будет получать исходные данные из базы данных.
Для использования связанных переменных используется синтаксис AnormSql. Пример связанной переменной:
select ...
from ...
where t.id = {id}
Для указания значений связанных переменных используется метод on класса ru.bitec.app.btk.sel.mda.model.MdaModelBuilder.
Полный пример использования запроса со связанными переменными:
val model = MdaModelBuilder()
.setQuery( () =>
s"""
select ...
from ...
where t.id = {id}
"""
)
.on(() => Seq(
"id" -> 100.nl
))
.build()
Измерения#
Определяют поля по которым доступна группировка и сортировка.
Класс ru.bitec.app.btk.sel.mda.model.Dimension.
Значимое измерение#
Измерение, представляющее собой единичную колонку запроса.
Пример создания:
val model = MdaModelBuilder()
.addDimension(NumberColumn("nNum"), "Число")
.addDimension(StringColumn("sString"), "Строка")
.addDimension(DateColumn("dDate"), "Дата")
Первым параметром передается объект колонка, который описывает тип данных и имя колонки в запросе данных.
Ссылочное измерение#
Измерение, представляющее из себя 2 колонки запроса, одна из которых содержит id объекта, а вторая - headline.
Используется, если в качестве измерения используется какой- либо объект с прямой ссылочностью.
В отображаемых данных колонка с id будет невидима.
Примечание
Для ссылочных полей важно создавать такие измерения, т.к. они позволят фильтроваться в универсальном фильтре по такому измерению как по ссылочному.
Пример создания:
val model = MdaModelBuilder()
.addRefDimension("idRefObject", "idRefObjectHl", "Ссылочный объект", "Some_RefClassName")
Параметры в порядке следования:
имя колонки с идентификатором;
имя колонки с отображаемым значением;
отображаемое имя;
имя класса, на который ссылается измерение.
Измерение переменной ссылочности#
Измерение, представляющее из себя 2 колонки запроса, одна из которых содержит gid объекта, а вторая - headline.
Используется, если в качестве измерения используется какой- либо объект, на который ссылочность организована через gid.
В отображаемых данных колонка с gid будет невидима.
Примечание
Для ссылочных полей важно создавать такие измерения, т.к. они позволят фильтроваться в универсальном фильтре по такому измерению как по ссылочному.
Пример создания:
val model = MdaModelBuilder()
.addAnyRefDimension("gidRefObject", "gidRefObjectHl", "Ссылочный объект", List("Some_RefClassName1", "Some_RefClassName2"))
Параметры в порядке следования:
имя колонки с идентификатором;
имя колонки с отображаемым значением;
отображаемое имя;
список классов, на который ссылается измерение.
Показатели#
Определяют поля по которым доступна агрегация значений.
Класс ru.bitec.app.btk.sel.mda.model.Dimension.
Простой показатель#
Показатель, представляющий собой единичную колонку запроса.
Пример создания:
val model = MdaModelBuilder()
.addMeasure(NumberColumn("nSum"), "Сумма")
Первым параметром передается объект колонка, который описывает тип данных и имя колонки в запросе данных.
Составной показатель#
Так же как и простой показатель представляет собой единичную колонку запроса, но имеет дополнительное измерение, в разрезе которого должна производиться агрегация.
Например, сумма в договоре, где дополнительным измерением является валюта.
Пример создания:
val model = MdaModelBuilder()
.addCompositeMeasure(
NumberColumn("nSum"),
Dimension(StringColumn("sMsr"), "Валюта"),
"Сумма"
)
Параметры в порядке следования:
колонка, которая описывает тип данных и имя колонки в запросе данных;измерение- дополнительное измерение, в рамках которого требуется агрегация;отображаемое имя.
Колонки#
Модель обладает перечнем колонок, которые были использованы при создании измерений и значений.
Класс ru.bitec.app.btk.sel.mda.model.Column
Колонки определяют:
тип данных;
имя колонки в запросе данных;
тип редактора.
Типы колонок:
NumberColumn- числовая колонка;BooleanColumn- булева колонка. Наследник от числовой, с типом редакторачекбокс;MoneyColumn- денежная колонка. Наследник от числовой, с типом редактораДенежный редактор;LongColumn- целочисленная колонка;StringColumn- строковая колонка;DateColumn- колонка с типомдата, с типом редактораредактор даты;DateTimeColumn- колонка с типомдата и время. Наследник отDateColumn, с типом редактораРедактор даты и времени.
Стандартный тип редактора может быть переопределен, используя метод setEditorType, который принимает строку, имеющую формат настройки динамического типа редактора.
Пример:
NumberColumn("nNum").setEditorType("EditorType=etEdit")
Представление данных#
Отвечает за настройки отображения данных в MDA-таблице:
порядок сортировки;
вывод промежуточных итогов;
агрегация значений показателей;
порядок вывода колонок на экран;
пользовательское переопределение наименования колонки;
изменение стилей строк итогов и промежуточных итогов;
размеры, видимость колонок;
параметры настройки.
Класс ru.bitec.app.btk.sel.mda.view.MdaView.
Пользователь управляет представлением, используя пользовательский интерфейс настройки вывода колонок, а так же сохраняя и загружая настройки.
Измерения#
Определяет настройки сортировки, группировки и вывода промежуточных итогов.
Показатели#
Определяет показатели, по которым будет выполнена агрегация.
Атрибуты#
Определяет порядок вывода колонок на экран и их наименование.
Описание формируемых атрибутов выборки#
На каждый подобранный атрибут представления в выборке формируются следующие атрибуты:
idValue[<имя колонки>]- невидимый атрибут, будет содержатьidдляссылочных измеренийилиgidдляизмерений переменной ссылочности.value[<имя колонки>]- видимый атрибут, в котором будет отображаться значение, видимое пользователя. Дляссылочных измеренийилиизмерений переменной ссылочностив этот атрибут выводится значение колонки, объявленной какheadline.sEditor[<имя колонки>]- невидимый атрибут, управляющий типом редактора.sStyle[<имя колонки>]- невидимый атрибут, управляющий стилем раскраски ячейки.
Подключение MDA-таблицы к прикладной выборке#
Реализация отображения сгруппированных данных#
Для подключения к прикладной выборке сервиса MDA-таблиц необходимо:
Унаследовать выборку от
ru.bitec.app.btk.sel.mda.Btk_MdaAbsAvi.Создать отображение, если требуется.
Унаследовать нужное отображение от отображения
Grid.Определить модель запроса данных, переопределив метод
buildModel, используя строителя моделиru.bitec.app.btk.sel.mda.model.MdaModelBuilder.Переопределить метод
getSourceDataRep, который будет определять выборку для открытия исходных данных.
Реализация отображения исходных данных#
Для реализации выборки, которая будет отображать исходные данные (данные которые вернул запрос из базы данных), необходимо:
Унаследовать выборку от
ru.bitec.app.btk.sel.mda.Btk_MdaAbsAvi.Создать отображение, если требуется.
Унаследовать нужное отображение от отображения
SourceDataGrid.
Управление типом редактора#
Тип редактора для колонки определяется в момент описания модели запроса данных.
Каждый тип колонки имеет свой тип редактора по умолчанию, для его переопределения можно воспользоваться методом setEditorType.
Интеграция с универсальным фильтром#
Универсальный фильтр анализирует модель запроса данных и на все показатели и измерения позволяет наложить условия фильтрации. Условие фильтрации будет наложено поверх результат запроса, описанного в модели.
Правила формирования доступных для фильтрации атрибутов:
для
ссылочных измеренийсоздается ссылочный атрибут фильтрации;для
измерений переменной ссылочностисоздается атрибут фильтрации переменой ссылочности;для всех остальных
измеренийипоказателейсоздаются значимые атрибуты фильтрации в соответствие с типом данных.
Создание стандартного фильтра#
Стандартный фильтр создается по тем же правилам, что и для обычной выборки.
Использование макросов#
Для использования макроса выборки в тексте запроса необходимо получить его текст, используя метод selection.getMacro, и добавить его в нужное место запроса.
Пример:
val model = MdaModelBuilder()
.setQuery(() =>
s"""
select ...
from ...
where ${selection.getMacro("SomeMacrosName")}
"""
)
Описание основных методов#
extendDynMeta- позволяет добавить в перечень атрибутов выборки свои атрибуты.extendDynRow- позволяет установить дополнительные значения в формируемую строку выборки.buildModel- метод, который должен переопределить разработчик, для описаниямодели данных.mdaModel- возвращаетмодель данных.mdaView- возвращаетпредставление данных.needGenChooseCheckBox- признак, что требуется формировать чекбоксы для выбора строк.forSelectedRows- позволяет обойти выбранные через чекбоксы строки.getSourceDataRep- метод, который должен переопределить разработчик, для указания выборки, которая будет открыта из операцииОткрыть исходные данные.filterRow- позволяет отфильтровать записи.refreshBySql- метод, который принудительно делает перезапрос данных из базы данных, и обновляет выборку.
Описание основных операций#
openSourceData- открывает выборку, указанную в методеgetSourceDataRep, в которой будут отображены исходные данные для выбранных строк.chooseAll- для всех записей проставляет чекбокс выбора.clearAllChosen- Для всех записей снимет чекбокс выбора.chooseSelected- Для всех выделенных записей проставляет чекбокс выбора.clearSelected- Для всех выделенных записей снимет чекбокс выбора.
Описание настройки атрибутов#
Настройка происходит через выборку ru.bitec.app.btk.sel.mda.Btk_MdaViewEditorAvi#attrEditor.
Выборка ожидает в качестве параметра mdaModel в формате JSON и опционально прошлый mdaView для
формирования нового mdaView. Возвращает JSON отредактированного mdaView.
Для работы с созданием/сохранением/загрузки настроек выборка ожидает названия выборки и репрезентации и опционально id прошлой настройки.
На вкладке
Настройка сортировки и агрегации можно настроить:
порядок и тип сортировки;
вывод промежуточных итогов;
тип агрегация значений показателей;
стили промежуточных итогов.
На вкладке
Настройка выводимых столбцов можно настроить:
порядок вывода колонок на экран;
пользовательское переопределение наименования колонки;
размеры, видимость колонок.
На вкладке
Характеристики настройки можно настроить:
изменение параметров настройки;
стили итогов.