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(ИМЯЗНАЧЕНИЕЗНАЧЕНИЕ...))
) 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(ИМЯASC/DESC...))
) 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
/* Cтатические атрибуты заголовка */
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(ИМЯЗНАЧЕНИЕЗНАЧЕНИЕ...))
) 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(ИМЯASC/DESC...))
) 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
/* Cтатические атрибуты заголовка */
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
/* Cтатические атрибуты заголовка */
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
/* Cтатические атрибуты заголовка */
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;
/