ЦИТК-904 - Code-review "P8PCyclogram"

This commit is contained in:
Mikhail Chechnev 2024-11-20 16:05:26 +03:00
parent db66f0c96b
commit 2bfce51fed
7 changed files with 761 additions and 61 deletions

View File

@ -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 }) => {
<P8PCyclogram
{...P8P_CYCLOGRAM_CONFIG_PROPS}
{...state}
containerStyle={STYLES.GANTT_CONTAINER}
containerStyle={STYLES.CYCLOGRAM_CONTAINER}
lineHeight={LINE_HEIGHT}
taskDialogRenderer={prms => (
<CustomTaskDialog task={prms.task} ident={state.ident} handleReload={handleReload} close={prms.close} />

View File

@ -536,7 +536,7 @@ const P8PCyclogramTaskEditor = ({
cancelBtnCaption
}) => {
//Собственное состояние
const [state, setState] = useState({
const [state] = useState({
start: task.start,
end: task.end
});

View File

@ -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 = {}) => <P8PDataGrid {...P8P_DATA_GRID_
//Обёртка для компонента "Диаграмма Ганта" (P8PGantt)
const P8PGanttConfigWrapped = (props = {}) => <P8PGantt {...P8P_GANTT_CONFIG_PROPS} {...props} />;
//Обёртка для компонента "Циклограмма" (P8PCyclogram)
const P8PCyclogramConfigWrapped = (props = {}) => <P8PCyclogram {...P8P_GANTT_CONFIG_PROPS} {...props} />;
//Универсальный элемент-обёртка в параметры конфигурации
const ConfigWrapper = ({ children }) => addConfigChildProps(children);
@ -149,5 +154,6 @@ export {
P8PTableConfigWrapped,
P8PDataGridConfigWrapped,
P8PGanttConfigWrapped,
P8PCyclogramConfigWrapped,
ConfigWrapper
};

View File

@ -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 }) => {
<P8PCyclogram
{...P8P_CYCLOGRAM_CONFIG_PROPS}
{...state}
containerStyle={STYLES.GANTT_CONTAINER}
containerStyle={STYLES.CYCLOGRAM_CONTAINER}
lineHeight={LINE_HEIGHT}
taskDialogRenderer={prms => (
<CustomTaskDialog task={prms.task} ident={state.ident} handleReload={handleReload} close={prms.close} />

View File

@ -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))
);

View File

@ -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);

View File

@ -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"
/*атические атрибуты заголовка */
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
/*атические атрибуты заголовка */
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;
/