From 2bfce51fed2a1413a21d98b1941364140315e8ed Mon Sep 17 00:00:00 2001 From: Mikhail Chechnev Date: Wed, 20 Nov 2024 16:05:26 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A6=D0=98=D0=A2=D0=9A-904=20-=20Code-review?= =?UTF-8?q?=20"P8PCyclogram"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 8 +- app/components/p8p_cyclogram.js | 2 +- app/config_wrapper.js | 6 + app/panels/samples/cyclogram.js | 4 +- db/P8PNL_SMPL_CYCLOGRAM.sql | 18 +- db/PKG_P8PANELS_SAMPLES.pck | 24 +- db/PKG_P8PANELS_VISUAL.pck | 760 ++++++++++++++++++++++++++++++-- 7 files changed, 761 insertions(+), 61 deletions(-) diff --git a/README.md b/README.md index 52dd0cd..bba4835 100644 --- a/README.md +++ b/README.md @@ -2377,8 +2377,8 @@ const Svg = ({ title }) => { - Отображение произвольного пользовательского диалога в качестве карточки задачи/редактора задачи - Масштабирование визуального представления -![Пример P8PGantt](docs/img/72.png) -![Пример P8PGantt](docs/img/73.png) +![Пример P8PCyclogram](docs/img/72.png) +![Пример P8PCyclogram](docs/img/73.png) **Подключение** @@ -2719,7 +2719,7 @@ const LINE_HEIGHT = 30; const STYLES = { CONTAINER: { textAlign: "center", paddingTop: CONTAINER_PADDING_TOP }, TITLE: { paddingBottom: "15px", height: TITLE_HEIGHT }, - GANTT_CONTAINER: { + CYCLOGRAM_CONTAINER: { height: `calc(100vh - ${APP_BAR_HEIGHT} - ${TITLE_HEIGHT} - ${CONTAINER_PADDING_TOP})`, width: "100vw", paddingTop: "5px" @@ -2833,7 +2833,7 @@ const Cyclogram = ({ title }) => { ( diff --git a/app/components/p8p_cyclogram.js b/app/components/p8p_cyclogram.js index 08a4866..bd0e3b1 100644 --- a/app/components/p8p_cyclogram.js +++ b/app/components/p8p_cyclogram.js @@ -536,7 +536,7 @@ const P8PCyclogramTaskEditor = ({ cancelBtnCaption }) => { //Собственное состояние - const [state, setState] = useState({ + const [state] = useState({ start: task.start, end: task.end }); diff --git a/app/config_wrapper.js b/app/config_wrapper.js index 808b6a7..86de65d 100644 --- a/app/config_wrapper.js +++ b/app/config_wrapper.js @@ -15,6 +15,7 @@ import { P8PAppWorkspace } from "./components/p8p_app_workspace"; //Рабоче import { P8PTable, P8P_TABLE_DATA_TYPE, P8P_TABLE_SIZE, P8P_TABLE_FILTER_SHAPE } from "./components/p8p_table"; //Таблица данных import { P8PDataGrid, P8P_DATA_GRID_DATA_TYPE, P8P_DATA_GRID_SIZE, P8P_DATA_GRID_FILTER_SHAPE } from "./components/p8p_data_grid"; //Таблица данных import { P8PGantt, P8P_GANTT_TASK_SHAPE, P8P_GANTT_TASK_ATTRIBUTE_SHAPE, P8P_GANTT_TASK_COLOR_SHAPE } from "./components/p8p_gantt"; //Диаграмма Ганта +import { P8PCyclogram } from "./components/p8p_cyclogram"; //Циклограмма //--------- //Константы @@ -98,6 +99,7 @@ const addConfigChildProps = children => if (child.type.name === "P8PTable") configProps = P8P_TABLE_CONFIG_PROPS; if (child.type.name === "P8PDataGrid") configProps = P8P_DATA_GRID_CONFIG_PROPS; if (child.type.name === "P8PGantt") configProps = P8P_GANTT_CONFIG_PROPS; + if (child.type.name === "P8PCyclogram") configProps = P8P_CYCLOGRAM_CONFIG_PROPS; return React.createElement(child.type, { ...configProps, ...restProps }, addConfigChildProps(children)); }); @@ -120,6 +122,9 @@ const P8PDataGridConfigWrapped = (props = {}) => ; +//Обёртка для компонента "Циклограмма" (P8PCyclogram) +const P8PCyclogramConfigWrapped = (props = {}) => ; + //Универсальный элемент-обёртка в параметры конфигурации const ConfigWrapper = ({ children }) => addConfigChildProps(children); @@ -149,5 +154,6 @@ export { P8PTableConfigWrapped, P8PDataGridConfigWrapped, P8PGanttConfigWrapped, + P8PCyclogramConfigWrapped, ConfigWrapper }; diff --git a/app/panels/samples/cyclogram.js b/app/panels/samples/cyclogram.js index 8517d78..d9ee6cb 100644 --- a/app/panels/samples/cyclogram.js +++ b/app/panels/samples/cyclogram.js @@ -47,7 +47,7 @@ const LINE_HEIGHT = 30; const STYLES = { CONTAINER: { textAlign: "center", paddingTop: CONTAINER_PADDING_TOP }, TITLE: { paddingBottom: "15px", height: TITLE_HEIGHT }, - GANTT_CONTAINER: { + CYCLOGRAM_CONTAINER: { height: `calc(100vh - ${APP_BAR_HEIGHT} - ${TITLE_HEIGHT} - ${CONTAINER_PADDING_TOP})`, width: "100vw", paddingTop: "5px" @@ -274,7 +274,7 @@ const Cyclogram = ({ title }) => { ( diff --git a/db/P8PNL_SMPL_CYCLOGRAM.sql b/db/P8PNL_SMPL_CYCLOGRAM.sql index 3c16eff..77634ee 100644 --- a/db/P8PNL_SMPL_CYCLOGRAM.sql +++ b/db/P8PNL_SMPL_CYCLOGRAM.sql @@ -4,15 +4,15 @@ */ create table P8PNL_SMPL_CYCLOGRAM ( - RN number( 17 ) not null, - IDENT number( 17 ) not null, - TYPE number( 1 ) not null, - NAME varchar2( 200 ) not null, - POS_START number( 17 ) default null, - POS_END number( 17 ) default null, - DATE_FROM date default null, - DATE_TO date default null, - TASK_GROUP number( 17 ) default null, + RN number(17) not null, -- Рег. номер записи + IDENT number(17) not null, -- Идентификатор процесса + TYPE number(1) not null, -- Тип (0 - колонка, 1 - группа, 2 - задача) + NAME varchar2(200) not null, -- Наименование + POS_START number(17) default null, -- Начальная позиция на циклограмме + POS_END number(17) default null, -- Конечная позиция на циклограмме + DATE_FROM date default null, -- Дата начала + DATE_TO date default null, -- Дата окончания + TASK_GROUP number(17) default null, -- Группа задач constraint C_P8PNL_SMPL_CYCLOGRAM_RN_PK primary key (RN), constraint C_P8PNL_SMPL_CYCLOGRAM_TP_VAL check (TYPE in (0, 1, 2)) ); diff --git a/db/PKG_P8PANELS_SAMPLES.pck b/db/PKG_P8PANELS_SAMPLES.pck index 74e7101..ee842fa 100644 --- a/db/PKG_P8PANELS_SAMPLES.pck +++ b/db/PKG_P8PANELS_SAMPLES.pck @@ -85,7 +85,7 @@ end PKG_P8PANELS_SAMPLES; / create or replace package body PKG_P8PANELS_SAMPLES as - /* Константы для циклограммы */ + /* Константы - циклограмма */ NCG_MULTIPLIER constant PKG_STD.TNUMBER := 5; -- Множитель для ширины отображения /* Получение списка контрагентов */ @@ -756,7 +756,7 @@ create or replace package body PKG_P8PANELS_SAMPLES as and T.IDENT = NIDENT; end CYCLOGRAM_BASE_UPDATE; - /* Инициализация буфера данных для диаграммы Ганта */ + /* Инициализация буфера данных для циклограммы */ procedure CYCLOGRAM_INIT ( NIDENT in out number -- Идентификатор буфера сформированных данных (null - сгенерировать новый, !null - удалить старые данные и пересоздать с указанным идентификатором) @@ -1161,18 +1161,18 @@ create or replace package body PKG_P8PANELS_SAMPLES as /* Изменение задачи циклограммы */ procedure CYCLOGRAM_TASK_MODIFY ( - NIDENT in number, -- Идентификатор буфера - NRN in number, -- Рег. номер записи - SDATE_FROM in varchar2, -- Дата начала (в строковом представлении) - SDATE_TO in varchar2 -- Дата окончания (в строковом представлении) + NIDENT in number, -- Идентификатор буфера + NRN in number, -- Рег. номер записи + SDATE_FROM in varchar2, -- Дата начала (в строковом представлении) + SDATE_TO in varchar2 -- Дата окончания (в строковом представлении) ) is - DDATE_FROM PKG_STD.TLDATE; -- Дата начала - DDATE_TO PKG_STD.TLDATE; -- Дата окончания - NYEAR PKG_STD.TNUMBER; -- Текущий год - DCYCLOGRAM_START PKG_STD.TLDATE; -- Дата начала циклограммы - NSTART PKG_STD.TNUMBER; -- Позиция начала элемента - NEND PKG_STD.TNUMBER; -- Позиция окончания элемента + DDATE_FROM PKG_STD.TLDATE; -- Дата начала + DDATE_TO PKG_STD.TLDATE; -- Дата окончания + NYEAR PKG_STD.TNUMBER; -- Текущий год + DCYCLOGRAM_START PKG_STD.TLDATE; -- Дата начала циклограммы + NSTART PKG_STD.TNUMBER; -- Позиция начала элемента + NEND PKG_STD.TNUMBER; -- Позиция окончания элемента begin /* Фиксируем текущий год */ NYEAR := EXTRACT(year from sysdate); diff --git a/db/PKG_P8PANELS_VISUAL.pck b/db/PKG_P8PANELS_VISUAL.pck index c1580f2..7b88ef2 100644 --- a/db/PKG_P8PANELS_VISUAL.pck +++ b/db/PKG_P8PANELS_VISUAL.pck @@ -16,17 +16,31 @@ create or replace package PKG_P8PANELS_VISUAL as NGANTT_ZOOM_WEEK constant PKG_STD.TNUMBER := 3; -- Неделя NGANTT_ZOOM_MONTH constant PKG_STD.TNUMBER := 4; -- Месяц + /* Константы - масштаб циклограммы */ + 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 от исходного) + /* Константы - тип графика */ - 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_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'; + 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_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; -- Высота строк циклограммы /* Типы данных - значение колонки таблицы данных */ type TCOL_VAL is record @@ -242,6 +256,83 @@ create or replace package PKG_P8PANELS_VISUAL as 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 -- Описание атрибутов карточки задачи + ); + /* Расчет диапаона выдаваемых записей */ procedure UTL_ROWS_LIMITS_CALC ( @@ -577,6 +668,87 @@ create or replace package PKG_P8PANELS_VISUAL as 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-описание end PKG_P8PANELS_VISUAL; / @@ -603,38 +775,44 @@ text="Формат data_grid и gant как в chart" SRESP_TAG_XGANTT_TASKS constant PKG_STD.TSTRING := 'XGANTT_TASKS'; -- Тэг для описания коллекции задач диаграммы Ганта 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_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_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_GROUPS constant PKG_STD.TSTRING := 'groups'; -- Атрибут для групп + 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_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_GANTT_ZOOM_BAR constant PKG_STD.TSTRING := 'zoomBar'; -- Атрибут для флага отображения панели масштаба диаграммы Ганта 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'; -- Атрибут для флага задачи "только для чтения" @@ -657,6 +835,10 @@ text="Формат data_grid и gant как в chart" 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'; -- Постфикс наименования верхней границы условия отбора @@ -2034,7 +2216,7 @@ text="Формат data_grid и gant как в chart" /* 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_GANTT_ZOOM_BAR, BVALUE => RGANTT.BZOOM_BAR); + 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); @@ -2382,5 +2564,517 @@ text="Формат data_grid и gant как в chart" 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; + + /* Сериализация описания колонок циклограммы */ + procedure TCYCLOGRAM_COLUMNS_TO_XML + ( + RCYCLOGRAM_COLUMNS in TCYCLOGRAM_COLUMNS -- Описание колонок циклограммы + ) + is + begin + /* Обходим колонки из коллекции */ + if ((RCYCLOGRAM_COLUMNS is not null) and (RCYCLOGRAM_COLUMNS.COUNT > 0)) then + for I in RCYCLOGRAM_COLUMNS.FIRST .. RCYCLOGRAM_COLUMNS.LAST + loop + /* Открываем описание колонки */ + PKG_XFAST.DOWN_NODE(SNAME => SRESP_TAG_XCOLUMNS_DEF); + /* Атрибуты колонки */ + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_NAME, SVALUE => RCYCLOGRAM_COLUMNS(I).SNAME); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_START, NVALUE => RCYCLOGRAM_COLUMNS(I).NSTART); + PKG_XFAST.ATTR(SNAME => SRESP_ATTR_END, NVALUE => RCYCLOGRAM_COLUMNS(I).NEND); + /* Закрываем описание колонки */ + PKG_XFAST.UP(); + end loop; + end if; + end TCYCLOGRAM_COLUMNS_TO_XML; + + /* Формирование группы циклограммы */ + 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; + end PKG_P8PANELS_VISUAL; /