ЦИТК-899 - Добавление возможности сортировки строк/граф раздела

Reviewed-on: #35
This commit is contained in:
Mim 2025-06-23 18:53:14 +03:00
commit 11f29bcf0c
4 changed files with 500 additions and 208 deletions

View File

@ -9,7 +9,23 @@
import React, { useState } from "react"; //Классы React import React, { useState } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { Box, IconButton, Icon, Dialog, DialogTitle, DialogContent, Typography, List, ListItem } from "@mui/material"; //Интерфейсные элементы import {
Box,
IconButton,
Icon,
Dialog,
DialogTitle,
DialogContent,
Button,
Typography,
List,
ListItem,
Select,
FormControl,
InputLabel,
MenuItem,
DialogActions
} from "@mui/material"; //Интерфейсные элементы
import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../../components/p8p_data_grid"; //Таблица данных import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../../components/p8p_data_grid"; //Таблица данных
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../../config_wrapper"; //Подключение компонентов к настройкам приложения import { P8P_DATA_GRID_CONFIG_PROPS } from "../../../config_wrapper"; //Подключение компонентов к настройкам приложения
import { SectionTabPanel } from "./section_tab_panel"; //Компонент вкладки раздела import { SectionTabPanel } from "./section_tab_panel"; //Компонент вкладки раздела
@ -67,7 +83,8 @@ const STYLES = {
}, },
HELP_LIST_ITEM_DESC: { HELP_LIST_ITEM_DESC: {
fontSize: "inherit" fontSize: "inherit"
} },
DIALOG_ACTIONS: { justifyContent: "end", paddingRight: "24px", paddingLeft: "24px" }
}; };
//------------------------------------ //------------------------------------
@ -136,6 +153,89 @@ HelpDialog.propTypes = {
handleOpenHelpChange: PropTypes.func.isRequired handleOpenHelpChange: PropTypes.func.isRequired
}; };
//Диалог сортировки
const SortDialog = ({ init, handleOpenSortChange, onOrderChange }) => {
//Собственное состояние сортировки
const [order, setOrder] = useState({ row: init.rowOrder ? init.rowOrder : 0, column: init.columnOrder ? init.columnOrder : 0 });
//Изменеие сортировки
const handleOrderChange = e => setOrder(pv => ({ ...pv, [e.target.name]: e.target.value }));
//Нажатие на кнопку Ok
const handleOk = () => {
onOrderChange({ rowOrder: order.row, columnOrder: order.column });
handleOpenSortChange();
};
//Кнопка "Очистить", значения по умолчанию
const handleClear = () => {
setOrder({ row: 0, column: 0 });
};
//Кнопка "Отмена"
const handleCancel = () => {
handleOpenSortChange();
};
//Генерация содержимого
return (
<Dialog open onClose={handleOpenSortChange}>
<DialogTitle>
<Box display="flex" alignItems="center">
<Box flexGrow={1} textAlign="center">
Сортировка
</Box>
<Box>
<IconButton aria-label="close" onClick={handleCancel}>
<Icon>close</Icon>
</IconButton>
</Box>
</Box>
</DialogTitle>
<DialogContent>
<Box component="section" p={1}>
<FormControl variant="standard" fullWidth>
<InputLabel id="row-label">Строки</InputLabel>
<Select labelId="row-label" id="row" name="row" value={order.row} label="Строки" onChange={handleOrderChange}>
<MenuItem value={0}>Номер</MenuItem>
<MenuItem value={1}>Код</MenuItem>
<MenuItem value={2}>Мнемокод</MenuItem>
</Select>
</FormControl>
</Box>
<Box component="section" p={1}>
<FormControl variant="standard" fullWidth>
<InputLabel id="column-label">Графы</InputLabel>
<Select labelId="column-label" id="column" name="column" value={order.column} label="Графы" onChange={handleOrderChange}>
<MenuItem value={0}>Номер</MenuItem>
<MenuItem value={1}>Код</MenuItem>
<MenuItem value={2}>Мнемокод</MenuItem>
</Select>
</FormControl>
</Box>
</DialogContent>
<DialogActions sx={STYLES.DIALOG_ACTIONS}>
<Button variant="text" onClick={handleOk}>
ОК
</Button>
<Button variant="text" onClick={handleClear}>
Очистить
</Button>
<Button variant="text" onClick={handleCancel}>
Отмена
</Button>
</DialogActions>
</Dialog>
);
};
//Контроль свойств - Диалог сортировки
SortDialog.propTypes = {
init: PropTypes.object.isRequired,
handleOpenSortChange: PropTypes.func.isRequired,
onOrderChange: PropTypes.func.isRequired
};
//----------- //-----------
//Тело модуля //Тело модуля
//----------- //-----------
@ -145,6 +245,8 @@ const SectionTab = ({
section, section,
tabValue, tabValue,
index, index,
order,
onOrderChange,
containerProps, containerProps,
handleMarkAdd, handleMarkAdd,
handleReload, handleReload,
@ -161,6 +263,14 @@ const SectionTab = ({
setOpenHelp(!openHelp); setOpenHelp(!openHelp);
}; };
//Состояние - диалог сортировки
const [openSort, setOpenSort] = useState(false);
//Изменение состояния диалога сортировки
const handleOpenSortChange = () => {
setOpenSort(!openSort);
};
//Генерация содержимого //Генерация содержимого
return ( return (
<> <>
@ -175,6 +285,9 @@ const SectionTab = ({
</IconButton> </IconButton>
</Box> </Box>
<Box> <Box>
<IconButton onClick={() => handleOpenSortChange()}>
<Icon>sort</Icon>
</IconButton>
<IconButton onClick={() => handleOpenHelpChange()}> <IconButton onClick={() => handleOpenHelpChange()}>
<Icon>help</Icon> <Icon>help</Icon>
</IconButton> </IconButton>
@ -217,6 +330,7 @@ const SectionTab = ({
</Box> </Box>
) : null} ) : null}
</SectionTabPanel> </SectionTabPanel>
{openSort ? <SortDialog init={order} handleOpenSortChange={handleOpenSortChange} onOrderChange={onOrderChange} /> : null}
{openHelp ? <HelpDialog handleOpenHelpChange={handleOpenHelpChange} /> : null} {openHelp ? <HelpDialog handleOpenHelpChange={handleOpenHelpChange} /> : null}
</> </>
); );
@ -227,6 +341,8 @@ SectionTab.propTypes = {
section: PropTypes.object.isRequired, section: PropTypes.object.isRequired,
tabValue: PropTypes.number, tabValue: PropTypes.number,
index: PropTypes.number, index: PropTypes.number,
order: PropTypes.object.isRequired,
onOrderChange: PropTypes.func.isRequired,
containerProps: PropTypes.object, containerProps: PropTypes.object,
handleMarkAdd: PropTypes.func, handleMarkAdd: PropTypes.func,
handleReload: PropTypes.func, handleReload: PropTypes.func,

View File

@ -39,7 +39,7 @@ const useWindowResize = () => {
}; };
//Хук для настройки регламентированного отчета //Хук для настройки регламентированного отчета
const useConf = (currentTab, handleSectionChange) => { const useConf = (currentTab, handleSectionChange, order) => {
//Собственное состояние - таблица данных //Собственное состояние - таблица данных
const dataGrid = { const dataGrid = {
rn: 0, rn: 0,
@ -58,6 +58,7 @@ const useConf = (currentTab, handleSectionChange) => {
const [rrpConf, setRrpConf] = useState({ const [rrpConf, setRrpConf] = useState({
docLoaded: false, docLoaded: false,
sections: [], sections: [],
orderChanged: false,
reload: true reload: true
}); });
@ -76,103 +77,116 @@ const useConf = (currentTab, handleSectionChange) => {
}, []); }, []);
//Загрузка данных разделов регламентированного отчёта //Загрузка данных разделов регламентированного отчёта
const loadData = useCallback(async () => { const loadData = useCallback(
if (rrpConf.reload) { async () => {
//Переменная номера раздела с фокусом if (rrpConf.reload) {
let tabFocus = currentTab ? currentTab : 0; //Переменная номера раздела с фокусом
const data = await executeStored({ let tabFocus = currentTab ? currentTab : 0;
stored: "PKG_P8PANELS_RRPCONFED.RRPCONF_GET_SECTIONS", const data = await executeStored({
args: { stored: "PKG_P8PANELS_RRPCONFED.RRPCONF_GET_SECTIONS",
NRN_RRPCONF: Number(getNavigationSearch().NRN) args: {
}, NRN_RRPCONF: Number(getNavigationSearch().NRN),
respArg: "COUT" NROW_ORDER: Number(order.rowOrder),
}); NCOL_ORDER: Number(order.columnOrder)
//Флаг первой загрузки данных },
let firstLoad = dataGrids.length == 0 ? true : false; respArg: "COUT"
//Копирование массива уже загруженных разделов
let cloneDGs = dataGrids.slice();
//Массив из нескольких разделов и из одного
const sections = data.SECTIONS ? (data.SECTIONS.length ? data.SECTIONS : [data.SECTIONS]) : [];
//Заполнение очередного раздела по шаблону
sections.map(s => {
let dg = {};
Object.assign(dg, dataGrid, {
...s.XDATA.XDATA_GRID,
rn: s.NRN,
code: s.SCODE,
name: s.SNAME,
delete_allow: s.NDELETE_ALLOW,
dataLoaded: true,
columnsDef: [...(s.XDATA.XDATA_GRID.columnsDef || [])],
groups: [...(s.XDATA.XDATA_GRID.groups || [])],
rows: [...(s.XDATA.XDATA_GRID.rows || [])],
reload: false
}); });
//Если раздел имеет составы показателей //Флаг первой загрузки данных
if (s.MARK_CNS.MARK_CN) { let firstLoad = dataGrids.length == 0 ? true : false;
//Обходим строки раздела //Копирование массива уже загруженных разделов
dg.rows.map(row => { let cloneDGs = dataGrids.slice();
//Цикл по ключам строки //Массив из нескольких разделов и из одного
for (let key in row) { const sections = data.SECTIONS ? (data.SECTIONS.length ? data.SECTIONS : [data.SECTIONS]) : [];
//Если это ключ для группы составов показателей //Заполнение очередного раздела по шаблону
if (key.match(/MARK_CNS_.*/)) { sections
//Считываем рег. номер показателя .sort((a, b) => a.SCODE - b.SCODE)
let markRn = key.substring(9); .map(s => {
//Переносим из раздела let dg = {};
row[key] = Array.isArray(s.MARK_CNS.MARK_CN) Object.assign(dg, dataGrid, {
? [...s.MARK_CNS.MARK_CN].filter(el => el.NPRN === row[`NMARK_RN_${markRn}`]) ...s.XDATA.XDATA_GRID,
: s.MARK_CNS.MARK_CN.NPRN === row[`NMARK_RN_${markRn}`] rn: s.NRN,
? [s.MARK_CNS.MARK_CN] code: s.SCODE,
: null; name: s.SNAME,
delete_allow: s.NDELETE_ALLOW,
dataLoaded: true,
columnsDef: [...(s.XDATA.XDATA_GRID.columnsDef || [])],
groups: [...(s.XDATA.XDATA_GRID.groups || [])],
rows: [...(s.XDATA.XDATA_GRID.rows || [])],
reload: false
});
//Если раздел имеет составы показателей
if (s.MARK_CNS.MARK_CN) {
//Обходим строки раздела
dg.rows.map(row => {
//Цикл по ключам строки
for (let key in row) {
//Если это ключ для группы составов показателей
if (key.match(/MARK_CNS_.*/)) {
//Считываем рег. номер показателя
let markRn = key.substring(9);
//Переносим из раздела
row[key] = Array.isArray(s.MARK_CNS.MARK_CN)
? [...s.MARK_CNS.MARK_CN].filter(el => el.NPRN === row[`NMARK_RN_${markRn}`])
: s.MARK_CNS.MARK_CN.NPRN === row[`NMARK_RN_${markRn}`]
? [s.MARK_CNS.MARK_CN]
: null;
}
}
});
}
//Ищем загружен ли уже раздел с таким же ид.
const dgItem = dataGrids.find(x => x.rn === dg.rn);
//Его индекс, если нет соответствия, то -1
let index = dataGrids.indexOf(dgItem);
//Если было соответствие
if (dgItem) {
//Если в нём не найдено изменений
if (JSON.stringify(dgItem, null, 4) === JSON.stringify(dg, null, 4)) {
//То из копированного массива его удаляем
cloneDGs.splice(cloneDGs.indexOf(cloneDGs.find(x => x.rn === dgItem.rn)), 1);
} else {
//Иначе обновляем раздел в массиве
dataGrids[index] = dg;
//Удаляем из копированного массива
cloneDGs.splice(cloneDGs.indexOf(cloneDGs.find(x => x.rn === dg.rn)), 1);
//Устанавливаем фокус на обновлённый раздел, если был добавлен
tabFocus = rrpConf.orderChanged ? 0 : index;
} }
} else {
//Если раздел новый, то добавляем его в массив данных
dataGrids.push(dg);
//И устанавливаем на него фокус, если флаг первой загрузки = false
tabFocus = !firstLoad ? dataGrids.length - 1 : 0;
} }
}); });
} //Обходим разделы, что остались в копированном массиве (на удаление)
//Ищем загружен ли уже раздел с таким же ид. cloneDGs.map(s => {
const dgItem = dataGrids.find(x => x.rn === dg.rn); let curIndex = dataGrids.indexOf(dataGrids.find(x => x.rn === s.rn));
//Его индекс, если нет соответствия, то -1 //Устаревший раздел удаляем из массива данных
let index = dataGrids.indexOf(dgItem); dataGrids.splice(curIndex, 1);
//Если было соответствие //Фокус на предшествующий раздел
if (dgItem) { if (curIndex > 0) tabFocus = curIndex - 1;
//Если в нём не найдено изменений //Иначе фокус на следующий, если был удалён первый раздел
if (JSON.stringify(dgItem, null, 4) === JSON.stringify(dg, null, 4)) { else tabFocus = curIndex;
//То из копированного массива его удаляем });
cloneDGs.splice(cloneDGs.indexOf(cloneDGs.find(x => x.rn === dgItem.rn)), 1); setRrpConf(pv => ({
} else { ...pv,
//Иначе обновляем раздел в массиве docLoaded: true,
dataGrids[index] = dg; orderChanged: false,
//Удаляем из копированного массива reload: false,
cloneDGs.splice(cloneDGs.indexOf(cloneDGs.find(x => x.rn === dg.rn)), 1); sections: dataGrids
//Устанавливаем фокус на обновлённый раздел }));
tabFocus = index; handleSectionChange(tabFocus);
} }
} else { },
//Если раздел новый, то добавляем его в массив данных
dataGrids.push(dg);
//И устанавливаем на него фокус, если флаг первой загрузки = false
tabFocus = !firstLoad ? dataGrids.length - 1 : 0;
}
});
//Обходим разделы, что остались в копированном массиве (на удаление)
cloneDGs.map(s => {
let curIndex = dataGrids.indexOf(dataGrids.find(x => x.rn === s.rn));
//Устаревший раздел удаляем из массива данных
dataGrids.splice(curIndex, 1);
//Фокус на предшествующий раздел
if (curIndex > 0) tabFocus = curIndex - 1;
//Иначе фокус на следующий, если был удалён первый раздел
else tabFocus = curIndex;
});
setRrpConf(pv => ({
...pv,
docLoaded: true,
reload: false,
sections: dataGrids
}));
handleSectionChange(tabFocus);
}
// eslint-disable-next-line react-hooks/exhaustive-deps // eslint-disable-next-line react-hooks/exhaustive-deps
}, [rrpConf.reload, rrpConf.docLoaded, dataGrid.reload, dataGrid.docLoaded, executeStored]); [rrpConf.reload, rrpConf.docLoaded, dataGrid.reload, dataGrid.docLoaded, executeStored]
);
//При изменении сортировок
useEffect(() => {
setRrpConf(pv => ({ ...pv, orderChanged: true, reload: true }));
}, [order]);
//При необходимости обновить данные таблицы //При необходимости обновить данные таблицы
useEffect(() => { useEffect(() => {

View File

@ -44,8 +44,14 @@ const RrpConfEditor = () => {
//Состояние вкладки //Состояние вкладки
const [tabValue, handleSectionChange] = useTab(""); const [tabValue, handleSectionChange] = useTab("");
//Состояние сортировки строк и граф
const [order, setOrder] = useState({ rowOrder: 0, columnOrder: 0 });
//Изменение состояния сортировки строк и граф
const handleOrder = newOrder => setOrder(newOrder);
//Состояние настройки //Состояние настройки
const [rrpConf, handleReload] = useConf(tabValue, handleSectionChange); const [rrpConf, handleReload] = useConf(tabValue, handleSectionChange, order);
//Функции открытия разделов //Функции открытия разделов
const [handleMarkOpen, handleMarkCnOpen, handleMarkCnInsert] = useRecOpen(handleReload); const [handleMarkOpen, handleMarkCnOpen, handleMarkCnInsert] = useRecOpen(handleReload);
@ -136,6 +142,8 @@ const RrpConfEditor = () => {
section={s} section={s}
tabValue={tabValue} tabValue={tabValue}
index={i} index={i}
order={order}
onOrderChange={handleOrder}
containerProps={{ height, pxOuterMenuH, pxPanelHeaderH, pxTabsH }} containerProps={{ height, pxOuterMenuH, pxPanelHeaderH, pxTabsH }}
handleReload={handleReload} handleReload={handleReload}
handleMarkOpen={handleMarkOpen} handleMarkOpen={handleMarkOpen}

View File

@ -3,23 +3,25 @@ create or replace package PKG_P8PANELS_RRPCONFED as
/* Получение разделов регламентированного отчёта */ /* Получение разделов регламентированного отчёта */
procedure RRPCONF_GET_SECTIONS procedure RRPCONF_GET_SECTIONS
( (
NRN_RRPCONF in number, -- Ид. нстройки форм регламентированного отчёта NRN_RRPCONF in number, -- Рег. номер настройки форм регламентированного отчёта
COUT out clob -- Список разделов NROW_ORDER in number := 0, -- Порядок сортировки строк
NCOL_ORDER in number := 0, -- Порядок сортировки граф
COUT out clob -- Список разделов
); );
/* Добавление раздела регламентированного отчёта */ /* Добавление раздела регламентированного отчёта */
procedure RRPCONFSCTN_INSERT procedure RRPCONFSCTN_INSERT
( (
NPRN in number, -- Ид. настройки форм регламентированного отчёта NPRN in number, -- Рег. номер настройки форм регламентированного отчёта
SCODE in varchar2, -- Мнемокод SCODE in varchar2, -- Мнемокод
SNAME in varchar2, -- Наименование SNAME in varchar2, -- Наименование
NRN out number -- Ид. созданной записи NRN out number -- Рег. номер созданной записи
); );
/* Исправление раздела регламентированного отчёта */ /* Исправление раздела регламентированного отчёта */
procedure RRPCONFSCTN_UPDATE procedure RRPCONFSCTN_UPDATE
( (
NRN in number, -- Ид. раздела NRN in number, -- Рег. номер раздела
SCODE in varchar2, -- Мнемокод раздела SCODE in varchar2, -- Мнемокод раздела
SNAME in varchar2 -- Наименование раздела SNAME in varchar2 -- Наименование раздела
); );
@ -27,16 +29,16 @@ create or replace package PKG_P8PANELS_RRPCONFED as
/* Удаление раздела регламентированного отчёта */ /* Удаление раздела регламентированного отчёта */
procedure RRPCONFSCTN_DELETE procedure RRPCONFSCTN_DELETE
( (
NRN in number -- Ид. раздела NRN in number -- Рег. номер раздела
); );
/* Получение кодов настройки, раздела и показателя раздела по ид. показателя раздела */ /* Получение кодов настройки, раздела и показателя раздела по ид. показателя раздела */
procedure RRPCONFSCTNMRK_GET_CODES procedure RRPCONFSCTNMRK_GET_CODES
( (
NRN in number, -- Ид. показателя раздела NRN in number, -- Рег. номер показателя раздела
SRRPCONF out varchar2, -- Код настройки формы регламентированного отчёта SRRPCONF out varchar2, -- Мнемокод настройки формы регламентированного отчёта
SRRPCONFSCTN out varchar2, -- Код раздела SRRPCONFSCTN out varchar2, -- Мнемокод раздела
SRRPCONFSCTNMRK out varchar2 -- Код показателя раздела SRRPCONFSCTNMRK out varchar2 -- Мнемокод показателя раздела
); );
/* Формирование кода и наименования показателя раздела регламентированного отчёта */ /* Формирование кода и наименования показателя раздела регламентированного отчёта */
@ -59,25 +61,25 @@ create or replace package PKG_P8PANELS_RRPCONFED as
/* Добавление показателя раздела регламентированного отчёта */ /* Добавление показателя раздела регламентированного отчёта */
procedure RRPCONFSCTNMRK_INSERT procedure RRPCONFSCTNMRK_INSERT
( (
NPRN in number, -- Ид. раздела NPRN in number, -- Рег. номер раздела
SCODE in varchar2, -- Мнемокод показателя раздела SCODE in varchar2, -- Мнемокод показателя раздела
SNAME in varchar2, -- Наименование показателя раздела SNAME in varchar2, -- Наименование показателя раздела
NRRPROW in number, -- Рег. номер строки NRRPROW in number, -- Рег. номер строки
NRRPCOLUMN in number, -- Рег. номер графы NRRPCOLUMN in number, -- Рег. номер графы
NRN out number -- Ид. созданной записи NRN out number -- Рег. номер созданной записи
); );
/* Исправление показателя раздела регламентированного отчёта */ /* Исправление показателя раздела регламентированного отчёта */
procedure RRPCONFSCTNMRK_UPDATE procedure RRPCONFSCTNMRK_UPDATE
( (
NRN in number, -- Ид. показателя раздела NRN in number, -- Рег. номер показателя раздела
SNAME in varchar2 -- Новое наименование SNAME in varchar2 -- Новое наименование
); );
/* Удаление показателя раздела регламентированного отчёта */ /* Удаление показателя раздела регламентированного отчёта */
procedure RRPCONFSCTNMRK_DELETE procedure RRPCONFSCTNMRK_DELETE
( (
NRN in number -- Ид. показателя раздела NRN in number -- Рег. номер показателя раздела
); );
end PKG_P8PANELS_RRPCONFED; end PKG_P8PANELS_RRPCONFED;
@ -778,7 +780,9 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
/* Получение разделов регламентированного отчёта */ /* Получение разделов регламентированного отчёта */
procedure RRPCONF_GET_SECTIONS procedure RRPCONF_GET_SECTIONS
( (
NRN_RRPCONF in number, -- Ид. нстройки форм регламентированного отчёта NRN_RRPCONF in number, -- Рег. номер настройки форм регламентированного отчёта
NROW_ORDER in number := 0, -- Порядок сортировки строк
NCOL_ORDER in number := 0, -- Порядок сортировки граф
COUT out clob -- Список разделов COUT out clob -- Список разделов
) )
is is
@ -794,58 +798,140 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
SSECTION_CODE PKG_STD.TSTRING; -- Мнемокод раздела настройки SSECTION_CODE PKG_STD.TSTRING; -- Мнемокод раздела настройки
SSECTION_NAME PKG_STD.TSTRING; -- Наименование раздела настройки SSECTION_NAME PKG_STD.TSTRING; -- Наименование раздела настройки
CSECTION_CLOB clob; -- Данные по разделу настройки CSECTION_CLOB clob; -- Данные по разделу настройки
CSQL_ROWS clob; -- Запрос по строкам
SORDERS_R PKG_STD.TSTRING; -- Сортировка строк
ICURSOR_R integer; -- Курсор для исполнения запроса по строкам
NROW_RN PKG_STD.TREF; -- Рег. номер строки
NROW_POS PKG_STD.TNUMBER := 0; -- Позиция строки
SROW_CODE PKG_STD.TSTRING; -- Код строки
SROW_NAME PKG_STD.TSTRING; -- Наименование строки
CSQL_COLS clob; -- Запрос по графам
SORDERS_C PKG_STD.TSTRING; -- Сортировка граф
ICURSOR_C integer; -- Курсор для исполнения запроса по графам
NCOL_RN PKG_STD.TREF; -- Рег. номер графы
SCOL_CODE PKG_STD.TSTRING; -- Код графы
SCOL_NAME PKG_STD.TSTRING; -- Наименование графы
/* Формирование текстового представления сортировки */
function ORDER_TEXT_GET
(
NORDER in number, -- Порядок сортировки
SALIAS in varchar2, -- Алиас таблицы
NTYPE in number -- Тип таблицы (0 - графы, 1 - строки)
) return varchar2 -- Текстовое представление сортировки
is
SRESULT PKG_STD.TSTRING; -- Текстовое представление сортировки
STABLE_COLUMN_CODE PKG_STD.TSTRING; -- Наименование колонки таблицы, содержащую код
begin
/* Определяем наименование колонки, содержающую код */
if (NTYPE = 0) then
/* Код графы */
STABLE_COLUMN_CODE := 'COLUMN_CODE';
else
/* Код графы */
STABLE_COLUMN_CODE := 'ROW_CODE';
end if;
/* Формируем представление сортировки */
case NORDER
/* Код - номер сортировки - мнемокод */
when 1 then
SRESULT := PKG_SQL_BUILD.LPAD_() || '(' || SALIAS || '.' || STABLE_COLUMN_CODE || ', 40, ''0''),' || SALIAS ||
'.SORT_NUMB,' || PKG_SQL_BUILD.LPAD_() || '(' || SALIAS || '.CODE, 20, ''0'')';
/* Мнемокод - номер сортировки - код */
when 2 then
SRESULT := PKG_SQL_BUILD.LPAD_() || '(' || SALIAS || '.CODE, 20, ''0''),' || SALIAS || '.SORT_NUMB,' ||
PKG_SQL_BUILD.LPAD_() || '(' || SALIAS || '.' || STABLE_COLUMN_CODE || ', 40, ''0'')';
/* Номер сортировки - код - мнемокод */
else
SRESULT := SALIAS || '.SORT_NUMB,' || PKG_SQL_BUILD.LPAD_() || '(' || SALIAS || '.' || STABLE_COLUMN_CODE ||
', 40, ''0''),' || PKG_SQL_BUILD.LPAD_() || '(' || SALIAS || '.CODE, 20, ''0'')';
end case;
/* Возвращаем результат */
return SRESULT;
end ORDER_TEXT_GET;
/* Инициализация колонок граф показателей */ /* Инициализация колонок граф показателей */
procedure MARKS_COLUMNS_INIT procedure MARKS_COLUMNS_INIT
( (
RDG in out nocopy PKG_P8PANELS_VISUAL.TDG, -- Описание таблицы RDG in out nocopy PKG_P8PANELS_VISUAL.TDG, -- Описание таблицы
NRRPCONFSCTN in number -- Рег. номер раздела NRRPCONFSCTN in number, -- Рег. номер раздела
SORDER in varchar2 -- Сортировка
) )
is is
CSQL clob; -- Запрос по графам показателей раздела
ICURSOR integer; -- Курсор для исполнения запроса по графам показателей раздела
SCOL_CODE PKG_STD.TSTRING; -- Мнемокод графы
SCOL_NAME PKG_STD.TSTRING; -- Наименование графы
begin begin
/* Цикл по графам показателей раздела */ /* Добавляем подсказку совместимости */
for REC in (select C.CODE, CSQL := null;
C.NAME CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
from RRPCONFSCTNMRK T, PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select C.CODE,');
RRPCOLUMN C PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' C.NAME');
where T.PRN = NRRPCONFSCTN PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from RRPCONFSCTNMRK T,');
and T.RRPCOLUMN = C.RN PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' RRPCOLUMN C');
group by C.RN, PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where T.PRN = ' || NRRPCONFSCTN);
C.CODE, PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.RRPCOLUMN = C.RN');
C.NAME PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' group by C.RN,');
order by C.CODE) PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' C.CODE,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' C.NAME,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' C.COLUMN_CODE,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' C.SORT_NUMB');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' order by ' || SORDER);
/* Разбираем его */
ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
/* Описываем структуру записи курсора */
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 1);
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
/* Делаем выборку */
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
null;
end if;
/* Обходим графы показателей раздела */
while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
loop loop
/* Считываем рег. номер строки */
PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 1, SVALUE => SCOL_CODE);
/* Считываем код строки */
PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR, IPOSITION => 2, SVALUE => SCOL_NAME);
/* Наименование графы */ /* Наименование графы */
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SCOL_' || REC.CODE, SNAME => 'SCOL_' || SCOL_CODE,
SCAPTION => REC.NAME, SCAPTION => SCOL_NAME,
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
NWIDTH => 200); NWIDTH => 200);
/* Рег. номер графы */ /* Рег. номер графы */
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NCOL_RN_' || REC.CODE, SNAME => 'NCOL_RN_' || SCOL_CODE,
SCAPTION => REC.NAME || ' рег. номер', SCAPTION => SCOL_NAME || ' рег. номер',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
BVISIBLE => false); BVISIBLE => false);
/* Рег. номер показателя */ /* Рег. номер показателя */
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NMARK_RN_' || REC.CODE, SNAME => 'NMARK_RN_' || SCOL_CODE,
SCAPTION => REC.NAME || ' рег. номер показателя', SCAPTION => SCOL_NAME || ' рег. номер показателя',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
BVISIBLE => false); BVISIBLE => false);
/* Мнемокод показателя */ /* Мнемокод показателя */
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SMARK_CODE_' || REC.CODE, SNAME => 'SMARK_CODE_' || SCOL_CODE,
SCAPTION => REC.NAME || ' мнемокод показателя', SCAPTION => SCOL_NAME || ' мнемокод показателя',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
BVISIBLE => false); BVISIBLE => false);
/* Для составов показтелей */ /* Для составов показтелей */
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'MARK_CNS_' || REC.CODE, SNAME => 'MARK_CNS_' || SCOL_CODE,
SCAPTION => REC.NAME || ' состав показателя', SCAPTION => SCOL_NAME || ' состав показателя',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
BVISIBLE => false); BVISIBLE => false);
end loop; end loop;
/* Освобождаем курсор */
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
exception
when others then
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
raise;
end MARKS_COLUMNS_INIT; end MARKS_COLUMNS_INIT;
/* Считывание показателя по строке/графе */ /* Считывание показателя по строке/графе */
@ -898,91 +984,159 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
loop loop
/* Инициализируем таблицу данных */ /* Инициализируем таблицу данных */
RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 1); RDG := PKG_P8PANELS_VISUAL.TDG_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 1);
/* Формируем структуру заголовка */ /* Наименование строки */
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SROW_NAME', SNAME => 'SROW_NAME',
SCAPTION => '', SCAPTION => '',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
NWIDTH => 150); NWIDTH => 150);
/* Формируем структуру заголовка */ /* Позиция строки */
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NROW_POS',
SCAPTION => 'Позиция строки',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
BVISIBLE => false);
/* Мнемокод строки */
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SROW_CODE', SNAME => 'SROW_CODE',
SCAPTION => 'Мнемокод строки', SCAPTION => 'Мнемокод строки',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
BVISIBLE => false); BVISIBLE => false);
/* Формируем структуру заголовка */ /* Рег. номер строки */
PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDG_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NROW_RN', SNAME => 'NROW_RN',
SCAPTION => 'Рег. номер строки', SCAPTION => 'Рег. номер строки',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
BVISIBLE => false); BVISIBLE => false);
/* Обнуляем счётчик позиции строки */
NROW_POS := 0;
/* Если раздел содержит показатели */ /* Если раздел содержит показатели */
if (S.NMARKS_EXISTS = 1) then if (S.NMARKS_EXISTS = 1) then
/* Формируем текстовое представление сортировки графы */
SORDERS_C := ORDER_TEXT_GET(NORDER => NCOL_ORDER, SALIAS => 'C', NTYPE => 0);
/* Инициализируем колонки граф */ /* Инициализируем колонки граф */
MARKS_COLUMNS_INIT(RDG => RDG, NRRPCONFSCTN => S.NRN); MARKS_COLUMNS_INIT(RDG => RDG, NRRPCONFSCTN => S.NRN, SORDER => SORDERS_C);
/* Обходим строки раздела */ begin
for R in (select R.RN, /* Формируем текстовое представление сортировки строки */
R.CODE, SORDERS_R := ORDER_TEXT_GET(NORDER => NROW_ORDER, SALIAS => 'R', NTYPE => 1);
R.NAME /* Добавляем подсказку совместимости */
from RRPCONFSCTNMRK T, CSQL_ROWS := PKG_SQL_BUILD.COMPATIBLE();
RRPROW R PKG_SQL_BUILD.APPEND(SSQL => CSQL_ROWS, SELEMENT1 => 'select R.RN,');
where T.PRN = S.NRN PKG_SQL_BUILD.APPEND(SSQL => CSQL_ROWS, SELEMENT1 => ' R.CODE,');
and R.RN = T.RRPROW PKG_SQL_BUILD.APPEND(SSQL => CSQL_ROWS, SELEMENT1 => ' R.NAME');
group by R.RN, PKG_SQL_BUILD.APPEND(SSQL => CSQL_ROWS, SELEMENT1 => ' from RRPCONFSCTNMRK T,');
R.CODE, PKG_SQL_BUILD.APPEND(SSQL => CSQL_ROWS, SELEMENT1 => ' RRPROW R');
R.NAME, PKG_SQL_BUILD.APPEND(SSQL => CSQL_ROWS, SELEMENT1 => ' where T.PRN = ' || S.NRN);
R.ROW_CODE, PKG_SQL_BUILD.APPEND(SSQL => CSQL_ROWS, SELEMENT1 => ' and R.RN = T.RRPROW');
R.SORT_NUMB PKG_SQL_BUILD.APPEND(SSQL => CSQL_ROWS, SELEMENT1 => ' group by R.RN,');
order by R.SORT_NUMB, PKG_SQL_BUILD.APPEND(SSQL => CSQL_ROWS, SELEMENT1 => ' R.CODE,');
LPAD(R.ROW_CODE, 40, '0'), PKG_SQL_BUILD.APPEND(SSQL => CSQL_ROWS, SELEMENT1 => ' R.NAME,');
LPAD(R.CODE, 20, '0')) PKG_SQL_BUILD.APPEND(SSQL => CSQL_ROWS, SELEMENT1 => ' R.ROW_CODE,');
loop PKG_SQL_BUILD.APPEND(SSQL => CSQL_ROWS, SELEMENT1 => ' R.SORT_NUMB');
/* Заполняем наименование строки */ PKG_SQL_BUILD.APPEND(SSQL => CSQL_ROWS, SELEMENT1 => ' order by ' || SORDERS_R);
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SROW_NAME', SVALUE => R.NAME, BCLEAR => true); /* Разбираем его */
/* Заполняем мнемокод строки */ ICURSOR_R := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SROW_CODE', SVALUE => R.CODE); PKG_SQL_DML.PARSE(ICURSOR => ICURSOR_R, SQUERY => CSQL_ROWS);
/* Заполняем рег. номер строки */ /* Описываем структуру записи курсора */
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NROW_RN', NVALUE => R.RN); PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR_R, IPOSITION => 1);
/* Обходим графы раздела */ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR_R, IPOSITION => 2);
for C in (select C.RN, PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR_R, IPOSITION => 3);
C.CODE, /* Делаем выборку */
C.NAME if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR_R) = 0) then
from RRPCONFSCTNMRK T, null;
RRPCOLUMN C end if;
where T.PRN = S.NRN /* Обходим выбранные записи */
and C.RN = T.RRPCOLUMN while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR_R) > 0)
group by C.RN,
C.CODE,
C.NAME,
C.COLUMN_CODE,
C.SORT_NUMB
order by C.SORT_NUMB,
LPAD(C.COLUMN_CODE, 40, '0'),
LPAD(C.CODE, 20, '0'))
loop loop
/* Считываем показатель по строке/графе */ /* Считываем рег. номер строки */
RRRPCONFSCTNMRK := RRPCONFSCTNMRK_GET_ROWCOL(NRRPCONFSCTN => S.NRN, NRRPROW => R.RN, NRRPCOLUMN => C.RN); PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR_R, IPOSITION => 1, NVALUE => NROW_RN);
/* Заполняем рег. номер графы */ /* Считываем код строки */
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SCOL_' || C.CODE, SVALUE => C.NAME); PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR_R, IPOSITION => 2, SVALUE => SROW_CODE);
/* Заполняем рег. номер графы */ /* Считываем наименование строки */
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCOL_RN_' || C.CODE, NVALUE => C.RN); PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR_R, IPOSITION => 3, SVALUE => SROW_NAME);
/* Заполняем рег. номер показателя */ /* Заполняем наименование строки */
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW,
SNAME => 'NMARK_RN_' || C.CODE, SNAME => 'SROW_NAME',
NVALUE => RRRPCONFSCTNMRK.RN); SVALUE => SROW_NAME,
/* Если ошибка считывания показателя */ BCLEAR => true);
if (RRRPCONFSCTNMRK.RN is not null) then /* Заполняем позицию строки */
/* Заполняем мнемокод показателя */ PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NROW_POS', NVALUE => NROW_POS);
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, /* Заполняем мнемокод строки */
SNAME => 'SMARK_CODE_' || C.CODE, PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SROW_CODE', SVALUE => SROW_CODE);
SVALUE => RRRPCONFSCTNMRK.CODE); /* Заполняем рег. номер строки */
/* Добавляем атрибут состава показателей */ PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NROW_RN', NVALUE => NROW_RN);
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'MARK_CNS_' || C.CODE, SVALUE => null); /* Добавляем подсказку совместимости */
CSQL_COLS := PKG_SQL_BUILD.COMPATIBLE();
PKG_SQL_BUILD.APPEND(SSQL => CSQL_COLS, SELEMENT1 => 'select C.RN,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL_COLS, SELEMENT1 => ' C.CODE,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL_COLS, SELEMENT1 => ' C.NAME');
PKG_SQL_BUILD.APPEND(SSQL => CSQL_COLS, SELEMENT1 => ' from RRPCONFSCTNMRK T,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL_COLS, SELEMENT1 => ' RRPCOLUMN C');
PKG_SQL_BUILD.APPEND(SSQL => CSQL_COLS, SELEMENT1 => ' where T.PRN = ' || S.NRN);
PKG_SQL_BUILD.APPEND(SSQL => CSQL_COLS, SELEMENT1 => ' and C.RN = T.RRPCOLUMN');
PKG_SQL_BUILD.APPEND(SSQL => CSQL_COLS, SELEMENT1 => ' group by C.RN,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL_COLS, SELEMENT1 => ' C.CODE,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL_COLS, SELEMENT1 => ' C.NAME,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL_COLS, SELEMENT1 => ' C.COLUMN_CODE,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL_COLS, SELEMENT1 => ' C.SORT_NUMB');
PKG_SQL_BUILD.APPEND(SSQL => CSQL_COLS, SELEMENT1 => ' order by ' || SORDERS_C);
/* Разбираем его */
ICURSOR_C := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
PKG_SQL_DML.PARSE(ICURSOR => ICURSOR_C, SQUERY => CSQL_COLS);
/* Описываем структуру записи курсора */
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR_C, IPOSITION => 1);
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR_C, IPOSITION => 2);
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR_C, IPOSITION => 3);
/* Делаем выборку */
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR_C) = 0) then
null;
end if; end if;
/* Обходим выбранные записи */
while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR_C) > 0)
loop
/* Считываем рег. номер графы */
PKG_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR_C, IPOSITION => 1, NVALUE => NCOL_RN);
/* Считываем код графы */
PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR_C, IPOSITION => 2, SVALUE => SCOL_CODE);
/* Считываем наименование графы */
PKG_SQL_DML.COLUMN_VALUE_STR(ICURSOR => ICURSOR_C, IPOSITION => 3, SVALUE => SCOL_NAME);
/* Считываем показатель по строке/графе */
RRRPCONFSCTNMRK := RRPCONFSCTNMRK_GET_ROWCOL(NRRPCONFSCTN => S.NRN,
NRRPROW => NROW_RN,
NRRPCOLUMN => NCOL_RN);
/* Заполняем наименование графы */
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SCOL_' || SCOL_CODE, SVALUE => SCOL_NAME);
/* Заполняем рег. номер графы */
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NCOL_RN_' || SCOL_CODE, NVALUE => NCOL_RN);
/* Заполняем рег. номер показателя */
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW,
SNAME => 'NMARK_RN_' || SCOL_CODE,
NVALUE => RRRPCONFSCTNMRK.RN);
/* Если ошибка считывания показателя */
if (RRRPCONFSCTNMRK.RN is not null) then
/* Заполняем мнемокод показателя */
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW,
SNAME => 'SMARK_CODE_' || SCOL_CODE,
SVALUE => RRRPCONFSCTNMRK.CODE);
/* Добавляем атрибут состава показателей */
PKG_P8PANELS_VISUAL.TDG_ROW_ADD_COL(RROW => RDG_ROW, SNAME => 'MARK_CNS_' || SCOL_CODE, SVALUE => null);
end if;
end loop;
/* Освобождаем курсор */
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR_C);
/* Добавим строку для раздела */
PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
/* Инкрементируем счётчик позиции строки */
NROW_POS := NROW_POS + 1;
end loop; end loop;
/* Добавим строку для раздела */ /* Освобождаем курсор */
PKG_P8PANELS_VISUAL.TDG_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR_R);
end loop; exception
when others then
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR_R);
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR_C);
raise;
end;
end if; end if;
/* Сериализуем описание */ /* Сериализуем описание */
CDG := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1); CDG := PKG_P8PANELS_VISUAL.TDG_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => 1);
@ -1058,10 +1212,10 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
/* Добавление раздела регламентированного отчёта */ /* Добавление раздела регламентированного отчёта */
procedure RRPCONFSCTN_INSERT procedure RRPCONFSCTN_INSERT
( (
NPRN in number, -- Ид. настройки форм регламентированного отчёта NPRN in number, -- Рег. номер настройки форм регламентированного отчёта
SCODE in varchar2, -- Мнемокод SCODE in varchar2, -- Мнемокод
SNAME in varchar2, -- Наименование SNAME in varchar2, -- Наименование
NRN out number -- Ид. созданной записи NRN out number -- Рег. номер созданной записи
) )
is is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
@ -1086,7 +1240,7 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
/* Исправление раздела регламентированного отчёта */ /* Исправление раздела регламентированного отчёта */
procedure RRPCONFSCTN_UPDATE procedure RRPCONFSCTN_UPDATE
( (
NRN in number, -- Ид. раздела NRN in number, -- Рег. номер раздела
SCODE in varchar2, -- Мнемокод раздела SCODE in varchar2, -- Мнемокод раздела
SNAME in varchar2 -- Наименование раздела SNAME in varchar2 -- Наименование раздела
) )
@ -1125,7 +1279,7 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
/* Удаление раздела регламентированного отчёта */ /* Удаление раздела регламентированного отчёта */
procedure RRPCONFSCTN_DELETE procedure RRPCONFSCTN_DELETE
( (
NRN in number -- Ид. раздела NRN in number -- Рег. номер раздела
) )
is is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
@ -1142,10 +1296,10 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
/* Получение кодов настройки, раздела и показателя раздела по ид. показателя раздела */ /* Получение кодов настройки, раздела и показателя раздела по ид. показателя раздела */
procedure RRPCONFSCTNMRK_GET_CODES procedure RRPCONFSCTNMRK_GET_CODES
( (
NRN in number, -- Ид. показателя раздела NRN in number, -- Рег. номер показателя раздела
SRRPCONF out varchar2, -- Код настройки формы регламентированного отчёта SRRPCONF out varchar2, -- Мнемокод настройки формы регламентированного отчёта
SRRPCONFSCTN out varchar2, -- Код раздела SRRPCONFSCTN out varchar2, -- Мнемокод раздела
SRRPCONFSCTNMRK out varchar2 -- Код показателя раздела SRRPCONFSCTNMRK out varchar2 -- Мнемокод показателя раздела
) )
is is
begin begin
@ -1227,12 +1381,12 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
/* Добавление показателя раздела регламентированного отчёта */ /* Добавление показателя раздела регламентированного отчёта */
procedure RRPCONFSCTNMRK_INSERT procedure RRPCONFSCTNMRK_INSERT
( (
NPRN in number, -- Ид. раздела NPRN in number, -- Рег. номер раздела
SCODE in varchar2, -- Мнемокод показателя раздела SCODE in varchar2, -- Мнемокод показателя раздела
SNAME in varchar2, -- Наименование показателя раздела SNAME in varchar2, -- Наименование показателя раздела
NRRPROW in number, -- Рег. номер строки NRRPROW in number, -- Рег. номер строки
NRRPCOLUMN in number, -- Рег. номер графы NRRPCOLUMN in number, -- Рег. номер графы
NRN out number -- Ид. созданной записи NRN out number -- Рег. номер созданной записи
) )
is is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации
@ -1285,7 +1439,7 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
/* Исправление показателя раздела регламентированного отчёта */ /* Исправление показателя раздела регламентированного отчёта */
procedure RRPCONFSCTNMRK_UPDATE procedure RRPCONFSCTNMRK_UPDATE
( (
NRN in number, -- Ид. показателя раздела NRN in number, -- Рег. номер показателя раздела
SNAME in varchar2 -- Новое наименование SNAME in varchar2 -- Новое наименование
) )
is is
@ -1340,7 +1494,7 @@ create or replace package body PKG_P8PANELS_RRPCONFED as
/* Удаление показателя раздела регламентированного отчёта */ /* Удаление показателя раздела регламентированного отчёта */
procedure RRPCONFSCTNMRK_DELETE procedure RRPCONFSCTNMRK_DELETE
( (
NRN in number -- Ид. показателя раздела NRN in number -- Рег. номер показателя раздела
) )
is is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Рег. номер организации