ЦИТК-839 ч1

This commit is contained in:
Vladislav 2024-06-11 15:44:53 +03:00
parent 06f0b35f92
commit 67905adaf2
3 changed files with 62 additions and 70 deletions

View File

@ -51,9 +51,6 @@ const EqsPrfrm = () => {
reload: false
});
// Состояние информации о трудоёмкости
const [info, setInfo] = useState({ cntP: 0, sumP: 0, cntF: 0, sumF: 0 });
// Состояние фильтра
const [filter, setFilter] = useState({
belong: "",
@ -65,17 +62,22 @@ const EqsPrfrm = () => {
toMonth: 1,
toYear: 1990
});
// Состояние открытия фильтра
const [filterOpen, setFilterOpen] = useState(true);
// Состояние данных по умолчанию для фильтра
const [defaultLoaded, setDefaultLoaded] = useState(false);
// Состояние хранения копии фильтра
const [filterCopy, setFilterCopy] = useState({ ...filter });
// Состояние ограничения редактирования фильтра
const [filterLock, setFilterLock] = useState(false);
// Состояние ячейки заголовка даты (по раскрытию/скрытию)
const [activeRef, setActiveRef] = useState();
// Состояние актуальности ссылки на ячейку
const [refIsDeprecated, setRidFlag] = useState(true);
@ -146,7 +148,6 @@ const EqsPrfrm = () => {
}
});
}
setInfo({ cntP: cP, sumP: sP, cntF: cF, sumF: sF });
setDataGrid(pv => ({
...pv,
columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,
@ -164,7 +165,6 @@ const EqsPrfrm = () => {
stored: "PKG_P8PANELS_EQUIPSRV.GET_DEFAULT_FP",
respArg: "COUT"
});
setFilter(pv => ({ ...pv, belong: data.JURPERS, fromMonth: 1, fromYear: data.YEAR, toMonth: 12, toYear: data.YEAR }));
setDefaultLoaded(true);
}, [executeStored]);
@ -173,14 +173,9 @@ const EqsPrfrm = () => {
const showEquipSrv = async ({ date, workType, info }) => {
const [techName, servKind] = info.split("_");
let type;
if (workType == "План") type = 0;
else type = 1;
let [year, month, day] = date.substring(1).split("_");
//if (day == undefined) day = null;
const data = await executeStored({
stored: "PKG_P8PANELS_EQUIPSRV.SELECT_EQUIPSRV",
args: {
@ -544,7 +539,6 @@ const EqsPrfrm = () => {
</DialogContent>
<DialogActions>
<Button
variant="contained"
disabled={
filter.belong && filter.prodObj && filter.fromMonth && filter.fromYear && filter.toMonth && filter.toYear ? false : true
}
@ -556,11 +550,8 @@ const EqsPrfrm = () => {
>
Сформировать
</Button>
<Button variant="contained" onClick={clearFilter}>
Очистить
</Button>
<Button onClick={clearFilter}>Очистить</Button>
<Button
variant="contained"
onClick={() => {
setFilter(filterCopy);
}}
@ -592,9 +583,7 @@ const EqsPrfrm = () => {
rows={dataGrid.rows}
size={P8P_DATA_GRID_SIZE.LARGE}
reloading={dataGrid.reload}
headCellRender={prms =>
headCellRender({ ...prms }, handleClick, filter.techServ, info.cntP, info.sumP, info.cntF, info.sumF)
}
headCellRender={prms => headCellRender({ ...prms }, handleClick)}
dataCellRender={prms => dataCellRender({ ...prms }, showEquipSrv)}
groupCellRender={prms => groupCellRender({ ...prms })}
showCellRightBorder={true}

View File

@ -1,5 +1,5 @@
/*
Парус 8 -
Парус 8 - Панели мониторинга - ТОиР - Выполнение работ
Дополнительная разметка и вёрстка клиентских элементов
*/
@ -19,6 +19,17 @@ export const DIGITS_REG_EXP = /\d+,?\d*/g;
export const MONTH_NAME_REG_EXP = /_\d{4}_\d{1,2}/;
export const DAY_NAME_REG_EXP = /_\d{4}_\d{1,2}_\d{1,2}/;
export const STYLES = {
HIDE_CELL_STYLE: { display: "none" },
HCR_MAIN_STYLE: { border: "1px solid rgba(0, 0, 0)", textAlign: "center" },
HCR_DATE_STYLE: { padding: "5px", minWidth: "25px", maxWidth: "25px" },
DCR_MAIN_STYLE: { padding: "2px", border: "1px solid rgba(0, 0, 0) !important", textAlign: "center" },
DCR_OBJECT_INFO_STYLE: { textAlign: "right", fontWeight: "bold" },
DCR_PLAN_CELL_STYLE: { cursor: "pointer", backgroundColor: "lightblue", border: "1px solid rgba(0, 0, 0) !important" },
DCR_FACT_RELATED_CELL_STYLE: { cursor: "pointer", backgroundColor: "green", border: "1px solid rgba(0, 0, 0) !important" },
DCR_FACT_NOT_REALATED_CELL_STYLE: { cursor: "pointer", backgroundColor: "crimson", border: "1px solid rgba(0, 0, 0) !important" }
};
let curParent = "";
let x = 0;
@ -34,13 +45,11 @@ const formatDate = date => {
return nd;
};
// eslint-disable-next-line no-unused-vars
export const headCellRender = ({ columnDef }, hClick, podr, cntP, sumP, cntF, sumF) => {
let cellStyle = { border: "1px solid rgba(0, 0, 0)", textAlign: "center" };
export const headCellRender = ({ columnDef }, hClick) => {
let cellStyle = STYLES.HCR_MAIN_STYLE; //{ border: "1px solid rgba(0, 0, 0)", textAlign: "center" };
let cellProps = {};
let stackStyle = {};
let data = columnDef.caption;
if (columnDef.expandable) {
const ref = createRef();
cellStyle = { ...cellStyle, padding: "5px" };
@ -51,40 +60,35 @@ export const headCellRender = ({ columnDef }, hClick, podr, cntP, sumP, cntF, su
hClick(e, ref);
}
};
stackStyle = { flexDirection: "column" };
}
if (columnDef.name == "SOBJINFO") cellStyle = { display: "none" };
if (columnDef.name == "SOBJINFO" || columnDef.name == "SWRKTYPE") cellStyle = STYLES.HIDE_CELL_STYLE; //{ display: "none" };
if (columnDef.name == "SINFO" || columnDef.name == "SWRKTYPE") {
cellProps = { colSpan: 2 };
if (columnDef.name == "SINFO") cellProps = { ...cellProps, rowSpan: 2 };
}
if (columnDef.name == "SWRKTYPE") cellStyle = { display: "none" };
//if (columnDef.name == "SWRKTYPE") cellStyle = STYLES.HIDE_CELL_STYLE; //{ display: "none" };
if (columnDef.visible && DAY_NAME_REG_EXP.test(columnDef.name)) {
cellStyle = { ...cellStyle, padding: "5px", minWidth: "25px", maxWidth: "25px" };
cellStyle = { ...cellStyle, ...STYLES.HCR_DATE_STYLE }; //{ ...cellStyle, padding: "5px", minWidth: "25px", maxWidth: "25px" };
stackStyle = { justifyContent: "center" };
}
return { cellStyle, cellProps, stackStyle, data };
};
export const dataCellRender = ({ row, columnDef }, showEquipSrv) => {
let cellStyle = {
let cellStyle = STYLES.DCR_MAIN_STYLE; /*{
padding: "2px",
border: "1px solid rgba(0, 0, 0) !important",
textAlign: "center"
};
};*/
let cellProps = {};
let data = " ";
if (row["SWRKTYPE"] == undefined) {
if (columnDef.name == "SOBJINFO") {
cellProps = { colSpan: 2 };
cellStyle = { ...cellStyle, textAlign: "right", fontWeight: "bold" };
cellStyle = { ...cellStyle, ...STYLES.DCR_OBJECT_INFO_STYLE }; //{ ...cellStyle, textAlign: "right", fontWeight: "bold" };
}
if (columnDef.name == "SWRKTYPE") cellStyle = { display: "none" };
if (columnDef.name == "SWRKTYPE") cellStyle = STYLES.HIDE_CELL_STYLE; //{ display: "none" };
if (columnDef.parent == "" && columnDef.expandable == true && columnDef.expanded == false) {
curParent = columnDef.name;
return { cellStyle: { ...cellStyle, height: "25px" }, data };
@ -108,10 +112,9 @@ export const dataCellRender = ({ row, columnDef }, showEquipSrv) => {
if (columnDef.name == "SOBJINFO" && row["SWRKTYPE"] == "Факт") {
cellStyle = { display: "none" };
}
switch (row[columnDef.name]) {
case "blue":
cellStyle = { ...cellStyle, cursor: "pointer", backgroundColor: "lightblue", border: "1px solid rgba(0, 0, 0) !important" };
cellStyle = { ...cellStyle, ...STYLES.DCR_PLAN_CELL_STYLE }; //{ ...cellStyle, cursor: "pointer", backgroundColor: "lightblue", border: "1px solid rgba(0, 0, 0) !important" };
cellProps = {
title: formatDate(columnDef.name),
onClick: () => {
@ -120,7 +123,7 @@ export const dataCellRender = ({ row, columnDef }, showEquipSrv) => {
};
return { cellStyle, cellProps, data };
case "green":
cellStyle = { ...cellStyle, cursor: "pointer", backgroundColor: "green", border: "1px solid rgba(0, 0, 0) !important" };
cellStyle = { ...cellStyle, ...STYLES.DCR_FACT_RELATED_CELL_STYLE }; //{ ...cellStyle, cursor: "pointer", backgroundColor: "green", border: "1px solid rgba(0, 0, 0) !important" };
cellProps = {
title: formatDate(columnDef.name),
onClick: () => {
@ -129,7 +132,7 @@ export const dataCellRender = ({ row, columnDef }, showEquipSrv) => {
};
return { cellStyle, cellProps, data };
case "red":
cellStyle = { ...cellStyle, cursor: "pointer", backgroundColor: "crimson", border: "1px solid rgba(0, 0, 0) !important" };
cellStyle = { ...cellStyle, ...STYLES.DCR_FACT_NOT_RELATED_CELL_STYLE }; //{ ...cellStyle, cursor: "pointer", backgroundColor: "crimson", border: "1px solid rgba(0, 0, 0) !important" };
cellProps = {
title: formatDate(columnDef.name),
onClick: () => {
@ -168,6 +171,6 @@ export const dataCellRender = ({ row, columnDef }, showEquipSrv) => {
};
export const groupCellRender = () => {
let cellStyle = { display: "none" };
let cellStyle = STYLES.HIDE_CELL_STYLE; //{ display: "none" };
return { cellStyle };
};

View File

@ -226,9 +226,9 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
SPRJ_GROUP_NAME PKG_STD.TSTRING; -- Наименование группы для проекта
BEXPANDED boolean; -- Флаг раскрытости уровня
RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
RDG_ROW0 PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы0
RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
RDG_ROW2 PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы2
RDG_ROW_INFO PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы с информацией по объекту ремонта
RDG_ROW_PLAN PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы с планом по объекту ремонта
RDG_ROW_FACT PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы с фактом по объекту ремонта
NCURYEAR PKG_STD.TNUMBER; -- Текущий год
NCURMONTH PKG_STD.TNUMBER; -- Текущий месяц
NTOTALDAYS PKG_STD.TNUMBER; -- Дней в текущем месяце
@ -270,7 +270,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
TT.DDATEPRD_BEG DDATEPLANBEG,
TT.DDATEPRD_END DDATEPLANEND,
EQJ.DATEFACT_BEG DDATEFACTBEG,
COALESCE(EQJ.DATEFACT_END, EQJ.DATEFACT_BEG) DDATEFACTEND, --
COALESCE(EQJ.DATEFACT_END, EQJ.DATEFACT_BEG) DDATEFACTEND,
EK.CODE STECSRVKINDCODE,
EK.NAME STECSRVKINDNAME,
COALESCE(EW.NSUM, (TT.DDATEPRD_END - TT.DDATEPRD_BEG) * 24) NSUMWORKPLAN,
@ -554,7 +554,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
/* Если новый объект ремонта */
if ((SCURTECHOBJ != QQ.STECHOBJNAME) or (SCURTECHOBJ is null)) then
/* Если строка с трудоёмкостью по объекту ремонта сформирована */
if (RDG_ROW0.RCOLS is not null) then
if (RDG_ROW_INFO.RCOLS is not null) then
/* Цикл по годам периода */
for Y in NFROMYEAR .. NTOYEAR
loop
@ -562,7 +562,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
if (NFROMYEAR = NTOYEAR) then
NMS := NFROMMONTH;
NME := NTOMONTH;
/* Иначе вычисляем кол-во месяцев в каждом году периода отчёта*/
/* Иначе вычисляем кол-во месяцев в каждом году периода отчёта */
else
if (Y = NFROMYEAR) then
NMS := NFROMMONTH;
@ -579,7 +579,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
for M in NMS .. NME
loop
SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0,
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_INFO,
SNAME => SPERIODNAME,
SVALUE => 'план: ' || HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM,
SROWID => SPERIODNAME || '_P'),
@ -594,7 +594,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
end loop;
end loop;
/* Добавление строки с трудоёмкостью */
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW0);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_INFO);
end if;
/* Добавление группы с объектом ремонта */
SCURTECHOBJ := QQ.STECHOBJNAME;
@ -603,29 +603,29 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
SNAME => SPRJ_GROUP_NAME,
SCAPTION => QQ.STECHOBJNAME,
BEXPANDABLE => false);
RDG_ROW0 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0, SNAME => 'SOBJINFO', SVALUE => SCURTECHOBJ);
RDG_ROW_INFO := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_INFO, SNAME => 'SOBJINFO', SVALUE => SCURTECHOBJ);
end if;
/* Формируем имя группы для вида ремонта */
SCURTSKCODE := SCURTECHOBJ || '_' || QQ.STECSRVKINDCODE;
/* Если по данной группе еще нет строк плана и факта */
if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => GF, SROWID => SCURTSKCODE) = false) then
/* Добавляем строку плана */
if (RDG_ROW.RCOLS is not null) then
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
if (RDG_ROW_PLAN.RCOLS is not null) then
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_PLAN);
end if;
/* Добавляем строку факта */
if (RDG_ROW2.RCOLS is not null) then
if (RDG_ROW_FACT.RCOLS is not null) then
CR := PKG_CONTVALLOC1S.FIRST_(RCONTAINER => MCLR);
/* Цикл по коллекции для закрашивания месяцев */
for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(RCONTAINER => MCLR)
loop
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2,
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_FACT,
SNAME => CR,
SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => CR));
CR := PKG_CONTVALLOC1S.NEXT_(RCONTAINER => MCLR, SROWID => CR);
end loop;
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW2);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_FACT);
end if;
PKG_CONTVALLOC1S.PURGE(RCONTAINER => MCLR);
/* Добвим группу для вида ремонта */
@ -635,12 +635,12 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
SCAPTION => QQ.STECSRVKINDCODE,
BEXPANDABLE => false);
/* Строка плана */
RDG_ROW := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SOBJINFO', SVALUE => QQ.STECSRVKINDCODE);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SWRKTYPE', SVALUE => 'План');
RDG_ROW_PLAN := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => 'SOBJINFO', SVALUE => QQ.STECSRVKINDCODE);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => 'SWRKTYPE', SVALUE => 'План');
/* Строка факта */
RDG_ROW2 := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2, SNAME => 'SWRKTYPE', SVALUE => 'Факт');
RDG_ROW_FACT := PKG_P8PANELS_VISUAL.TROW_MAKE(SGROUP => SPRJ_GROUP_NAME);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_FACT, SNAME => 'SWRKTYPE', SVALUE => 'Факт');
/* Добавляем в заполненные группы */
PKG_CONTVALLOC1S.PUTS(RCONTAINER => GF, SROWID => SPRJ_GROUP_NAME, SVALUE => '');
end if;
@ -665,7 +665,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
/* Закрашивание месяца плана синим */
if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => COLS, SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN') =
false) then
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => SPERIODNAME, SVALUE => 'blue');
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => SPERIODNAME, SVALUE => 'blue');
PKG_CONTVALLOC1S.PUTS(RCONTAINER => COLS,
SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN',
SVALUE => '');
@ -675,7 +675,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
/* Закрашивание дня плана синим */
if (PKG_CONTVALLOC1S.EXISTS_(RCONTAINER => COLS, SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN') =
false) then
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => SPERIODNAME, SVALUE => 'blue');
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_PLAN, SNAME => SPERIODNAME, SVALUE => 'blue');
PKG_CONTVALLOC1S.PUTS(RCONTAINER => COLS,
SROWID => SPRJ_GROUP_NAME || ' ' || SPERIODNAME || ' PLAN',
SVALUE => '');
@ -749,7 +749,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
end if;
end loop;
end if;
if ((RDG_ROW0.RCOLS is not null) and (NROWS = 0)) then
if ((RDG_ROW_INFO.RCOLS is not null) and (NROWS = 0)) then
/* Цикл по годам периода */
for Y in NFROMYEAR .. NTOYEAR
loop
@ -772,7 +772,7 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
for M in NMS .. NME
loop
SPERIODNAME := '_' || TO_CHAR(Y) || '_' || TO_CHAR(M);
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW0,
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_INFO,
SNAME => SPERIODNAME,
SVALUE => 'план: ' || HOURS_STR(NHOURS => TRUNC(PKG_CONTVALLOC1S.GETN(RCONTAINER => YM,
SROWID => SPERIODNAME || '_P'),
@ -782,23 +782,23 @@ create or replace package body PKG_P8PANELS_EQUIPSRV as
1)));
end loop;
end loop;
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW0);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_INFO);
end if;
/* План для последней записи */
if ((RDG_ROW.RCOLS is not null) and (NROWS = 0)) then
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
if ((RDG_ROW_PLAN.RCOLS is not null) and (NROWS = 0)) then
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_PLAN);
end if;
/* Факт для последней записи */
if ((RDG_ROW2.RCOLS is not null) and (NROWS = 0)) then
if ((RDG_ROW_FACT.RCOLS is not null) and (NROWS = 0)) then
CR := PKG_CONTVALLOC1S.FIRST_(RCONTAINER => MCLR);
for Z in 1 .. PKG_CONTVALLOC1S.COUNT_(RCONTAINER => MCLR)
loop
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW2,
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW_FACT,
SNAME => CR,
SVALUE => PKG_CONTVALLOC1S.GETS(RCONTAINER => MCLR, SROWID => CR));
CR := PKG_CONTVALLOC1S.NEXT_(RCONTAINER => MCLR, SROWID => CR);
end loop;
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW2);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW_FACT);
end if;
end loop;
/* Сериализуем описание */