P8-Panels/db/PKG_P8PANELS_VISUAL.pck

3217 lines
190 KiB
SQL
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

create or replace package PKG_P8PANELS_VISUAL as
/* Константы - типы данных */
SDATA_TYPE_STR constant PKG_STD.TSTRING := 'STR'; -- Тип данных "строка"
SDATA_TYPE_NUMB constant PKG_STD.TSTRING := 'NUMB'; -- Тип данных "число"
SDATA_TYPE_DATE constant PKG_STD.TSTRING := 'DATE'; -- Тип данных "дата"
/* Константы - направление сортировки */
SORDER_DIRECTION_ASC constant PKG_STD.TSTRING := 'ASC'; -- По возрастанию
SORDER_DIRECTION_DESC constant PKG_STD.TSTRING := 'DESC'; -- По убыванию
/* Константы - диаграмма Ганта - масштаб */
NGANTT_ZOOM_QUARTER_DAY constant PKG_STD.TNUMBER := 0; -- Четверть дня
NGANTT_ZOOM_HALF_DAY constant PKG_STD.TNUMBER := 1; -- Пол дня
NGANTT_ZOOM_DAY constant PKG_STD.TNUMBER := 2; -- День
NGANTT_ZOOM_WEEK constant PKG_STD.TNUMBER := 3; -- Неделя
NGANTT_ZOOM_MONTH constant PKG_STD.TNUMBER := 4; -- Месяц
/* Константы - график - тип */
SCHART_TYPE_BAR constant PKG_STD.TSTRING := 'bar'; -- Столбчатая
SCHART_TYPE_LINE constant PKG_STD.TSTRING := 'line'; -- Линейная
SCHART_TYPE_PIE constant PKG_STD.TSTRING := 'pie'; -- Круговая
SCHART_TYPE_DOUGHNUT constant PKG_STD.TSTRING := 'doughnut'; -- Кольцевая
/* Константы - график - расположение легенды */
SCHART_LGND_POS_LEFT constant PKG_STD.TSTRING := 'left'; -- Слева
SCHART_LGND_POS_RIGHT constant PKG_STD.TSTRING := 'right'; -- Справа
SCHART_LGND_POS_TOP constant PKG_STD.TSTRING := 'top'; -- Наверху
SCHART_LGND_POS_BOTTOM constant PKG_STD.TSTRING := 'bottom'; -- Внизу
/* Константы - циклограмма - масштаб */
NCYCLOGRAM_ZOOM_MIN constant PKG_STD.TLNUMBER := 0.2; -- Минимальный (0.2 от исходного)
NCYCLOGRAM_ZOOM_TINY constant PKG_STD.TLNUMBER := 0.4; -- Мелкий (0.4 от исходного)
NCYCLOGRAM_ZOOM_SMALL constant PKG_STD.TLNUMBER := 0.7; -- Уменьшенный (0.7 от исходного)
NCYCLOGRAM_ZOOM_DEFAULT constant PKG_STD.TLNUMBER := 1; -- Исходный
NCYCLOGRAM_ZOOM_LARGE constant PKG_STD.TLNUMBER := 1.5; -- Увеличенный (1.5 от исходного)
NCYCLOGRAM_ZOOM_HUGE constant PKG_STD.TLNUMBER := 2; -- Большой (2 от исходного)
NCYCLOGRAM_ZOOM_MAX constant PKG_STD.TLNUMBER := 2.5; -- Максимальный (2.5 от исходного)
/* Константы - циклограмма - оформление */
NCYCLOGRAM_GROUP_DEF_WIDTH constant PKG_STD.TNUMBER := 100; -- Высота заголовка группы (по умолчанию)
NCYCLOGRAM_GROUP_DEF_HEIGHT constant PKG_STD.TNUMBER := 42; -- Ширина заголовка группы (по умолчанию)
NCYCLOGRAM_LINE_HEIGHT constant PKG_STD.TNUMBER := 20; -- Высота строк циклограммы
/* Константы - индикатор - состояния */
SINDICATOR_STATE_UNDEFINED constant PKG_STD.TSTRING := 'UNDEFINED'; -- Неопределено
SINDICATOR_STATE_OK constant PKG_STD.TSTRING := 'OK'; -- Позитивное
SINDICATOR_STATE_ERR constant PKG_STD.TSTRING := 'ERR'; -- Негативное
SINDICATOR_STATE_WARN constant PKG_STD.TSTRING := 'WARN'; -- Пограничное
/* Константы - индикатор - варианты исполнения */
SINDICATOR_VARIANT_ELEVATION constant PKG_STD.TSTRING := 'elevation'; -- Парящий
SINDICATOR_VARIANT_OUTLINED constant PKG_STD.TSTRING := 'outlined'; -- Плоский с рамкой
/* Типы данных - значение колонки таблицы данных */
type TDG_COL_VAL is record
(
SVALUE PKG_STD.TLSTRING, -- Значение (строка)
NVALUE PKG_STD.TLNUMBER, -- Значение (число)
DVALUE PKG_STD.TLDATE -- Значение (дата)
);
/* Типы данных - коллекция значений колонки таблицы данных */
type TDG_COL_VALS is table of TDG_COL_VAL;
/* Типы данных - описатель колонки таблицы данных */
type TDG_COL_DEF is record
(
SNAME PKG_STD.TSTRING, -- Наименование
SCAPTION PKG_STD.TSTRING, -- Заголовок
SDATA_TYPE PKG_STD.TSTRING, -- Тип данных (см. константы SDATA_TYPE_*)
SCOND_FROM PKG_STD.TSTRING, -- Наименование нижней границы условия отбора
SCOND_TO PKG_STD.TSTRING, -- Наименование верхней границы условия отбора
BVISIBLE boolean, -- Разрешить отображение
BORDER boolean, -- Разрешить сортировку
BFILTER boolean, -- Разрешить отбор
RCOL_VALS TDG_COL_VALS, -- Предопределённые значения
SHINT PKG_STD.TSTRING, -- Текст всплывающей подсказки
SPARENT PKG_STD.TSTRING, -- Наименование родительской колонки
BEXPANDABLE boolean, -- Разрешить сокрытие/отображение дочерних колонок
BEXPANDED boolean, -- Отобразить/скрыть дочерние колонки
NWIDTH PKG_STD.TNUMBER -- Ширина колонки (обязательно для фиксированных)
);
/* Типы данных - коллекция описателей колонок таблицы данных */
type TDG_COL_DEFS is table of TDG_COL_DEF;
/* Типы данных - колонка */
type TDG_COL is record
(
SNAME PKG_STD.TSTRING, -- Наименование
RCOL_VAL TDG_COL_VAL -- Значение
);
/* Типы данных - коллекция колонок */
type TDG_COLS is table of TDG_COL;
/* Типы данных - строка */
type TDG_ROW is record
(
SGROUP PKG_STD.TSTRING, -- Наименование группы
RCOLS TDG_COLS -- Колонки
);
/* Типы данных - коллекция строк */
type TDG_ROWS is table of TDG_ROW;
/* Типы данных - группа */
type TDG_GROUP is record
(
SNAME PKG_STD.TSTRING, -- Наименование
SCAPTION PKG_STD.TSTRING, -- Заголовок
BEXPANDABLE boolean, -- Разрешить сокрытие/отображение дочерних
BEXPANDED boolean -- Отобразить/скрыть дочерние
);
/* Типы данных - коллекция групп */
type TDG_GROUPS is table of TDG_GROUP;
/* Типы данных - таблица данных */
type TDG is record
(
BFIXED_HEADER boolean, -- Зафиксировать заголовок
NFIXED_COLUMNS PKG_STD.TNUMBER, -- Количество фиксированных колонок
RCOL_DEFS TDG_COL_DEFS, -- Описание колонок
RGROUPS TDG_GROUPS, -- Описание групп
RROWS TDG_ROWS -- Данные строк
);
/* Типы данных - фильтр */
type TDG_FILTER is record
(
SNAME PKG_STD.TSTRING, -- Наименование
SFROM PKG_STD.TSTRING, -- Значение "с"
STO PKG_STD.TSTRING -- Значение "по"
);
/* Типы данных - коллекция фильтров */
type TDG_FILTERS is table of TDG_FILTER;
/* Типы данных - сортировка */
type TDG_ORDER is record
(
SNAME PKG_STD.TSTRING, -- Наименование
SDIRECTION PKG_STD.TSTRING -- Направление (см. константы SORDER_DIRECTION_*)
);
/* Типы данных - коллекция сортировок */
type TDG_ORDERS is table of TDG_ORDER;
/* Типы данных - описание атрибута задачи для диаграммы Ганта */
type TGANTT_TASK_ATTR is record
(
SNAME PKG_STD.TSTRING, -- Наименование
SCAPTION PKG_STD.TSTRING, -- Заголовок
BVISIBLE boolean -- Разрешить отображение
);
/* Типы данных - коллекция описаний атрибутов задачи для диаграммы Ганта */
type TGANTT_TASK_ATTRS is table of TGANTT_TASK_ATTR;
/* Типы данных - значение атрибута задачи для диаграммы Ганта */
type TGANTT_TASK_ATTR_VAL is record
(
SNAME PKG_STD.TSTRING, -- Наименование
SVALUE PKG_STD.TSTRING -- Значение
);
/* Типы данных - коллекция значений атрибутов задачи для диаграммы Ганта */
type TGANTT_TASK_ATTR_VALS is table of TGANTT_TASK_ATTR_VAL;
/* Типы данных - коллекция ссылок на предшествующие задачи для диаграммы Ганта */
type TGANTT_TASK_DEPENDENCIES is table of PKG_STD.TREF;
/* Тип данных - задача для диаграммы Ганта */
type TGANTT_TASK is record
(
NRN PKG_STD.TREF, -- Рег. номер
SNUMB PKG_STD.TSTRING, -- Номер
SCAPTION PKG_STD.TSTRING, -- Заголовок
SNAME PKG_STD.TSTRING, -- Наименование
DSTART PKG_STD.TLDATE, -- Дата начала
DEND PKG_STD.TLDATE, -- Дата окончания
NPROGRESS PKG_STD.TLNUMBER := null, -- Прогресс (% готовности) задачи (null - не определен)
SBG_COLOR PKG_STD.TSTRING := null, -- Цвет заливки задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
STEXT_COLOR PKG_STD.TSTRING := null, -- Цвет текста заголовка задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
SBG_PROGRESS_COLOR PKG_STD.TSTRING := null, -- Цвет заливки прогресса (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
BREAD_ONLY boolean := null, -- Сроки и прогресс задачи только для чтения (null - как указано в описании диаграммы)
BREAD_ONLY_DATES boolean := null, -- Сроки задачи только для чтения (null - как указано в описании диаграммы)
BREAD_ONLY_PROGRESS boolean := null, -- Прогресс задачи только для чтения (null - как указано в описании диаграммы)
RATTR_VALS TGANTT_TASK_ATTR_VALS := null, -- Значения дополнительных атрбутов (null - дополнительные атрибуты не определены)
RDEPENDENCIES TGANTT_TASK_DEPENDENCIES := null -- Список предшествующих задач
);
/* Тип данных - коллекция задач диаграммы Ганта */
type TGANTT_TASKS is table of TGANTT_TASK;
/* Тип данных - описание цвета задач диаграммы Ганта */
type TGANTT_TASK_COLOR is record
(
SBG_COLOR PKG_STD.TSTRING := null, -- Цвет заливки задачи (формат - HTML-цвет, #RRGGBBAA)
STEXT_COLOR PKG_STD.TSTRING := null, -- Цвет текста заголовка задачи (формат - HTML-цвет, #RRGGBBAA)
SBG_PROGRESS_COLOR PKG_STD.TSTRING := null, -- Цвет заливки прогресса (формат - HTML-цвет, #RRGGBBAA)
SDESC PKG_STD.TSTRING -- Описание
);
/* Тип данных - коллекция описаний цветов задач диаграммы Ганта */
type TGANTT_TASK_COLORS is table of TGANTT_TASK_COLOR;
/* Типы данных - диаграмма Ганта */
type TGANTT is record
(
STITLE PKG_STD.TSTRING := null, -- Заголовок (null - не отображать)
NZOOM PKG_STD.TNUMBER := NGANTT_ZOOM_WEEK, -- Текущий масштаб (см. константы NGANTT_ZOOM_*)
BZOOM_BAR boolean := true, -- Обображать панель масштабирования
BREAD_ONLY boolean := false, -- Сроки и прогресс задач только для чтения
BREAD_ONLY_DATES boolean := false, -- Сроки задач только для чтения
BREAD_ONLY_PROGRESS boolean := false, -- Прогресс задач только для чтения
RTASK_ATTRS TGANTT_TASK_ATTRS, -- Описание атрибутов карточки задачи
RTASK_COLORS TGANTT_TASK_COLORS, -- Описание цветов задач
RTASKS TGANTT_TASKS -- Список задач
);
/* Типы данных - значение атрибута элемента данных графика */
type TCHART_DATASET_ITEM_ATTR_VAL is record
(
SNAME PKG_STD.TSTRING, -- Наименование
SVALUE PKG_STD.TSTRING -- Значение
);
/* Типы данных - коллекция значений атрибутов элемента данных графика */
type TCHART_DATASET_ITEM_ATTR_VALS is table of TCHART_DATASET_ITEM_ATTR_VAL;
/* Тип данных - элемент данных графика */
type TCHART_DATASET_ITEM is record
(
NVALUE PKG_STD.TLNUMBER, -- Значение элемента данных, отображаемое на графике
RATTR_VALS TCHART_DATASET_ITEM_ATTR_VALS := null -- Значения дополнительных атрбутов (null - дополнительные атрибуты не определены)
);
/* Тип данных - коллекция элементов данных */
type TCHART_DATASET_ITEMS is table of TCHART_DATASET_ITEM;
/* Тип данных - набор данных графика */
type TCHART_DATASET is record
(
SCAPTION PKG_STD.TSTRING, -- Заголовок
SBORDER_COLOR PKG_STD.TSTRING := null, -- Цвет границы элемента данных на графике (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
SBG_COLOR PKG_STD.TSTRING := null, -- Цвет заливки элемента данных на графике (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
RITEMS TCHART_DATASET_ITEMS -- Элементы данных
);
/* Тип данных - коллекция наборов данных графика */
type TCHART_DATASETS is table of TCHART_DATASET;
/* Тип данных - коллекция меток данных графика */
type TCHART_LABELS is table of PKG_STD.TSTRING;
/* Типы данных - график */
type TCHART is record
(
STYPE PKG_STD.TSTRING, -- Тип (см. константы SCHART_TYPE_*)
STITLE PKG_STD.TSTRING := null, -- Заголовок (null - не отображать)
SLGND_POS PKG_STD.TSTRING := null, -- Расположение легенды (null - не отображать, см. константы SCHART_LGND_POS_*)
RLABELS TCHART_LABELS, -- Метки значений
RDATASETS TCHART_DATASETS -- Наборы данных
);
/* Типы данных - описание атрибута задачи для циклограммы */
type TCYCLOGRAM_TASK_ATTR is record
(
SNAME PKG_STD.TSTRING, -- Наименование
SCAPTION PKG_STD.TSTRING, -- Заголовок
BVISIBLE boolean -- Разрешить отображение
);
/* Типы данных - коллекция описаний атрибутов задачи для циклограммы */
type TCYCLOGRAM_TASK_ATTRS is table of TCYCLOGRAM_TASK_ATTR;
/* Типы данных - значение атрибута задачи для циклограммы */
type TCYCLOGRAM_TASK_ATTR_VAL is record
(
SNAME PKG_STD.TSTRING, -- Наименование
SVALUE PKG_STD.TSTRING -- Значение
);
/* Типы данных - коллекция значений атрибутов задачи для циклограммы */
type TCYCLOGRAM_TASK_ATTR_VALS is table of TCYCLOGRAM_TASK_ATTR_VAL;
/* Типы данных - колонка циклограммы */
type TCYCLOGRAM_COLUMN is record
(
SNAME PKG_STD.TSTRING, -- Наименование колонки
NSTART PKG_STD.TNUMBER, -- Позиция начала колонки
NEND PKG_STD.TNUMBER -- Позиция конца колонки
);
/* Типы данных - коллекция колонок циклограммы */
type TCYCLOGRAM_COLUMNS is table of TCYCLOGRAM_COLUMN;
/* Типы данных - строки циклограммы */
type TCYCLOGRAM_TASK is record
(
NRN PKG_STD.TREF, -- Рег. номер
SCAPTION PKG_STD.TSTRING, -- Заголовок
SNAME PKG_STD.TSTRING, -- Наименование
NLINE_NUMB PKG_STD.TNUMBER, -- Номер строки
NSTART PKG_STD.TNUMBER, -- Позиция начала задачи
NEND PKG_STD.TNUMBER, -- Позиция конца задачи
SGROUP PKG_STD.TSTRING, -- Наименование группы
SBG_COLOR PKG_STD.TSTRING := null, -- Цвет заливки задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
STEXT_COLOR PKG_STD.TSTRING := null, -- Цвет текста заголовка задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
SHIGHLIGHT_COLOR PKG_STD.TSTRING := null, -- Цвет при наведении (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
RATTR_VALS TCYCLOGRAM_TASK_ATTR_VALS := null -- Значения дополнительных атрбутов (null - дополнительные атрибуты не определены)
);
/* Типы данных - коллекция строк циклограммы */
type TCYCLOGRAM_TASKS is table of TCYCLOGRAM_TASK;
/* Типы данных - группа строк циклограммы */
type TCYCLOGRAM_GROUP is record
(
SNAME PKG_STD.TSTRING, -- Имя группы
BHEADER_VISIBLE boolean, -- Признак отображения заголовка группы
NHEADER_HEIGHT PKG_STD.TNUMBER, -- Высота заголовка группы
NHEADER_WIDTH PKG_STD.TNUMBER, -- Ширина заголовка группы
SHIGHLIGHT_COLOR PKG_STD.TSTRING := null -- Цвет при наведении (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
);
/* Типы данных - коллекция групп строк циклограммы */
type TCYCLOGRAM_GROUPS is table of TCYCLOGRAM_GROUP;
/* Типы данных - циклограмма */
type TCYCLOGRAM is record
(
STITLE PKG_STD.TSTRING, -- Заголовок (null - не отображать)
NLINE_HEIGHT PKG_STD.TLNUMBER, -- Высота строк
NZOOM PKG_STD.TNUMBER := NCYCLOGRAM_ZOOM_DEFAULT, -- Текущий масштаб (см. константы NCYCLOGRAM_ZOOM_*)
BZOOM_BAR boolean := true, -- Обображать панель масштабирования
RCOLUMNS TCYCLOGRAM_COLUMNS, -- Коллекция колонок циклограммы
RGROUPS TCYCLOGRAM_GROUPS, -- Коллекция групп строк циклограммы
RTASKS TCYCLOGRAM_TASKS, -- Коллекция строк циклограммы
RTASK_ATTRS TCYCLOGRAM_TASK_ATTRS -- Описание атрибутов карточки задачи
);
/* Типы данных - индикатор */
type TINDICATOR is record
(
SCAPTION PKG_STD.TSTRING, -- Подпись
SVALUE PKG_STD.TSTRING, -- Значение
SICON PKG_STD.TSTRING := null, -- Иконка (код шрифта "Google Material Icons" - https://fonts.google.com/icons?icon.set=Material+Icons)
SSTATE PKG_STD.TSTRING := SINDICATOR_STATE_UNDEFINED, -- Состояние (см. константы SINDICATOR_STATE_*)
BSQUARE boolean := false, -- Скруглять углы
NELEVATION PKG_STD.TNUMBER := 3, -- Высота парения (от 0 до 24, игнорируется для SINDICATOR_VARIANT_OUTLINED)
SVARIANT PKG_STD.TSTRING := SINDICATOR_VARIANT_ELEVATION, -- Вариант исполнения (см. константы SINDICATOR_VARIANT_*)
SHINT PKG_STD.TSTRING := null, -- Подсказка
SBACKGROUND_COLOR PKG_STD.TSTRING := null, -- Цвет заливки (HTML-код, null - использовать цвет по умолчанию для состояния)
SCOLOR PKG_STD.TSTRING := null -- Цвет шрифта и иконки (HTML-код, null - использовать цвет по умолчанию для состояния)
);
/* Расчет диапаона выдаваемых записей */
procedure UTL_ROWS_LIMITS_CALC
(
NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
NROW_FROM out number, -- Нижняя граница диапазона
NROW_TO out number -- Верхняя граница диапазона
);
/* Формирование наименования условия отбора для нижней границы */
function UTL_COND_NAME_MAKE_FROM
(
SNAME in varchar2 -- Наименование колонки
) return varchar2; -- Результат
/* Формирование наименования условия отбора для верхней границы */
function UTL_COND_NAME_MAKE_TO
(
SNAME in varchar2 -- Наименование колонки
) return varchar2; -- Результат
/* Добавление значения в коллекцию */
procedure TDG_COL_VALS_ADD
(
RCOL_VALS in out nocopy TDG_COL_VALS, -- Коллекция значений
SVALUE in varchar2 := null, -- Значение (строка)
NVALUE in number := null, -- Значение (число)
DVALUE in date := null, -- Значение (дата)
BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Формирование строки */
function TDG_ROW_MAKE
(
SGROUP in varchar2 := null -- Наименование группы
) return TDG_ROW; -- Результат работы
/* Добавление колонки к строке */
procedure TDG_ROW_ADD_COL
(
RROW in out nocopy TDG_ROW, -- Строка
SNAME in varchar2, -- Наименование колонки
SVALUE in varchar2 := null, -- Значение (строка)
NVALUE in number := null, -- Значение (число)
DVALUE in date := null, -- Значение (дата)
BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Добавление строковой колонки к строке из курсора динамического запроса */
procedure TDG_ROW_ADD_CUR_COLS
(
RROW in out nocopy TDG_ROW, -- Строка
SNAME in varchar2, -- Наименование колонки
ICURSOR in integer, -- Курсор
NPOSITION in number, -- Номер колонки в курсоре
BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Добавление числовой колонки к строке из курсора динамического запроса */
procedure TDG_ROW_ADD_CUR_COLN
(
RROW in out nocopy TDG_ROW, -- Строка
SNAME in varchar2, -- Наименование колонки
ICURSOR in integer, -- Курсор
NPOSITION in number, -- Номер колонки в курсоре
BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Добавление колонки типа "дата" к строке из курсора динамического запроса */
procedure TDG_ROW_ADD_CUR_COLD
(
RROW in out nocopy TDG_ROW, -- Строка
SNAME in varchar2, -- Наименование колонки
ICURSOR in integer, -- Курсор
NPOSITION in number, -- Номер колонки в курсоре
BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Формирование таблицы данных */
function TDG_MAKE
(
BFIXED_HEADER in boolean := false, -- Зафиксировать заголовок
NFIXED_COLUMNS in number := 0 -- Количество фиксированных колонок
) return TDG; -- Результат работы
/* Поиск описания колонки в таблице данных по наименованию */
function TDG_FIND_COL_DEF
(
RDATA_GRID in TDG, -- Описание таблицы данных
SNAME in varchar2 -- Наименование колонки
) return TDG_COL_DEF; -- Найденное описание (null - если не нашли)
/* Добавление описания колонки к таблице данных */
procedure TDG_ADD_COL_DEF
(
RDATA_GRID in out nocopy TDG, -- Описание таблицы данных
SNAME in varchar2, -- Наименование колонки
SCAPTION in varchar2, -- Заголовок колонки
SDATA_TYPE in varchar2 := SDATA_TYPE_STR, -- Тип данных колонки (см. константы SDATA_TYPE_*)
SCOND_FROM in varchar2 := null, -- Наименование нижней границы условия отбора (null - используется UTL_COND_NAME_MAKE_FROM)
SCOND_TO in varchar2 := null, -- Наименование верхней границы условия отбора (null - используется UTL_COND_NAME_MAKE_TO)
BVISIBLE in boolean := true, -- Разрешить отображение
BORDER in boolean := false, -- Разрешить сортировку по колонке
BFILTER in boolean := false, -- Разрешить отбор по колонке
RCOL_VALS in TDG_COL_VALS := null, -- Предопределённые значения колонки
SHINT in varchar2 := null, -- Текст всплывающей подсказки
SPARENT in varchar2 := null, -- Наименование родительской колонки
BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних колонок
BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние колонки
NWIDTH in number := null, -- Ширина колонки (обязательно для фиксированных)
BCLEAR in boolean := false -- Флаг очистки коллекции описаний колонок таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Добавление описания группы к таблице данных */
procedure TDG_ADD_GROUP
(
RDATA_GRID in out nocopy TDG, -- Описание таблицы данных
SNAME in varchar2, -- Наименование группы
SCAPTION in varchar2, -- Заголовок группы
BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних
BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние
BCLEAR in boolean := false -- Флаг очистки коллекции описаний групп таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Добавление описания колонки к таблице данных */
procedure TDG_ADD_ROW
(
RDATA_GRID in out nocopy TDG, -- Описание таблицы данных
RROW in TDG_ROW, -- Строка
BCLEAR in boolean := false -- Флаг очистки коллекции строк таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Сериализация таблицы данных */
function TDG_TO_XML
(
RDATA_GRID in TDG, -- Описание таблицы данных
NINCLUDE_DEF in number := 1 -- Включить описание колонок (0 - нет, 1 - да)
) return clob; -- XML-описание
/* Конвертация значений фильтра в число */
procedure TDG_FILTER_TO_NUMBER
(
RFILTER in TDG_FILTER, -- Фильтр
NFROM out number, -- Значение нижней границы диапазона
NTO out number -- Значение верхней границы диапазона
);
/* Конвертация значений фильтра в дату */
procedure TDG_FILTER_TO_DATE
(
RFILTER in TDG_FILTER, -- Фильтр
DFROM out date, -- Значение нижней границы диапазона
DTO out date -- Значение верхней границы диапазона
);
/* Поиск фильтра в коллекции */
function TDG_FILTERS_FIND
(
RFILTERS in TDG_FILTERS, -- Коллекция фильтров
SNAME in varchar2 -- Наименование
) return TDG_FILTER; -- Найденный фильтр (null - если не нашли)
/* Десериализация фильтров */
function TDG_FILTERS_FROM_XML
(
CFILTERS in clob -- Сериализованное представление фильтров (BASE64(<filters><name>ИМЯ</name><from>ЗНАЧЕНИЕ</from><to>ЗНАЧЕНИЕ</to></filters>...))
) return TDG_FILTERS; -- Результат работы
/* Применение параметров фильтрации в запросе */
procedure TDG_FILTERS_SET_QUERY
(
NIDENT in number, -- Идентификатор отбора
NCOMPANY in number, -- Рег. номер организации
NPARENT in number := null, -- Рег. номер родителя
SUNIT in varchar2, -- Код раздела
SPROCEDURE in varchar2, -- Наименование серверной процедуры отбора
RDATA_GRID in TDG, -- Описание таблицы данных
RFILTERS in TDG_FILTERS -- Коллекция фильтров
);
/* Десериализация сортировок */
function TDG_ORDERS_FROM_XML
(
CORDERS in clob -- Сериализованное представление сотрировок (BASE64(<orders><name>ИМЯ</name><direction>ASC/DESC</direction></orders>...))
) return TDG_ORDERS; -- Результат работы
/* Применение параметров сортировки в запросе */
procedure TDG_ORDERS_SET_QUERY
(
RDATA_GRID in TDG, -- Описание таблицы
RORDERS in TDG_ORDERS, -- Коллекция сортировок
SPATTERN in varchar2, -- Шаблон для подстановки условий отбора в запрос
CSQL in out nocopy clob -- Буфер запроса
);
/* Формирование задачи для диаграммы Ганта */
function TGANTT_TASK_MAKE
(
NRN in number, -- Рег. номер
SNUMB in varchar2, -- Номер
SCAPTION in varchar2, -- Заголовок
SNAME in varchar2, -- Наименование
DSTART in date, -- Дата начала
DEND in date, -- Дата окончания
NPROGRESS in number := null, -- Прогресс (% готовности) задачи (null - не определен)
SBG_COLOR in varchar2 := null, -- Цвет заливки задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
STEXT_COLOR in varchar2 := null, -- Цвет текста заголовка задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
SBG_PROGRESS_COLOR in varchar2 := null, -- Цвет заливки прогресса (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
BREAD_ONLY in boolean := null, -- Сроки и прогресс задачи только для чтения (null - как указано в описании диаграммы)
BREAD_ONLY_DATES in boolean := null, -- Сроки задачи только для чтения (null - как указано в описании диаграммы)
BREAD_ONLY_PROGRESS in boolean := null -- Прогресс задачи только для чтения (null - как указано в описании диаграммы)
) return TGANTT_TASK; -- Результат работы
/* Добавление значения атрибута к задаче диаграммы Ганта */
procedure TGANTT_TASK_ADD_ATTR_VAL
(
RGANTT in TGANTT, -- Описание диаграммы
RTASK in out nocopy TGANTT_TASK, -- Описание задачи
SNAME in varchar2, -- Наименование
SVALUE in varchar2, -- Значение
BCLEAR in boolean := false -- Флаг очистки коллекции значений атрибутов (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Добавление предшествующей задачи к задаче диаграммы Ганта */
procedure TGANTT_TASK_ADD_DEPENDENCY
(
RTASK in out nocopy TGANTT_TASK, -- Описание задачи
NDEPENDENCY in number, -- Рег. номер предшествующей задачи
BCLEAR in boolean := false -- Флаг очистки коллекции предшествущих задач (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Формирование диаграммы Ганта */
function TGANTT_MAKE
(
STITLE in varchar2 := null, -- Заголовок (null - не отображать)
NZOOM in number := NGANTT_ZOOM_WEEK, -- Текущий масштаб (см. константы NGANTT_ZOOM_*)
BZOOM_BAR in boolean := true, -- Обображать панель масштабирования
BREAD_ONLY in boolean := false, -- Сроки и прогресс задач только для чтения
BREAD_ONLY_DATES in boolean := false, -- Сроки задач только для чтения
BREAD_ONLY_PROGRESS in boolean := false -- Прогресс задач только для чтения
) return TGANTT; -- Результат работы
/* Добавление описания атрибута карточки задачи диаграммы Ганта */
procedure TGANTT_ADD_TASK_ATTR
(
RGANTT in out nocopy TGANTT, -- Описание диаграммы Ганта
SNAME in varchar2, -- Наименование
SCAPTION in varchar2, -- Заголовок
BVISIBLE boolean := true, -- Разрешить отображение
BCLEAR in boolean := false -- Флаг очистки коллекции атрибутов (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Добавление описания цвета задачи диаграммы Ганта */
procedure TGANTT_ADD_TASK_COLOR
(
RGANTT in out nocopy TGANTT, -- Описание диаграммы Ганта
SBG_COLOR in varchar2 := null, -- Цвет заливки задачи (формат - HTML-цвет, #RRGGBBAA)
STEXT_COLOR in varchar2 := null, -- Цвет текста заголовка задачи (формат - HTML-цвет, #RRGGBBAA)
SBG_PROGRESS_COLOR in varchar2 := null, -- Цвет заливки прогресса (формат - HTML-цвет, #RRGGBBAA)
SDESC in varchar2, -- Описание
BCLEAR in boolean := false -- Флаг очистки коллекции цветов (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Добавление задачи к диаграмме Ганта */
procedure TGANTT_ADD_TASK
(
RGANTT in out nocopy TGANTT, -- Описание диаграммы Ганта
RTASK in TGANTT_TASK, -- Задача
BCLEAR in boolean := false -- Флаг очистки коллекции задач диаграммы (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Сериализация диаграммы Ганта */
function TGANTT_TO_XML
(
RGANTT in TGANTT, -- Описание диаграммы Ганта
NINCLUDE_DEF in number := 1 -- Включить описание заголовка (0 - нет, 1 - да)
) return clob; -- XML-описание
/* Добавление дополнительного атрибута элемента данных графика */
procedure TCHART_DATASET_ITM_ATTR_VL_ADD
(
RATTR_VALS in out nocopy TCHART_DATASET_ITEM_ATTR_VALS, -- Коллекция дополнительных атрибутов элемента данных графика
SNAME PKG_STD.TSTRING, -- Наименование
SVALUE PKG_STD.TSTRING, -- Значение
BCLEAR in boolean := false -- Флаг очистки коллекции дополнительных атрибутов элемента данных (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Формирование набора данных графика */
function TCHART_DATASET_MAKE
(
SCAPTION in varchar2, -- Заголовок
SBORDER_COLOR in varchar2 := null, -- Цвет границы элемента данных на графике (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
SBG_COLOR in varchar2 := null -- Цвет заливки элемента данных на графике (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
) return TCHART_DATASET; -- Результат работы
/* Добавление элемента в набор данных графика */
procedure TCHART_DATASET_ADD_ITEM
(
RDATASET in out nocopy TCHART_DATASET, -- Описание набора данных графика
NVALUE in number, -- Значение элемента данных, отображаемое на графике
RATTR_VALS in TCHART_DATASET_ITEM_ATTR_VALS := null, -- Значения дополнительных атрбутов (null - дополнительные атрибуты не определены)
BCLEAR in boolean := false -- Флаг очистки коллекции элементов набора данных (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Формирование графика */
function TCHART_MAKE
(
STYPE in varchar2, -- Тип (см. константы SCHART_TYPE_*)
STITLE in varchar2 := null, -- Заголовок (null - не отображать)
SLGND_POS in varchar2 := null -- Расположение легенды (null - не отображать, см. константы SCHART_LGND_POS_*)
) return TCHART; -- Результат работы
/* Добавление метки значения графика */
procedure TCHART_ADD_LABEL
(
RCHART in out nocopy TCHART, -- Описание графика
SLABEL in varchar2, -- Метка значения
BCLEAR in boolean := false -- Флаг очистки коллекции меток (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Добавление набора данных графика */
procedure TCHART_ADD_DATASET
(
RCHART in out nocopy TCHART, -- Описание графика
RDATASET in TCHART_DATASET, -- Набор данных
BCLEAR in boolean := false -- Флаг очистки коллекции наборов данных (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Сериализация графика */
function TCHART_TO_XML
(
RCHART in TCHART, -- Описание графика
NINCLUDE_DEF in number := 1 -- Включить описание заголовка (0 - нет, 1 - да)
) return clob; -- XML-описание
/* Формирование задачи циклограммы */
function TCYCLOGRAM_TASK_MAKE
(
NRN in number, -- Рег. номер записи
SCAPTION in varchar2, -- Заголовок
SNAME in varchar2, -- Наименование
NLINE_NUMB in number, -- Номер строки
NSTART in number, -- Позиция начала задачи
NEND in number, -- Позиция конца задачи
SGROUP in varchar2 := null, -- Наименование группы
SBG_COLOR in varchar2 := null, -- Цвет заливки задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
STEXT_COLOR in varchar2 := null, -- Цвет текста заголовка задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
SHIGHLIGHT_COLOR in varchar2 := null -- Цвет при наведении (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
) return TCYCLOGRAM_TASK; -- Результат работы
/* Добавление значения атрибута к задаче циклограммы */
procedure TCYCLOGRAM_TASK_ADD_ATTR_VAL
(
RCYCLOGRAM in TCYCLOGRAM, -- Описание циклограммы
RTASK in out nocopy TCYCLOGRAM_TASK, -- Описание задачи
SNAME in varchar2, -- Наименование
SVALUE in varchar2, -- Значение
BCLEAR in boolean := false -- Флаг очистки коллекции значений атрибутов (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Формирование циклограммы */
function TCYCLOGRAM_MAKE
(
STITLE in varchar2, -- Заголовок (null - не отображать)
NLINE_HEIGHT in number := NCYCLOGRAM_LINE_HEIGHT, -- Высота строк
NZOOM in number := NCYCLOGRAM_ZOOM_DEFAULT, -- Текущий масштаб (см. константы NCYCLOGRAM_ZOOM_*)
BZOOM_BAR in boolean := true -- Обображать панель масштабирования
) return TCYCLOGRAM; -- Результат работы
/* Добавление колонки в циклограмму */
procedure TCYCLOGRAM_ADD_COLUMN
(
RCYCLOGRAM in out nocopy TCYCLOGRAM, -- Описание циклограммы
SNAME in varchar2, -- Заголовок колонки
NSTART in number, -- Позиция начала колонки
NEND in number, -- Позиция конца колонки
BCLEAR in boolean := false -- Флаг очистки коллекции колонок циклограммы (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Добавление группы в циклограмму */
procedure TCYCLOGRAM_ADD_GROUP
(
RCYCLOGRAM in out nocopy TCYCLOGRAM, -- Описание циклограммы
SNAME in varchar2, -- Имя группы
BHEADER_VISIBLE in boolean := true, -- Признак отображения заголовка группы
NHEADER_HEIGHT in number := NCYCLOGRAM_GROUP_DEF_HEIGHT, -- Высота заголовка группы
NHEADER_WIDTH in number := NCYCLOGRAM_GROUP_DEF_WIDTH, -- Ширина заголовка группы
SHIGHLIGHT_COLOR in varchar2 := null, -- Цвет при наведении (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
BCLEAR in boolean := false -- Флаг очистки коллекции групп (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Добавление задачи в циклограммы */
procedure TCYCLOGRAM_ADD_TASK
(
RCYCLOGRAM in out nocopy TCYCLOGRAM, -- Описание циклограммы
RTASK in TCYCLOGRAM_TASK, -- Задача циклограммы
BCLEAR in boolean := false -- Флаг очистки коллекции задач (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Добавление описания атрибута задачи циклограммы */
procedure TCYCLOGRAM_ADD_TASK_ATTR
(
RCYCLOGRAM in out nocopy TCYCLOGRAM, -- Описание циклограммы
SNAME in varchar2, -- Наименование
SCAPTION in varchar2, -- Заголовок
BVISIBLE boolean := true, -- Разрешить отображение
BCLEAR in boolean := false -- Флаг очистки коллекции атрибутов (false - не очищать, true - очистить коллекцию перед добавлением)
);
/* Сериализация циклограммы */
function TCYCLOGRAM_TO_XML
(
RCYCLOGRAM in TCYCLOGRAM, -- Описание циклограммы
NINCLUDE_DEF in number := 1 -- Включить описание колонок (0 - нет, 1 - да)
) return clob; -- XML-описание
/* Формирование индикатора */
function TINDICATOR_MAKE
(
SCAPTION in varchar2, -- Подпись
SVALUE in varchar2, -- Значение
SICON in varchar2 := null, -- Иконка (код шрифта "Google Material Icons" - https://fonts.google.com/icons?icon.set=Material+Icons)
SSTATE in varchar2 := SINDICATOR_STATE_UNDEFINED, -- Состояние (см. константы SINDICATOR_STATE_*)
BSQUARE in boolean := false, -- Скруглять углы
NELEVATION in number := 3, -- Высота парения (от 0 до 24, игнорируется для SINDICATOR_VARIANT_OUTLINED)
SVARIANT in varchar2 := SINDICATOR_VARIANT_ELEVATION, -- Вариант исполнения (см. константы SINDICATOR_VARIANT_*)
SHINT in varchar2 := null, -- Подсказка
SBACKGROUND_COLOR in varchar2 := null, -- Цвет заливки (HTML-код, null - использовать цвет по умолчанию для состояния)
SCOLOR in varchar2 := null -- Цвет шрифта и иконки (HTML-код, null - использовать цвет по умолчанию для состояния)
) return TINDICATOR; -- Результат работы
/* Сериализация индикатора */
function TINDICATOR_TO_XML
(
RINDICATOR in TINDICATOR -- Описание индикатора
) return clob; -- XML-описание
end PKG_P8PANELS_VISUAL;
/
create or replace package body PKG_P8PANELS_VISUAL as
/* Константы - тэги запросов */
SRQ_TAG_XROOT constant PKG_STD.TSTRING := 'XROOT'; -- Тэг для корня данных запроса
SRQ_TAG_XFILTERS constant PKG_STD.TSTRING := 'filters'; -- Тэг для строк данных
SRQ_TAG_XORDERS constant PKG_STD.TSTRING := 'orders'; -- Тэг для описания колонок
SRQ_TAG_SNAME constant PKG_STD.TSTRING := 'name'; -- Тэг для наименования
SRQ_TAG_SDIRECTION constant PKG_STD.TSTRING := 'direction'; -- Тэг для направления
SRQ_TAG_SFROM constant PKG_STD.TSTRING := 'from'; -- Тэг для значения "с"
SRQ_TAG_STO constant PKG_STD.TSTRING := 'to'; -- Тэг для значения "по"
/* Константы - тэги ответов */
SRESP_TAG_XDATA constant PKG_STD.TSTRING := 'XDATA'; -- Тэг для корня описания данных
SRESP_TAG_XCHART constant PKG_STD.TSTRING := 'XCHART'; -- Тэг для описания графика
SRESP_TAG_XDATA_GRID constant PKG_STD.TSTRING := 'XDATA_GRID'; -- Тэг для описания таблицы данных
SRESP_TAG_XCYCLOGRAM constant PKG_STD.TSTRING := 'XCYCLOGRAM'; -- Тэг для описания циклограммы
SRESP_TAG_XGANTT constant PKG_STD.TSTRING := 'XGANTT'; -- Тэг для описания диаграммы Ганта
SRESP_TAG_XINDICATOR constant PKG_STD.TSTRING := 'XINDICATOR'; -- Тэг для описания индикатора
/* Константы - атрибуты ответов (универсальные) */
SRESP_ATTR_NAME constant PKG_STD.TSTRING := 'name'; -- Атрибут для наименования
SRESP_ATTR_CAPTION constant PKG_STD.TSTRING := 'caption'; -- Атрибут для подписи
SRESP_ATTR_DATA_TYPE constant PKG_STD.TSTRING := 'dataType'; -- Атрибут для типа данных
SRESP_ATTR_VISIBLE constant PKG_STD.TSTRING := 'visible'; -- Атрибут для флага видимости
SRESP_ATTR_TITLE constant PKG_STD.TSTRING := 'title'; -- Атрибут для заголовка
SRESP_ATTR_ZOOM constant PKG_STD.TSTRING := 'zoom'; -- Атрибут для масштаба
SRESP_ATTR_ID constant PKG_STD.TSTRING := 'id'; -- Атрибут для идентификатора
SRESP_ATTR_START constant PKG_STD.TSTRING := 'start'; -- Атрибут для даты начала
SRESP_ATTR_END constant PKG_STD.TSTRING := 'end'; -- Атрибут для даты окончания
SRESP_ATTR_RN constant PKG_STD.TSTRING := 'rn'; -- Атрибут для рег. номера
SRESP_ATTR_NUMB constant PKG_STD.TSTRING := 'numb'; -- Атрибут для номера
SRESP_ATTR_FULL_NAME constant PKG_STD.TSTRING := 'fullName'; -- Атрибут для полного наименования
SRESP_ATTR_DESC constant PKG_STD.TSTRING := 'desc'; -- Атрибут для описания
SRESP_ATTR_TYPE constant PKG_STD.TSTRING := 'type'; -- Атрибут для типа
SRESP_ATTR_HINT constant PKG_STD.TSTRING := 'hint'; -- Атрибут для подсказки
SRESP_ATTR_GROUP_NAME constant PKG_STD.TSTRING := 'groupName'; -- Атрибут для наименования группы
SRESP_ATTR_PARENT constant PKG_STD.TSTRING := 'parent'; -- Атрибут для ссылки на родителя
SRESP_ATTR_EXPANDABLE constant PKG_STD.TSTRING := 'expandable'; -- Атрибут для доступности действия сокрытия/отображения
SRESP_ATTR_EXPANDED constant PKG_STD.TSTRING := 'expanded'; -- Атрибут для флага сокрытия/отображения
SRESP_ATTR_FIXED_HEADER constant PKG_STD.TSTRING := 'fixedHeader'; -- Атрибут для флага фиксации заголовка
SRESP_ATTR_FIXED_COLUMNS constant PKG_STD.TSTRING := 'fixedColumns'; -- Атрибут для количества фиксированных колонок
SRESP_ATTR_WIDTH constant PKG_STD.TSTRING := 'width'; -- Атрибут для ширины
SRESP_ATTR_HEIGHT constant PKG_STD.TSTRING := 'height'; -- Атрибут для высоты
SRESP_ATTR_COLUMNS constant PKG_STD.TSTRING := 'columns'; -- Атрибут для колонок
SRESP_ATTR_TASKS constant PKG_STD.TSTRING := 'tasks'; -- Атрибут для задач
SRESP_ATTR_HL_COLOR constant PKG_STD.TSTRING := 'highlightColor'; -- Атрибут для цвета подсветки
SRESP_ATTR_ZOOM_BAR constant PKG_STD.TSTRING := 'zoomBar'; -- Атрибут для флага отображения панели масштаба
SRESP_ATTR_ROWS constant PKG_STD.TSTRING := 'rows'; -- Атрибут для строк данных
SRESP_ATTR_COLUMNS_DEF constant PKG_STD.TSTRING := 'columnsDef'; -- Атрибут для описания колонок
SRESP_ATTR_GROUPS constant PKG_STD.TSTRING := 'groups'; -- Атрибут для описания групп
SRESP_ATTR_VALUE constant PKG_STD.TSTRING := 'value'; -- Атрибут для значения
SRESP_ATTR_ICON constant PKG_STD.TSTRING := 'icon'; -- Атрибут для иконки
SRESP_ATTR_STATE constant PKG_STD.TSTRING := 'state'; -- Атрибут для состояния
SRESP_ATTR_SQUARE constant PKG_STD.TSTRING := 'square'; -- Атрибут для флага скругления
SRESP_ATTR_ELEVATION constant PKG_STD.TSTRING := 'elevation'; -- Атрибут для высоты парения
SRESP_ATTR_VARIANT constant PKG_STD.TSTRING := 'variant'; -- Атрибут для варианта исполнения
SRESP_ATTR_BG_COLOR constant PKG_STD.TSTRING := 'backgroundColor'; -- Атрибут для цвета заливки
SRESP_ATTR_COLOR constant PKG_STD.TSTRING := 'color'; -- Атрибут для цвета
/* Константы - атрибуты ответов (таблица данных) */
SRESP_ATTR_DT_ORDER constant PKG_STD.TSTRING := 'order'; -- Атрибут для флага сортировки
SRESP_ATTR_DT_FILTER constant PKG_STD.TSTRING := 'filter'; -- Атрибут для флага отбора
SRESP_ATTR_DT_COLUMN_VALUES constant PKG_STD.TSTRING := 'values'; -- Атрибут для предопределённых значений
/* Константы - атрибуты ответов (диаграмма Ганта) */
SRESP_ATTR_TASK_PROGRESS constant PKG_STD.TSTRING := 'progress'; -- Атрибут для прогресса задачи
SRESP_ATTR_TASK_DEPS constant PKG_STD.TSTRING := 'dependencies'; -- Атрибут для зависимостей задачи
SRESP_ATTR_TASK_RO constant PKG_STD.TSTRING := 'readOnly'; -- Атрибут для флага задачи "только для чтения"
SRESP_ATTR_TASK_RO_PRGRS constant PKG_STD.TSTRING := 'readOnlyProgress'; -- Атрибут для флага задачи "прогресс только для чтения"
SRESP_ATTR_TASK_RO_DATES constant PKG_STD.TSTRING := 'readOnlyDates'; -- Атрибут для флага задачи "даты только для чтения"
SRESP_ATTR_TASK_BG_COLOR constant PKG_STD.TSTRING := 'bgColor'; -- Атрибут для цвета заголовка задачи
SRESP_ATTR_TASK_TEXT_COLOR constant PKG_STD.TSTRING := 'textColor'; -- Атрибут для цвета текста задачи
SRESP_ATTR_TASK_BG_PRG_COLOR constant PKG_STD.TSTRING := 'bgProgressColor'; -- Атрибут для цвета прогресса задачи
SRESP_ATTR_TASK_ATTRIBUTES constant PKG_STD.TSTRING := 'taskAttributes'; -- Атрибут для коллекции атрибутов задачи
SRESP_ATTR_TASK_COLORS constant PKG_STD.TSTRING := 'taskColors'; -- Атрибут для коллекции цветов задачи
/* Константы - атрибуты ответов (графики) */
SRESP_ATTR_CHART_LGND_POS constant PKG_STD.TSTRING := 'legendPosition'; -- Атрибут для места размешения легенды графика
SRESP_ATTR_CHART_LABELS constant PKG_STD.TSTRING := 'labels'; -- Атрибут для меток графика
SRESP_ATTR_CHART_DATASETS constant PKG_STD.TSTRING := 'datasets'; -- Атрибут для наборов данных графика
SRESP_ATTR_CHART_DS_LABEL constant PKG_STD.TSTRING := 'label'; -- Атрибут для метки набора данных графика
SRESP_ATTR_CHART_DS_BR_CLR constant PKG_STD.TSTRING := 'borderColor'; -- Атрибут для цвета границы элемента набора данных графика
SRESP_ATTR_CHART_DS_BG_CLR constant PKG_STD.TSTRING := 'backgroundColor'; -- Атрибут для цвета заливки элемента набора данных графика
SRESP_ATTR_CHART_DS_DATA constant PKG_STD.TSTRING := 'data'; -- Атрибут для коллекции значений элементов набора данных
SRESP_ATTR_CHART_DS_ITEMS constant PKG_STD.TSTRING := 'items'; -- Атрибут для коллекции элементов набора данных
SRESP_ATTR_CHART_DS_I_VAL constant PKG_STD.TSTRING := 'value'; -- Атрибут для значения элемента набора данных
/* Константы - атрибуты ответов (циклограмма) */
SRESP_ATTR_CG_TASK_LINE constant PKG_STD.TSTRING := 'lineNumb'; -- Атрибут для номера строки (по оси Y)
SRESP_ATTR_CG_LINE_HEIGHT constant PKG_STD.TSTRING := 'lineHeight'; -- Атрибут для высоты строк
/* Константы - параметры условий отбора */
SCOND_FROM_POSTFIX constant PKG_STD.TSTRING := 'From'; -- Постфикс наименования нижней границы условия отбора
SCOND_TO_POSTFIX constant PKG_STD.TSTRING := 'To'; -- Постфикс наименования верхней границы условия отбора
/* Расчет диапаона выдаваемых записей */
procedure UTL_ROWS_LIMITS_CALC
(
NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
NROW_FROM out number, -- Нижняя граница диапазона
NROW_TO out number -- Верхняя граница диапазона
)
is
begin
if (COALESCE(NPAGE_SIZE, 0) <= 0)
then
NROW_FROM := 1;
NROW_TO := 1000000000;
else
NROW_FROM := COALESCE(NPAGE_NUMBER, 1) * NPAGE_SIZE - NPAGE_SIZE + 1;
NROW_TO := COALESCE(NPAGE_NUMBER, 1) * NPAGE_SIZE;
end if;
end UTL_ROWS_LIMITS_CALC;
/* Формирование наименования условия отбора для нижней границы */
function UTL_COND_NAME_MAKE_FROM
(
SNAME in varchar2 -- Наименование колонки
) return varchar2 -- Результат
is
begin
return SNAME || SCOND_FROM_POSTFIX;
end UTL_COND_NAME_MAKE_FROM;
/* Формирование наименования условия отбора для верхней границы */
function UTL_COND_NAME_MAKE_TO
(
SNAME in varchar2 -- Наименование колонки
) return varchar2 -- Результат
is
begin
return SNAME || SCOND_TO_POSTFIX;
end UTL_COND_NAME_MAKE_TO;
/* Формирование значения */
function TDG_COL_VAL_MAKE
(
SVALUE in varchar2, -- Значение (строка)
NVALUE in number, -- Значение (число)
DVALUE in date -- Значение (дата)
) return TDG_COL_VAL -- Результат работы
is
RRES TDG_COL_VAL; -- Буфер для результата
begin
/* Формируем объект */
RRES.SVALUE := SVALUE;
RRES.NVALUE := NVALUE;
RRES.DVALUE := DVALUE;
/* Возвращаем результат */
return RRES;
end TDG_COL_VAL_MAKE;
/* Добавление значения в коллекцию */
procedure TDG_COL_VALS_ADD
(
RCOL_VALS in out nocopy TDG_COL_VALS, -- Коллекция значений
SVALUE in varchar2 := null, -- Значение (строка)
NVALUE in number := null, -- Значение (число)
DVALUE in date := null, -- Значение (дата)
BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Инициализируем коллекцию если необходимо */
if ((RCOL_VALS is null) or (BCLEAR)) then
RCOL_VALS := TDG_COL_VALS();
end if;
/* Добавляем элемент */
RCOL_VALS.EXTEND();
RCOL_VALS(RCOL_VALS.LAST) := TDG_COL_VAL_MAKE(SVALUE => SVALUE, NVALUE => NVALUE, DVALUE => DVALUE);
end TDG_COL_VALS_ADD;
/* Формирование описания колонки */
function TDG_COL_DEF_MAKE
(
SNAME in varchar2, -- Наименование
SCAPTION in varchar2, -- Заголовок
SDATA_TYPE in varchar2 := SDATA_TYPE_STR, -- Тип данных (см. константы SDATA_TYPE_*)
SCOND_FROM in varchar2 := null, -- Наименование нижней границы условия отбора (null - используется UTL_COND_NAME_MAKE_FROM)
SCOND_TO in varchar2 := null, -- Наименование верхней границы условия отбора (null - используется UTL_COND_NAME_MAKE_TO)
BVISIBLE in boolean := true, -- Разрешить отображение
BORDER in boolean := false, -- Разрешить сортировку
BFILTER in boolean := false, -- Разрешить отбор
RCOL_VALS in TDG_COL_VALS := null, -- Предопределённые значения
SHINT in varchar2 := null, -- Текст всплывающей подсказки
SPARENT in varchar2 := null, -- Наименование родительской колонки
BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних колонок
BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние колонки
NWIDTH in number := null -- Ширина колонки (обязательно для фиксированных)
) return TDG_COL_DEF -- Результат работы
is
RRES TDG_COL_DEF; -- Буфер для результата
begin
/* Формируем объект */
RRES.SNAME := SNAME;
RRES.SCAPTION := SCAPTION;
RRES.SDATA_TYPE := COALESCE(SDATA_TYPE, SDATA_TYPE_STR);
RRES.SCOND_FROM := COALESCE(SCOND_FROM, UTL_COND_NAME_MAKE_FROM(SNAME => SNAME));
RRES.SCOND_TO := COALESCE(SCOND_TO, UTL_COND_NAME_MAKE_TO(SNAME => SNAME));
RRES.BVISIBLE := COALESCE(BVISIBLE, true);
RRES.BORDER := COALESCE(BORDER, false);
RRES.BFILTER := COALESCE(BFILTER, false);
RRES.RCOL_VALS := COALESCE(RCOL_VALS, TDG_COL_VALS());
RRES.SHINT := SHINT;
RRES.SPARENT := SPARENT;
RRES.BEXPANDABLE := COALESCE(BEXPANDABLE, false);
RRES.BEXPANDED := COALESCE(BEXPANDED, true);
RRES.NWIDTH := NWIDTH;
/* Возвращаем результат */
return RRES;
end TDG_COL_DEF_MAKE;
/* Добавление описания колонки в коллекцию */
procedure TDG_COL_DEFS_ADD
(
RCOL_DEFS in out nocopy TDG_COL_DEFS, -- Коллекция описаний колонок
SNAME in varchar2, -- Наименование
SCAPTION in varchar2, -- Заголовок
SDATA_TYPE in varchar2 := SDATA_TYPE_STR, -- Тип данных (см. константы SDATA_TYPE_*)
SCOND_FROM in varchar2 := null, -- Наименование нижней границы условия отбора (null - используется UTL_COND_NAME_MAKE_FROM)
SCOND_TO in varchar2 := null, -- Наименование верхней границы условия отбора (null - используется UTL_COND_NAME_MAKE_TO)
BVISIBLE in boolean := true, -- Разрешить отображение
BORDER in boolean := false, -- Разрешить сортировку
BFILTER in boolean := false, -- Разрешить отбор
RCOL_VALS in TDG_COL_VALS := null, -- Предопределённые значения
SHINT in varchar2 := null, -- Текст всплывающей подсказки
SPARENT in varchar2 := null, -- Наименование родительской колонки
BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних колонок
BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние колонки
NWIDTH in number := null, -- Ширина колонки (обязательно для фиксированных)
BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Инициализируем коллекцию если необходимо */
if ((RCOL_DEFS is null) or (BCLEAR)) then
RCOL_DEFS := TDG_COL_DEFS();
end if;
/* Добавляем элемент */
RCOL_DEFS.EXTEND();
RCOL_DEFS(RCOL_DEFS.LAST) := TDG_COL_DEF_MAKE(SNAME => SNAME,
SCAPTION => SCAPTION,
SDATA_TYPE => SDATA_TYPE,
SCOND_FROM => SCOND_FROM,
SCOND_TO => SCOND_TO,
BVISIBLE => BVISIBLE,
BORDER => BORDER,
BFILTER => BFILTER,
RCOL_VALS => RCOL_VALS,
SHINT => SHINT,
SPARENT => SPARENT,
BEXPANDABLE => BEXPANDABLE,
BEXPANDED => BEXPANDED,
NWIDTH => NWIDTH);
end TDG_COL_DEFS_ADD;
/* Поиск описания колонки по наименованию */
function TDG_COL_DEFS_FIND
(
RCOL_DEFS in TDG_COL_DEFS, -- Описание колонок таблицы данных
SNAME in varchar2 -- Наименование
) return TDG_COL_DEF -- Найденное описание (null - если не нашли)
is
begin
/* Обходим колонки из коллекции описаний */
if ((RCOL_DEFS is not null) and (RCOL_DEFS.COUNT > 0)) then
for I in RCOL_DEFS.FIRST .. RCOL_DEFS.LAST
loop
if (RCOL_DEFS(I).SNAME = SNAME) then
return RCOL_DEFS(I);
end if;
end loop;
end if;
/* Ничего не нашли */
return null;
end TDG_COL_DEFS_FIND;
/* Сериализация описания колонок таблицы данных */
procedure TDG_COL_DEFS_TO_XML
(
RCOL_DEFS in TDG_COL_DEFS -- Описание колонок таблицы данных
)
is
begin
/* Обходим колонки из коллекции */
if ((RCOL_DEFS is not null) and (RCOL_DEFS.COUNT > 0)) then
for I in RCOL_DEFS.FIRST .. RCOL_DEFS.LAST
loop
/* Открываем описание колонки */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_COLUMNS_DEF);
/* Атрибуты колонки */
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_NAME, SVALUE => RCOL_DEFS(I).SNAME);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CAPTION, SVALUE => RCOL_DEFS(I).SCAPTION);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_DATA_TYPE, SVALUE => RCOL_DEFS(I).SDATA_TYPE);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_VISIBLE, BVALUE => RCOL_DEFS(I).BVISIBLE);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_DT_ORDER, BVALUE => RCOL_DEFS(I).BORDER);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_DT_FILTER, BVALUE => RCOL_DEFS(I).BFILTER);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_HINT, SVALUE => RCOL_DEFS(I).SHINT);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_PARENT, SVALUE => RCOL_DEFS(I).SPARENT);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_EXPANDABLE, BVALUE => RCOL_DEFS(I).BEXPANDABLE);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_EXPANDED, BVALUE => RCOL_DEFS(I).BEXPANDED);
if (RCOL_DEFS(I).NWIDTH is not null) then
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_WIDTH, NVALUE => RCOL_DEFS(I).NWIDTH);
end if;
/* Предопределённые значения */
if (RCOL_DEFS(I).RCOL_VALS is not null) and (RCOL_DEFS(I).RCOL_VALS.COUNT > 0) then
for V in RCOL_DEFS(I).RCOL_VALS.FIRST .. RCOL_DEFS(I).RCOL_VALS.LAST
loop
/* Открываем описание предопределённого значения */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_DT_COLUMN_VALUES);
/* Значение */
case RCOL_DEFS(I).SDATA_TYPE
when SDATA_TYPE_STR then
PKG_XFAST.VALUE(SVALUE => RCOL_DEFS(I).RCOL_VALS(V).SVALUE);
when SDATA_TYPE_NUMB then
PKG_XFAST.VALUE(NVALUE => RCOL_DEFS(I).RCOL_VALS(V).NVALUE);
when SDATA_TYPE_DATE then
PKG_XFAST.VALUE(DVALUE => RCOL_DEFS(I).RCOL_VALS(V).DVALUE);
else
P_EXCEPTION(0,
'Описание колонки "%s" таблицы данных содержит неподдерживаемый тип данных ("%s").',
COALESCE(RCOL_DEFS(I).SNAME, '<НЕ ОПРЕДЕЛЕНА>'),
COALESCE(RCOL_DEFS(I).SDATA_TYPE, '<НЕ ОПРЕДЕЛЁН>'));
end case;
/* Закрываем описание предопределённого значения */
PKG_XFAST.UP();
end loop;
end if;
/* Закрываем описание колонки */
PKG_XFAST.UP();
end loop;
end if;
end TDG_COL_DEFS_TO_XML;
/* Формирование колонки */
function TDG_COL_MAKE
(
SNAME in varchar2, -- Наименование колонки
SVALUE in varchar2 := null, -- Значение (строка)
NVALUE in number := null, -- Значение (число)
DVALUE in date := null -- Значение (дата)
) return TDG_COL -- Результат работы
is
RRES TDG_COL; -- Буфер для результата
begin
/* Формируем объект */
RRES.SNAME := SNAME;
RRES.RCOL_VAL := TDG_COL_VAL_MAKE(SVALUE => SVALUE, NVALUE => NVALUE, DVALUE => DVALUE);
/* Возвращаем результат */
return RRES;
end TDG_COL_MAKE;
/* Добавление колонки в коллекцию */
procedure TDG_COLS_ADD
(
RCOLS in out nocopy TDG_COLS, -- Коллекция колонок
SNAME in varchar2, -- Наименование колонки
SVALUE in varchar2 := null, -- Значение (строка)
NVALUE in number := null, -- Значение (число)
DVALUE in date := null, -- Значение (дата)
BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Инициализируем коллекцию если необходимо */
if ((RCOLS is null) or (BCLEAR)) then
RCOLS := TDG_COLS();
end if;
/* Добавляем элемент */
RCOLS.EXTEND();
RCOLS(RCOLS.LAST) := TDG_COL_MAKE(SNAME => SNAME, SVALUE => SVALUE, NVALUE => NVALUE, DVALUE => DVALUE);
end TDG_COLS_ADD;
/* Формирование описания группы */
function TDG_GROUP_MAKE
(
SNAME in varchar2, -- Наименование
SCAPTION in varchar2, -- Заголовок
BEXPANDABLE in boolean := true, -- Разрешить сокрытие/отображение дочерних
BEXPANDED in boolean := true -- Отобразить/скрыть дочерние
) return TDG_GROUP -- Результат работы
is
RRES TDG_GROUP; -- Буфер для результата
begin
/* Формируем объект */
RRES.SNAME := SNAME;
RRES.SCAPTION := SCAPTION;
RRES.BEXPANDABLE := COALESCE(BEXPANDABLE, true);
RRES.BEXPANDED := COALESCE(BEXPANDED, true);
/* Возвращаем результат */
return RRES;
end TDG_GROUP_MAKE;
/* Добавление описания группы в коллекцию */
procedure TDG_GROUPS_ADD
(
RGROUPS in out nocopy TDG_GROUPS, -- Коллекция описаний колонок
SNAME in varchar2, -- Наименование
SCAPTION in varchar2, -- Заголовок
BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних
BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние
BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
BFND boolean := false; -- Флаг наличия группы в коллекции
begin
/* Инициализируем коллекцию если необходимо */
if ((RGROUPS is null) or (BCLEAR)) then
RGROUPS := TDG_GROUPS();
end if;
/* Проверим наличие */
if (RGROUPS.COUNT > 0) then
for I in RGROUPS.FIRST .. RGROUPS.LAST
loop
if (RGROUPS(I).SNAME = SNAME) then
/* Элемент найден - обновим */
BFND := true;
RGROUPS(I) := TDG_GROUP_MAKE(SNAME => SNAME,
SCAPTION => SCAPTION,
BEXPANDABLE => BEXPANDABLE,
BEXPANDED => BEXPANDED);
exit;
end if;
end loop;
end if;
/* Добавляем элемент если такого нет */
if (not BFND) then
RGROUPS.EXTEND();
RGROUPS(RGROUPS.LAST) := TDG_GROUP_MAKE(SNAME => SNAME,
SCAPTION => SCAPTION,
BEXPANDABLE => BEXPANDABLE,
BEXPANDED => BEXPANDED);
end if;
end TDG_GROUPS_ADD;
/* Сериализация описания групп таблицы данных */
procedure TDG_GROUPS_TO_XML
(
RGROUPS in TDG_GROUPS -- Описание групп таблицы данных
)
is
begin
/* Обходим группы из коллекции */
if ((RGROUPS is not null) and (RGROUPS.COUNT > 0)) then
for I in RGROUPS.FIRST .. RGROUPS.LAST
loop
/* Открываем описание группы */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_GROUPS);
/* Атрибуты группы */
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_NAME, SVALUE => RGROUPS(I).SNAME);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CAPTION, SVALUE => RGROUPS(I).SCAPTION);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_EXPANDABLE, BVALUE => RGROUPS(I).BEXPANDABLE);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_EXPANDED, BVALUE => RGROUPS(I).BEXPANDED);
/* Закрываем описание группы */
PKG_XFAST.UP();
end loop;
end if;
end TDG_GROUPS_TO_XML;
/* Формирование строки */
function TDG_ROW_MAKE
(
SGROUP in varchar2 := null -- Наименование группы
)
return TDG_ROW -- Результат работы
is
RRES TDG_ROW; -- Буфер для результата
begin
/* Формируем объект */
RRES.SGROUP := SGROUP;
RRES.RCOLS := TDG_COLS();
/* Возвращаем результат */
return RRES;
end TDG_ROW_MAKE;
/* Добавление колонки к строке */
procedure TDG_ROW_ADD_COL
(
RROW in out nocopy TDG_ROW, -- Строка
SNAME in varchar2, -- Наименование колонки
SVALUE in varchar2 := null, -- Значение (строка)
NVALUE in number := null, -- Значение (число)
DVALUE in date := null, -- Значение (дата)
BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Сформируем колонку и добавим её к коллекции колонок строки */
TDG_COLS_ADD(RCOLS => RROW.RCOLS,
SNAME => SNAME,
SVALUE => SVALUE,
NVALUE => NVALUE,
DVALUE => DVALUE,
BCLEAR => BCLEAR);
end TDG_ROW_ADD_COL;
/* Добавление строковой колонки к строке из курсора динамического запроса */
procedure TDG_ROW_ADD_CUR_COLS
(
RROW in out nocopy TDG_ROW, -- Строка
SNAME in varchar2, -- Наименование колонки
ICURSOR in integer, -- Курсор
NPOSITION in number, -- Номер колонки в курсоре
BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
SVALUE PKG_STD.TLSTRING; -- Буфер для значения курсора
begin
/* Читаем данные из курсора */
PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => NPOSITION, SVALUE => SVALUE);
/* Сформируем колонку и добавим её к коллекции колонок строки */
TDG_COLS_ADD(RCOLS => RROW.RCOLS,
SNAME => SNAME,
SVALUE => SVALUE,
NVALUE => null,
DVALUE => null,
BCLEAR => BCLEAR);
end TDG_ROW_ADD_CUR_COLS;
/* Добавление числовой колонки к строке из курсора динамического запроса */
procedure TDG_ROW_ADD_CUR_COLN
(
RROW in out nocopy TDG_ROW, -- Строка
SNAME in varchar2, -- Наименование колонки
ICURSOR in integer, -- Курсор
NPOSITION in number, -- Номер колонки в курсоре
BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
NVALUE PKG_STD.TLNUMBER; -- Буфер для значения курсора
begin
/* Читаем данные из курсора */
PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => NPOSITION, NVALUE => NVALUE);
/* Сформируем колонку и добавим её к коллекции колонок строки */
TDG_COLS_ADD(RCOLS => RROW.RCOLS,
SNAME => SNAME,
SVALUE => null,
NVALUE => NVALUE,
DVALUE => null,
BCLEAR => BCLEAR);
end TDG_ROW_ADD_CUR_COLN;
/* Добавление колонки типа "дата" к строке из курсора динамического запроса */
procedure TDG_ROW_ADD_CUR_COLD
(
RROW in out nocopy TDG_ROW, -- Строка
SNAME in varchar2, -- Наименование колонки
ICURSOR in integer, -- Курсор
NPOSITION in number, -- Номер колонки в курсоре
BCLEAR in boolean := false -- Флаг очистки коллекции (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
DVALUE PKG_STD.TLDATE; -- Буфер для значения курсора
begin
/* Читаем данные из курсора */
PKG_SQL_DML.COLUMN_VALUE_DATE(ICURSOR => ICURSOR, IPOSITION => NPOSITION, DVALUE => DVALUE);
/* Сформируем колонку и добавим её к коллекции колонок строки */
TDG_COLS_ADD(RCOLS => RROW.RCOLS,
SNAME => SNAME,
SVALUE => null,
NVALUE => null,
DVALUE => DVALUE,
BCLEAR => BCLEAR);
end TDG_ROW_ADD_CUR_COLD;
/* Сериализация строки данных таблицы данных */
procedure TDG_ROWS_TO_XML
(
RCOL_DEFS in TDG_COL_DEFS, -- Описание колонок таблицы данных
RROWS in TDG_ROWS -- Строки таблицы данных
)
is
RCOL_DEF TDG_COL_DEF; -- Описание текущей сериализуемой колонки
begin
/* Обходим строки из коллекции */
if ((RROWS is not null) and (RROWS.COUNT > 0)) then
for I in RROWS.FIRST .. RROWS.LAST
loop
/* Открываем строку */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_ROWS);
/* Если указана группа - добавим её */
if (RROWS(I).SGROUP is not null) then
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_GROUP_NAME, SVALUE => RROWS(I).SGROUP);
end if;
/* Обходим колонки строки */
if ((RROWS(I).RCOLS is not null) and (RROWS(I).RCOLS.COUNT > 0)) then
for J in RROWS(I).RCOLS.FIRST .. RROWS(I).RCOLS.LAST
loop
/* Найдём описание колонки */
RCOL_DEF := TDG_COL_DEFS_FIND(RCOL_DEFS => RCOL_DEFS, SNAME => RROWS(I).RCOLS(J).SNAME);
if (RCOL_DEF.SNAME is null) then
P_EXCEPTION(0,
'Описание колонки "%s" таблицы данных не определено.',
RROWS(I).RCOLS(J).SNAME);
end if;
/* Добавлением значение колонки как атрибут строки */
case RCOL_DEF.SDATA_TYPE
when SDATA_TYPE_STR then
PKG_XFAST.ATTR(SNAME => RROWS(I).RCOLS(J).SNAME, SVALUE => RROWS(I).RCOLS(J).RCOL_VAL.SVALUE);
when SDATA_TYPE_NUMB then
PKG_XFAST.ATTR(SNAME => RROWS(I).RCOLS(J).SNAME, NVALUE => RROWS(I).RCOLS(J).RCOL_VAL.NVALUE);
when SDATA_TYPE_DATE then
PKG_XFAST.ATTR(SNAME => RROWS(I).RCOLS(J).SNAME, DVALUE => RROWS(I).RCOLS(J).RCOL_VAL.DVALUE);
else
P_EXCEPTION(0,
'Описание колонки "%s" таблицы данных содержит неподдерживаемый тип данных ("%s").',
RCOL_DEFS(I).SNAME,
COALESCE(RCOL_DEFS(I).SDATA_TYPE, '<НЕ ОПРЕДЕЛЁН>'));
end case;
end loop;
end if;
/* Закрываем строку */
PKG_XFAST.UP();
end loop;
end if;
end TDG_ROWS_TO_XML;
/* Формирование таблицы данных */
function TDG_MAKE
(
BFIXED_HEADER in boolean := false, -- Зафиксировать заголовок
NFIXED_COLUMNS in number := 0 -- Количество фиксированных колонок
) return TDG -- Результат работы
is
RRES TDG; -- Буфер для результата
begin
/* Формируем объект */
RRES.BFIXED_HEADER := COALESCE(BFIXED_HEADER, false);
RRES.NFIXED_COLUMNS := COALESCE(NFIXED_COLUMNS, 0);
RRES.RCOL_DEFS := TDG_COL_DEFS();
RRES.RGROUPS := TDG_GROUPS();
RRES.RROWS := TDG_ROWS();
/* Возвращаем результат */
return RRES;
end TDG_MAKE;
/* Поиск описания колонки в таблице данных по наименованию */
function TDG_FIND_COL_DEF
(
RDATA_GRID in TDG, -- Описание таблицы данных
SNAME in varchar2 -- Наименование колонки
) return TDG_COL_DEF -- Найденное описание (null - если не нашли)
is
begin
return TDG_COL_DEFS_FIND(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, SNAME => SNAME);
end TDG_FIND_COL_DEF;
/* Добавление описания колонки к таблице данных */
procedure TDG_ADD_COL_DEF
(
RDATA_GRID in out nocopy TDG, -- Описание таблицы данных
SNAME in varchar2, -- Наименование колонки
SCAPTION in varchar2, -- Заголовок колонки
SDATA_TYPE in varchar2 := SDATA_TYPE_STR, -- Тип данных колонки (см. константы SDATA_TYPE_*)
SCOND_FROM in varchar2 := null, -- Наименование нижней границы условия отбора (null - используется UTL_COND_NAME_MAKE_FROM)
SCOND_TO in varchar2 := null, -- Наименование верхней границы условия отбора (null - используется UTL_COND_NAME_MAKE_TO)
BVISIBLE in boolean := true, -- Разрешить отображение
BORDER in boolean := false, -- Разрешить сортировку по колонке
BFILTER in boolean := false, -- Разрешить отбор по колонке
RCOL_VALS in TDG_COL_VALS := null, -- Предопределённые значения колонки
SHINT in varchar2 := null, -- Текст всплывающей подсказки
SPARENT in varchar2 := null, -- Наименование родительской колонки
BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних колонок
BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние колонки
NWIDTH in number := null, -- Ширина колонки (обязательно для фиксированных)
BCLEAR in boolean := false -- Флаг очистки коллекции описаний колонок таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Формируем описание и добавляем в коллекцию таблицы данных */
TDG_COL_DEFS_ADD(RCOL_DEFS => RDATA_GRID.RCOL_DEFS,
SNAME => SNAME,
SCAPTION => SCAPTION,
SDATA_TYPE => SDATA_TYPE,
SCOND_FROM => SCOND_FROM,
SCOND_TO => SCOND_TO,
BVISIBLE => BVISIBLE,
BORDER => BORDER,
BFILTER => BFILTER,
RCOL_VALS => RCOL_VALS,
SHINT => SHINT,
SPARENT => SPARENT,
BEXPANDABLE => BEXPANDABLE,
BEXPANDED => BEXPANDED,
NWIDTH => NWIDTH,
BCLEAR => BCLEAR);
end TDG_ADD_COL_DEF;
/* Добавление описания группы к таблице данных */
procedure TDG_ADD_GROUP
(
RDATA_GRID in out nocopy TDG, -- Описание таблицы данных
SNAME in varchar2, -- Наименование группы
SCAPTION in varchar2, -- Заголовок группы
BEXPANDABLE in boolean := false, -- Разрешить сокрытие/отображение дочерних
BEXPANDED in boolean := true, -- Отобразить/скрыть дочерние
BCLEAR in boolean := false -- Флаг очистки коллекции описаний групп таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Формируем описание и добавляем в коллекцию таблицы данных */
TDG_GROUPS_ADD(RGROUPS => RDATA_GRID.RGROUPS,
SNAME => SNAME,
SCAPTION => SCAPTION,
BEXPANDABLE => BEXPANDABLE,
BEXPANDED => BEXPANDED,
BCLEAR => BCLEAR);
end TDG_ADD_GROUP;
/* Добавление описания колонки к таблице данных */
procedure TDG_ADD_ROW
(
RDATA_GRID in out nocopy TDG, -- Описание таблицы данных
RROW in TDG_ROW, -- Строка
BCLEAR in boolean := false -- Флаг очистки коллекции строк таблицы данных (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Инициализируем коллекцию если необходимо */
if ((RDATA_GRID.RROWS is null) or (BCLEAR)) then
RDATA_GRID.RROWS := TDG_ROWS();
end if;
/* Добавляем элемент */
RDATA_GRID.RROWS.EXTEND();
RDATA_GRID.RROWS(RDATA_GRID.RROWS.LAST) := RROW;
end TDG_ADD_ROW;
/* Сериализация описания таблицы данных */
procedure TDG_DEF_TO_XML
(
RDATA_GRID in TDG -- Описание таблицы данных
)
is
begin
/*атические атрибуты заголовка */
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_FIXED_HEADER, BVALUE => RDATA_GRID.BFIXED_HEADER);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_FIXED_COLUMNS, NVALUE => RDATA_GRID.NFIXED_COLUMNS);
end TDG_DEF_TO_XML;
/* Сериализация таблицы данных */
function TDG_TO_XML
(
RDATA_GRID in TDG, -- Описание таблицы данных
NINCLUDE_DEF in number := 1 -- Включить описание колонок (0 - нет, 1 - да)
) return clob -- XML-описание
is
CRES clob; -- Буфер для результата
begin
/* Начинаем формирование XML */
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
/* Открываем корень */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XDATA);
/* Открываем таблицу данных */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XDATA_GRID);
/* Формируем описание таблицы данных */
TDG_DEF_TO_XML(RDATA_GRID => RDATA_GRID);
/* Если необходимо включить описание колонок */
if (NINCLUDE_DEF = 1) then
TDG_COL_DEFS_TO_XML(RCOL_DEFS => RDATA_GRID.RCOL_DEFS);
end if;
/* Формируем описание групп */
TDG_GROUPS_TO_XML(RGROUPS => RDATA_GRID.RGROUPS);
/* Формируем описание строк */
TDG_ROWS_TO_XML(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, RROWS => RDATA_GRID.RROWS);
/* Закрываем таблицу данных */
PKG_XFAST.UP();
/* Закрываем корень */
PKG_XFAST.UP();
/* Сериализуем */
CRES := PKG_XFAST.SERIALIZE_TO_CLOB();
/* Завершаем формирование XML */
PKG_XFAST.EPILOGUE();
/* Возвращаем полученное */
return CRES;
exception
when others then
/* Завершаем формирование XML */
PKG_XFAST.EPILOGUE();
/* Вернем ошибку */
PKG_STATE.DIAGNOSTICS_STACKED();
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
end TDG_TO_XML;
/* Конвертация значений фильтра в число */
procedure TDG_FILTER_TO_NUMBER
(
RFILTER in TDG_FILTER, -- Фильтр
NFROM out number, -- Значение нижней границы диапазона
NTO out number -- Значение верхней границы диапазона
)
is
begin
/* Нижняя граница диапазона */
if (RFILTER.SFROM is not null) then
begin
NFROM := PKG_P8PANELS_BASE.UTL_S2N(SVALUE => RFILTER.SFROM);
exception
when others then
P_EXCEPTION(0,
'Неверный формат числа (%s) в указанной нижней границе диапазона фильтра.',
RFILTER.SFROM);
end;
end if;
/* Верхняя граница диапазона */
if (RFILTER.STO is not null) then
begin
NTO := PKG_P8PANELS_BASE.UTL_S2N(SVALUE => RFILTER.STO);
exception
when others then
P_EXCEPTION(0,
'Неверный формат числа (%s) в указанной верхней границе диапазона фильтра.',
RFILTER.STO);
end;
end if;
end TDG_FILTER_TO_NUMBER;
/* Конвертация значений фильтра в дату */
procedure TDG_FILTER_TO_DATE
(
RFILTER in TDG_FILTER, -- Фильтр
DFROM out date, -- Значение нижней границы диапазона
DTO out date -- Значение верхней границы диапазона
)
is
begin
/* Нижняя граница диапазона */
if (RFILTER.SFROM is not null) then
begin
DFROM := PKG_P8PANELS_BASE.UTL_S2D(SVALUE => RFILTER.SFROM);
exception
when others then
P_EXCEPTION(0,
'Неверный формат даты (%s) в указанной нижней границе диапазона фильтра.',
RFILTER.SFROM);
end;
end if;
/* Верхняя граница диапазона */
if (RFILTER.STO is not null) then
begin
DTO := PKG_P8PANELS_BASE.UTL_S2D(SVALUE => RFILTER.STO);
exception
when others then
P_EXCEPTION(0,
'Неверный формат даты (%s) в указанной верхней границе диапазона фильтра.',
RFILTER.STO);
end;
end if;
end TDG_FILTER_TO_DATE;
/* Формирование фильтра */
function TDG_FILTER_MAKE
(
SNAME in varchar2, -- Наименование
SFROM in varchar2, -- Значение "с"
STO in varchar2 -- Значение "по"
) return TDG_FILTER -- Результат работы
is
RRES TDG_FILTER; -- Буфер для результата
begin
/* Формируем объект */
RRES.SNAME := SNAME;
RRES.SFROM := SFROM;
RRES.STO := STO;
/* Возвращаем результат */
return RRES;
end TDG_FILTER_MAKE;
/* Поиск фильтра в коллекции */
function TDG_FILTERS_FIND
(
RFILTERS in TDG_FILTERS, -- Коллекция фильтров
SNAME in varchar2 -- Наименование
) return TDG_FILTER -- Найденный фильтр (null - если не нашли)
is
begin
/* Обходим фильтры из коллекции */
if ((RFILTERS is not null) and (RFILTERS.COUNT > 0)) then
for I in RFILTERS.FIRST .. RFILTERS.LAST
loop
if (RFILTERS(I).SNAME = SNAME) then
return RFILTERS(I);
end if;
end loop;
end if;
/* Ничего не нашли */
return null;
end TDG_FILTERS_FIND;
/* Десериализация фильтров */
function TDG_FILTERS_FROM_XML
(
CFILTERS in clob -- Сериализованное представление фильтров (BASE64(<filters><name>ИМЯ</name><from>ЗНАЧЕНИЕ</from><to>ЗНАЧЕНИЕ</to></filters>...))
) return TDG_FILTERS -- Результат работы
is
RFILTERS TDG_FILTERS; -- Буфер для результата работы
XDOC PKG_XPATH.TDOCUMENT; -- Документ XML
XROOT PKG_XPATH.TNODE; -- Корень документа XML
XNODE PKG_XPATH.TNODE; -- Буфер узла документа
XNODES PKG_XPATH.TNODES; -- Буфер коллекции узлов документа
begin
/* Вернём выходную коллекцию */
RFILTERS := TDG_FILTERS();
/* Разбираем XML */
XDOC := PKG_XPATH.PARSE_FROM_CLOB(LCXML => '<' || SRQ_TAG_XROOT || '>' ||
BLOB2CLOB(LBDATA => BASE64_DECODE(LCSRCE => CFILTERS),
SCHARSET => PKG_CHARSET.CHARSET_UTF_()) || '</' ||
SRQ_TAG_XROOT || '>');
/* Считываем корневой узел */
XROOT := PKG_XPATH.ROOT_NODE(RDOCUMENT => XDOC);
/* Считывание списка записей */
XNODES := PKG_XPATH.LIST_NODES(RPARENT_NODE => XROOT, SPATTERN => '/' || SRQ_TAG_XROOT || '/' || SRQ_TAG_XFILTERS);
/* Цикл по списку записией */
for I in 1 .. PKG_XPATH.COUNT_NODES(RNODES => XNODES)
loop
/* Считаем элемент по его номеру */
XNODE := PKG_XPATH.ITEM_NODE(RNODES => XNODES, INUMBER => I);
/* Добавим его в коллекцию */
RFILTERS.EXTEND();
RFILTERS(RFILTERS.LAST) := TDG_FILTER_MAKE(SNAME => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_SNAME),
SFROM => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_SFROM),
STO => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_STO));
end loop;
/* Освободим документ */
PKG_XPATH.FREE(RDOCUMENT => XDOC);
/* Вернём результат */
return RFILTERS;
exception
when others then
/* Освободим документ */
PKG_XPATH.FREE(RDOCUMENT => XDOC);
/* Вернем ошибку */
PKG_STATE.DIAGNOSTICS_STACKED();
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
end TDG_FILTERS_FROM_XML;
/* Применение параметров фильтрации в запросе */
procedure TDG_FILTERS_SET_QUERY
(
NIDENT in number, -- Идентификатор отбора
NCOMPANY in number, -- Рег. номер организации
NPARENT in number := null, -- Рег. номер родителя
SUNIT in varchar2, -- Код раздела
SPROCEDURE in varchar2, -- Наименование серверной процедуры отбора
RDATA_GRID in TDG, -- Описание таблицы данных
RFILTERS in TDG_FILTERS -- Коллекция фильтров
)
is
RCOL_DEF TDG_COL_DEF; -- Описание текущей фильтруемой колонки
BENUM boolean; -- Флаг начиличия перечисляемых значений
NFROM PKG_STD.TLNUMBER; -- Буфер для верхней границы диапазона отбора чисел
NTO PKG_STD.TLNUMBER; -- Буфер для нижней границы диапазона отбора чисел
DFROM PKG_STD.TLDATE; -- Буфер для верхней границы диапазона отбора дат
DTO PKG_STD.TLDATE; -- Буфер для нижней границы диапазона отбора дат
begin
/* Формирование условий отбора - Пролог */
PKG_COND_BROKER.PROLOGUE(IMODE => PKG_COND_BROKER.MODE_SMART_, NIDENT => NIDENT);
/* Формирование условий отбора - Установка процедуры серверного отбора */
PKG_COND_BROKER.SET_PROCEDURE(SPROCEDURE_NAME => SPROCEDURE);
/* Формирование условий отбора - Установка раздела */
PKG_COND_BROKER.SET_UNIT(SUNITCODE => SUNIT);
/* Формирование условий отбора - Установка организации */
PKG_COND_BROKER.SET_COMPANY(NCOMPANY => NCOMPANY);
/* Формирование условий отбора - Установка родителя */
if (NPARENT is not null) then
PKG_COND_BROKER.SET_PARENT(NPARENT => NPARENT);
end if;
/* Обходим фильтр, если задан */
if ((RFILTERS is not null) and (RFILTERS.COUNT > 0)) then
for I in RFILTERS.FIRST .. RFILTERS.LAST
loop
/* Найдем фильтруемую колонку в описании */
RCOL_DEF := TDG_COL_DEFS_FIND(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, SNAME => RFILTERS(I).SNAME);
if (RCOL_DEF.SNAME is not null) then
/* Определимся с наличием перечисляемых значений */
if ((RCOL_DEF.RCOL_VALS is not null) and (RCOL_DEF.RCOL_VALS.COUNT > 0)) then
BENUM := true;
else
BENUM := false;
end if;
/* Установим для неё условие отобра согласно типу данных */
case RCOL_DEF.SDATA_TYPE
when SDATA_TYPE_STR then
begin
if (BENUM) then
PKG_COND_BROKER.SET_CONDITION_ESTR(SCONDITION_NAME => RCOL_DEF.SCOND_FROM,
SCONDITION_ESTR => RFILTERS(I).SFROM,
ICASE_INSENSITIVE => 1);
else
PKG_COND_BROKER.SET_CONDITION_STR(SCONDITION_NAME => RCOL_DEF.SCOND_FROM,
SCONDITION_VALUE => RFILTERS(I).SFROM,
ICASE_INSENSITIVE => 1);
end if;
end;
when SDATA_TYPE_NUMB then
begin
if (BENUM) then
PKG_COND_BROKER.SET_CONDITION_ENUM(SCONDITION_NAME => RCOL_DEF.SCOND_FROM,
SCONDITION_ENUM => RFILTERS(I).SFROM);
else
TDG_FILTER_TO_NUMBER(RFILTER => RFILTERS(I), NFROM => NFROM, NTO => NTO);
if (NFROM is not null) then
PKG_COND_BROKER.SET_CONDITION_NUM(SCONDITION_NAME => RCOL_DEF.SCOND_FROM,
NCONDITION_VALUE => NFROM);
end if;
if (NTO is not null) then
PKG_COND_BROKER.SET_CONDITION_NUM(SCONDITION_NAME => RCOL_DEF.SCOND_TO, NCONDITION_VALUE => NTO);
end if;
end if;
end;
when SDATA_TYPE_DATE then
begin
if (BENUM) then
PKG_COND_BROKER.SET_CONDITION_EDATE(SCONDITION_NAME => RCOL_DEF.SCOND_FROM,
SCONDITION_EDATE => RFILTERS(I).SFROM);
else
TDG_FILTER_TO_DATE(RFILTER => RFILTERS(I), DFROM => DFROM, DTO => DTO);
if (DFROM is not null) then
PKG_COND_BROKER.SET_CONDITION_DATE(SCONDITION_NAME => RCOL_DEF.SCOND_FROM,
DCONDITION_VALUE => DFROM);
end if;
if (DTO is not null) then
PKG_COND_BROKER.SET_CONDITION_DATE(SCONDITION_NAME => RCOL_DEF.SCOND_TO, DCONDITION_VALUE => DTO);
end if;
end if;
end;
else
P_EXCEPTION(0,
'Описание колонки "%s" таблицы данных содержит неподдерживаемый тип данных ("%s").',
RCOL_DEF.SNAME,
COALESCE(RCOL_DEF.SDATA_TYPE, '<НЕ ОПРЕДЕЛЁН>'));
end case;
end if;
end loop;
end if;
/* Формирование условий отбора - Эпилог */
PKG_COND_BROKER.EPILOGUE();
end TDG_FILTERS_SET_QUERY;
/* Формирование сортировки */
function TDG_ORDER_MAKE
(
SNAME in varchar2, -- Наименование
SDIRECTION in varchar2 -- Направление (см. константы SORDER_DIRECTION_*)
) return TDG_ORDER -- Результат работы
is
RRES TDG_ORDER; -- Буфер для результата
begin
/* Формируем объект */
RRES.SNAME := SNAME;
RRES.SDIRECTION := SDIRECTION;
/* Возвращаем результат */
return RRES;
end TDG_ORDER_MAKE;
/* Десериализация сортировок */
function TDG_ORDERS_FROM_XML
(
CORDERS in clob -- Сериализованное представление сотрировок (BASE64(<orders><name>ИМЯ</name><direction>ASC/DESC</direction></orders>...))
) return TDG_ORDERS -- Результат работы
is
RORDERS TDG_ORDERS; -- Буфер для результата работы
XDOC PKG_XPATH.TDOCUMENT; -- Документ XML
XROOT PKG_XPATH.TNODE; -- Корень документа XML
XNODE PKG_XPATH.TNODE; -- Буфер узла документа
XNODES PKG_XPATH.TNODES; -- Буфер коллекции узлов документа
begin
/* Инициализируем выходную коллекцию */
RORDERS := TDG_ORDERS();
/* Разбираем XML */
XDOC := PKG_XPATH.PARSE_FROM_CLOB(LCXML => '<' || SRQ_TAG_XROOT || '>' ||
BLOB2CLOB(LBDATA => BASE64_DECODE(LCSRCE => CORDERS),
SCHARSET => PKG_CHARSET.CHARSET_UTF_()) || '</' ||
SRQ_TAG_XROOT || '>');
/* Считываем корневой узел */
XROOT := PKG_XPATH.ROOT_NODE(RDOCUMENT => XDOC);
/* Считывание списка записей */
XNODES := PKG_XPATH.LIST_NODES(RPARENT_NODE => XROOT, SPATTERN => '/' || SRQ_TAG_XROOT || '/' || SRQ_TAG_XORDERS);
/* Цикл по списку записией */
for I in 1 .. PKG_XPATH.COUNT_NODES(RNODES => XNODES)
loop
/* Считаем элемент по его номеру */
XNODE := PKG_XPATH.ITEM_NODE(RNODES => XNODES, INUMBER => I);
/* Добавим его в коллекцию */
RORDERS.EXTEND();
RORDERS(RORDERS.LAST) := TDG_ORDER_MAKE(SNAME => PKG_XPATH.VALUE(RNODE => XNODE, SPATTERN => SRQ_TAG_SNAME),
SDIRECTION => PKG_XPATH.VALUE(RNODE => XNODE,
SPATTERN => SRQ_TAG_SDIRECTION));
end loop;
/* Освободим документ */
PKG_XPATH.FREE(RDOCUMENT => XDOC);
/* Вернём результат */
return RORDERS;
exception
when others then
/* Освободим документ */
PKG_XPATH.FREE(RDOCUMENT => XDOC);
/* Вернем ошибку */
PKG_STATE.DIAGNOSTICS_STACKED();
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
end TDG_ORDERS_FROM_XML;
/* Применение параметров сортировки в запросе */
procedure TDG_ORDERS_SET_QUERY
(
RDATA_GRID in TDG, -- Описание таблицы
RORDERS in TDG_ORDERS, -- Коллекция сортировок
SPATTERN in varchar2, -- Шаблон для подстановки условий отбора в запрос
CSQL in out nocopy clob -- Буфер запроса
)
is
CSQL_ORDERS clob; -- Буфер для условий сортировки в запросе
begin
/* Если сортировка задана */
if ((RORDERS is not null) and (RORDERS.COUNT > 0)) then
CSQL_ORDERS := ' order by ';
for I in RORDERS.FIRST .. RORDERS.LAST
loop
/* Перед добавлением в запрос - обязательная проверка, чтобы избежать SQL-инъекций */
if ((TDG_COL_DEFS_FIND(RCOL_DEFS => RDATA_GRID.RCOL_DEFS, SNAME => RORDERS(I).SNAME).SNAME is not null) and
(RORDERS(I).SDIRECTION in (SORDER_DIRECTION_ASC, SORDER_DIRECTION_DESC))) then
CSQL_ORDERS := CSQL_ORDERS || RORDERS(I).SNAME || ' ' || RORDERS(I).SDIRECTION;
if (I < RORDERS.LAST) then
CSQL_ORDERS := CSQL_ORDERS || ', ';
end if;
end if;
end loop;
end if;
CSQL := replace(CSQL, SPATTERN, CSQL_ORDERS);
end TDG_ORDERS_SET_QUERY;
/* Проверка корректности наименования дополнительного атрибута задачи диаграммы Ганта */
procedure TGANTT_TASK_ATTR_NAME_CHECK
(
SNAME in varchar2 -- Наименование
)
is
begin
if (SNAME in (SRESP_ATTR_ID,
SRESP_ATTR_RN,
SRESP_ATTR_NUMB,
SRESP_ATTR_CAPTION,
SRESP_ATTR_FULL_NAME,
SRESP_ATTR_START,
SRESP_ATTR_END,
SRESP_ATTR_TASK_PROGRESS,
SRESP_ATTR_TASK_BG_COLOR,
SRESP_ATTR_TASK_TEXT_COLOR,
SRESP_ATTR_TASK_RO,
SRESP_ATTR_TASK_RO_PRGRS,
SRESP_ATTR_TASK_RO_DATES,
SRESP_ATTR_TASK_DEPS)) then
P_EXCEPTION(0,
'Наименование атрибута "%s" является зарезервированным.',
SNAME);
end if;
end TGANTT_TASK_ATTR_NAME_CHECK;
/* Поиск атрибута задачи диаграммы Ганта по наименованию */
function TGANTT_TASK_ATTR_FIND
(
RTASK_ATTRS in TGANTT_TASK_ATTRS, -- Описание атрибутов задачи диаграммы Ганта
SNAME in varchar2 -- Наименование
) return TGANTT_TASK_ATTR -- Найденное описание (null - если не нашли)
is
begin
/* Обходим атрибуты из описания */
if ((RTASK_ATTRS is not null) and (RTASK_ATTRS.COUNT > 0)) then
for I in RTASK_ATTRS.FIRST .. RTASK_ATTRS.LAST
loop
if (RTASK_ATTRS(I).SNAME = SNAME) then
return RTASK_ATTRS(I);
end if;
end loop;
end if;
/* Ничего не нашли */
return null;
end TGANTT_TASK_ATTR_FIND;
/* Поиск цвета задачи диаграммы Ганта по параметрам */
function TGANTT_TASK_COLOR_FIND
(
RTASK_COLORS in TGANTT_TASK_COLORS, -- Описание цветов задачи диаграммы Ганта
SBG_COLOR in varchar2 := null, -- Цвет заливки задачи (формат - HTML-цвет, #RRGGBBAA)
STEXT_COLOR in varchar2 := null, -- Цвет текста заголовка задачи (формат - HTML-цвет, #RRGGBBAA)
SBG_PROGRESS_COLOR in varchar2 := null -- Цвет заливки прогресса (формат - HTML-цвет, #RRGGBBAA)
) return TGANTT_TASK_COLOR -- Найденное описание цвета (null - если не нашли)
is
begin
/* Обходим цвета из описания */
if ((RTASK_COLORS is not null) and (RTASK_COLORS.COUNT > 0)) then
for I in RTASK_COLORS.FIRST .. RTASK_COLORS.LAST
loop
if ((CMP_VC2(V1 => RTASK_COLORS(I).SBG_COLOR, V2 => SBG_COLOR) = 1) and
(CMP_VC2(V1 => RTASK_COLORS(I).STEXT_COLOR, V2 => STEXT_COLOR) = 1) and
(CMP_VC2(V1 => RTASK_COLORS(I).SBG_PROGRESS_COLOR, V2 => SBG_PROGRESS_COLOR) = 1))
then
return RTASK_COLORS(I);
end if;
end loop;
end if;
/* Ничего не нашли */
return null;
end TGANTT_TASK_COLOR_FIND;
/* Формирование задачи для диаграммы Ганта */
function TGANTT_TASK_MAKE
(
NRN in number, -- Рег. номер
SNUMB in varchar2, -- Номер
SCAPTION in varchar2, -- Заголовок
SNAME in varchar2, -- Наименование
DSTART in date, -- Дата начала
DEND in date, -- Дата окончания
NPROGRESS in number := null, -- Прогресс (% готовности) задачи (null - не определен)
SBG_COLOR in varchar2 := null, -- Цвет заливки задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
STEXT_COLOR in varchar2 := null, -- Цвет текста заголовка задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
SBG_PROGRESS_COLOR in varchar2 := null, -- Цвет заливки прогресса (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
BREAD_ONLY in boolean := null, -- Сроки и прогресс задачи только для чтения (null - как указано в описании диаграммы)
BREAD_ONLY_DATES in boolean := null, -- Сроки задачи только для чтения (null - как указано в описании диаграммы)
BREAD_ONLY_PROGRESS in boolean := null -- Прогресс задачи только для чтения (null - как указано в описании диаграммы)
) return TGANTT_TASK -- Результат работы
is
RRES TGANTT_TASK; -- Буфер для результата
begin
/* Проверим параметры */
if ((NRN is null) or (SNUMB is null) or (SCAPTION is null) or (SNAME is null) or (DSTART is null) or (DEND is null)) then
P_EXCEPTION(0,
'Регистрационный номер, номер, заголовок, наименование, даты начала и окончания являются обязательными при создании задачи для диаграммы Ганта.');
end if;
if ((NPROGRESS is not null) and (not (NPROGRESS between 0 and 100))) then
P_EXCEPTION(0, 'Прогресс задачи должен быть значением от 0 до 100');
end if;
/* Формируем объект */
RRES.NRN := NRN;
RRES.SNUMB := SNUMB;
RRES.SCAPTION := SCAPTION;
RRES.SNAME := SNAME;
RRES.DSTART := DSTART;
RRES.DEND := DEND;
RRES.NPROGRESS := NPROGRESS;
RRES.SBG_COLOR := SBG_COLOR;
RRES.STEXT_COLOR := STEXT_COLOR;
RRES.SBG_PROGRESS_COLOR := SBG_PROGRESS_COLOR;
RRES.BREAD_ONLY := BREAD_ONLY;
RRES.BREAD_ONLY_DATES := BREAD_ONLY_DATES;
RRES.BREAD_ONLY_PROGRESS := BREAD_ONLY_PROGRESS;
RRES.RATTR_VALS := TGANTT_TASK_ATTR_VALS();
RRES.RDEPENDENCIES := TGANTT_TASK_DEPENDENCIES();
/* Возвращаем результат */
return RRES;
end TGANTT_TASK_MAKE;
/* Добавление значения атрибута к задаче диаграммы Ганта */
procedure TGANTT_TASK_ADD_ATTR_VAL
(
RGANTT in TGANTT, -- Описание диаграммы
RTASK in out nocopy TGANTT_TASK, -- Описание задачи
SNAME in varchar2, -- Наименование
SVALUE in varchar2, -- Значение
BCLEAR in boolean := false -- Флаг очистки коллекции значений атрибутов (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Проверим наименование */
TGANTT_TASK_ATTR_NAME_CHECK(SNAME => SNAME);
/* Проверим, что такой атрибут зарегистрирован */
if (TGANTT_TASK_ATTR_FIND(RTASK_ATTRS => RGANTT.RTASK_ATTRS, SNAME => SNAME).SNAME is null) then
P_EXCEPTION(0,
'Атрибут "%s" задачи диаграммы Ганта не зарегистрирован.',
SNAME);
end if;
/* Инициализируем коллекцию если необходимо */
if ((RTASK.RATTR_VALS is null) or (BCLEAR)) then
RTASK.RATTR_VALS := TGANTT_TASK_ATTR_VALS();
end if;
/* Добавляем элемент */
RTASK.RATTR_VALS.EXTEND();
RTASK.RATTR_VALS(RTASK.RATTR_VALS.LAST).SNAME := SNAME;
RTASK.RATTR_VALS(RTASK.RATTR_VALS.LAST).SVALUE := SVALUE;
end TGANTT_TASK_ADD_ATTR_VAL;
/* Добавление предшествующей задачи к задаче диаграммы Ганта */
procedure TGANTT_TASK_ADD_DEPENDENCY
(
RTASK in out nocopy TGANTT_TASK, -- Описание задачи
NDEPENDENCY in number, -- Рег. номер предшествующей задачи
BCLEAR in boolean := false -- Флаг очистки коллекции предшествущих задач (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Инициализируем коллекцию если необходимо */
if ((RTASK.RDEPENDENCIES is null) or (BCLEAR)) then
RTASK.RDEPENDENCIES := TGANTT_TASK_DEPENDENCIES();
end if;
/* Добавляем элемент */
RTASK.RDEPENDENCIES.EXTEND();
RTASK.RDEPENDENCIES(RTASK.RDEPENDENCIES.LAST) := NDEPENDENCY;
end TGANTT_TASK_ADD_DEPENDENCY;
/* Сериализация описания задач диаграммы Ганта */
procedure TGANTT_TASKS_TO_XML
(
RTASKS in TGANTT_TASKS -- Коллекция задач диаграммы Ганта
)
is
begin
/* Обходим задачи из коллекции */
if ((RTASKS is not null) and (RTASKS.COUNT > 0)) then
for I in RTASKS.FIRST .. RTASKS.LAST
loop
/* Открываем строку */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_TASKS);
/* Статические тарибуты */
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_ID, SVALUE => 'taskId' || RTASKS(I).NRN);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_RN, NVALUE => RTASKS(I).NRN);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_NUMB, SVALUE => RTASKS(I).SNUMB);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_NAME, SVALUE => RTASKS(I).SCAPTION);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_FULL_NAME, SVALUE => RTASKS(I).SNAME);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_START, DVALUE => RTASKS(I).DSTART);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_END, DVALUE => RTASKS(I).DEND);
if (RTASKS(I).NPROGRESS is not null) then
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_PROGRESS, NVALUE => RTASKS(I).NPROGRESS);
end if;
if (RTASKS(I).SBG_COLOR is not null) then
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_BG_COLOR, SVALUE => RTASKS(I).SBG_COLOR);
end if;
if (RTASKS(I).STEXT_COLOR is not null) then
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_TEXT_COLOR, SVALUE => RTASKS(I).STEXT_COLOR);
end if;
if (RTASKS(I).SBG_PROGRESS_COLOR is not null) then
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_BG_PRG_COLOR, SVALUE => RTASKS(I).SBG_PROGRESS_COLOR);
end if;
if (RTASKS(I).BREAD_ONLY is not null) then
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_RO, BVALUE => RTASKS(I).BREAD_ONLY);
end if;
if (RTASKS(I).BREAD_ONLY_DATES is not null) then
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_RO_DATES, BVALUE => RTASKS(I).BREAD_ONLY_DATES);
end if;
if (RTASKS(I).BREAD_ONLY_PROGRESS is not null) then
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_RO_PRGRS, BVALUE => RTASKS(I).BREAD_ONLY_PROGRESS);
end if;
/* Динамические атрибуты */
if ((RTASKS(I).RATTR_VALS is not null) and (RTASKS(I).RATTR_VALS.COUNT > 0)) then
for J in RTASKS(I).RATTR_VALS.FIRST .. RTASKS(I).RATTR_VALS.LAST
loop
PKG_XFAST.ATTR(SNAME => RTASKS(I).RATTR_VALS(J).SNAME, SVALUE => RTASKS(I).RATTR_VALS(J).SVALUE);
end loop;
end if;
/* Зависимости */
if ((RTASKS(I).RDEPENDENCIES is not null) and (RTASKS(I).RDEPENDENCIES.COUNT > 0)) then
for J in RTASKS(I).RDEPENDENCIES.FIRST .. RTASKS(I).RDEPENDENCIES.LAST
loop
PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_TASK_DEPS);
PKG_XFAST.VALUE(SVALUE => 'taskId' || TO_CHAR(RTASKS(I).RDEPENDENCIES(J)));
PKG_XFAST.UP();
end loop;
end if;
/* Закрываем задачу */
PKG_XFAST.UP();
end loop;
end if;
end TGANTT_TASKS_TO_XML;
/* Формирование диаграммы Ганта */
function TGANTT_MAKE
(
STITLE in varchar2 := null, -- Заголовок (null - не отображать)
NZOOM in number := NGANTT_ZOOM_WEEK, -- Текущий масштаб (см. константы NGANTT_ZOOM_*)
BZOOM_BAR in boolean := true, -- Обображать панель масштабирования
BREAD_ONLY in boolean := false, -- Сроки и прогресс задач только для чтения
BREAD_ONLY_DATES in boolean := false, -- Сроки задач только для чтения
BREAD_ONLY_PROGRESS in boolean := false -- Прогресс задач только для чтения
) return TGANTT -- Результат работы
is
RRES TGANTT; -- Буфер для результата
begin
/* Формируем объект */
RRES.STITLE := STITLE;
RRES.NZOOM := COALESCE(NZOOM, NGANTT_ZOOM_WEEK);
RRES.BZOOM_BAR := COALESCE(BZOOM_BAR, true);
RRES.BREAD_ONLY := COALESCE(BREAD_ONLY, false);
RRES.BREAD_ONLY_DATES := COALESCE(BREAD_ONLY_DATES, false);
RRES.BREAD_ONLY_PROGRESS := COALESCE(BREAD_ONLY_PROGRESS, false);
RRES.RTASK_ATTRS := TGANTT_TASK_ATTRS();
RRES.RTASK_COLORS := TGANTT_TASK_COLORS();
RRES.RTASKS := TGANTT_TASKS();
/* Возвращаем результат */
return RRES;
end TGANTT_MAKE;
/* Добавление описания атрибута карточки задачи диаграммы Ганта */
procedure TGANTT_ADD_TASK_ATTR
(
RGANTT in out nocopy TGANTT, -- Описание диаграммы Ганта
SNAME in varchar2, -- Наименование
SCAPTION in varchar2, -- Заголовок
BVISIBLE boolean := true, -- Разрешить отображение
BCLEAR in boolean := false -- Флаг очистки коллекции атрибутов (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Проверим наименование */
TGANTT_TASK_ATTR_NAME_CHECK(SNAME => SNAME);
/* Проверим, что такого ещё нет */
if (TGANTT_TASK_ATTR_FIND(RTASK_ATTRS => RGANTT.RTASK_ATTRS, SNAME => SNAME).SNAME is not null) then
P_EXCEPTION(0,
'Атрибут "%s" задачи диаграммы Ганта уже зарегистрирован.',
SNAME);
end if;
/* Инициализируем коллекцию если необходимо */
if ((RGANTT.RTASK_ATTRS is null) or (BCLEAR)) then
RGANTT.RTASK_ATTRS := TGANTT_TASK_ATTRS();
end if;
/* Добавляем элемент */
RGANTT.RTASK_ATTRS.EXTEND();
RGANTT.RTASK_ATTRS(RGANTT.RTASK_ATTRS.LAST).SNAME := SNAME;
RGANTT.RTASK_ATTRS(RGANTT.RTASK_ATTRS.LAST).SCAPTION := SCAPTION;
RGANTT.RTASK_ATTRS(RGANTT.RTASK_ATTRS.LAST).BVISIBLE := BVISIBLE;
end TGANTT_ADD_TASK_ATTR;
/* Добавление описания цвета задачи диаграммы Ганта */
procedure TGANTT_ADD_TASK_COLOR
(
RGANTT in out nocopy TGANTT, -- Описание диаграммы Ганта
SBG_COLOR in varchar2 := null, -- Цвет заливки задачи (формат - HTML-цвет, #RRGGBBAA)
STEXT_COLOR in varchar2 := null, -- Цвет текста заголовка задачи (формат - HTML-цвет, #RRGGBBAA)
SBG_PROGRESS_COLOR in varchar2 := null, -- Цвет заливки прогресса (формат - HTML-цвет, #RRGGBBAA)
SDESC in varchar2, -- Описание
BCLEAR in boolean := false -- Флаг очистки коллекции цветов (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Проверим параметры */
if ((SBG_COLOR is null) and (STEXT_COLOR is null) and (SBG_PROGRESS_COLOR is null)) then
P_EXCEPTION(0,
'Должен быть указан цвет заливки или цвет текста задачи, или цвет заливки прогресса.');
end if;
if (SDESC is null) then
P_EXCEPTION(0, 'Описание цвета должно быть задано.');
end if;
/* Проверим, что такого ещё нет */
if (TGANTT_TASK_COLOR_FIND(RTASK_COLORS => RGANTT.RTASK_COLORS, SBG_COLOR => SBG_COLOR, STEXT_COLOR => STEXT_COLOR, SBG_PROGRESS_COLOR => SBG_PROGRESS_COLOR)
.SDESC is not null) then
P_EXCEPTION(0,
'Такое описание цвета для задачи диаграммы Ганта уже зарегистрировано.');
end if;
/* Инициализируем коллекцию если необходимо */
if ((RGANTT.RTASK_COLORS is null) or (BCLEAR)) then
RGANTT.RTASK_COLORS := TGANTT_TASK_COLORS();
end if;
/* Добавляем элемент */
RGANTT.RTASK_COLORS.EXTEND();
RGANTT.RTASK_COLORS(RGANTT.RTASK_COLORS.LAST).SBG_COLOR := SBG_COLOR;
RGANTT.RTASK_COLORS(RGANTT.RTASK_COLORS.LAST).STEXT_COLOR := STEXT_COLOR;
RGANTT.RTASK_COLORS(RGANTT.RTASK_COLORS.LAST).SBG_PROGRESS_COLOR := SBG_PROGRESS_COLOR;
RGANTT.RTASK_COLORS(RGANTT.RTASK_COLORS.LAST).SDESC := SDESC;
end TGANTT_ADD_TASK_COLOR;
/* Добавление задачи к диаграмме Ганта */
procedure TGANTT_ADD_TASK
(
RGANTT in out nocopy TGANTT, -- Описание диаграммы Ганта
RTASK in TGANTT_TASK, -- Задача
BCLEAR in boolean := false -- Флаг очистки коллекции задач диаграммы (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Инициализируем коллекцию если необходимо */
if ((RGANTT.RTASKS is null) or (BCLEAR)) then
RGANTT.RTASKS := TGANTT_TASKS();
end if;
/* Добавляем элемент */
RGANTT.RTASKS.EXTEND();
RGANTT.RTASKS(RGANTT.RTASKS.LAST) := RTASK;
end TGANTT_ADD_TASK;
/* Сериализация описания заголовка диаграммы Ганта */
procedure TGANTT_DEF_TO_XML
(
RGANTT in TGANTT -- Описание диаграммы Ганта
)
is
begin
/*атические атрибуты заголовка */
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TITLE, SVALUE => RGANTT.STITLE);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_ZOOM, NVALUE => RGANTT.NZOOM);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_ZOOM_BAR, BVALUE => RGANTT.BZOOM_BAR);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_RO, BVALUE => RGANTT.BREAD_ONLY);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_RO_DATES, BVALUE => RGANTT.BREAD_ONLY_DATES);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_RO_PRGRS, BVALUE => RGANTT.BREAD_ONLY_PROGRESS);
/* Если есть динамические атрибуты */
if ((RGANTT.RTASK_ATTRS is not null) and (RGANTT.RTASK_ATTRS.COUNT > 0)) then
/* Обходим динамические атрибуты задачи */
for I in RGANTT.RTASK_ATTRS.FIRST .. RGANTT.RTASK_ATTRS.LAST
loop
/* Открываем динамический атрибут задачи */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_TASK_ATTRIBUTES);
/* Наполняем его атрибутами */
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_NAME, SVALUE => RGANTT.RTASK_ATTRS(I).SNAME);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CAPTION, SVALUE => RGANTT.RTASK_ATTRS(I).SCAPTION);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_VISIBLE, BVALUE => RGANTT.RTASK_ATTRS(I).BVISIBLE);
/* Закрываем динамический атрибут задачи */
PKG_XFAST.UP();
end loop;
end if;
/* Если есть описание цветов */
if ((RGANTT.RTASK_COLORS is not null) and (RGANTT.RTASK_COLORS.COUNT > 0)) then
/* Обходим описание цветов задачи */
for I in RGANTT.RTASK_COLORS.FIRST .. RGANTT.RTASK_COLORS.LAST
loop
/* Открываем описание цвета задачи */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_TASK_COLORS);
/* Наполняем его атрибутами */
if (RGANTT.RTASK_COLORS(I).SBG_COLOR is not null) then
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_BG_COLOR, SVALUE => RGANTT.RTASK_COLORS(I).SBG_COLOR);
end if;
if (RGANTT.RTASK_COLORS(I).STEXT_COLOR is not null) then
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_TEXT_COLOR, SVALUE => RGANTT.RTASK_COLORS(I).STEXT_COLOR);
end if;
if (RGANTT.RTASK_COLORS(I).SBG_PROGRESS_COLOR is not null) then
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_BG_PRG_COLOR, SVALUE => RGANTT.RTASK_COLORS(I).SBG_PROGRESS_COLOR);
end if;
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_DESC, SVALUE => RGANTT.RTASK_COLORS(I).SDESC);
/* Закрываем описание цвета задачи */
PKG_XFAST.UP();
end loop;
end if;
end TGANTT_DEF_TO_XML;
/* Сериализация диаграммы Ганта */
function TGANTT_TO_XML
(
RGANTT in TGANTT, -- Описание диаграммы Ганта
NINCLUDE_DEF in number := 1 -- Включить описание заголовка (0 - нет, 1 - да)
) return clob -- XML-описание
is
CRES clob; -- Буфер для результата
begin
/* Начинаем формирование XML */
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
/* Открываем корень */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XDATA);
/* Открываем диаграмму Ганта */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XGANTT);
/* Если необходимо включить описание колонок */
if (NINCLUDE_DEF = 1) then
TGANTT_DEF_TO_XML(RGANTT => RGANTT);
end if;
/* Формируем описание задач */
TGANTT_TASKS_TO_XML(RTASKS => RGANTT.RTASKS);
/* Закрываем диаграмму Ганта */
PKG_XFAST.UP();
/* Закрываем корень */
PKG_XFAST.UP();
/* Сериализуем */
CRES := PKG_XFAST.SERIALIZE_TO_CLOB();
/* Завершаем формирование XML */
PKG_XFAST.EPILOGUE();
/* Возвращаем полученное */
return CRES;
exception
when others then
/* Завершаем формирование XML */
PKG_XFAST.EPILOGUE();
/* Вернем ошибку */
PKG_STATE.DIAGNOSTICS_STACKED();
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
end TGANTT_TO_XML;
/* Проверка корректности наименования дополнительного атрибута элемента данных графика */
procedure TCHART_DATASET_ITEM_ATTR_NM_CH
(
SNAME in varchar2 -- Наименование
)
is
begin
if (SNAME in (SRESP_ATTR_CHART_DS_I_VAL)) then
P_EXCEPTION(0,
'Наименование атрибута "%s" является зарезервированным.',
SNAME);
end if;
end TCHART_DATASET_ITEM_ATTR_NM_CH;
/* Сериализация меток графика */
procedure TCHART_LABELS_TO_XML
(
RLABELS in TCHART_LABELS -- Описание диаграммы Ганта
)
is
begin
/* Если есть метки */
if ((RLABELS is not null) and (RLABELS.COUNT > 0)) then
/* Обходим метки */
for I in RLABELS.FIRST .. RLABELS.LAST
loop
/* Открываем описание метки */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_CHART_LABELS);
/* Добавляем значение */
PKG_XFAST.VALUE(SVALUE => RLABELS(I));
/* Закрываем описание метки */
PKG_XFAST.UP();
end loop;
end if;
end TCHART_LABELS_TO_XML;
/* Добавление дополнительного атрибута элемента данных графика */
procedure TCHART_DATASET_ITM_ATTR_VL_ADD
(
RATTR_VALS in out nocopy TCHART_DATASET_ITEM_ATTR_VALS, -- Коллекция дополнительных атрибутов элемента данных графика
SNAME PKG_STD.TSTRING, -- Наименование
SVALUE PKG_STD.TSTRING, -- Значение
BCLEAR in boolean := false -- Флаг очистки коллекции дополнительных атрибутов элемента данных (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Проверим корректность наименования */
TCHART_DATASET_ITEM_ATTR_NM_CH(SNAME => SNAME);
/* Инициализируем коллекцию если необходимо */
if ((RATTR_VALS is null) or (BCLEAR)) then
RATTR_VALS := TCHART_DATASET_ITEM_ATTR_VALS();
end if;
/* Добавляем элемент */
RATTR_VALS.EXTEND();
RATTR_VALS(RATTR_VALS.LAST).SNAME := SNAME;
RATTR_VALS(RATTR_VALS.LAST).SVALUE := SVALUE;
end TCHART_DATASET_ITM_ATTR_VL_ADD;
/* Формирование набора данных графика */
function TCHART_DATASET_MAKE
(
SCAPTION in varchar2, -- Заголовок
SBORDER_COLOR in varchar2 := null, -- Цвет границы элемента данных на графике (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
SBG_COLOR in varchar2 := null -- Цвет заливки элемента данных на графике (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
) return TCHART_DATASET -- Результат работы
is
RRES TCHART_DATASET; -- Буфер для результата
begin
/* Формируем объект */
RRES.SCAPTION := SCAPTION;
RRES.SBORDER_COLOR := SBORDER_COLOR;
RRES.SBG_COLOR := SBG_COLOR;
RRES.RITEMS := TCHART_DATASET_ITEMS();
/* Возвращаем результат */
return RRES;
end TCHART_DATASET_MAKE;
/* Добавление элемента в набор данных графика */
procedure TCHART_DATASET_ADD_ITEM
(
RDATASET in out nocopy TCHART_DATASET, -- Описание набора данных графика
NVALUE in number, -- Значение элемента данных, отображаемое на графике
RATTR_VALS in TCHART_DATASET_ITEM_ATTR_VALS := null, -- Значения дополнительных атрбутов (null - дополнительные атрибуты не определены)
BCLEAR in boolean := false -- Флаг очистки коллекции элементов набора данных (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Инициализируем коллекцию если необходимо */
if ((RDATASET.RITEMS is null) or (BCLEAR)) then
RDATASET.RITEMS := TCHART_DATASET_ITEMS();
end if;
/* Добавляем элемент */
RDATASET.RITEMS.EXTEND();
RDATASET.RITEMS(RDATASET.RITEMS.LAST).NVALUE := NVALUE;
RDATASET.RITEMS(RDATASET.RITEMS.LAST).RATTR_VALS := RATTR_VALS;
end TCHART_DATASET_ADD_ITEM;
/* Сериализация коллекции наборов данных графика */
procedure TCHART_DATASETS_TO_XML
(
RDATASETS in TCHART_DATASETS -- Наборы данных графика
)
is
begin
/* Если есть наборы данных */
if ((RDATASETS is not null) and (RDATASETS.COUNT > 0)) then
/* Обходим наборы данных */
for I in RDATASETS.FIRST .. RDATASETS.LAST
loop
/* Открываем набор данных */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_CHART_DATASETS);
/* Добавляем статические атрибуты */
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CHART_DS_LABEL, SVALUE => RDATASETS(I).SCAPTION);
if (RDATASETS(I).SBORDER_COLOR is not null) then
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CHART_DS_BR_CLR, SVALUE => RDATASETS(I).SBORDER_COLOR);
end if;
if (RDATASETS(I).SBG_COLOR is not null) then
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CHART_DS_BG_CLR, SVALUE => RDATASETS(I).SBG_COLOR);
end if;
/* Если в наборе данных есть элементы */
if ((RDATASETS(I).RITEMS is not null) and (RDATASETS(I).RITEMS.COUNT > 0)) then
/* Обходим элементы набора данных для формирования отображаемых значений */
for J in RDATASETS(I).RITEMS.FIRST .. RDATASETS(I).RITEMS.LAST
loop
/* Открываем значение элемента набора данных */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_CHART_DS_DATA);
/* Формируем значение элемента */
PKG_XFAST.VALUE(NVALUE => RDATASETS(I).RITEMS(J).NVALUE);
/* Закрываем значение элемента набора данных */
PKG_XFAST.UP();
end loop;
/* Обходим элементы набора данных для формирования из самих */
for J in RDATASETS(I).RITEMS.FIRST .. RDATASETS(I).RITEMS.LAST
loop
/* Открываем элемент набора данных */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_CHART_DS_ITEMS);
/* Добавляем статические атрибуты */
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CHART_DS_I_VAL, NVALUE => RDATASETS(I).RITEMS(J).NVALUE);
/* Добавляем дополнительные атрибуты */
if ((RDATASETS(I).RITEMS(J).RATTR_VALS is not null) and (RDATASETS(I).RITEMS(J).RATTR_VALS.COUNT > 0)) then
for K in RDATASETS(I).RITEMS(J).RATTR_VALS.FIRST .. RDATASETS(I).RITEMS(J).RATTR_VALS.LAST
loop
PKG_XFAST.ATTR(SNAME => RDATASETS(I).RITEMS(J).RATTR_VALS(K).SNAME,
SVALUE => RDATASETS(I).RITEMS(J).RATTR_VALS(K).SVALUE);
end loop;
end if;
/* Закрываем элемент набора данных */
PKG_XFAST.UP();
end loop;
end if;
/* Закрываем набор данных */
PKG_XFAST.UP();
end loop;
end if;
end TCHART_DATASETS_TO_XML;
/* Формирование графика */
function TCHART_MAKE
(
STYPE in varchar2, -- Тип (см. константы SCHART_TYPE_*)
STITLE in varchar2 := null, -- Заголовок (null - не отображать)
SLGND_POS in varchar2 := null -- Расположение легенды (null - не отображать, см. константы SCHART_LGND_POS_*)
) return TCHART -- Результат работы
is
RRES TCHART; -- Буфер для результата
begin
/* Формируем объект */
RRES.STYPE := STYPE;
RRES.STITLE := STITLE;
RRES.SLGND_POS := SLGND_POS;
RRES.RLABELS := TCHART_LABELS();
RRES.RDATASETS := TCHART_DATASETS();
/* Возвращаем результат */
return RRES;
end TCHART_MAKE;
/* Добавление метки значения графика */
procedure TCHART_ADD_LABEL
(
RCHART in out nocopy TCHART, -- Описание графика
SLABEL in varchar2, -- Метка значения
BCLEAR in boolean := false -- Флаг очистки коллекции меток (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Инициализируем коллекцию если необходимо */
if ((RCHART.RLABELS is null) or (BCLEAR)) then
RCHART.RLABELS := TCHART_LABELS();
end if;
/* Добавляем элемент */
RCHART.RLABELS.EXTEND();
RCHART.RLABELS(RCHART.RLABELS.LAST) := SLABEL;
end TCHART_ADD_LABEL;
/* Добавление набора данных графика */
procedure TCHART_ADD_DATASET
(
RCHART in out nocopy TCHART, -- Описание графика
RDATASET in TCHART_DATASET, -- Набор данных
BCLEAR in boolean := false -- Флаг очистки коллекции наборов данных (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Инициализируем коллекцию если необходимо */
if ((RCHART.RDATASETS is null) or (BCLEAR)) then
RCHART.RDATASETS := TCHART_DATASETS();
end if;
/* Добавляем элемент */
RCHART.RDATASETS.EXTEND();
RCHART.RDATASETS(RCHART.RDATASETS.LAST) := RDATASET;
end TCHART_ADD_DATASET;
/* Сериализация описания заголовка графика */
procedure TCHART_DEF_TO_XML
(
RCHART in TCHART -- Описание графика
)
is
begin
/*атические атрибуты заголовка */
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TYPE, SVALUE => RCHART.STYPE);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TITLE, SVALUE => RCHART.STITLE);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CHART_LGND_POS, SVALUE => RCHART.SLGND_POS);
end TCHART_DEF_TO_XML;
/* Сериализация графика */
function TCHART_TO_XML
(
RCHART in TCHART, -- Описание графика
NINCLUDE_DEF in number := 1 -- Включить описание заголовка (0 - нет, 1 - да)
) return clob -- XML-описание
is
CRES clob; -- Буфер для результата
begin
/* Начинаем формирование XML */
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
/* Открываем корень */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XDATA);
/* Открываем график */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XCHART);
/* Если необходимо включить описание колонок */
if (NINCLUDE_DEF = 1) then
TCHART_DEF_TO_XML(RCHART => RCHART);
end if;
/* Формируем описание меток */
TCHART_LABELS_TO_XML(RLABELS => RCHART.RLABELS);
/* Формируем описание наборов данных */
TCHART_DATASETS_TO_XML(RDATASETS => RCHART.RDATASETS);
/* Закрываем график */
PKG_XFAST.UP();
/* Закрываем корень */
PKG_XFAST.UP();
/* Сериализуем */
CRES := PKG_XFAST.SERIALIZE_TO_CLOB();
/* Завершаем формирование XML */
PKG_XFAST.EPILOGUE();
/* Возвращаем полученное */
return CRES;
exception
when others then
/* Завершаем формирование XML */
PKG_XFAST.EPILOGUE();
/* Вернем ошибку */
PKG_STATE.DIAGNOSTICS_STACKED();
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
end TCHART_TO_XML;
/* Формирование колонки циклограммы */
function TCYCLOGRAM_COLUMN_MAKE
(
SNAME in varchar2, -- Заголовок колонки
NSTART in number, -- Позиция начала колонки
NEND in number -- Позиция конца колонки
) return TCYCLOGRAM_COLUMN -- Результат работы
is
RRES TCYCLOGRAM_COLUMN; -- Буфер для результата
begin
/* Формируем объект */
RRES.SNAME := SNAME;
RRES.NSTART := NSTART;
RRES.NEND := NEND;
/* Возвращаем результат */
return RRES;
end TCYCLOGRAM_COLUMN_MAKE;
/* Добавление колонки циклограммы в коллекцию */
procedure TCYCLOGRAM_COLUMNS_ADD
(
RCOLUMNS in out nocopy TCYCLOGRAM_COLUMNS, -- Коллекция колонок циклограммы
SNAME in varchar2, -- Наименование колонки
NSTART in number, -- Позиция начала колонки
NEND in number, -- Позиция конца колонки
BCLEAR in boolean := false -- Флаг очистки коллекции колонок (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Инициализируем коллекцию если необходимо */
if ((RCOLUMNS is null) or (BCLEAR)) then
RCOLUMNS := TCYCLOGRAM_COLUMNS();
end if;
/* Добавляем элемент */
RCOLUMNS.EXTEND();
RCOLUMNS(RCOLUMNS.LAST) := TCYCLOGRAM_COLUMN_MAKE(SNAME => SNAME, NSTART => NSTART, NEND => NEND);
end TCYCLOGRAM_COLUMNS_ADD;
/* Формирование группы циклограммы */
function TCYCLOGRAM_GROUP_MAKE
(
SNAME in varchar2, -- Имя группы
BHEADER_VISIBLE in boolean := true, -- Признак отображения заголовка группы
NHEADER_HEIGHT in number := NCYCLOGRAM_GROUP_DEF_HEIGHT, -- Высота заголовка группы
NHEADER_WIDTH in number := NCYCLOGRAM_GROUP_DEF_WIDTH, -- Ширина заголовка группы
SHIGHLIGHT_COLOR in varchar2 := null -- Цвет при наведении (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
) return TCYCLOGRAM_GROUP -- Результат работы
is
RRES TCYCLOGRAM_GROUP; -- Буфер для результата
begin
/* Формируем объект */
RRES.SNAME := SNAME;
RRES.BHEADER_VISIBLE := BHEADER_VISIBLE;
RRES.NHEADER_HEIGHT := NHEADER_HEIGHT;
RRES.NHEADER_WIDTH := NHEADER_WIDTH;
RRES.SHIGHLIGHT_COLOR := SHIGHLIGHT_COLOR;
/* Возвращаем результат */
return RRES;
end TCYCLOGRAM_GROUP_MAKE;
/* Поиск группы циклограммы по наименованию */
function TCYCLOGRAM_GROUP_FIND
(
RGROUPS in TCYCLOGRAM_GROUPS, -- Описание групп циклограммы
SNAME in varchar2 -- Наименование
) return TCYCLOGRAM_GROUP -- Найденное описание группы (null - если не нашли)
is
begin
/* Обходим группы из описания */
if ((RGROUPS is not null) and (RGROUPS.COUNT > 0)) then
for I in RGROUPS.FIRST .. RGROUPS.LAST
loop
if (RGROUPS(I).SNAME = SNAME) then
return RGROUPS(I);
end if;
end loop;
end if;
/* Ничего не нашли */
return null;
end TCYCLOGRAM_GROUP_FIND;
/* Сериализация описания групп циклограммы */
procedure TCYCLOGRAM_GROUPS_TO_XML
(
RGROUPS in TCYCLOGRAM_GROUPS -- Коллекция групп циклограммы
)
is
begin
/* Обходим группы из коллекции */
if ((RGROUPS is not null) and (RGROUPS.COUNT > 0)) then
for I in RGROUPS.FIRST .. RGROUPS.LAST
loop
/* Открываем описание группы */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_GROUPS);
/* Атрибуты группы */
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_NAME, SVALUE => RGROUPS(I).SNAME);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_VISIBLE, BVALUE => RGROUPS(I).BHEADER_VISIBLE);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_HEIGHT, NVALUE => RGROUPS(I).NHEADER_HEIGHT);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_WIDTH, NVALUE => RGROUPS(I).NHEADER_WIDTH);
if (RGROUPS(I).SHIGHLIGHT_COLOR is not null) then
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_HL_COLOR, SVALUE => RGROUPS(I).SHIGHLIGHT_COLOR);
end if;
/* Закрываем описание группы */
PKG_XFAST.UP();
end loop;
end if;
end TCYCLOGRAM_GROUPS_TO_XML;
/* Проверка наличия группы в циклограмме */
function TCYCLOGRAM_TASK_GROUP_CHECK
(
RGROUPS in TCYCLOGRAM_GROUPS, -- Описание групп циклограммы
SNAME in varchar2 -- Наименование
) return TCYCLOGRAM_GROUP -- Найденное описание группы (null - если не нашли)
is
begin
/* Обходим группы из описания */
if ((RGROUPS is not null) and (RGROUPS.COUNT > 0)) then
for I in RGROUPS.FIRST .. RGROUPS.LAST
loop
if (RGROUPS(I).SNAME = SNAME) then
return RGROUPS(I);
end if;
end loop;
end if;
/* Ничего не нашли */
return null;
end TCYCLOGRAM_TASK_GROUP_CHECK;
/* Формирование задачи циклограммы */
function TCYCLOGRAM_TASK_MAKE
(
NRN in number, -- Рег. номер записи
SCAPTION in varchar2, -- Заголовок
SNAME in varchar2, -- Наименование
NLINE_NUMB in number, -- Номер строки
NSTART in number, -- Позиция начала задачи
NEND in number, -- Позиция конца задачи
SGROUP in varchar2 := null, -- Наименование группы
SBG_COLOR in varchar2 := null, -- Цвет заливки задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
STEXT_COLOR in varchar2 := null, -- Цвет текста заголовка задачи (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
SHIGHLIGHT_COLOR in varchar2 := null -- Цвет при наведении (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
) return TCYCLOGRAM_TASK -- Результат работы
is
RRES TCYCLOGRAM_TASK; -- Буфер для результата
begin
/* Формируем объект */
RRES.NRN := NRN;
RRES.SCAPTION := SCAPTION;
RRES.SNAME := SNAME;
RRES.NLINE_NUMB := NLINE_NUMB;
RRES.NSTART := NSTART;
RRES.NEND := NEND;
RRES.SGROUP := SGROUP;
RRES.SBG_COLOR := SBG_COLOR;
RRES.STEXT_COLOR := STEXT_COLOR;
RRES.SHIGHLIGHT_COLOR := SHIGHLIGHT_COLOR;
/* Возвращаем результат */
return RRES;
end TCYCLOGRAM_TASK_MAKE;
/* Проверка корректности наименования дополнительного атрибута задачи циклограммы */
procedure TCYCLOGRAM_TASK_ATTR_NAME_CH
(
SNAME in varchar2 -- Наименование
)
is
begin
if (SNAME in (SRESP_ATTR_ID,
SRESP_ATTR_RN,
SRESP_ATTR_CAPTION,
SRESP_ATTR_FULL_NAME,
SRESP_ATTR_START,
SRESP_ATTR_END,
SRESP_ATTR_CG_TASK_LINE,
SRESP_ATTR_GROUP_NAME,
SRESP_ATTR_TASK_BG_COLOR,
SRESP_ATTR_TASK_TEXT_COLOR,
SRESP_ATTR_HL_COLOR)) then
P_EXCEPTION(0,
'Наименование атрибута "%s" является зарезервированным.',
SNAME);
end if;
end TCYCLOGRAM_TASK_ATTR_NAME_CH;
/* Поиск атрибута задачи циклограммы по наименованию */
function TCYCLOGRAM_TASK_ATTR_FIND
(
RTASK_ATTRS in TCYCLOGRAM_TASK_ATTRS, -- Описание атрибутов задачи циклограммы
SNAME in varchar2 -- Наименование
) return TCYCLOGRAM_TASK_ATTR -- Найденное описание (null - если не нашли)
is
begin
/* Обходим атрибуты из описания */
if ((RTASK_ATTRS is not null) and (RTASK_ATTRS.COUNT > 0)) then
for I in RTASK_ATTRS.FIRST .. RTASK_ATTRS.LAST
loop
if (RTASK_ATTRS(I).SNAME = SNAME) then
return RTASK_ATTRS(I);
end if;
end loop;
end if;
/* Ничего не нашли */
return null;
end TCYCLOGRAM_TASK_ATTR_FIND;
/* Добавление значения атрибута к задаче циклограммы */
procedure TCYCLOGRAM_TASK_ADD_ATTR_VAL
(
RCYCLOGRAM in TCYCLOGRAM, -- Описание циклограммы
RTASK in out nocopy TCYCLOGRAM_TASK, -- Описание задачи
SNAME in varchar2, -- Наименование
SVALUE in varchar2, -- Значение
BCLEAR in boolean := false -- Флаг очистки коллекции значений атрибутов (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Проверим наименование */
TCYCLOGRAM_TASK_ATTR_NAME_CH(SNAME => SNAME);
/* Проверим, что такой атрибут зарегистрирован */
if (TCYCLOGRAM_TASK_ATTR_FIND(RTASK_ATTRS => RCYCLOGRAM.RTASK_ATTRS, SNAME => SNAME).SNAME is null) then
P_EXCEPTION(0,
'Атрибут "%s" задачи циклограммы не зарегистрирован.',
SNAME);
end if;
/* Инициализируем коллекцию если необходимо */
if ((RTASK.RATTR_VALS is null) or (BCLEAR)) then
RTASK.RATTR_VALS := TCYCLOGRAM_TASK_ATTR_VALS();
end if;
/* Добавляем элемент */
RTASK.RATTR_VALS.EXTEND();
RTASK.RATTR_VALS(RTASK.RATTR_VALS.LAST).SNAME := SNAME;
RTASK.RATTR_VALS(RTASK.RATTR_VALS.LAST).SVALUE := SVALUE;
end TCYCLOGRAM_TASK_ADD_ATTR_VAL;
/* Сериализация описания задач группы циклограммы */
procedure TCYCLOGRAM_TASKS_TO_XML
(
RTASKS in TCYCLOGRAM_TASKS -- Коллекция задач группы циклограммы
)
is
begin
/* Обходим задачи из коллекции */
if ((RTASKS is not null) and (RTASKS.COUNT > 0)) then
for I in RTASKS.FIRST .. RTASKS.LAST
loop
/* Открываем строку */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_TASKS);
/* Статические тарибуты */
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_ID, SVALUE => 'taskId' || RTASKS(I).NRN);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_RN, NVALUE => RTASKS(I).NRN);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_NAME, SVALUE => RTASKS(I).SCAPTION);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_FULL_NAME, SVALUE => RTASKS(I).SNAME);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CG_TASK_LINE, NVALUE => RTASKS(I).NLINE_NUMB);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_START, NVALUE => RTASKS(I).NSTART);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_END, NVALUE => RTASKS(I).NEND);
if (RTASKS(I).SGROUP is not null) then
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_GROUP_NAME, SVALUE => RTASKS(I).SGROUP);
end if;
if (RTASKS(I).SBG_COLOR is not null) then
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_BG_COLOR, SVALUE => RTASKS(I).SBG_COLOR);
end if;
if (RTASKS(I).STEXT_COLOR is not null) then
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TASK_TEXT_COLOR, SVALUE => RTASKS(I).STEXT_COLOR);
end if;
if (RTASKS(I).SHIGHLIGHT_COLOR is not null) then
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_HL_COLOR, SVALUE => RTASKS(I).SHIGHLIGHT_COLOR);
end if;
/* Динамические атрибуты */
if ((RTASKS(I).RATTR_VALS is not null) and (RTASKS(I).RATTR_VALS.COUNT > 0)) then
for J in RTASKS(I).RATTR_VALS.FIRST .. RTASKS(I).RATTR_VALS.LAST
loop
PKG_XFAST.ATTR(SNAME => RTASKS(I).RATTR_VALS(J).SNAME, SVALUE => RTASKS(I).RATTR_VALS(J).SVALUE);
end loop;
end if;
/* Закрываем задачу */
PKG_XFAST.UP();
end loop;
end if;
end TCYCLOGRAM_TASKS_TO_XML;
/* Формирование циклограммы */
function TCYCLOGRAM_MAKE
(
STITLE in varchar2, -- Заголовок (null - не отображать)
NLINE_HEIGHT in number := NCYCLOGRAM_LINE_HEIGHT, -- Высота строк
NZOOM in number := NCYCLOGRAM_ZOOM_DEFAULT, -- Текущий масштаб (см. константы NCYCLOGRAM_ZOOM_*)
BZOOM_BAR in boolean := true -- Обображать панель масштабирования
) return TCYCLOGRAM -- Результат работы
is
RRES TCYCLOGRAM; -- Буфер для результата
begin
/* Формируем объект */
RRES.STITLE := STITLE;
RRES.NLINE_HEIGHT := NLINE_HEIGHT;
RRES.NZOOM := NZOOM;
RRES.BZOOM_BAR := BZOOM_BAR;
/* Возвращаем результат */
return RRES;
end TCYCLOGRAM_MAKE;
/* Добавление колонки в циклограмму */
procedure TCYCLOGRAM_ADD_COLUMN
(
RCYCLOGRAM in out nocopy TCYCLOGRAM, -- Описание циклограммы
SNAME in varchar2, -- Заголовок колонки
NSTART in number, -- Позиция начала колонки
NEND in number, -- Позиция конца колонки
BCLEAR in boolean := false -- Флаг очистки коллекции колонок (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Формируем описание и добавляем в коллекцию колонок */
TCYCLOGRAM_COLUMNS_ADD(RCOLUMNS => RCYCLOGRAM.RCOLUMNS,
SNAME => SNAME,
NSTART => NSTART,
NEND => NEND,
BCLEAR => BCLEAR);
end TCYCLOGRAM_ADD_COLUMN;
/* Добавление группы в циклограмму */
procedure TCYCLOGRAM_ADD_GROUP
(
RCYCLOGRAM in out nocopy TCYCLOGRAM, -- Описание циклограммы
SNAME in varchar2, -- Имя группы
BHEADER_VISIBLE in boolean := true, -- Признак отображения заголовка группы
NHEADER_HEIGHT in number := NCYCLOGRAM_GROUP_DEF_HEIGHT, -- Высота заголовка группы
NHEADER_WIDTH in number := NCYCLOGRAM_GROUP_DEF_WIDTH, -- Ширина заголовка группы
SHIGHLIGHT_COLOR in varchar2 := null, -- Цвет при наведении (null - использовать цвет по умолчанию из стилей, формат - HTML-цвет, #RRGGBBAA)
BCLEAR in boolean := false -- Флаг очистки коллекции групп (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Проверяем наличие группы в циклограмме */
if (TCYCLOGRAM_GROUP_FIND(RGROUPS => RCYCLOGRAM.RGROUPS, SNAME => SNAME).SNAME is null) then
/* Инициализируем коллекцию если необходимо */
if ((RCYCLOGRAM.RGROUPS is null) or (BCLEAR)) then
RCYCLOGRAM.RGROUPS := TCYCLOGRAM_GROUPS();
end if;
/* Добавляем элемент */
RCYCLOGRAM.RGROUPS.EXTEND();
RCYCLOGRAM.RGROUPS(RCYCLOGRAM.RGROUPS.LAST) := TCYCLOGRAM_GROUP_MAKE(SNAME => SNAME,
BHEADER_VISIBLE => BHEADER_VISIBLE,
NHEADER_HEIGHT => NHEADER_HEIGHT,
NHEADER_WIDTH => NHEADER_WIDTH,
SHIGHLIGHT_COLOR => SHIGHLIGHT_COLOR);
end if;
end TCYCLOGRAM_ADD_GROUP;
/* Добавление задачи в циклограммы */
procedure TCYCLOGRAM_ADD_TASK
(
RCYCLOGRAM in out nocopy TCYCLOGRAM, -- Описание циклограммы
RTASK in TCYCLOGRAM_TASK, -- Задача циклограммы
BCLEAR in boolean := false -- Флаг очистки коллекции задач (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Инициализируем коллекцию если необходимо */
if ((RCYCLOGRAM.RTASKS is null) or (BCLEAR)) then
RCYCLOGRAM.RTASKS := TCYCLOGRAM_TASKS();
end if;
/* Если у задачи указана группа */
if (RTASK.SGROUP is not null) then
/* Проверяем наличие группы в циклограмме */
if (TCYCLOGRAM_GROUP_FIND(RGROUPS => RCYCLOGRAM.RGROUPS, SNAME => RTASK.SGROUP).SNAME is null) then
P_EXCEPTION(0, 'Группа "%s" циклограммы не зарегистрирована.', RTASK.SGROUP);
end if;
end if;
/* Добавляем элемент */
RCYCLOGRAM.RTASKS.EXTEND();
RCYCLOGRAM.RTASKS(RCYCLOGRAM.RTASKS.LAST) := RTASK;
end TCYCLOGRAM_ADD_TASK;
/* Добавление описания атрибута задачи циклограммы */
procedure TCYCLOGRAM_ADD_TASK_ATTR
(
RCYCLOGRAM in out nocopy TCYCLOGRAM, -- Описание циклограммы
SNAME in varchar2, -- Наименование
SCAPTION in varchar2, -- Заголовок
BVISIBLE boolean := true, -- Разрешить отображение
BCLEAR in boolean := false -- Флаг очистки коллекции атрибутов (false - не очищать, true - очистить коллекцию перед добавлением)
)
is
begin
/* Проверим наименование */
TCYCLOGRAM_TASK_ATTR_NAME_CH(SNAME => SNAME);
/* Проверим, что такого ещё нет */
if (TCYCLOGRAM_TASK_ATTR_FIND(RTASK_ATTRS => RCYCLOGRAM.RTASK_ATTRS, SNAME => SNAME).SNAME is not null) then
P_EXCEPTION(0,
'Атрибут "%s" задачи циклограммы уже зарегистрирован.',
SNAME);
end if;
/* Инициализируем коллекцию если необходимо */
if ((RCYCLOGRAM.RTASK_ATTRS is null) or (BCLEAR)) then
RCYCLOGRAM.RTASK_ATTRS := TCYCLOGRAM_TASK_ATTRS();
end if;
/* Добавляем элемент */
RCYCLOGRAM.RTASK_ATTRS.EXTEND();
RCYCLOGRAM.RTASK_ATTRS(RCYCLOGRAM.RTASK_ATTRS.LAST).SNAME := SNAME;
RCYCLOGRAM.RTASK_ATTRS(RCYCLOGRAM.RTASK_ATTRS.LAST).SCAPTION := SCAPTION;
RCYCLOGRAM.RTASK_ATTRS(RCYCLOGRAM.RTASK_ATTRS.LAST).BVISIBLE := BVISIBLE;
end TCYCLOGRAM_ADD_TASK_ATTR;
/* Сериализация описания циклограммы */
procedure TCYCLOGRAM_DEF_TO_XML
(
RCYCLOGRAM in TCYCLOGRAM -- Описание циклограммы
)
is
begin
/*атические атрибуты заголовка */
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_TITLE, SVALUE => RCYCLOGRAM.STITLE);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CG_LINE_HEIGHT, NVALUE => RCYCLOGRAM.NLINE_HEIGHT);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_ZOOM, NVALUE => RCYCLOGRAM.NZOOM);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_ZOOM_BAR, BVALUE => RCYCLOGRAM.BZOOM_BAR);
/* Если есть динамические атрибуты */
if ((RCYCLOGRAM.RTASK_ATTRS is not null) and (RCYCLOGRAM.RTASK_ATTRS.COUNT > 0)) then
/* Обходим динамические атрибуты задачи */
for I in RCYCLOGRAM.RTASK_ATTRS.FIRST .. RCYCLOGRAM.RTASK_ATTRS.LAST
loop
/* Открываем динамический атрибут задачи */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_TASK_ATTRIBUTES);
/* Наполняем его атрибутами */
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_NAME, SVALUE => RCYCLOGRAM.RTASK_ATTRS(I).SNAME);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CAPTION, SVALUE => RCYCLOGRAM.RTASK_ATTRS(I).SCAPTION);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_VISIBLE, BVALUE => RCYCLOGRAM.RTASK_ATTRS(I).BVISIBLE);
/* Закрываем динамический атрибут задачи */
PKG_XFAST.UP();
end loop;
end if;
/* Обходим колонки циклограммы */
if ((RCYCLOGRAM.RCOLUMNS is not null) and (RCYCLOGRAM.RCOLUMNS.COUNT > 0)) then
for I in RCYCLOGRAM.RCOLUMNS.FIRST .. RCYCLOGRAM.RCOLUMNS.LAST
loop
/* Открываем описание колонки */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_ATTR_COLUMNS);
/* Атрибуты колонки */
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_NAME, SVALUE => RCYCLOGRAM.RCOLUMNS(I).SNAME);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_START, NVALUE => RCYCLOGRAM.RCOLUMNS(I).NSTART);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_END, NVALUE => RCYCLOGRAM.RCOLUMNS(I).NEND);
/* Закрываем описание колонки */
PKG_XFAST.UP();
end loop;
end if;
end TCYCLOGRAM_DEF_TO_XML;
/* Сериализация циклограммы */
function TCYCLOGRAM_TO_XML
(
RCYCLOGRAM in TCYCLOGRAM, -- Описание циклограммы
NINCLUDE_DEF in number := 1 -- Включить описание колонок (0 - нет, 1 - да)
) return clob -- XML-описание
is
CRES clob; -- Буфер для результата
begin
/* Начинаем формирование XML */
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
/* Открываем корень */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XDATA);
/* Открываем циклограмму */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XCYCLOGRAM);
/* Если необходимо включить описание циклограммы */
if (NINCLUDE_DEF = 1) then
TCYCLOGRAM_DEF_TO_XML(RCYCLOGRAM => RCYCLOGRAM);
end if;
/* Формируем описание групп циклограммы */
TCYCLOGRAM_GROUPS_TO_XML(RGROUPS => RCYCLOGRAM.RGROUPS);
/* Описываем задачи */
TCYCLOGRAM_TASKS_TO_XML(RTASKS => RCYCLOGRAM.RTASKS);
/* Закрываем циклограмму */
PKG_XFAST.UP();
/* Закрываем корень */
PKG_XFAST.UP();
/* Сериализуем */
CRES := PKG_XFAST.SERIALIZE_TO_CLOB();
/* Завершаем формирование XML */
PKG_XFAST.EPILOGUE();
/* Возвращаем полученное */
return CRES;
exception
when others then
/* Завершаем формирование XML */
PKG_XFAST.EPILOGUE();
/* Вернем ошибку */
PKG_STATE.DIAGNOSTICS_STACKED();
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
end TCYCLOGRAM_TO_XML;
/* Формирование индикатора */
function TINDICATOR_MAKE
(
SCAPTION in varchar2, -- Подпись
SVALUE in varchar2, -- Значение
SICON in varchar2 := null, -- Иконка (код шрифта "Google Material Icons" - https://fonts.google.com/icons?icon.set=Material+Icons)
SSTATE in varchar2 := SINDICATOR_STATE_UNDEFINED, -- Состояние (см. константы SINDICATOR_STATE_*)
BSQUARE in boolean := false, -- Скруглять углы
NELEVATION in number := 3, -- Высота парения (от 0 до 24, игнорируется для SINDICATOR_VARIANT_OUTLINED)
SVARIANT in varchar2 := SINDICATOR_VARIANT_ELEVATION, -- Вариант исполнения (см. константы SINDICATOR_VARIANT_*)
SHINT in varchar2 := null, -- Подсказка
SBACKGROUND_COLOR in varchar2 := null, -- Цвет заливки (HTML-код, null - использовать цвет по умолчанию для состояния)
SCOLOR in varchar2 := null -- Цвет шрифта и иконки (HTML-код, null - использовать цвет по умолчанию для состояния)
) return TINDICATOR -- Результат работы
is
RRES TINDICATOR; -- Буфер для результата
begin
/* Проверим параметры */
if ((SSTATE is not null) and
(SSTATE not in (SINDICATOR_STATE_UNDEFINED, SINDICATOR_STATE_OK, SINDICATOR_STATE_ERR, SINDICATOR_STATE_WARN))) then
P_EXCEPTION(0, 'Некорректно указано значение "Состояние".');
end if;
if ((NELEVATION is not null) and ((NELEVATION <> TRUNC(NELEVATION)) or (NELEVATION < 0) or (NELEVATION > 24))) then
P_EXCEPTION(0,
'Некорректно указано значение "Высота парения" (ожидается целое число от 0 до 24).');
end if;
if ((SVARIANT is not null) and (SVARIANT not in (SINDICATOR_VARIANT_ELEVATION, SINDICATOR_VARIANT_OUTLINED))) then
P_EXCEPTION(0, 'Некорректно указано значение "Вариант исполнения".');
end if;
/* Формируем объект */
RRES.SCAPTION := SCAPTION;
RRES.SVALUE := SVALUE;
RRES.SICON := SICON;
RRES.SSTATE := COALESCE(SSTATE, SINDICATOR_STATE_UNDEFINED);
RRES.BSQUARE := BSQUARE;
RRES.NELEVATION := COALESCE(NELEVATION, 3);
RRES.SVARIANT := COALESCE(SVARIANT, SINDICATOR_VARIANT_ELEVATION);
RRES.SHINT := SHINT;
RRES.SBACKGROUND_COLOR := SBACKGROUND_COLOR;
RRES.SCOLOR := SCOLOR;
/* Возвращаем результат */
return RRES;
end TINDICATOR_MAKE;
/* Сериализация индикатора */
function TINDICATOR_TO_XML
(
RINDICATOR in TINDICATOR -- Описание индикатора
) return clob -- XML-описание
is
CRES clob; -- Буфер для результата
begin
/* Начинаем формирование XML */
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_);
/* Открываем корень */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XDATA);
/* Открываем индикатор */
PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XINDICATOR);
/* Формируем атрибуты */
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_CAPTION, SVALUE => RINDICATOR.SCAPTION);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_VALUE, SVALUE => RINDICATOR.SVALUE);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_ICON, SVALUE => RINDICATOR.SICON);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_STATE, SVALUE => RINDICATOR.SSTATE);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_SQUARE, BVALUE => RINDICATOR.BSQUARE);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_ELEVATION, NVALUE => RINDICATOR.NELEVATION);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_VARIANT, SVALUE => RINDICATOR.SVARIANT);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_HINT, SVALUE => RINDICATOR.SHINT);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_BG_COLOR, SVALUE => RINDICATOR.SBACKGROUND_COLOR);
PKG_XFAST.ATTR(SNAME => SRESP_ATTR_COLOR, SVALUE => RINDICATOR.SCOLOR);
/* Закрываем индикатор */
PKG_XFAST.UP();
/* Закрываем корень */
PKG_XFAST.UP();
/* Сериализуем */
CRES := PKG_XFAST.SERIALIZE_TO_CLOB();
/* Завершаем формирование XML */
PKG_XFAST.EPILOGUE();
/* Возвращаем полученное */
return CRES;
exception
when others then
/* Завершаем формирование XML */
PKG_XFAST.EPILOGUE();
/* Вернем ошибку */
PKG_STATE.DIAGNOSTICS_STACKED();
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
end TINDICATOR_TO_XML;
end PKG_P8PANELS_VISUAL;
/