diff --git a/app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js b/app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js
new file mode 100644
index 0000000..04e626f
--- /dev/null
+++ b/app/panels/mech_rec_cost_prod_plans/datagrids/backend_dg.js
@@ -0,0 +1,251 @@
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import { useState, useCallback, useEffect, useContext } from "react";
+import { BackEndСtx } from "../../../context/backend"; //Контекст взаимодействия с сервером
+import { object2Base64XML, formatDateRF } from "../../../core/utils"; //Вспомогательные функции
+
+//---------
+//Константы
+//---------
+
+//Размер страницы данных
+const DATA_GRID_PAGE_SIZE = 10;
+
+//-----------
+//Тело модуля
+//-----------
+
+//Хук для таблицы маршрутных листов
+const useCostRouteLists = (task, taskType) => {
+ //Собственное состояние - таблица данных
+ const [costRouteLists, setCostRouteLists] = useState({
+ dataLoaded: false,
+ columnsDef: [],
+ orders: null,
+ rows: [],
+ reload: true,
+ pageNumber: 1,
+ morePages: true,
+ quantPlanSum: 0,
+ uniqueNomns: []
+ });
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
+
+ //Загрузка данных таблицы с сервера
+ const loadData = useCallback(async () => {
+ if (costRouteLists.reload) {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.FCROUTLST_DG_GET",
+ args: {
+ NFCPRODPLANSP: task,
+ NTYPE: taskType,
+ CORDERS: { VALUE: object2Base64XML(costRouteLists.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
+ NPAGE_NUMBER: costRouteLists.pageNumber,
+ NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
+ NINCLUDE_DEF: costRouteLists.dataLoaded ? 0 : 1
+ },
+ attributeValueProcessor: (name, val) => (["DEXEC_DATE", "DREL_DATE"].includes(name) ? formatDateRF(val) : val),
+ respArg: "COUT"
+ });
+ setCostRouteLists(pv => ({
+ ...pv,
+ columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,
+ rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],
+ dataLoaded: true,
+ reload: false,
+ morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE,
+ quantPlanSum: data.XROWS ? data.XROWS.reduce((a, b) => a + b["NQUANT_PLAN"], 0) : 0,
+ uniqueNomns: data.XROWS
+ ? data.XROWS.reduce((accumulator, current) => {
+ if (!accumulator.find(item => item.SMATRES_PLAN_NOMEN === current.SMATRES_PLAN_NOMEN)) {
+ accumulator.push(current);
+ }
+ return accumulator;
+ }, [])
+ : []
+ }));
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [
+ costRouteLists.reload,
+ costRouteLists.filters,
+ costRouteLists.orders,
+ costRouteLists.dataLoaded,
+ costRouteLists.pageNumber,
+ executeStored,
+ SERV_DATA_TYPE_CLOB
+ ]);
+
+ //При необходимости обновить данные таблицы
+ useEffect(() => {
+ loadData();
+ }, [costRouteLists.reload, loadData]);
+
+ return [costRouteLists, setCostRouteLists];
+};
+
+//Хук для таблицы приходов из подразделений
+const useIncomFromDeps = (task, taskType) => {
+ //Собственное состояние - таблица данных
+ const [incomFromDeps, setIncomFromDeps] = useState({
+ dataLoaded: false,
+ columnsDef: [],
+ orders: null,
+ rows: [],
+ reload: true,
+ pageNumber: 1,
+ morePages: true
+ });
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
+
+ //Загрузка данных таблицы с сервера
+ const loadData = useCallback(async () => {
+ if (incomFromDeps.reload) {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.INCOMEFROMDEPS_DG_GET",
+ args: {
+ NFCPRODPLANSP: task,
+ NTYPE: taskType,
+ CORDERS: { VALUE: object2Base64XML(incomFromDeps.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
+ NPAGE_NUMBER: incomFromDeps.pageNumber,
+ NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
+ NINCLUDE_DEF: incomFromDeps.dataLoaded ? 0 : 1
+ },
+ attributeValueProcessor: (name, val) => (["DWORK_DATE"].includes(name) ? formatDateRF(val) : val),
+ respArg: "COUT"
+ });
+ setIncomFromDeps(pv => ({
+ ...pv,
+ columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,
+ rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],
+ dataLoaded: true,
+ reload: false,
+ morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE
+ }));
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [incomFromDeps.reload, incomFromDeps.orders, incomFromDeps.dataLoaded, incomFromDeps.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);
+
+ //При необходимости обновить данные таблицы
+ useEffect(() => {
+ loadData();
+ }, [incomFromDeps.reload, loadData]);
+
+ return [incomFromDeps, setIncomFromDeps];
+};
+
+//Хук для таблицы товарных запасов
+const useGoodsParties = mainRowRN => {
+ //Собственное состояние - таблица данных
+ const [goodsParties, setGoodsParties] = useState({
+ dataLoaded: false,
+ columnsDef: [],
+ orders: null,
+ rows: [],
+ reload: true,
+ pageNumber: 1,
+ morePages: true
+ });
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
+
+ //Загрузка данных таблицы с сервера
+ const loadData = useCallback(async () => {
+ if (goodsParties.reload) {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.GOODSPARTIES_DG_GET",
+ args: {
+ NFCROUTLST: mainRowRN,
+ CORDERS: { VALUE: object2Base64XML(goodsParties.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
+ NPAGE_NUMBER: goodsParties.pageNumber,
+ NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
+ NINCLUDE_DEF: goodsParties.dataLoaded ? 0 : 1
+ },
+ respArg: "COUT"
+ });
+ setGoodsParties(pv => ({
+ ...pv,
+ columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,
+ rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],
+ dataLoaded: true,
+ reload: false,
+ morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE
+ }));
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [goodsParties.reload, goodsParties.orders, goodsParties.dataLoaded, goodsParties.pageNumber, executeStored, SERV_DATA_TYPE_CLOB]);
+
+ //При необходимости обновить данные таблицы
+ useEffect(() => {
+ loadData();
+ }, [goodsParties.reload, loadData]);
+
+ return [goodsParties, setGoodsParties];
+};
+
+//Хук для таблицы строк комплектации
+const useCostDeliveryLists = mainRowRN => {
+ //Собственное состояние - таблица данных
+ const [costDeliveryLists, setCostDeliveryLists] = useState({
+ dataLoaded: false,
+ columnsDef: [],
+ orders: null,
+ rows: [],
+ reload: true,
+ pageNumber: 1,
+ morePages: true
+ });
+
+ //Подключение к контексту взаимодействия с сервером
+ const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
+
+ //Загрузка данных таблицы строк комплектации с сервера
+ const loadData = useCallback(async () => {
+ if (costDeliveryLists.reload) {
+ const data = await executeStored({
+ stored: "PKG_P8PANELS_MECHREC.FCDELIVERYLISTSP_DG_GET",
+ args: {
+ NFCROUTLST: mainRowRN,
+ CORDERS: { VALUE: object2Base64XML(costDeliveryLists.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
+ NPAGE_NUMBER: costDeliveryLists.pageNumber,
+ NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
+ NINCLUDE_DEF: costDeliveryLists.dataLoaded ? 0 : 1
+ },
+ attributeValueProcessor: (name, val) => (name === "DRES_DATE_TO" ? formatDateRF(val) : val),
+ respArg: "COUT"
+ });
+ setCostDeliveryLists(pv => ({
+ ...pv,
+ columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,
+ rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])],
+ dataLoaded: true,
+ reload: false,
+ morePages: (data.XROWS || []).length >= DATA_GRID_PAGE_SIZE
+ }));
+ }
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ }, [
+ costDeliveryLists.reload,
+ costDeliveryLists.orders,
+ costDeliveryLists.dataLoaded,
+ costDeliveryLists.pageNumber,
+ executeStored,
+ SERV_DATA_TYPE_CLOB
+ ]);
+
+ //При необходимости обновить данные таблицы
+ useEffect(() => {
+ loadData();
+ }, [costDeliveryLists.reload, loadData]);
+
+ return [costDeliveryLists, setCostDeliveryLists];
+};
+
+export { useCostRouteLists, useIncomFromDeps, useGoodsParties, useCostDeliveryLists };
diff --git a/app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js b/app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js
new file mode 100644
index 0000000..75f5021
--- /dev/null
+++ b/app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js
@@ -0,0 +1,90 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Производственная программа
+ Компонент панели: Таблица строк комплектации
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Typography } from "@mui/material"; //Интерфейсные элементы
+import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../../components/p8p_data_grid"; //Таблица данных
+import { P8P_DATA_GRID_CONFIG_PROPS } from "../../../config_wrapper"; //Подключение компонентов к настройкам приложения
+import { useCostDeliveryLists } from "./backend_dg"; //Собственные хуки таблиц
+
+//---------
+//Константы
+//---------
+
+//Стили
+const STYLES = {
+ CONTAINER: { margin: "5px 0px", textAlign: "center" }
+};
+
+//------------------------------------
+//Вспомогательные функции и компоненты
+//------------------------------------
+
+//Генерация заливки строки исходя от значений
+const dataCellRender = ({ row, columnDef }) => {
+ //Если "Количество план" равно или меньше "Остаток"
+ if (row["NQUANT_PLAN"] <= row["NREST"]) {
+ return {
+ cellStyle: { backgroundColor: "lightblue" },
+ data: row[columnDef]
+ };
+ } else {
+ return {
+ data: row[columnDef]
+ };
+ }
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Таблица строк комплектации
+const CostDeliveryListsDataGrid = ({ mainRowRN }) => {
+ //Собственное состояние - таблица данных
+ const [costDeliveryLists, setCostDeliveryLists] = useCostDeliveryLists(mainRowRN);
+
+ //При изменении состояния сортировки
+ const handleOrderChanged = ({ orders }) => setCostDeliveryLists(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true }));
+
+ //При изменении количества отображаемых страниц
+ const handlePagesCountChanged = () => setCostDeliveryLists(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true }));
+
+ //Генерация содержимого
+ return (
+
+
Строки комплектации
+ {costDeliveryLists.dataLoaded ? (
+
dataCellRender({ ...prms })}
+ />
+ ) : null}
+
+ );
+};
+
+//Контроль свойств - Таблица строк комплектации
+CostDeliveryListsDataGrid.propTypes = {
+ mainRowRN: PropTypes.number.isRequired
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { CostDeliveryListsDataGrid };
diff --git a/app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js b/app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js
new file mode 100644
index 0000000..a523514
--- /dev/null
+++ b/app/panels/mech_rec_cost_prod_plans/datagrids/fcroutlst.js
@@ -0,0 +1,112 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Производственная программа
+ Компонент панели: Таблица маршрутных листов
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Typography, Box, Paper } from "@mui/material"; //Интерфейсные элементы
+import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../../components/p8p_data_grid"; //Таблица данных
+import { P8P_DATA_GRID_CONFIG_PROPS } from "../../../config_wrapper"; //Подключение компонентов к настройкам приложения
+import { GoodsPartiesDataGrid } from "./goodparties";
+import { CostDeliveryListsDataGrid } from "./fcdeliverylistsp";
+import { useCostRouteLists } from "./backend_dg"; //Собственные хуки таблиц
+
+//---------
+//Константы
+//---------
+
+//Стили
+const STYLES = {
+ CONTAINER: { textAlign: "center" },
+ TABLE: { paddingTop: "15px" },
+ TABLE_SUM: { textAlign: "right", paddingTop: "5px", paddingRight: "15px" }
+};
+
+//---------------------------------------------
+//Вспомогательные функции форматирования данных
+//---------------------------------------------
+
+//Генерация представления расширения строки
+export const rowExpandRender = ({ row }) => {
+ return (
+
+
+
+ );
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Таблица маршрутных листов
+const CostRouteListsDataGrid = ({ task, taskType }) => {
+ //Собственное состояние - таблица данных
+ const [costRouteLists, setCostRouteLists] = useCostRouteLists(task, taskType);
+
+ //Необходимость разворачивать строки только для типа задачи 1
+ const needExpand = taskType === 1;
+
+ //При изменении состояния сортировки
+ const handleOrderChanged = ({ orders }) => setCostRouteLists(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true }));
+
+ //При изменении количества отображаемых страниц
+ const handlePagesCountChanged = () => setCostRouteLists(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true }));
+
+ //Генерация содержимого
+ return (
+
+
Маршрутные листы
+ {costRouteLists.dataLoaded ? (
+ <>
+
+
+ {taskType === 0 ? (
+
+ Итого: {costRouteLists.quantPlanSum}
+
+ ) : null}
+
+ {taskType === 0
+ ? costRouteLists.uniqueNomns.map(item => (
+
+ ))
+ : null}
+ >
+ ) : null}
+
+ );
+};
+
+//Контроль свойств - Таблица маршрутных листов
+CostRouteListsDataGrid.propTypes = {
+ task: PropTypes.number.isRequired,
+ taskType: PropTypes.number.isRequired
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { CostRouteListsDataGrid };
diff --git a/app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js b/app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js
new file mode 100644
index 0000000..be18627
--- /dev/null
+++ b/app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js
@@ -0,0 +1,92 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Производственная программа
+ Компонент панели: Таблица товарных запасов
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Typography } from "@mui/material"; //Интерфейсные элементы
+import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../../components/p8p_data_grid"; //Таблица данных
+import { P8P_DATA_GRID_CONFIG_PROPS } from "../../../config_wrapper"; //Подключение компонентов к настройкам приложения
+import { useGoodsParties } from "./backend_dg"; //Собственные хуки таблиц
+
+//---------
+//Константы
+//---------
+
+//Стили
+const STYLES = {
+ CONTAINER: { margin: "5px 0px", textAlign: "center" }
+};
+
+//------------------------------------
+//Вспомогательные функции и компоненты
+//------------------------------------
+
+//Генерация представления строки на основании заглавной
+const dataCellRender = ({ row, columnDef, quantPlanSum }) => {
+ //Если остаток больше суммы "Выдать по норме" - закрашиваем голубым
+ if (row["NRESTFACT"] >= quantPlanSum) {
+ return {
+ cellStyle: { backgroundColor: "lightblue" },
+ data: row[columnDef]
+ };
+ } else {
+ return {
+ data: row[columnDef]
+ };
+ }
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Таблица товарных запасов
+const GoodsPartiesDataGrid = ({ mainRowRN, quantPlanSum, nomenclature }) => {
+ //Собственное состояние - таблица данных
+ const [goodsParties, setGoodsParties] = useGoodsParties(mainRowRN);
+
+ //При изменении состояния сортировки
+ const handleOrderChanged = ({ orders }) => setGoodsParties(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true }));
+
+ //При изменении количества отображаемых страниц
+ const handlePagesCountChanged = () => setGoodsParties(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true }));
+
+ //Генерация содержимого
+ return (
+
+
{`Товарные запасы по номенклатуре "${nomenclature}"`}
+ {goodsParties.dataLoaded ? (
+
dataCellRender({ ...prms, quantPlanSum })}
+ />
+ ) : null}
+
+ );
+};
+
+//Контроль свойств - Таблица товарных запасов
+GoodsPartiesDataGrid.propTypes = {
+ mainRowRN: PropTypes.number.isRequired,
+ quantPlanSum: PropTypes.number,
+ nomenclature: PropTypes.string
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { GoodsPartiesDataGrid };
diff --git a/app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.js b/app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.js
new file mode 100644
index 0000000..4c0ce52
--- /dev/null
+++ b/app/panels/mech_rec_cost_prod_plans/datagrids/incomefromdeps.js
@@ -0,0 +1,74 @@
+/*
+ Парус 8 - Панели мониторинга - ПУП - Производственная программа
+ Компонент панели: Таблица приходов из подразделений
+*/
+
+//---------------------
+//Подключение библиотек
+//---------------------
+
+import React from "react"; //Классы React
+import PropTypes from "prop-types"; //Контроль свойств компонента
+import { Typography, Box } from "@mui/material"; //Интерфейсные элементы
+import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../../components/p8p_data_grid"; //Таблица данных
+import { P8P_DATA_GRID_CONFIG_PROPS } from "../../../config_wrapper"; //Подключение компонентов к настройкам приложения
+import { useIncomFromDeps } from "./backend_dg"; //Собственные хуки таблиц
+
+//---------
+//Константы
+//---------
+
+//Стили
+const STYLES = {
+ CONTAINER: { textAlign: "center" },
+ TABLE: { paddingTop: "15px" }
+};
+
+//-----------
+//Тело модуля
+//-----------
+
+//Таблица приходов из подразделений
+const IncomFromDepsDataGrid = ({ task, taskType }) => {
+ //Собственное состояние - таблица данных
+ const [incomFromDeps, setIncomFromDeps] = useIncomFromDeps(task, taskType);
+
+ //При изменении состояния сортировки
+ const handleOrderChanged = ({ orders }) => setIncomFromDeps(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true }));
+
+ //При изменении количества отображаемых страниц
+ const handlePagesCountChanged = () => setIncomFromDeps(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true }));
+
+ //Генерация содержимого
+ return (
+
+
Приходы из подразделений
+
+ {incomFromDeps.dataLoaded ? (
+
+ ) : null}
+
+
+ );
+};
+
+//Контроль свойств - Таблица приходов из подразделений
+IncomFromDepsDataGrid.propTypes = {
+ task: PropTypes.number.isRequired,
+ taskType: PropTypes.number
+};
+
+//----------------
+//Интерфейс модуля
+//----------------
+
+export { IncomFromDepsDataGrid };
diff --git a/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js b/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js
index dc5566e..049c016 100644
--- a/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js
+++ b/app/panels/mech_rec_cost_prod_plans/mech_rec_cost_prod_plans.js
@@ -24,7 +24,11 @@ import {
InputLabel,
FormGroup,
FormControlLabel,
- Checkbox
+ Checkbox,
+ Button,
+ Dialog,
+ DialogContent,
+ DialogActions
} from "@mui/material"; //Интерфейсные элементы
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
import { MessagingСtx } from "../../context/messaging"; //Контекст сообщений
@@ -32,6 +36,8 @@ import { P8P_GANTT_CONFIG_PROPS } from "../../config_wrapper"; //Подключ
import { P8PGantt } from "../../components/p8p_gantt"; //Диаграмма Ганта
import { xml2JSON, formatDateJSONDateOnly } from "../../core/utils"; //Вспомогательные функции
import { useFilteredPlanCtlgs } from "./hooks"; //Вспомогательные хуки
+import { CostRouteListsDataGrid } from "./datagrids/fcroutlst";
+import { IncomFromDepsDataGrid } from "./datagrids/incomefromdeps";
//---------
//Константы
@@ -65,7 +71,8 @@ const STYLES = {
[`& .MuiDrawer-paper`]: { width: "350px", display: "inline-block", boxSizing: "border-box" }
},
GANTT_CONTAINER: { height: GANTT_HEIGHT, width: GANTT_WIDTH },
- GANTT_TITLE: { paddingLeft: "100px", paddingRight: "120px" }
+ GANTT_TITLE: { paddingLeft: "100px", paddingRight: "120px" },
+ SECOND_TABLE: { paddingTop: "30px" }
};
//------------------------------------
@@ -186,7 +193,9 @@ const MechRecCostProdPlans = () => {
selectedPlanCtlgSort: null,
selectedPlanCtlgMenuItems: null,
selectedPlanCtlgGanttDef: {},
- selectedPlanCtlgSpecs: []
+ selectedPlanCtlgSpecs: [],
+ selectedTaskDetail: null,
+ selectedTaskDetailType: null
});
//Состояние для фильтра каталогов
const [filter, setFilter] = useState({ ctlgName: "", haveDocs: false });
@@ -226,7 +235,9 @@ const MechRecCostProdPlans = () => {
selectedPlanCtlgMenuItems: null,
selectedPlanCtlgSpecs: [],
selectedPlanCtlgGanttDef: {},
- showPlanList: false
+ showPlanList: false,
+ selectedTaskDetail: null,
+ selectedTaskDetailType: null
}));
};
@@ -242,7 +253,9 @@ const MechRecCostProdPlans = () => {
selectedPlanCtlgMenuItems: null,
selectedPlanCtlgSpecs: [],
selectedPlanCtlgGanttDef: {},
- showPlanList: false
+ showPlanList: false,
+ selectedTaskDetail: null,
+ selectedTaskDetailType: null
}));
//Загрузка списка спецификаций каталога планов
@@ -299,6 +312,34 @@ const MechRecCostProdPlans = () => {
setState(pv => ({ ...pv, selectedPlanCtlgSort: selectedSort }));
};
+ //При закрытии окна детализации
+ const handleTaskDetailClose = () => {
+ setState(pv => ({ ...pv, selectedTaskDetail: null, selectedTaskDetailType: null }));
+ };
+
+ //При открытии окна детализации
+ const handleTaskDetailOpen = (taskRn, taskType) => {
+ setState(pv => ({ ...pv, selectedTaskDetail: taskRn, selectedTaskDetailType: taskType }));
+ };
+
+ //Генерация ссылки на документы анализа отклонений
+ const taskAttributeRenderer = ({ task, attribute }) => {
+ // Если есть информация о детализации и указан тип - делаем кнопку открытия документов
+ if (attribute.name === "detail_list" && task.type !== null && task.type !== "") {
+ return (
+
+ );
+ } else {
+ return null;
+ }
+ };
+
//Генерация содержимого
return (
@@ -369,14 +410,14 @@ const MechRecCostProdPlans = () => {
- ) : //
- null}
+ ) : null}
)
@@ -386,6 +427,30 @@ const MechRecCostProdPlans = () => {
) : null}
+ {state.selectedTaskDetail ? (
+
+ ) : null}
);
};
diff --git a/db/PKG_P8PANELS_MECHREC.pck b/db/PKG_P8PANELS_MECHREC.pck
index cb486cb..905133f 100644
--- a/db/PKG_P8PANELS_MECHREC.pck
+++ b/db/PKG_P8PANELS_MECHREC.pck
@@ -1,5 +1,51 @@
create or replace package PKG_P8PANELS_MECHREC as
+ /* Получение таблицы ПиП на основании маршрутного листа, связанных со спецификацией плана */
+ procedure INCOMEFROMDEPS_DG_GET
+ (
+ NFCPRODPLANSP in number, -- Рег. номер связанной спецификации плана
+ NTYPE in number, -- Тип спецификации плана (2 - Не включать "Состояние", 3 - включать)
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ );
+
+ /* Получение строк комплектации на основании маршрутного листа */
+ procedure FCDELIVERYLISTSP_DG_GET
+ (
+ NFCROUTLST in number, -- Рег. номер маршрутного листа
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ );
+
+ /* Получение товарных запасов на основании маршрутного листа */
+ procedure GOODSPARTIES_DG_GET
+ (
+ NFCROUTLST in number, -- Рег. номер маршрутного листа
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ );
+
+ /* Получение таблицы маршрутных листов, связанных со спецификацией плана с учетом типа */
+ procedure FCROUTLST_DG_GET
+ (
+ NFCPRODPLANSP in number, -- Рег. номер связанной спецификации плана
+ NTYPE in number, -- Тип спецификации плана (0 - Деталь, 1 - Изделие/сборочная единица, 3/4 - ПиП)
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ );
+
/* Получение списка спецификаций планов и отчетов производства изделий для диаграммы Ганта */
procedure FCPRODPLANSP_GET
(
@@ -9,7 +55,7 @@ create or replace package PKG_P8PANELS_MECHREC as
COUT out clob, -- Список проектов
NMAX_LEVEL out number -- Максимальный уровень иерархии
);
-
+
/* Инициализация каталогов раздела "Планы и отчеты производства изделий" */
procedure ACATALOG_INIT
(
@@ -21,25 +67,1428 @@ end PKG_P8PANELS_MECHREC;
create or replace package body PKG_P8PANELS_MECHREC as
/* Константы - цвета отображения */
- SBG_COLOR_RED constant PKG_STD.TSTRING := 'red'; -- Цвет заливки красный (Дефицит запуска != 0)
+ SBG_COLOR_RED constant PKG_STD.TSTRING := 'red'; -- Цвет заливки красный (Дефицит запуска != 0 или нет связей и дата запуска меньше текущей)
SBG_COLOR_YELLOW constant PKG_STD.TSTRING := '#e0db44'; -- Цвет заливки желтый (Дефицит» запуска = 0 и Выпуск факт = 0)
SBG_COLOR_GREEN constant PKG_STD.TSTRING := 'lightgreen'; -- Цвет заливки зеленый (Дефицит выпуска = 0)
+ SBG_COLOR_GREY constant PKG_STD.TSTRING := 'lightgrey'; -- Цвет заливки серый (Дата запуска больше текущей)
SBG_COLOR_BLACK constant PKG_STD.TSTRING := 'black'; -- Цвет заливки черный (Нет дат и связей)
STEXT_COLOR_ORANGE constant PKG_STD.TSTRING := '#FF8C00'; -- Цвет текста для черной заливки (оранжевый)
-
+
/* Константы - параметры отборов планов */
NFCPRODPLAN_CATEGORY constant PKG_STD.TNUMBER := 1; -- Категория планов "Производственная программа"
NFCPRODPLAN_STATUS constant PKG_STD.TNUMBER := 2; -- Статус планов "Утвержден"
SFCPRODPLAN_TYPE constant PKG_STD.TSTRING := 'План'; -- Тип планов (мнемокод состояния)
-
+
/* Константы - дополнительные атрибуты */
- STASK_ATTR_PROD_ORDER constant PKG_STD.TSTRING := 'prod_order'; -- Заказ
- STASK_ATTR_SUBDIV_DLVR constant PKG_STD.TSTRING := 'subdiv_dlvr'; -- Сдающее подразделение
- STASK_ATTR_MAIN_QUANT constant PKG_STD.TSTRING := 'main_quant'; -- Выпуск
- STASK_ATTR_DEFRESLIZ constant PKG_STD.TSTRING := 'defresliz'; -- Дефицит запуска
- STASK_ATTR_REL_FACT constant PKG_STD.TSTRING := 'rel_fact'; -- Выпуск факт
- STASK_ATTR_DEFSTART constant PKG_STD.TSTRING := 'defstart'; -- Дефицит выпуска
- STASK_ATTR_LEVEL constant PKG_STD.TSTRING := 'level'; -- Уровень
+ STASK_ATTR_START_FACT constant PKG_STD.TSTRING := 'start_fact'; -- Запущено
+ STASK_ATTR_MAIN_QUANT constant PKG_STD.TSTRING := 'main_quant'; -- Количество план
+ STASK_ATTR_REL_FACT constant PKG_STD.TSTRING := 'rel_fact'; -- Количество сдано
+ STASK_ATTR_REP_DATE_TO constant PKG_STD.TSTRING := 'rep_date_to'; -- Дата выпуска план
+ STASK_ATTR_DL constant PKG_STD.TSTRING := 'detail_list'; -- Связанные документы
+ STASK_ATTR_TYPE constant PKG_STD.TSTRING := 'type'; -- Тип (0 - Деталь, 1 - Изделие/сборочная единица)
+
+ /* Инциализация списка маршрутных листов (с иерархией) */
+ procedure UTL_FCROUTLST_IDENT_INIT
+ (
+ NFCPRODPLANSP in number, -- Рег. номер связанной спецификации плана
+ NIDENT out number -- Идентификатор отмеченных записей
+ )
+ is
+ /* Рекурсивная процедура формирования списка маршрутных листов */
+ procedure PUT_FCROUTLST
+ (
+ NIDENT in number, -- Идентификатор отмеченных записей
+ NFCROUTLST in number -- Рег. номер маршрутного листа
+ )
+ is
+ NTMP PKG_STD.TNUMBER; -- Буфер
+ begin
+ /* Добавление в список */
+ begin
+ P_SELECTLIST_INSERT(NIDENT => NIDENT, NDOCUMENT => NFCROUTLST, SUNITCODE => 'CostRouteLists', NRN => NTMP);
+ exception
+ when others then
+ return;
+ end;
+ /* Маршрутные листы, связанные со строками добавленного */
+ for RLST in (select distinct L.OUT_DOCUMENT as RN
+ from FCROUTLSTSP LS,
+ DOCLINKS L
+ where LS.PRN = NFCROUTLST
+ and L.IN_DOCUMENT = LS.RN
+ and L.IN_UNITCODE = 'CostRouteListsSpecs'
+ and L.OUT_UNITCODE = 'CostRouteLists')
+ loop
+ /* Добавляем по данному листу */
+ PUT_FCROUTLST(NIDENT => NIDENT, NFCROUTLST => RLST.RN);
+ end loop;
+ end PUT_FCROUTLST;
+ begin
+ /* Генерируем идентификатор */
+ NIDENT := GEN_IDENT();
+ /* Цикл по связанным напрямую маршрутным листам */
+ for RLST in (select D.RN
+ from FCROUTLST D
+ where D.RN in (select L.OUT_DOCUMENT
+ from DOCLINKS L
+ where L.IN_DOCUMENT = NFCPRODPLANSP
+ and L.IN_UNITCODE = 'CostProductPlansSpecs'
+ and L.OUT_UNITCODE = 'CostRouteLists'))
+ loop
+ /* Рекурсивная процедура формирования списка маршрутных листов */
+ PUT_FCROUTLST(NIDENT => NIDENT, NFCROUTLST => RLST.RN);
+ end loop;
+ end UTL_FCROUTLST_IDENT_INIT;
+
+ /* Проверка наличия связанных маршрутных листов */
+ function LINK_FCROUTLST_CHECK
+ (
+ NCOMPANY in number, -- Рег. номер организации
+ NFCPRODPLANSP in number, -- Рег. номер спецификации плана
+ NSTATE in number := null -- Состояние маршрутного листа
+ ) return number -- Наличие связанного МЛ (0 - нет, 1 - есть)
+ is
+ NRESULT PKG_STD.TNUMBER; -- Наличие связанного МЛ (0 - нет, 1 - есть)
+ begin
+ begin
+ select 1
+ into NRESULT
+ from DUAL
+ where exists (select null
+ from DOCLINKS L,
+ FCROUTLST F
+ where L.IN_DOCUMENT = NFCPRODPLANSP
+ and L.IN_UNITCODE = 'CostProductPlansSpecs'
+ and L.IN_COMPANY = NCOMPANY
+ and L.OUT_UNITCODE = 'CostRouteLists'
+ and L.OUT_COMPANY = NCOMPANY
+ and F.RN = L.OUT_DOCUMENT
+ and ((NSTATE is null) or ((NSTATE is not null) and (F.STATE = NSTATE)))
+ and ROWNUM = 1);
+ exception
+ when others then
+ NRESULT := 0;
+ end;
+ /* Возвращаем результат */
+ return NRESULT;
+ end LINK_FCROUTLST_CHECK;
+
+ /* Проверка наличия связанных приходов из подразделений */
+ function LINK_INCOMEFROMDEPS_CHECK
+ (
+ NCOMPANY in number, -- Рег. номер организации
+ NFCPRODPLANSP in number, -- Рег. номер спецификации плана
+ NSTATE in number := null -- Состояние ПиП
+ ) return number -- Наличие связанного ПиП (0 - нет, 1 - есть)
+ is
+ NRESULT PKG_STD.TNUMBER; -- Наличие связанного ПиП (0 - нет, 1 - есть)
+ NFCROUTLST_IDENT PKG_STD.TREF; -- Рег. номер идентификатора отмеченных записей маршрутных листов
+ begin
+ /* Инициализируем список маршрутных листов */
+ UTL_FCROUTLST_IDENT_INIT(NFCPRODPLANSP => NFCPRODPLANSP, NIDENT => NFCROUTLST_IDENT);
+ /* Проверяем наличие */
+ begin
+ select 1
+ into NRESULT
+ from DUAL
+ where exists (select null
+ from DOCLINKS L,
+ INCOMEFROMDEPS F
+ where L.IN_DOCUMENT = NFCPRODPLANSP
+ and L.IN_UNITCODE = 'CostProductPlansSpecs'
+ and L.OUT_UNITCODE = 'IncomFromDeps'
+ and L.OUT_COMPANY = NCOMPANY
+ and F.RN = L.OUT_DOCUMENT
+ and F.COMPANY = NCOMPANY
+ and ((NSTATE is null) or ((NSTATE is not null) and (F.DOC_STATE = NSTATE)))
+ and ROWNUM = 1)
+ or exists (select null
+ from INCOMEFROMDEPS F
+ where F.RN in (select L.OUT_DOCUMENT
+ from SELECTLIST SL,
+ DOCLINKS L
+ where SL.IDENT = NFCROUTLST_IDENT
+ and SL.UNITCODE = 'CostRouteLists'
+ and L.IN_DOCUMENT = SL.DOCUMENT
+ and L.IN_UNITCODE = 'CostRouteLists'
+ and L.OUT_UNITCODE = 'IncomFromDeps'));
+ exception
+ when others then
+ NRESULT := 0;
+ end;
+ /* Очищаем отмеченные маршрутные листы */
+ P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
+ /* Возвращаем результат */
+ return NRESULT;
+ exception
+ when others then
+ /* Очищаем отмеченные маршрутные листы */
+ P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
+ raise;
+ end LINK_INCOMEFROMDEPS_CHECK;
+
+ /* Получение таблицы ПиП на основании маршрутного листа, связанных со спецификацией плана */
+ procedure INCOMEFROMDEPS_DG_GET
+ (
+ NFCPRODPLANSP in number, -- Рег. номер связанной спецификации плана
+ NTYPE in number, -- Тип спецификации плана (2 - Не включать "Состояние", 3 - включать)
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ NFCROUTLST_IDENT PKG_STD.TREF; -- Рег. номер идентификатора отмеченных записей маршрутных листов
+ begin
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SDOC_INFO',
+ SCAPTION => 'Накладная',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ /* Если тип = 3, то необходимо включать состояние */
+ if (NTYPE = 3) then
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SDOC_STATE',
+ SCAPTION => 'Состояние',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ end if;
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'DWORK_DATE',
+ SCAPTION => 'Дата сдачи',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SDOC_VALID_INFO',
+ SCAPTION => 'Маршрутный лист',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SOUT_DEPARTMENT',
+ SCAPTION => 'Сдающий цех',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SSTORE',
+ SCAPTION => 'Склад цеха потребителя',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NQUANT_FACT',
+ SCAPTION => 'Количество сдано',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ /* Инициализируем список маршрутных листов */
+ UTL_FCROUTLST_IDENT_INIT(NFCPRODPLANSP => NFCPRODPLANSP, NIDENT => NFCROUTLST_IDENT);
+ /* Обходим данные */
+ begin
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DT.DOCCODE ||');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' '', '' || TRIM(T.DOC_PREF) ||');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ''-'' || TRIM(T.DOC_NUMB) ||');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' '', '' || TO_CHAR(T.DOC_DATE, ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'dd.mm.yyyy') || ') as SDOC_INFO,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case T.DOC_STATE');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when 0 then');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Не отработан'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when 1 then');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Отработан как план'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when 2 then');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Отработан как факт'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' else');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' end SDOC_STATE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.WORK_DATE DWORK_DATE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DTV.DOCCODE ||');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' '', '' || T.VALID_DOCNUMB || ');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' '', '' || TO_CHAR(T.VALID_DOCDATE, ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'dd.mm.yyyy') || ') as SDOC_VALID_INFO,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' D.CODE SOUT_DEPARTMENT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' S.AZS_NUMBER SSTORE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select SUM(SP.QUANT_FACT)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from INCOMEFROMDEPSSPEC SP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where SP.PRN = T.RN) NQUANT_FACT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from INCOMEFROMDEPS T left outer join DOCTYPES DTV on T.VALID_DOCTYPE = DTV.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join INS_DEPARTMENT D on T.OUT_DEPARTMENT = D.RN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DOCTYPES DT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' AZSAZSLISTMT S');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where ((T.RN in (select L.OUT_DOCUMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from DOCLINKS L');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where L.IN_DOCUMENT = :NFCPRODPLANSP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and L.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostProductPlansSpecs'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and L.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'IncomFromDeps') || '))');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' or (T.RN in (select L.OUT_DOCUMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from SELECTLIST SL,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DOCLINKS L');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where SL.IDENT = :NFCROUTLST_IDENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and SL.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and L.IN_DOCUMENT = SL.DOCUMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and L.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and L.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'IncomFromDeps') || ')))');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.DOC_TYPE = DT.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.STORE = S.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
+ PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
+ /* Делаем подстановку параметров */
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCPRODPLANSP', NVALUE => NFCPRODPLANSP);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCROUTLST_IDENT', NVALUE => NFCROUTLST_IDENT);
+ /* Описываем структуру записи курсора */
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
+ PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 4);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 5);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 6);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 7);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 8);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 9);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
+ end if;
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
+ loop
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SDOC_INFO',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ /* Если тип = 3, то необходимо включать состояние */
+ if (NTYPE = 3) then
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SDOC_STATE',
+ ICURSOR => ICURSOR,
+ NPOSITION => 3);
+ end if;
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW,
+ SNAME => 'DWORK_DATE',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SDOC_VALID_INFO',
+ ICURSOR => ICURSOR,
+ NPOSITION => 5);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SOUT_DEPARTMENT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 6);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SSTORE', ICURSOR => ICURSOR, NPOSITION => 7);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NQUANT_FACT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 8);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ /* Очищаем отмеченные маршрутные листы */
+ P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ exception
+ when others then
+ /* Очищаем отмеченные маршрутные листы */
+ P_SELECTLIST_CLEAR(NIDENT => NFCROUTLST_IDENT);
+ raise;
+ end INCOMEFROMDEPS_DG_GET;
+
+ /* Получение таблицы строк комплектации на основании маршрутного листа */
+ procedure FCDELIVERYLISTSP_DG_GET
+ (
+ NFCROUTLST in number, -- Рег. номер маршрутного листа
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ begin
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'DRES_DATE_TO',
+ SCAPTION => 'Зарезервировано',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SMATRESPL_NOMEN',
+ SCAPTION => 'Номенклатура',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SMATRESPL_CODE',
+ SCAPTION => 'Обозначение',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SMATRESPL_NAME',
+ SCAPTION => 'Наименование',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NPROD_QUANT',
+ SCAPTION => 'Применяемость',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NQUANT_PLAN',
+ SCAPTION => 'Количество план',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NREST',
+ SCAPTION => 'Остаток',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NQUANT_FACT',
+ SCAPTION => 'Скомплектовано',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ /* Обходим данные */
+ begin
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select min(T.RN) NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.RES_DATE_TO DRES_DATE_TO,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' NP.NOMEN_CODE SMATRESPL_NOMEN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CP.CODE SMATRESPL_CODE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CP."NAME" SMATRESPL_NAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.PROD_QUANT NPROD_QUANT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' sum(T.QUANT_PLAN) NQUANT_PLAN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.REST NREST,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' sum(T.QUANT_FACT) NQUANT_FACT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from DOCLINKS DL,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCDELIVERYLIST TL,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCDELIVERYLISTSP T,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCMATRESOURCE CP left outer join DICNOMNS NP on CP.NOMENCLATURE = NP.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where DL.IN_DOCUMENT = :NFCROUTLST');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and DL.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and DL.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostDeliveryLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and TL.RN = DL.OUT_DOCUMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and TL.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.PRN = TL.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.MATRESPL = CP.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where (UP."CATALOG" = T.CRN))');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from V_USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP.JUR_PERS = T.JUR_PERS');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostDeliveryLists') || ')');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' group by T.RES_DATE_TO, NP.NOMEN_CODE, CP.CODE, CP."NAME", T.PROD_QUANT, T.REST');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
+ PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
+ /* Делаем подстановку параметров */
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCROUTLST', NVALUE => NFCROUTLST);
+ /* Описываем структуру записи курсора */
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
+ PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 2);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 4);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 5);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 8);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 9);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 10);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
+ end if;
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
+ loop
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW,
+ SNAME => 'DRES_DATE_TO',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SMATRESPL_NOMEN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SMATRESPL_CODE',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SMATRESPL_NAME',
+ ICURSOR => ICURSOR,
+ NPOSITION => 5);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NPROD_QUANT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 6);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NQUANT_PLAN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 7);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NREST', ICURSOR => ICURSOR, NPOSITION => 8);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NQUANT_FACT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 9);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ end FCDELIVERYLISTSP_DG_GET;
+
+ /* Получение таблицы товарных запасов на основании маршрутного листа */
+ procedure GOODSPARTIES_DG_GET
+ (
+ NFCROUTLST in number, -- Рег. номер маршрутного листа
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NSTORAGE PKG_STD.TREF; -- Рег. номер склада списания
+ NSTORAGE_IN PKG_STD.TREF; -- Рег. номер склада получения
+ NNOMENCLATURE PKG_STD.TREF; -- Рег. номер номенклатуры основного материала
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ DDATE PKG_STD.TLDATE; -- Дата с/по
+ begin
+ /* Считываем информацию из маршрутного листа */
+ begin
+ select T.STORAGE,
+ T.STORAGE_IN,
+ F.NOMENCLATURE
+ into NSTORAGE,
+ NSTORAGE_IN,
+ NNOMENCLATURE
+ from FCROUTLST T,
+ FCMATRESOURCE F
+ where T.MATRES_PLAN = F.RN(+)
+ and T.RN = NFCROUTLST;
+ exception
+ when others then
+ NSTORAGE := null;
+ NSTORAGE_IN := null;
+ NNOMENCLATURE := null;
+ end;
+ /* Если номенклатура не указана */
+ if ((NNOMENCLATURE is null) or ((NSTORAGE is null) and (NSTORAGE_IN is null))) then
+ /* Не идем дальше */
+ return;
+ end if;
+ /* Инициализируем даты */
+ DDATE := TRUNC(sysdate);
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SINDOC',
+ SCAPTION => 'Партия',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SSTORE',
+ SCAPTION => 'Склад',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NSALE',
+ SCAPTION => 'К продаже',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRESTFACT',
+ SCAPTION => 'Фактический остаток',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRESERV',
+ SCAPTION => 'Резерв',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true,
+ BFILTER => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SPRICEMEAS',
+ SCAPTION => 'Единица измерения',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ /* Обходим данные */
+ begin
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select I.CODE SINDOC,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' AZ.AZS_NUMBER SSTORE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' least(H.MIN_RESTPLAN,H.MIN_RESTFACT) NSALE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' H.RESTFACT NRESTFACT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' H.RESERV NRESERV,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case coalesce(GRP.NMEASTYPE, 0)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when 0 then MU1.MEAS_MNEMO');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when 1 then MU2.MEAS_MNEMO');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' when 2 then MU3.MEAS_MNEMO');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' end SPRICEMEAS');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from GOODSPARTIES G,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' NOMMODIF MF,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DICNOMNS NOM left outer join DICMUNTS MU2 on NOM.UMEAS_ALT = MU2.RN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' GOODSSUPPLYHIST H left outer join NOMNMODIFPACK PAC on H.NOMNMODIFPACK = PAC.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join NOMNPACK NPAC on PAC.NOMENPACK = NPAC.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join DICMUNTS MU3 on NPAC.UMEAS = MU3.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join V_GOODSSUPPLY_REGPRICE GRP on H.RN = GRP.NGOODSSUPPLYHIST,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' INCOMDOC I,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' GOODSSUPPLY S,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DICMUNTS MU1,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' AZSAZSLISTMT AZ');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where G.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and G.NOMMODIF = MF.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and NOM.RN = MF.PRN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and NOM.RN = :NNOMENCLATURE');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and I.RN = G.INDOC');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and S.PRN = G.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and (((:NSTORAGE is not null) and (S.STORE = :NSTORAGE)) or ((:NSTORAGE_IN is not null) and (S.STORE = :NSTORAGE_IN)))');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and H.PRN = S.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and AZ.RN = S.STORE');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and H.DATE_FROM <= :DDATE');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and (H.DATE_TO >= :DDATE or H.DATE_TO is null)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and NOM.UMEAS_MAIN = MU1.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and H.RESTFACT <> ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_JUR_PERS_ROLEID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP.JUR_PERS = G.JUR_PERS');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'GoodsParties'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERROLES UR');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UR.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' union all');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_JUR_PERS_AUTHID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP.JUR_PERS = G.JUR_PERS');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'GoodsParties'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
+ PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
+ /* Делаем подстановку параметров */
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NNOMENCLATURE', NVALUE => NNOMENCLATURE);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NSTORAGE', NVALUE => NSTORAGE);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NSTORAGE_IN', NVALUE => NSTORAGE_IN);
+ PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE', DVALUE => DDATE);
+ /* Описываем структуру записи курсора */
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 1);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 3);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 4);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 5);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 6);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
+ end if;
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
+ loop
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SINDOC',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SSTORE', ICURSOR => ICURSOR, NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NSALE', ICURSOR => ICURSOR, NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRESTFACT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NRESERV', ICURSOR => ICURSOR, NPOSITION => 5);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SPRICEMEAS',
+ ICURSOR => ICURSOR,
+ NPOSITION => 6);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ end GOODSPARTIES_DG_GET;
+
+ /* Получение таблицы маршрутных листов, связанных со спецификацией плана (по детали) */
+ procedure FCROUTLST_DG_BY_DTL
+ (
+ NFCPRODPLANSP in number, -- Рег. номер связанной спецификации плана
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ begin
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SDOCPREF',
+ SCAPTION => 'Префикс',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SDOCNUMB',
+ SCAPTION => 'Номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'DEXEC_DATE',
+ SCAPTION => 'Дата запуска',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SMATRES_PLAN_NOMEN',
+ SCAPTION => 'Номенклатура основного материала',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SMATRES_PLAN_NAME',
+ SCAPTION => 'Наименование основного материала',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NQUANT_PLAN',
+ SCAPTION => 'Выдать по норме',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ /* Обходим данные */
+ begin
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.DOCPREF SDOCPREF,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.DOCNUMB SDOCNUMB,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.EXEC_DATE DEXEC_DATE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select NM2.NOMEN_CODE from DICNOMNS NM2 where F3.NOMENCLATURE = NM2.RN) SMATRES_PLAN_NOMEN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' F3."NAME" SMATRES_PLAN_NAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT_PLAN NQUANT_PLAN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCROUTLST T');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join FCMATRESOURCE F3 on T.MATRES_PLAN = F3.RN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DOCLINKS DL');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where DL.IN_DOCUMENT = :NFCPRODPLANSP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and DL.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostProductPlansSpecs'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and DL.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.RN = DL.OUT_DOCUMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T."STATE" = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_ROLEID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP."CATALOG" = T.CRN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERROLES UR');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UR.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' union all');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_AUTHID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP."CATALOG" = T.CRN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_JUR_PERS_ROLEID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP.JUR_PERS = T.JUR_PERS');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERROLES UR');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UR.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' union all');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_JUR_PERS_AUTHID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP.JUR_PERS = T.JUR_PERS');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
+ PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
+ /* Делаем подстановку параметров */
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCPRODPLANSP', NVALUE => NFCPRODPLANSP);
+ /* Описываем структуру записи курсора */
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
+ PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 4);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 5);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 6);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 8);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
+ end if;
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
+ loop
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SDOCPREF',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SDOCNUMB', ICURSOR => ICURSOR, NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW,
+ SNAME => 'DEXEC_DATE',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SMATRES_PLAN_NOMEN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 5);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SMATRES_PLAN_NAME',
+ ICURSOR => ICURSOR,
+ NPOSITION => 6);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NQUANT_PLAN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 7);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ end FCROUTLST_DG_BY_DTL;
+
+ /* Получение таблицы маршрутных листов, связанных со спецификацией плана (по изделию) */
+ procedure FCROUTLST_DG_BY_PRDCT
+ (
+ NFCPRODPLANSP in number, -- Рег. номер связанной спецификации плана
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ begin
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SDOCPREF',
+ SCAPTION => 'Префикс',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SDOCNUMB',
+ SCAPTION => 'Номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'DEXEC_DATE',
+ SCAPTION => 'Дата запуска',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NQUANT',
+ SCAPTION => 'Количество запуска',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'DREL_DATE',
+ SCAPTION => 'Дата выпуска',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NREL_QUANT',
+ SCAPTION => 'Количество выпуска',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ /* Обходим данные */
+ begin
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.DOCPREF SDOCPREF,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.DOCNUMB SDOCNUMB,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.EXEC_DATE DEXEC_DATE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT NQUANT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.REL_DATE DREL_DATE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.REL_QUANT NREL_QUANT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCROUTLST T,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DOCLINKS DL');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where DL.IN_DOCUMENT = :NFCPRODPLANSP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and DL.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostProductPlansSpecs'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and DL.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.RN = DL.OUT_DOCUMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T."STATE" = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_ROLEID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP."CATALOG" = T.CRN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERROLES UR');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UR.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' union all');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_AUTHID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP."CATALOG" = T.CRN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_JUR_PERS_ROLEID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP.JUR_PERS = T.JUR_PERS');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERROLES UR');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UR.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' union all');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_JUR_PERS_AUTHID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP.JUR_PERS = T.JUR_PERS');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
+ PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
+ /* Делаем подстановку параметров */
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCPRODPLANSP', NVALUE => NFCPRODPLANSP);
+ /* Описываем структуру записи курсора */
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
+ PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 4);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 5);
+ PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 6);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 8);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
+ end if;
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
+ loop
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
+ SNAME => 'SDOCPREF',
+ ICURSOR => ICURSOR,
+ NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SDOCNUMB', ICURSOR => ICURSOR, NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW,
+ SNAME => 'DEXEC_DATE',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NQUANT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 5);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW,
+ SNAME => 'DREL_DATE',
+ ICURSOR => ICURSOR,
+ NPOSITION => 6);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NREL_QUANT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 7);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ end FCROUTLST_DG_BY_PRDCT;
+
+ /* Получение таблицы маршрутных листов, связанных со спецификацией плана (для приходов) */
+ procedure FCROUTLST_DG_BY_DEPS
+ (
+ NFCPRODPLANSP in number, -- Рег. номер связанной спецификации плана
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+ RO PKG_P8PANELS_VISUAL.TORDERS; -- Сортировки
+ RDG PKG_P8PANELS_VISUAL.TDATA_GRID; -- Описание таблицы
+ RDG_ROW PKG_P8PANELS_VISUAL.TROW; -- Строка таблицы
+ NROW_FROM PKG_STD.TREF; -- Номер строки с
+ NROW_TO PKG_STD.TREF; -- Номер строки по
+ CSQL clob; -- Буфер для запроса
+ ICURSOR integer; -- Курсор для исполнения запроса
+ begin
+ /* Читем сортировки */
+ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS);
+ /* Преобразуем номер и размер страницы в номер строк с и по */
+ PKG_P8PANELS_VISUAL.UTL_ROWS_LIMITS_CALC(NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ NROW_FROM => NROW_FROM,
+ NROW_TO => NROW_TO);
+ /* Инициализируем таблицу данных */
+ RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE();
+ /* Описываем колонки таблицы данных */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NRN',
+ SCAPTION => 'Рег. номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => false);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SDOCPREF',
+ SCAPTION => 'Префикс',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'SDOCNUMB',
+ SCAPTION => 'Номер',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'DEXEC_DATE',
+ SCAPTION => 'Дата запуска',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NQUANT',
+ SCAPTION => 'Количество запуска',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'DREL_DATE',
+ SCAPTION => 'Дата выпуска',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_DATE,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NREL_QUANT',
+ SCAPTION => 'Количество выпуска',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NREL_QUANT',
+ SCAPTION => 'Количество выпуска',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NQUANT_FACT',
+ SCAPTION => 'Сдано',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
+ SNAME => 'NPROCENT',
+ SCAPTION => '% готовности',
+ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
+ BVISIBLE => true,
+ BORDER => true);
+ /* Обходим данные */
+ begin
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select P.NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.SDOCPREF,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.SDOCNUMB,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.DEXEC_DATE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NQUANT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.DREL_DATE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NREL_QUANT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NQUANT_FACT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case when (P.NT_SHT_PLAN <> 0) then P.NLABOUR_FACT / P.NT_SHT_PLAN * 100 else 0 end NPROCENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.DOCPREF SDOCPREF,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.DOCNUMB SDOCNUMB,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.EXEC_DATE DEXEC_DATE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT NQUANT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.REL_DATE DREL_DATE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.REL_QUANT NREL_QUANT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select SUM(SP.QUANT_FACT)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from DOCLINKS D,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' INCOMEFROMDEPSSPEC SP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where D.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and D.IN_DOCUMENT = T.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and D.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'IncomFromDeps'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and SP.PRN = D.OUT_DOCUMENT) NQUANT_FACT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select SUM(SP.LABOUR_FACT)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCROUTLSTSP SP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where SP.PRN = T.RN) NLABOUR_FACT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select SUM(SP.T_SHT_PLAN)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCROUTLSTSP SP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where SP.PRN = T.RN) NT_SHT_PLAN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCROUTLST T,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' DOCLINKS DL');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where DL.IN_DOCUMENT = :NFCPRODPLANSP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and DL.IN_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostProductPlansSpecs'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and DL.OUT_UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.RN = DL.OUT_DOCUMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T."STATE" = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_ROLEID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP."CATALOG" = T.CRN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERROLES UR');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UR.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' union all');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_AUTHID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP."CATALOG" = T.CRN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_JUR_PERS_ROLEID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP.JUR_PERS = T.JUR_PERS');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERROLES UR');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UR.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' union all');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_JUR_PERS_AUTHID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP.JUR_PERS = T.JUR_PERS');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostRouteLists'));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.AUTHID = UTILIZER())) P');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
+ /* Учтём сортировки */
+ PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
+ /* Разбираем его */
+ ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
+ PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
+ /* Делаем подстановку параметров */
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCPRODPLANSP', NVALUE => NFCPRODPLANSP);
+ /* Описываем структуру записи курсора */
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
+ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
+ PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 4);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 5);
+ PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 6);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 8);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 9);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 10);
+ /* Делаем выборку */
+ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
+ null;
+ end if;
+ /* Обходим выбранные записи */
+ while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
+ loop
+ /* Добавляем колонки с данными */
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SDOCPREF', ICURSOR => ICURSOR, NPOSITION => 2);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SDOCNUMB', ICURSOR => ICURSOR, NPOSITION => 3);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW,
+ SNAME => 'DEXEC_DATE',
+ ICURSOR => ICURSOR,
+ NPOSITION => 4);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NQUANT', ICURSOR => ICURSOR, NPOSITION => 5);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW,
+ SNAME => 'DREL_DATE',
+ ICURSOR => ICURSOR,
+ NPOSITION => 6);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NREL_QUANT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 7);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NQUANT_FACT',
+ ICURSOR => ICURSOR,
+ NPOSITION => 8);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NPROCENT', ICURSOR => ICURSOR, NPOSITION => 9);
+ /* Добавляем строку в таблицу */
+ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
+ end loop;
+ exception
+ when others then
+ PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR);
+ raise;
+ end;
+ /* Сериализуем описание */
+ COUT := PKG_P8PANELS_VISUAL.TDATA_GRID_TO_XML(RDATA_GRID => RDG, NINCLUDE_DEF => NINCLUDE_DEF);
+ end FCROUTLST_DG_BY_DEPS;
+
+ /* Получение таблицы маршрутных листов, связанных со спецификацией плана с учетом типа */
+ procedure FCROUTLST_DG_GET
+ (
+ NFCPRODPLANSP in number, -- Рег. номер связанной спецификации плана
+ NTYPE in number, -- Тип спецификации плана (0 - Деталь, 1 - Изделие/сборочная единица, 3/4 - ПиП)
+ NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0)
+ NPAGE_SIZE in number, -- Количество записей на странице (0 - все)
+ CORDERS in clob, -- Сортировки
+ NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ
+ COUT out clob -- Сериализованная таблица данных
+ )
+ is
+ begin
+ /* Выбираем сборку таблицы, исходя из типа спецификации плана */
+ case
+ /* Деталь */
+ when (NTYPE = 0) then
+ /* Получаем таблицу по детали */
+ FCROUTLST_DG_BY_DTL(NFCPRODPLANSP => NFCPRODPLANSP,
+ NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ CORDERS => CORDERS,
+ NINCLUDE_DEF => NINCLUDE_DEF,
+ COUT => COUT);
+ /* Изделие/сборочная единица */
+ when (NTYPE = 1) then
+ /* Получаем таблицу по изделию */
+ FCROUTLST_DG_BY_PRDCT(NFCPRODPLANSP => NFCPRODPLANSP,
+ NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ CORDERS => CORDERS,
+ NINCLUDE_DEF => NINCLUDE_DEF,
+ COUT => COUT);
+ /* Для приходов из подразделений */
+ when ((NTYPE = 3) or (NTYPE = 4)) then
+ /* Получаем таблицу по приходу */
+ FCROUTLST_DG_BY_DEPS(NFCPRODPLANSP => NFCPRODPLANSP,
+ NPAGE_NUMBER => NPAGE_NUMBER,
+ NPAGE_SIZE => NPAGE_SIZE,
+ CORDERS => CORDERS,
+ NINCLUDE_DEF => NINCLUDE_DEF,
+ COUT => COUT);
+ else
+ P_EXCEPTION(0,
+ 'Не определен тип получения таблицы маршрутных листов.');
+ end case;
+ end FCROUTLST_DG_GET;
/* Формирование характеристик спецификации в Ганте */
procedure MAKE_GANT_ITEM
@@ -49,7 +1498,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
NDEFSTART in number, -- Дефицит выпуска
NMAIN_QUANT in number, -- Выпуск
STASK_BG_COLOR out varchar2, -- Цвет заливки спецификации
- STASK_BG_PROGRESS_COLOR out varchar2, -- Цвет заливки прогресса спецификации
+ STASK_BG_PROGRESS_COLOR out varchar2, -- Цвет заливки прогресса спецификации
NTASK_PROGRESS out number -- Прогресс спецификации
)
is
@@ -93,7 +1542,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
end if;
end if;
end MAKE_GANT_ITEM;
-
+
/* Считывание максимального уровня иерархии плана по каталогу */
function PRODPLAN_MAX_LEVEL_GET
(
@@ -143,7 +1592,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Возвращаем результат */
return NRESULT;
end PRODPLAN_MAX_LEVEL_GET;
-
+
/* Определение дат спецификации плана */
procedure FCPRODPLANSP_DATES_GET
(
@@ -161,8 +1610,8 @@ create or replace package body PKG_P8PANELS_MECHREC as
begin
/* Проициниализируем цвет и прогресс */
STASK_BG_COLOR := null;
- NTASK_PROGRESS := null;
STASK_TEXT_COLOR := null;
+ NTASK_PROGRESS := null;
/* Если даты запуска и выпуска пусты */
if ((DREP_DATE is null) and (DREP_DATE_TO is null)) then
/* Указываем дату включения в план */
@@ -183,30 +1632,50 @@ create or replace package body PKG_P8PANELS_MECHREC as
NTASK_PROGRESS := null;
end if;
end if;
+ /* Если нет связанных документов */
+ if (NHAVE_LINK = 0) then
+ /* Если дата запуска меньше текущей даты */
+ if (DREP_DATE <= sysdate) then
+ /* Закрашиваем в красный */
+ STASK_BG_COLOR := SBG_COLOR_RED;
+ STASK_TEXT_COLOR := null;
+ NTASK_PROGRESS := null;
+ end if;
+ /* Если дата больше текущей даты */
+ if (DREP_DATE > sysdate) then
+ /* Закрашиваем в серый */
+ STASK_BG_COLOR := SBG_COLOR_GREY;
+ STASK_TEXT_COLOR := null;
+ NTASK_PROGRESS := null;
+ end if;
+ end if;
end FCPRODPLANSP_DATES_GET;
-
+
/* Получение списка спецификаций планов и отчетов производства изделий для диаграммы Ганта */
procedure FCPRODPLANSP_GET
(
- NCRN in number, -- Рег. номер каталога
- NLEVEL in number := null, -- Уровень отбора
- SSORT_FIELD in varchar2 := 'DREP_DATE_TO', -- Поле сортировки
- COUT out clob, -- Список проектов
- NMAX_LEVEL out number -- Максимальный уровень иерархии
+ NCRN in number, -- Рег. номер каталога
+ NLEVEL in number := null, -- Уровень отбора
+ SSORT_FIELD in varchar2 := 'DREP_DATE_TO', -- Поле сортировки
+ COUT out clob, -- Список проектов
+ NMAX_LEVEL out number -- Максимальный уровень иерархии
)
is
/* Переменные */
- RG PKG_P8PANELS_VISUAL.TGANTT; -- Описание диаграммы Ганта
- RGT PKG_P8PANELS_VISUAL.TGANTT_TASK; -- Описание задачи для диаграммы
- BREAD_ONLY_DATES boolean := false; -- Флаг доступности дат проекта только для чтения
- STASK_BG_COLOR PKG_STD.TSTRING; -- Цвет заливки задачи
- STASK_TEXT_COLOR PKG_STD.TSTRING; -- Цвет текста задачи
- STASK_BG_PROGRESS_COLOR PKG_STD.TSTRING; -- Цвет заливки прогресса задачи
- NTASK_PROGRESS PKG_STD.TNUMBER; -- Прогресс выполнения задачи
- DDATE_FROM PKG_STD.TLDATE; -- Дата запуска спецификации
- DDATE_TO PKG_STD.TLDATE; -- Дата выпуска спецификации
- STASK_CAPTION PKG_STD.TSTRING; -- Описание задачи в Ганте
-
+ RG PKG_P8PANELS_VISUAL.TGANTT; -- Описание диаграммы Ганта
+ RGT PKG_P8PANELS_VISUAL.TGANTT_TASK; -- Описание задачи для диаграммы
+ BREAD_ONLY_DATES boolean := false; -- Флаг доступности дат проекта только для чтения
+ STASK_BG_COLOR PKG_STD.TSTRING; -- Цвет заливки задачи
+ STASK_TEXT_COLOR PKG_STD.TSTRING; -- Цвет текста задачи
+ STASK_BG_PROGRESS_COLOR PKG_STD.TSTRING; -- Цвет заливки прогресса задачи
+ NTASK_PROGRESS PKG_STD.TNUMBER; -- Прогресс выполнения задачи
+ DDATE_FROM PKG_STD.TLDATE; -- Дата запуска спецификации
+ DDATE_TO PKG_STD.TLDATE; -- Дата выпуска спецификации
+ STASK_CAPTION PKG_STD.TSTRING; -- Описание задачи в Ганте
+ NTYPE PKG_STD.TNUMBER; -- Тип задачи (0/1 - для "Дата выпуска", 2/3/4 - для "Дата выпуска")
+ SDETAIL_LIST PKG_STD.TSTRING; -- Ссылки на детализацию
+ NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
+
/* Объединение значений в строковое представление */
function MAKE_INFO
(
@@ -225,7 +1694,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Возвращаем результат */
return SRESULT;
end MAKE_INFO;
-
+
/* Инициализация динамических атрибутов */
procedure TASK_ATTRS_INIT
(
@@ -234,25 +1703,24 @@ create or replace package body PKG_P8PANELS_MECHREC as
is
begin
/* Добавим динамические атрибуты к спецификациям */
- PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, SNAME => STASK_ATTR_PROD_ORDER, SCAPTION => 'Заказ');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG,
- SNAME => STASK_ATTR_SUBDIV_DLVR,
- SCAPTION => 'Сдающее подразделение');
+ SNAME => STASK_ATTR_START_FACT,
+ SCAPTION => 'Запущено');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG,
SNAME => STASK_ATTR_MAIN_QUANT,
- SCAPTION => 'Выпуск');
- PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG,
- SNAME => STASK_ATTR_DEFRESLIZ,
- SCAPTION => 'Дефицит запуска');
+ SCAPTION => 'Количество план');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG,
SNAME => STASK_ATTR_REL_FACT,
- SCAPTION => 'Выпуск факт');
+ SCAPTION => 'Количество сдано');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG,
- SNAME => STASK_ATTR_DEFSTART,
- SCAPTION => 'Дефицит выпуска');
- PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, SNAME => STASK_ATTR_LEVEL, SCAPTION => 'Уровень');
+ SNAME => STASK_ATTR_REP_DATE_TO,
+ SCAPTION => 'Дата выпуска план');
+ PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG,
+ SNAME => STASK_ATTR_DL,
+ SCAPTION => 'Анализ отклонений');
+ PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_ATTR(RGANTT => RG, SNAME => STASK_ATTR_TYPE, SCAPTION => 'Тип');
end TASK_ATTRS_INIT;
-
+
/* Инициализация цветов */
procedure TASK_COLORS_INIT
(
@@ -263,7 +1731,8 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Добавим описание цветов */
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
SBG_COLOR => SBG_COLOR_RED,
- SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» != 0.');
+ SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» != 0 или ' ||
+ 'не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения», а также «Дата запуска» меньше текущей.');
PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
SBG_COLOR => SBG_COLOR_YELLOW,
SDESC => 'Для спецификаций планов и отчетов производства изделий с «Дефицит запуска» = 0 и «Выпуск факт» = 0.');
@@ -278,54 +1747,156 @@ create or replace package body PKG_P8PANELS_MECHREC as
SBG_COLOR => SBG_COLOR_BLACK,
STEXT_COLOR => STEXT_COLOR_ORANGE,
SDESC => 'Для спецификаций планов и отчетов производства изделий с пустыми «Дата запуска» и «Дата выпуска» и не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения».');
+ PKG_P8PANELS_VISUAL.TGANTT_ADD_TASK_COLOR(RGANTT => RG,
+ SBG_COLOR => SBG_COLOR_GREY,
+ SDESC => 'Для спецификаций планов и отчетов производства изделий не имеющих связей с разделами «Маршрутный лист» или «Приход из подразделения», а также «Дата запуска» больше текущей.');
end TASK_COLORS_INIT;
-
+
/* Заполнение значений динамических атрибутов */
procedure FILL_TASK_ATTRS
(
RG in PKG_P8PANELS_VISUAL.TGANTT, -- Описание диаграммы Ганта
RGT in out nocopy PKG_P8PANELS_VISUAL.TGANTT_TASK, -- Описание задачи для диаграммы
- SPROD_ORDER in varchar2, -- Заказ
- SSUBDIV_DLVR in varchar2, -- Сдающее подразделение
+ NSTART_FACT in number, -- Запуск факт
NMAIN_QUANT in number, -- Выпуск
- NDEFRESLIZ in number, -- Дефицит запуска
NREL_FACT in number, -- Выпуск факт
- NDEFSTART in number, -- Дефицит выпуска
- NLEVEL in number -- Уровень
+ DREP_DATE_TO in date, -- Дата выпуска
+ NTYPE in number, -- Тип (0 - Деталь, 1 - Изделие/сборочная единица)
+ SDETAIL_LIST in varchar2 -- Ссылки на детализацию
)
is
begin
/* Добавим доп. атрибуты */
PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
RTASK => RGT,
- SNAME => STASK_ATTR_PROD_ORDER,
- SVALUE => SPROD_ORDER,
+ SNAME => STASK_ATTR_START_FACT,
+ SVALUE => TO_CHAR(NSTART_FACT),
BCLEAR => true);
- PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
- RTASK => RGT,
- SNAME => STASK_ATTR_SUBDIV_DLVR,
- SVALUE => SSUBDIV_DLVR);
PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
RTASK => RGT,
SNAME => STASK_ATTR_MAIN_QUANT,
SVALUE => TO_CHAR(NMAIN_QUANT));
- PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
- RTASK => RGT,
- SNAME => STASK_ATTR_DEFRESLIZ,
- SVALUE => TO_CHAR(NDEFRESLIZ));
PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
RTASK => RGT,
SNAME => STASK_ATTR_REL_FACT,
SVALUE => TO_CHAR(NREL_FACT));
PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
RTASK => RGT,
- SNAME => STASK_ATTR_DEFSTART,
- SVALUE => TO_CHAR(NDEFSTART));
+ SNAME => STASK_ATTR_REP_DATE_TO,
+ SVALUE => TO_CHAR(DREP_DATE_TO, 'dd.mm.yyyy hh24:mi'));
PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
RTASK => RGT,
- SNAME => STASK_ATTR_LEVEL,
- SVALUE => TO_CHAR(NLEVEL));
+ SNAME => STASK_ATTR_TYPE,
+ SVALUE => TO_CHAR(NTYPE));
+ PKG_P8PANELS_VISUAL.TGANTT_TASK_ADD_ATTR_VAL(RGANTT => RG,
+ RTASK => RGT,
+ SNAME => STASK_ATTR_DL,
+ SVALUE => SDETAIL_LIST);
end FILL_TASK_ATTRS;
+
+ /* Получение типа задачи */
+ procedure GET_TASK_TYPE
+ (
+ NCOMPANY in number, -- Рег. номер организации
+ SSORT_FIELD in varchar2, -- Тип сортировки
+ NFCPRODPLAN in number, -- Рег. номер плана
+ NFCPRODPLANSP in number, -- Рег. номер спецификации плана
+ STASK_BG_COLOR in varchar2, -- Цвет заливки задачи
+ STASK_BG_PROGRESS_COLOR in varchar2, -- Цвет заливки прогресса
+ NTYPE out number, -- Тип задачи (0/1 - для "Дата выпуска", 2/3/4 - для "Дата выпуска")
+ SDETAIL_LIST out varchar2 -- Ссылки на детализацию
+ )
+ is
+ begin
+ /* Описание типов:
+ 0 - Маршрутные листы с развертыванием товарных запасов
+ 1 - Маршрутные листы с развертыванием комплектаций
+ 2 - Приход из подразделений
+ 3 - Приход из подразделений и маршрутные листы
+ 4 - Маршрутные листы
+ null - Нет детализации
+ */
+ /* Исходим сортировка по "Дата запуска" */
+ if (SSORT_FIELD = 'DREP_DATE') then
+ /* Если цвет - красный */
+ if (STASK_BG_COLOR = SBG_COLOR_RED) then
+ /* Проверяем деталь или изделие */
+ begin
+ select 1
+ into NTYPE
+ from DUAL
+ where exists (select null
+ from FCPRODPLANSP SP
+ where SP.PRN = NFCPRODPLAN
+ and SP.UP_LEVEL = NFCPRODPLANSP);
+ exception
+ when others then
+ NTYPE := 0;
+ end;
+ /* Проверяем наличие связей с маршрутными листами */
+ if (LINK_FCROUTLST_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP, NSTATE => 0) = 0) then
+ /* Указываем, что маршрутных листов нет */
+ SDETAIL_LIST := 'Нет маршрутных листов';
+ NTYPE := null;
+ else
+ /* Указываем, что маршрутные листы есть */
+ SDETAIL_LIST := 'Маршрутные листы';
+ end if;
+ else
+ /* Не отображаем информацию о маршрутных листах */
+ NTYPE := null;
+ SDETAIL_LIST := null;
+ end if;
+ else
+ /* Если цвет зеленый */
+ if (STASK_BG_COLOR = SBG_COLOR_GREEN) then
+ /* Если полностью зеленый */
+ if (STASK_BG_PROGRESS_COLOR is null) then
+ /* Проверяем наличией связей с приходов из подразделений */
+ if (LINK_INCOMEFROMDEPS_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP, NSTATE => 2) = 0) then
+ /* Указываем, что приходов из подразделений нет */
+ SDETAIL_LIST := 'Нет приходов из подразделений';
+ NTYPE := null;
+ else
+ /* Указываем, что приходы из подразделений есть */
+ SDETAIL_LIST := 'Приход из подразделений';
+ NTYPE := 2;
+ end if;
+ end if;
+ /* Если желтно-зеленый */
+ if (STASK_BG_PROGRESS_COLOR = SBG_COLOR_YELLOW) then
+ /* Проверяем наличией связей с приходов из подразделений */
+ if (LINK_INCOMEFROMDEPS_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP) = 0) then
+ /* Указываем, что приходов из подразделений нет */
+ SDETAIL_LIST := 'Нет приходов из подразделений';
+ NTYPE := null;
+ else
+ /* Указываем, что приходы из подразделений есть */
+ SDETAIL_LIST := 'Приход из подразделений';
+ NTYPE := 3;
+ end if;
+ end if;
+ else
+ /* Если цвет полностью желтый или красный */
+ if ((STASK_BG_COLOR = SBG_COLOR_YELLOW) or (STASK_BG_COLOR = SBG_COLOR_RED)) then
+ /* Проверяем наличие связей с маршрутными листами */
+ if (LINK_FCROUTLST_CHECK(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP, NSTATE => 1) = 0) then
+ /* Указываем, что маршрутных листов нет */
+ SDETAIL_LIST := 'Нет маршрутных листов';
+ NTYPE := null;
+ else
+ /* Указываем, что маршрутные листы есть */
+ SDETAIL_LIST := 'Маршрутные листы';
+ NTYPE := 4;
+ end if;
+ else
+ /* Для данных критериев ничего не выводится */
+ NTYPE := null;
+ SDETAIL_LIST := null;
+ end if;
+ end if;
+ end if;
+ end GET_TASK_TYPE;
begin
/* Инициализируем диаграмму Ганта */
RG := PKG_P8PANELS_VISUAL.TGANTT_MAKE(STITLE => 'Производственная программа',
@@ -348,7 +1919,9 @@ create or replace package body PKG_P8PANELS_MECHREC as
T.REP_DATE_TO DREP_DATE_TO,
T.INCL_DATE DINCL_DATE,
T.ROUTE SROUTE,
+ (FM.CODE || ', ' || FM.NAME) SNAME,
D.NOMEN_NAME SNOMEN_NAME,
+ T.START_FACT NSTART_FACT,
(T.QUANT_REST - T.START_FACT) NDEFRESLIZ,
T.REL_FACT NREL_FACT,
(T.MAIN_QUANT - T.REL_FACT) NDEFSTART,
@@ -436,7 +2009,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
RGT := PKG_P8PANELS_VISUAL.TGANTT_TASK_MAKE(NRN => C.NRN,
SNUMB => COALESCE(C.SROUTE, 'Отсутствует'),
SCAPTION => STASK_CAPTION,
- SNAME => C.SNOMEN_NAME,
+ SNAME => C.SNAME,
DSTART => DDATE_FROM,
DEND => DDATE_TO,
NPROGRESS => NTASK_PROGRESS,
@@ -446,16 +2019,24 @@ create or replace package body PKG_P8PANELS_MECHREC as
BREAD_ONLY => true,
BREAD_ONLY_DATES => true,
BREAD_ONLY_PROGRESS => true);
+ /* Определяем тип и ссылки на детализацию */
+ GET_TASK_TYPE(NCOMPANY => NCOMPANY,
+ SSORT_FIELD => SSORT_FIELD,
+ NFCPRODPLAN => C.NPRN,
+ NFCPRODPLANSP => C.NRN,
+ STASK_BG_COLOR => STASK_BG_COLOR,
+ STASK_BG_PROGRESS_COLOR => STASK_BG_PROGRESS_COLOR,
+ NTYPE => NTYPE,
+ SDETAIL_LIST => SDETAIL_LIST);
/* Заполним значение динамических атрибутов */
FILL_TASK_ATTRS(RG => RG,
RGT => RGT,
- SPROD_ORDER => C.SPROD_ORDER,
- SSUBDIV_DLVR => C.SSUBDIV_DLVR,
+ NSTART_FACT => C.NSTART_FACT,
NMAIN_QUANT => C.NMAIN_QUANT,
- NDEFRESLIZ => C.NDEFRESLIZ,
NREL_FACT => C.NREL_FACT,
- NDEFSTART => C.NDEFSTART,
- NLEVEL => C.NTASK_LEVEL);
+ DREP_DATE_TO => C.DREP_DATE_TO,
+ NTYPE => NTYPE,
+ SDETAIL_LIST => SDETAIL_LIST);
/* Собираем зависимости */
for LINK in (select T.RN
from FCPRODPLANSP T
@@ -473,7 +2054,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
/* Формируем список */
COUT := PKG_P8PANELS_VISUAL.TGANTT_TO_XML(RGANTT => RG);
end FCPRODPLANSP_GET;
-
+
/* Инициализация каталогов раздела "Планы и отчеты производства изделий" */
procedure ACATALOG_INIT
(
@@ -553,6 +2134,6 @@ create or replace package body PKG_P8PANELS_MECHREC as
PKG_STATE.DIAGNOSTICS_STACKED();
P_EXCEPTION(0, PKG_STATE.SQL_ERRM());
end ACATALOG_INIT;
-
+
end PKG_P8PANELS_MECHREC;
/
diff --git a/db/PKG_P8PANELS_PROJECTS.pck b/db/PKG_P8PANELS_PROJECTS.pck
index ce0ca88..5afb251 100644
--- a/db/PKG_P8PANELS_PROJECTS.pck
+++ b/db/PKG_P8PANELS_PROJECTS.pck
@@ -16,7 +16,7 @@ create or replace package PKG_P8PANELS_PROJECTS as
);
/* Типы данных - коллекция статей этапа проекта */
- type TSTAGE_ARTS is table of TSTAGE_ART;
+ type TSTAGE_ARTS is table of TSTAGE_ART;
/* Отбор проектов */
procedure COND;
@@ -579,61 +579,70 @@ text="Проверить, что для расчётных полей дата-
SJOINS => 'EXT_CUST <- RN;AGNLIST');
/* Контроль финансирования */
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_FIN') = 1) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.GET_CTRL_FIN(RN) = :EDCTRL_FIN');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_CTRL_FIN') ||
+ '(RN) = :EDCTRL_FIN');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_FIN',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_FIN'));
- end if;
+ end if;
/* Контроль контрактации */
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_CONTR') = 1) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.GET_CTRL_CONTR(RN) = :EDCTRL_CONTR');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_CTRL_CONTR') ||
+ '(RN) = :EDCTRL_CONTR');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_CONTR',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_CONTR'));
end if;
/* Контроль соисполнения */
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_COEXEC') = 1) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.GET_CTRL_COEXEC(RN) = :EDCTRL_COEXEC');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_CTRL_COEXEC') ||
+ '(RN) = :EDCTRL_COEXEC');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_COEXEC',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_COEXEC'));
end if;
/* Контроль сроков */
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_PERIOD') = 1) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.GET_CTRL_PERIOD(RN) = :EDCTRL_PERIOD');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_CTRL_PERIOD') ||
+ '(RN) = :EDCTRL_PERIOD');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_PERIOD',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_PERIOD'));
end if;
/* Контроль затрат */
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_COST') = 1) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.GET_CTRL_COST(RN) = :EDCTRL_COST');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_CTRL_COST') ||
+ '(RN) = :EDCTRL_COST');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_COST',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_COST'));
end if;
/* Контроль актирования */
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_ACT') = 1) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.GET_CTRL_ACT(RN) = :EDCTRL_ACT');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_CTRL_ACT') ||
+ '(RN) = :EDCTRL_ACT');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_ACT',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_ACT'));
end if;
/* Готовность (%, по затратам) */
if ((PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYFrom') = 1) and
(PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYTo') = 0)) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.GET_COST_READY(RN) >= :EDCOST_READYFrom');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_COST_READY') ||
+ '(RN) >= :EDCOST_READYFrom');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYFrom',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYFrom'));
end if;
if ((PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYTo') = 1) and
(PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYFrom') = 0)) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.GET_COST_READY(RN) <= :EDCOST_READYTo');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_COST_READY') ||
+ '(RN) <= :EDCOST_READYTo');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYTo',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYTo'));
end if;
if ((PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYFrom') = 1) and
(PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYTo') = 1)) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.GET_COST_READY(RN) between :EDCOST_READYFrom and :EDCOST_READYTo');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_COST_READY') ||
+ '(RN) between :EDCOST_READYFrom and :EDCOST_READYTo');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYFrom',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYFrom'));
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYTo',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYTo'));
- end if;
+ end if;
end COND;
/* Получение рег. номера документа основания (договора) проекта */
@@ -698,9 +707,9 @@ text="Проверить, что для расчётных полей дата-
/* Подбор платежей финансирования проекта */
procedure SELECT_FIN
(
- NRN in number, -- Рег. номер проекта
- NDIRECTION in number, -- Направление (0 - приход, 1 - расход)
- NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
+ NRN in number, -- Рег. номер проекта
+ NDIRECTION in number, -- Направление (0 - приход, 1 - расход)
+ NIDENT out number -- Идентификатор буфера подобранных (списка отмеченных записей, null - не найдено)
)
is
begin
@@ -745,12 +754,12 @@ text="Проверить, что для расчётных полей дата-
/* Получение состояния финансирования проекта */
function GET_CTRL_FIN
(
- NRN in number -- Рег. номер проекта
- ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
+ NRN in number -- Рег. номер проекта
+ ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
is
- NSTAGE_CTRL PKG_STD.TNUMBER; -- Состояние этапа
- NCNT_STAGES PKG_STD.TNUMBER :=0; -- Количество этапов
- NCNT_NULL PKG_STD.TNUMBER :=0; -- Количество "безконтрольных" этапов
+ NSTAGE_CTRL PKG_STD.TNUMBER; -- Состояние этапа
+ NCNT_STAGES PKG_STD.TNUMBER := 0; -- Количество этапов
+ NCNT_NULL PKG_STD.TNUMBER := 0; -- Количество "безконтрольных" этапов
begin
/* Обходим этапы */
for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN)
@@ -784,12 +793,12 @@ text="Проверить, что для расчётных полей дата-
/* Получение состояния контрактации проекта */
function GET_CTRL_CONTR
(
- NRN in number -- Рег. номер проекта
- ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
+ NRN in number -- Рег. номер проекта
+ ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
is
- NSTAGE_CTRL PKG_STD.TNUMBER; -- Состояние этапа
- NCNT_STAGES PKG_STD.TNUMBER :=0; -- Количество этапов
- NCNT_NULL PKG_STD.TNUMBER :=0; -- Количество "безконтрольных" этапов
+ NSTAGE_CTRL PKG_STD.TNUMBER; -- Состояние этапа
+ NCNT_STAGES PKG_STD.TNUMBER := 0; -- Количество этапов
+ NCNT_NULL PKG_STD.TNUMBER := 0; -- Количество "безконтрольных" этапов
begin
/* Обходим этапы */
for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN)
@@ -823,12 +832,12 @@ text="Проверить, что для расчётных полей дата-
/* Получение состояния соисполнения проекта */
function GET_CTRL_COEXEC
(
- NRN in number -- Рег. номер проекта
- ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
+ NRN in number -- Рег. номер проекта
+ ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
is
- NSTAGE_CTRL PKG_STD.TNUMBER; -- Состояние этапа
- NCNT_STAGES PKG_STD.TNUMBER :=0; -- Количество этапов
- NCNT_NULL PKG_STD.TNUMBER :=0; -- Количество "безконтрольных" этапов
+ NSTAGE_CTRL PKG_STD.TNUMBER; -- Состояние этапа
+ NCNT_STAGES PKG_STD.TNUMBER := 0; -- Количество этапов
+ NCNT_NULL PKG_STD.TNUMBER := 0; -- Количество "безконтрольных" этапов
begin
/* Обходим этапы */
for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN)
@@ -862,12 +871,12 @@ text="Проверить, что для расчётных полей дата-
/* Получение состояния сроков проекта */
function GET_CTRL_PERIOD
(
- NRN in number -- Рег. номер проекта
- ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
+ NRN in number -- Рег. номер проекта
+ ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
is
- NSTAGE_CTRL PKG_STD.TNUMBER; -- Состояние этапа
- NCNT_STAGES PKG_STD.TNUMBER :=0; -- Количество этапов
- NCNT_NULL PKG_STD.TNUMBER :=0; -- Количество "безконтрольных" этапов
+ NSTAGE_CTRL PKG_STD.TNUMBER; -- Состояние этапа
+ NCNT_STAGES PKG_STD.TNUMBER := 0; -- Количество этапов
+ NCNT_NULL PKG_STD.TNUMBER := 0; -- Количество "безконтрольных" этапов
begin
/* Обходим этапы */
for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN)
@@ -901,12 +910,12 @@ text="Проверить, что для расчётных полей дата-
/* Получение состояния затрат проекта */
function GET_CTRL_COST
(
- NRN in number -- Рег. номер проекта
- ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
+ NRN in number -- Рег. номер проекта
+ ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
is
- NSTAGE_CTRL PKG_STD.TNUMBER; -- Состояние этапа
- NCNT_STAGES PKG_STD.TNUMBER :=0; -- Количество этапов
- NCNT_NULL PKG_STD.TNUMBER :=0; -- Количество "безконтрольных" этапов
+ NSTAGE_CTRL PKG_STD.TNUMBER; -- Состояние этапа
+ NCNT_STAGES PKG_STD.TNUMBER := 0; -- Количество этапов
+ NCNT_NULL PKG_STD.TNUMBER := 0; -- Количество "безконтрольных" этапов
begin
/* Обходим этапы */
for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN)
@@ -940,12 +949,12 @@ text="Проверить, что для расчётных полей дата-
/* Получение состояния актирования проекта */
function GET_CTRL_ACT
(
- NRN in number -- Рег. номер проекта
- ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
+ NRN in number -- Рег. номер проекта
+ ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
is
- NSTAGE_CTRL PKG_STD.TNUMBER; -- Состояние этапа
- NCNT_STAGES PKG_STD.TNUMBER :=0; -- Количество этапов
- NCNT_NULL PKG_STD.TNUMBER :=0; -- Количество "безконтрольных" этапов
+ NSTAGE_CTRL PKG_STD.TNUMBER; -- Состояние этапа
+ NCNT_STAGES PKG_STD.TNUMBER := 0; -- Количество этапов
+ NCNT_NULL PKG_STD.TNUMBER := 0; -- Количество "безконтрольных" этапов
begin
/* Обходим этапы */
for C in (select PS.RN from PROJECTSTAGE PS where PS.PRN = NRN)
@@ -1239,7 +1248,8 @@ text="Проверить, что для расчётных полей дата-
BFILTER => true,
RCOL_VALS => RCOL_VALS,
SHINT => 'Соисполнение - контроль исполнения обязательств по договорам, заключеным с соисполнителями в рамках проекта.
' ||
- 'Требует внимания - в проекте есть этапы, до окончания которых осталось менее ' || TO_CHAR(NDAYS_LEFT_LIMIT) ||
+ 'Требует внимания - в проекте есть этапы, до окончания которых осталось менее ' ||
+ TO_CHAR(NDAYS_LEFT_LIMIT) ||
' дней, при этом зафиксирован положительный остаток к поставке/актированию по договорам соисполнителей данного этапа.
' ||
'В норме - нет этапов с отклонениями, описанными выше.
' ||
'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапов задана привязка к договорам с соисполнителями и плановые сроки окончания.');
@@ -1252,7 +1262,8 @@ text="Проверить, что для расчётных полей дата-
BFILTER => true,
RCOL_VALS => RCOL_VALS,
SHINT => 'Сроки - контроль сроков исполнения работ по проекту.
' ||
- 'Требует внимания - в проекте есть этапы, до окончания которых осталось менее ' || TO_CHAR(NDAYS_LEFT_LIMIT) || ' дней.
' ||
+ 'Требует внимания - в проекте есть этапы, до окончания которых осталось менее ' ||
+ TO_CHAR(NDAYS_LEFT_LIMIT) || ' дней.
' ||
'В норме - нет этапов с отклонениями, описанными выше.
' ||
'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапов заданы плановые сроки окончания.');
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
@@ -1284,73 +1295,71 @@ text="Проверить, что для расчётных полей дата-
SCAPTION => 'Готов (%, затраты)',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'EDCOST_READYFrom',
- SCOND_TO => 'EDCOST_READYTo',
+ SCOND_TO => 'EDCOST_READYTo',
BORDER => true,
- BFILTER => true);
+ BFILTER => true);
/* Определим дополнительные свойства - ответственный экономист */
FIND_DOCS_PROPS_CODE(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, SCODE => SDP_SECON_RESP, NRN => NECON_RESP_DP);
/* Обходим данные */
begin
- /* Собираем запрос */
- CSQL := 'select *
- from (select D.*,
- ROWNUM NROW
- from (select P.RN NRN,
- P.CODE SCODE,
- P.NAME SNAME,
- P.NAME_USL SNAME_USL,
- P.EXPECTED_RES SEXPECTED_RES,
- PT.CODE SPRJTYPE,
- EC.AGNABBR SEXT_CUST,
- GC.CODE SGOVCNTRID,
- P.DOC_OSN SDOC_OSN,
- ''Contracts'' SLNK_UNIT_SDOC_OSN,
- PKG_P8PANELS_PROJECTS.GET_DOC_OSN_LNK_DOCUMENT(P.RN) NLNK_DOCUMENT_SDOC_OSN,
- SR.CODE SSUBDIV_RESP,
- R.AGNABBR SRESPONSIBLE,
- F_DOCS_PROPS_GET_STR_VALUE(:NECON_RESP_DP, ''Projects'', P.RN) SECON_RESP,
- P.STATE NSTATE,
- P.BEGPLAN DBEGPLAN,
- P.ENDPLAN DENDPLAN,
- P.COST_SUM_BASECURR NCOST_SUM,
- CN.INTCODE SCURNAMES,
- PKG_P8PANELS_PROJECTS.GET_FIN_IN(P.RN) NFIN_IN,
- ''Paynotes'' SLNK_UNIT_NFIN_IN,
- 0 NLNK_DOCUMENT_NFIN_IN,
- PKG_P8PANELS_PROJECTS.GET_FIN_OUT(P.RN) NFIN_OUT,
- ''Paynotes'' SLNK_UNIT_NFIN_OUT,
- 1 NLNK_DOCUMENT_NFIN_OUT,
- PKG_P8PANELS_PROJECTS.GET_CTRL_FIN(P.RN) NCTRL_FIN,
- PKG_P8PANELS_PROJECTS.GET_CTRL_CONTR(P.RN) NCTRL_CONTR,
- PKG_P8PANELS_PROJECTS.GET_CTRL_COEXEC(P.RN) NCTRL_COEXEC,
- PKG_P8PANELS_PROJECTS.GET_CTRL_PERIOD(P.RN) NCTRL_PERIOD,
- PKG_P8PANELS_PROJECTS.GET_CTRL_COST(P.RN) NCTRL_COST,
- PKG_P8PANELS_PROJECTS.GET_CTRL_ACT(P.RN) NCTRL_ACT,
- PKG_P8PANELS_PROJECTS.GET_COST_READY(P.RN) NCOST_READY
- from PROJECT P,
- PRJTYPE PT,
- AGNLIST EC,
- GOVCNTRID GC,
- INS_DEPARTMENT SR,
- AGNLIST R,
- CURNAMES CN
- where P.PRJTYPE = PT.RN
- and P.EXT_CUST = EC.RN(+)
- and P.GOVCNTRID = GC.RN(+)
- and P.SUBDIV_RESP = SR.RN(+)
- and P.RESPONSIBLE = R.RN(+)
- and P.CURNAMES = CN.RN
- and exists (select null from V_USERPRIV UP where UP.CATALOG = P.CRN)
- and exists (select null from V_USERPRIV UP where UP.JUR_PERS = P.JUR_PERS and UP.UNITCODE = ''Projects'')
- and P.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F
- where F.NROW between :NROW_FROM and :NROW_TO';
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select P.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.CODE SCODE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P."NAME" SNAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NAME_USL SNAME_USL,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.EXPECTED_RES SEXPECTED_RES,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PT.CODE SPRJTYPE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' EC.AGNABBR SEXT_CUST,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' GC.CODE SGOVCNTRID,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.DOC_OSN SDOC_OSN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Contracts') || ' SLNK_UNIT_SDOC_OSN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_DOC_OSN_LNK_DOCUMENT') || '(P.RN) NLNK_DOCUMENT_SDOC_OSN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' SR.CODE SSUBDIV_RESP,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' R.AGNABBR SRESPONSIBLE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' F_DOCS_PROPS_GET_STR_VALUE(:NECON_RESP_DP, ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Projects') || ', P.RN) SECON_RESP,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P."STATE" NSTATE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.BEGPLAN DBEGPLAN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.ENDPLAN DENDPLAN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.COST_SUM_BASECURR NCOST_SUM,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CN.INTCODE SCURNAMES,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_FIN_IN') || '(P.RN) NFIN_IN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Paynotes') || ' SLNK_UNIT_NFIN_IN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0) || ' NLNK_DOCUMENT_NFIN_IN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_FIN_OUT') || '(P.RN) NFIN_OUT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Paynotes') || ' SLNK_UNIT_NFIN_OUT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1) || ' NLNK_DOCUMENT_NFIN_OUT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_CTRL_FIN') || '(P.RN) NCTRL_FIN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_CTRL_CONTR') || '(P.RN) NCTRL_CONTR,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_CTRL_COEXEC') || '(P.RN) NCTRL_COEXEC,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_CTRL_PERIOD') || '(P.RN) NCTRL_PERIOD,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_CTRL_COST') || '(P.RN) NCTRL_COST,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_CTRL_ACT') || '(P.RN) NCTRL_ACT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.GET_COST_READY') || '(P.RN) NCOST_READY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from PROJECT P');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join AGNLIST EC on P.EXT_CUST = EC.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join GOVCNTRID GC on P.GOVCNTRID = GC.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join INS_DEPARTMENT SR on P.SUBDIV_RESP = SR.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join AGNLIST R on P.RESPONSIBLE = R.RN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PRJTYPE PT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CURNAMES CN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where P.PRJTYPE = PT.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.CURNAMES = CN.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP."CATALOG" = P.CRN)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP.JUR_PERS = P.JUR_PERS and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Projects') || ')');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
/* Учтём сортировки */
PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
/* Учтём фильтры */
PKG_P8PANELS_VISUAL.TFILTERS_SET_QUERY(NIDENT => NIDENT,
NCOMPANY => NCOMPANY,
SUNIT => 'Projects',
- SPROCEDURE => 'PKG_P8PANELS_PROJECTS.COND',
+ SPROCEDURE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.COND'),
RDATA_GRID => RDG,
RFILTERS => RF);
/* Разбираем его */
@@ -1394,6 +1403,7 @@ text="Проверить, что для расчётных полей дата-
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 30);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 31);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 32);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 33);
/* Делаем выборку */
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
null;
@@ -1402,7 +1412,11 @@ text="Проверить, что для расчётных полей дата-
while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
loop
/* Добавляем колонки с данными */
- PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NRN', ICURSOR => ICURSOR, NPOSITION => 1, BCLEAR => true);
+ PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
+ SNAME => 'NRN',
+ ICURSOR => ICURSOR,
+ NPOSITION => 1,
+ BCLEAR => true);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SCODE', ICURSOR => ICURSOR, NPOSITION => 2);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SNAME', ICURSOR => ICURSOR, NPOSITION => 3);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
@@ -1459,7 +1473,7 @@ text="Проверить, что для расчётных полей дата-
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
SNAME => 'SCURNAMES',
ICURSOR => ICURSOR,
- NPOSITION => 19);
+ NPOSITION => 19);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NFIN_IN', ICURSOR => ICURSOR, NPOSITION => 20);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
SNAME => 'SLNK_UNIT_NFIN_IN',
@@ -1468,7 +1482,7 @@ text="Проверить, что для расчётных полей дата-
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
SNAME => 'NLNK_DOCUMENT_NFIN_IN',
ICURSOR => ICURSOR,
- NPOSITION => 22);
+ NPOSITION => 22);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
SNAME => 'NFIN_OUT',
ICURSOR => ICURSOR,
@@ -1876,8 +1890,8 @@ text="Проверить, что для расчётных полей дата-
SNAME => 'SUNITCODE',
SVALUE => 'CostNotes',
BCLEAR => true);
- PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS, SNAME => 'NYEAR', SVALUE => NYEAR);
- PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS, SNAME => 'NMONTH', SVALUE => I);
+ PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS, SNAME => 'NYEAR', SVALUE => TO_CHAR(NYEAR));
+ PKG_P8PANELS_VISUAL.TCHART_DATASET_ITM_ATTR_VL_ADD(RATTR_VALS => RATTR_VALS, SNAME => 'NMONTH', SVALUE => TO_CHAR(I));
PKG_P8PANELS_VISUAL.TCHART_DATASET_ADD_ITEM(RDATASET => RCH_DS, NVALUE => NSUM, RATTR_VALS => RATTR_VALS);
end loop;
/* Добавим набор данных в график */
@@ -1972,56 +1986,56 @@ text="Проверить, что для расчётных полей дата-
PKG_COND_BROKER.ADD_CONDITION_ENUM(SCOLUMN_NAME => 'STATE', SCONDITION_NAME => 'CGSTATE');
/* Контроль финансирования */
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_FIN') = 1) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_FIN(RN) = :EDCTRL_FIN');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_FIN') || '(RN) = :EDCTRL_FIN');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_FIN',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_FIN'));
end if;
/* Контроль контрактации */
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_CONTR') = 1) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_CONTR(RN) = :EDCTRL_CONTR');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_CONTR') || '(RN) = :EDCTRL_CONTR');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_CONTR',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_CONTR'));
end if;
/* Контроль соисполнения */
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_COEXEC') = 1) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_COEXEC(RN) = :EDCTRL_COEXEC');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_COEXEC') || '(RN) = :EDCTRL_COEXEC');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_COEXEC',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_COEXEC'));
end if;
/* Контроль сроков */
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_PERIOD') = 1) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_PERIOD(RN) = :EDCTRL_PERIOD');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_PERIOD') || '(RN) = :EDCTRL_PERIOD');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_PERIOD',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_PERIOD'));
end if;
/* Контроль затрат */
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_COST') = 1) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_COST(RN) = :EDCTRL_COST');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_COST') || '(RN) = :EDCTRL_COST');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_COST',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_COST'));
end if;
/* Контроль актирования */
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_ACT') = 1) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_ACT(RN) = :EDCTRL_ACT');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_ACT') || '(RN) = :EDCTRL_ACT');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_ACT',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_ACT'));
end if;
/* Готовность (%, по затратам) */
if ((PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYFrom') = 1) and
(PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYTo') = 0)) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY(RN) >= :EDCOST_READYFrom');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY') || '(RN) >= :EDCOST_READYFrom');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYFrom',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYFrom'));
end if;
if ((PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYTo') = 1) and
(PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYFrom') = 0)) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY(RN) <= :EDCOST_READYTo');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY') || '(RN) <= :EDCOST_READYTo');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYTo',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYTo'));
end if;
if ((PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYFrom') = 1) and
(PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCOST_READYTo') = 1)) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY(RN) between :EDCOST_READYFrom and :EDCOST_READYTo');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY') || '(RN) between :EDCOST_READYFrom and :EDCOST_READYTo');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYFrom',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCOST_READYFrom'));
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCOST_READYTo',
@@ -2164,12 +2178,12 @@ text="Проверить, что для расчётных полей дата-
/* Получение состояния финансирования этапа проекта */
function STAGES_GET_CTRL_FIN
(
- NRN in number -- Рег. номер этапа проекта
- ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
+ NRN in number -- Рег. номер этапа проекта
+ ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
is
- NCONTR_CTRL PKG_STD.TNUMBER; -- Состояние соисполнителя этапа
- NCNT_CONTR PKG_STD.TNUMBER :=0; -- Количество соисполнителей этапа
- NCNT_NULL PKG_STD.TNUMBER :=0; -- Количество "безконтрольных" соисполнителей этапа
+ NCONTR_CTRL PKG_STD.TNUMBER; -- Состояние соисполнителя этапа
+ NCNT_CONTR PKG_STD.TNUMBER := 0; -- Количество соисполнителей этапа
+ NCNT_NULL PKG_STD.TNUMBER := 0; -- Количество "безконтрольных" соисполнителей этапа
begin
/* Обходим соисполнителей этапа */
for C in (select PSPF.RN from PROJECTSTAGEPF PSPF where PSPF.PRN = NRN)
@@ -2239,12 +2253,12 @@ text="Проверить, что для расчётных полей дата-
/* Получение состояния соисполнения этапа проекта */
function STAGES_GET_CTRL_COEXEC
(
- NRN in number -- Рег. номер этапа проекта
- ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
+ NRN in number -- Рег. номер этапа проекта
+ ) return number -- Состояние (null - не определено, 0 - без отклонений, 1 - есть отклонения)
is
- NCONTR_CTRL PKG_STD.TNUMBER; -- Состояние соисполнителя этапа
- NCNT_CONTR PKG_STD.TNUMBER :=0; -- Количество соисполнителей этапа
- NCNT_NULL PKG_STD.TNUMBER :=0; -- Количество "безконтрольных" соисполнителей этапа
+ NCONTR_CTRL PKG_STD.TNUMBER; -- Состояние соисполнителя этапа
+ NCNT_CONTR PKG_STD.TNUMBER := 0; -- Количество соисполнителей этапа
+ NCNT_NULL PKG_STD.TNUMBER := 0; -- Количество "безконтрольных" соисполнителей этапа
begin
/* Обходим соисполнителей этапа */
for C in (select PSPF.RN from PROJECTSTAGEPF PSPF where PSPF.PRN = NRN)
@@ -2555,7 +2569,7 @@ text="Проверить, что для расчётных полей дата-
NSUMM_INCOME PKG_STD.TNUMBER; -- Сумма прибыли по этапу проекта
NINCOME_PRC PKG_STD.TNUMBER; -- Процент прибыли по этапу проекта
begin
- /* Определим рег. номер статьи калькуляции для учёта реализации */
+ /* Определим рег. номер статьи калькуляции для учёта реализации */
FIND_FPDARTCL_CODE(NFLAG_SMART => 1, NCOMPANY => NCOMPANY, SCODE => SFPDARTCL_REALIZ, NRN => NFPDARTCL_REALIZ);
/* Читаем фильтры */
RF := PKG_P8PANELS_VISUAL.TFILTERS_FROM_XML(CFILTERS => CFILTERS);
@@ -2703,7 +2717,8 @@ text="Проверить, что для расчётных полей дата-
BFILTER => true,
RCOL_VALS => RCOL_VALS,
SHINT => 'Соисполнение - контроль исполнения обязательств по договорам, заключеным с соисполнителями в рамках этапа.
' ||
- 'Требует внимания - до окончания этапа осталось менее ' || TO_CHAR(NDAYS_LEFT_LIMIT) ||
+ 'Требует внимания - до окончания этапа осталось менее ' ||
+ TO_CHAR(NDAYS_LEFT_LIMIT) ||
' дней, при этом зафиксирован положительный остаток к поставке/актированию по привязанным к нему договорам соисполнителей.
' ||
'В норме - нет описанных выше отклонений.
' ||
'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапа задана привязка к договорам с соисполнителями и плановый срок окончания.');
@@ -2721,7 +2736,8 @@ text="Проверить, что для расчётных полей дата-
BFILTER => true,
RCOL_VALS => RCOL_VALS,
SHINT => 'Сроки - контроль сроков исполнения работ по этапу.
' ||
- 'Требует внимания - до окончания этапа осталось менее ' || TO_CHAR(NDAYS_LEFT_LIMIT) || ' дней.
' ||
+ 'Требует внимания - до окончания этапа осталось менее ' ||
+ TO_CHAR(NDAYS_LEFT_LIMIT) || ' дней.
' ||
'В норме - нет описанных выше отклонений.
' ||
'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для этапа задан плановый срок окончания.');
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
@@ -2743,7 +2759,7 @@ text="Проверить, что для расчётных полей дата-
SNAME => 'NSUMM_REALIZ',
SCAPTION => 'Сумма реализации',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
- BVISIBLE => false);
+ BVISIBLE => false);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SLNK_UNIT_NSUMM_REALIZ',
SCAPTION => 'Сумма реализации (код раздела ссылки)',
@@ -2793,56 +2809,57 @@ text="Проверить, что для расчётных полей дата-
SCAPTION => 'Готов (%, затраты)',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
SCOND_FROM => 'EDCOST_READYFrom',
- SCOND_TO => 'EDCOST_READYTo',
+ SCOND_TO => 'EDCOST_READYTo',
BORDER => true,
BFILTER => true);
/* Обходим данные */
begin
- /* Собираем запрос */
- CSQL := 'select *
- from (select D.*,
- ROWNUM NROW
- from (select PS.RN NRN,
- PS.NUMB SNUMB,
- PS.NAME SNAME,
- PS.EXPECTED_RES SEXPECTED_RES,
- FAC.NUMB SFACEACC,
- PS.STATE NSTATE,
- PS.BEGPLAN DBEGPLAN,
- PS.ENDPLAN DENDPLAN,
- PS.COST_SUM_BASECURR NCOST_SUM,
- CN.INTCODE SCURNAMES,
- PKG_P8PANELS_PROJECTS.STAGES_GET_FIN_IN(PS.RN) NFIN_IN,
- ''Paynotes'' SLNK_UNIT_NFIN_IN,
- 0 NLNK_DOCUMENT_NFIN_IN,
- PKG_P8PANELS_PROJECTS.STAGES_GET_FIN_OUT(PS.RN) NFIN_OUT,
- ''Paynotes'' SLNK_UNIT_NFIN_OUT,
- 1 NLNK_DOCUMENT_NFIN_OUT,
- PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_FIN(PS.RN) NCTRL_FIN,
- PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_CONTR(PS.RN) NCTRL_CONTR,
- PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_COEXEC(PS.RN) NCTRL_COEXEC,
- PKG_P8PANELS_PROJECTS.STAGES_GET_DAYS_LEFT(PS.RN) NDAYS_LEFT,
- PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_PERIOD(PS.RN) NCTRL_PERIOD,
- PKG_P8PANELS_PROJECTS.STAGES_GET_COST_FACT(PS.RN) NCOST_FACT,
- ''CostNotes'' SLNK_UNIT_NCOST_FACT,
- 1 NLNK_DOCUMENT_NCOST_FACT,
- PKG_P8PANELS_PROJECTS.STAGES_GET_SUMM_REALIZ(PS.RN, :NFPDARTCL_REALIZ) NSUMM_REALIZ,
- ''GoodsTransInvoicesToConsumers'' SLNK_UNIT_NSUMM_REALIZ,
- 1 NLNK_DOCUMENT_NSUMM_REALIZ,
- PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_COST(PS.RN) NCTRL_COST,
- PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_ACT(PS.RN) NCTRL_ACT,
- PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY(PS.RN) NCOST_READY
- from PROJECTSTAGE PS,
- PROJECT P,
- FACEACC FAC,
- CURNAMES CN
- where PS.PRN = P.RN
- and PS.FACEACC = FAC.RN(+)
- and P.CURNAMES = CN.RN
- and exists (select null from V_USERPRIV UP where UP.CATALOG = PS.CRN)
- and exists (select null from V_USERPRIV UP where UP.JUR_PERS = PS.JUR_PERS and UP.UNITCODE = ''Projects'')
- and PS.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F
- where F.NROW between :NROW_FROM and :NROW_TO';
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select PS.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PS.NUMB SNUMB,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PS."NAME" SNAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PS.EXPECTED_RES SEXPECTED_RES,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FAC.NUMB SFACEACC,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PS."STATE" NSTATE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PS.BEGPLAN DBEGPLAN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PS.ENDPLAN DENDPLAN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PS.COST_SUM_BASECURR NCOST_SUM,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CN.INTCODE SCURNAMES,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_FIN_IN') || '(PS.RN) NFIN_IN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Paynotes') || ' SLNK_UNIT_NFIN_IN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0) || ' NLNK_DOCUMENT_NFIN_IN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_FIN_OUT') || '(PS.RN) NFIN_OUT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Paynotes') || ' SLNK_UNIT_NFIN_OUT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1) || ' NLNK_DOCUMENT_NFIN_OUT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_FIN') || '(PS.RN) NCTRL_FIN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_CONTR') || '(PS.RN) NCTRL_CONTR,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_COEXEC') || '(PS.RN) NCTRL_COEXEC,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_DAYS_LEFT') || '(PS.RN) NDAYS_LEFT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_PERIOD') || '(PS.RN) NCTRL_PERIOD,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_COST_FACT') || '(PS.RN) NCOST_FACT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.WRAP_STR(SVALUE => 'CostNotes') || ' SLNK_UNIT_NCOST_FACT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1) || ' NLNK_DOCUMENT_NCOST_FACT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_SUMM_REALIZ') || '(PS.RN, :NFPDARTCL_REALIZ) NSUMM_REALIZ,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.WRAP_STR(SVALUE => 'GoodsTransInvoicesToConsumers') || ' SLNK_UNIT_NSUMM_REALIZ,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.WRAP_NUM(NVALUE => 1) || ' NLNK_DOCUMENT_NSUMM_REALIZ,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_COST') || '(PS.RN) NCTRL_COST,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_CTRL_ACT') || '(PS.RN) NCTRL_ACT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_GET_COST_READY') || '(PS.RN) NCOST_READY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from PROJECTSTAGE PS');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join FACEACC FAC on PS.FACEACC = FAC.RN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECT P,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CURNAMES CN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where PS.PRN = P.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.CURNAMES = CN.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP."CATALOG" = PS.CRN)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP.JUR_PERS = PS.JUR_PERS and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Projects') || ')');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PS.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
/* Учтём сортировки */
PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
/* Учтём фильтры */
@@ -2850,7 +2867,7 @@ text="Проверить, что для расчётных полей дата-
NCOMPANY => NCOMPANY,
NPARENT => NPRN,
SUNIT => 'ProjectsStages',
- SPROCEDURE => 'PKG_P8PANELS_PROJECTS.STAGES_COND',
+ SPROCEDURE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGES_COND'),
RDATA_GRID => RDG,
RFILTERS => RF);
/* Разбираем его */
@@ -2892,6 +2909,7 @@ text="Проверить, что для расчётных полей дата-
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 28);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 29);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 30);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 31);
/* Делаем выборку */
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
null;
@@ -3476,13 +3494,13 @@ text="Проверить, что для расчётных полей дата-
SJOINS => 'PRN <- RN;CONTRACTS');
/* Контроль финансирования */
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_FIN') = 1) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_GET_CTRL_FIN(RN) = :EDCTRL_FIN');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_GET_CTRL_FIN') || '(RN) = :EDCTRL_FIN');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_FIN',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_FIN'));
end if;
/* Контроль соисполнения */
if (PKG_COND_BROKER.CONDITION_EXISTS(SCONDITION_NAME => 'EDCTRL_COEXEC') = 1) then
- PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => 'PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_GET_CTRL_COEXE(RN) = :EDCTRL_COEXEC');
+ PKG_COND_BROKER.ADD_CLAUSE(SCLAUSE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_GET_CTRL_COEXE') || '(RN) = :EDCTRL_COEXEC');
PKG_COND_BROKER.BIND_VARIABLE(SVARIABLE_NAME => 'EDCTRL_COEXEC',
NVALUE => PKG_COND_BROKER.GET_CONDITION_NUM(SCONDITION_NAME => 'EDCTRL_COEXEC'));
end if;
@@ -4010,12 +4028,12 @@ text="Проверить, что для расчётных полей дата-
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
BVISIBLE => false);
PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 0, BCLEAR => true);
- PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1);
+ PKG_P8PANELS_VISUAL.TCOL_VALS_ADD(RCOL_VALS => RCOL_VALS, NVALUE => 1);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NCTRL_FIN',
SCAPTION => 'Фин-е (исх.)',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
- SCOND_FROM => 'EDCTRL_FIN',
+ SCOND_FROM => 'EDCTRL_FIN',
BORDER => false,
BFILTER => true,
RCOL_VALS => RCOL_VALS,
@@ -4047,56 +4065,57 @@ text="Проверить, что для расчётных полей дата-
BFILTER => true,
RCOL_VALS => RCOL_VALS,
SHINT => 'Соисполнение - контроль исполнения обязательств по договору с соисполнителем.
' ||
- 'Требует внимания - до окончания этапа проекта, в рамках которого действует соисполнение, осталось менее ' || TO_CHAR(NDAYS_LEFT_LIMIT) ||
+ 'Требует внимания - до окончания этапа проекта, в рамках которого действует соисполнение, осталось менее ' ||
+ TO_CHAR(NDAYS_LEFT_LIMIT) ||
' дней, при этом зафиксирован положительный остаток к поставке/актированию по договору.
' ||
'В норме - нет описанных выше отклонений.
' ||
'Пусто - в Системе не хватает данных для рассчёта. Убедитесь, что для связанного этапа проекта задана плановая дата окончания, ' ||
'а по договору с соисполнителем аккуратно ведётся учёт первичных документов оперативного учёта (приходных накладных).');
/* Обходим данные */
begin
- /* Собираем запрос */
- CSQL := 'select *
- from (select D.*,
- ROWNUM NROW
- from (select PSPF.RN NRN,
- trim(CN.DOC_PREF) SDOC_PREF,
- ''Contracts'' SLNK_UNIT_SDOC_PREF,
- CN.RN NLNK_DOCUMENT_SDOC_PREF,
- trim(CN.DOC_NUMB) SDOC_NUMB,
- ''Contracts'' SLNK_UNIT_SDOC_NUMB,
- CN.RN NLNK_DOCUMENT_SDOC_NUMB,
- CN.DOC_DATE DDOC_DATE,
- CN.EXT_NUMBER SEXT_NUMBER,
- AG.AGNNAME SAGENT,
- AG.AGNIDNUMB SAGENT_INN,
- AG.REASON_CODE SAGENT_KPP,
- GC.CODE SGOVCNTRID,
- trim(ST.NUMB) SCSTAGE,
- ST.DESCRIPTION SCSTAGE_DESCRIPTION,
- ST.BEGIN_DATE DCSTAGE_BEGIN_DATE,
- ST.END_DATE DCSTAGE_END_DATE,
- PSPF.COST_PLAN NSUMM,
- CUR.INTCODE SCURR,
- ART.CODE SCOST_ART
- from PROJECTSTAGEPF PSPF,
- STAGES ST,
- CONTRACTS CN,
- AGNLIST AG,
- CURNAMES CUR,
- FPDARTCL ART,
- GOVCNTRID GC
- where PSPF.FACEACC = ST.FACEACC
- and ST.PRN = CN.RN
- and PSPF.PERFORMER = AG.RN
- and CN.CURRENCY = CUR.RN
- and PSPF.COST_ARTICLE = ART.RN(+)
- and CN.GOVCNTRID = GC.RN(+)
- and exists (select null from V_USERPRIV UP where UP.CATALOG = PSPF.CRN)
- and exists (select null from V_USERPRIV UP where UP.JUR_PERS = PSPF.JUR_PERS and UP.UNITCODE = ''Projects'')
- and exists (select null from V_USERPRIV UP where UP.CATALOG = ST.CRN)
- and exists (select null from V_USERPRIV UP where UP.JUR_PERS = ST.JUR_PERS and UP.UNITCODE = ''Contracts'')
- and PSPF.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F
- where F.NROW between :NROW_FROM and :NROW_TO';
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select PSPF.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' trim(CN.DOC_PREF) SDOC_PREF,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Contracts') || ' SLNK_UNIT_SDOC_PREF,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CN.RN NLNK_DOCUMENT_SDOC_PREF,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' trim(CN.DOC_NUMB) SDOC_NUMB,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Contracts') || ' SLNK_UNIT_SDOC_NUMB,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CN.RN NLNK_DOCUMENT_SDOC_NUMB,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CN.DOC_DATE DDOC_DATE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CN.EXT_NUMBER SEXT_NUMBER,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' AG.AGNNAME SAGENT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' AG.AGNIDNUMB SAGENT_INN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' AG.REASON_CODE SAGENT_KPP,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' GC.CODE SGOVCNTRID,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' trim(ST.NUMB) SCSTAGE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ST.DESCRIPTION SCSTAGE_DESCRIPTION,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ST.BEGIN_DATE DCSTAGE_BEGIN_DATE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ST.END_DATE DCSTAGE_END_DATE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PSPF.COST_PLAN NSUMM,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CUR.INTCODE SCURR,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ART.CODE SCOST_ART');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from PROJECTSTAGEPF PSPF');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join FPDARTCL ART on PSPF.COST_ARTICLE = ART.RN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' STAGES ST,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CONTRACTS CN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join GOVCNTRID GC on CN.GOVCNTRID = GC.RN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' AGNLIST AG,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CURNAMES CUR');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where PSPF.FACEACC = ST.FACEACC');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ST.PRN = CN.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PSPF.PERFORMER = AG.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and CN.CURRENCY = CUR.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP."CATALOG" = PSPF.CRN)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP.JUR_PERS = PSPF.JUR_PERS and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Projects') || ')');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP."CATALOG" = ST.CRN)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null from V_USERPRIV UP where UP.JUR_PERS = ST.JUR_PERS and UP.UNITCODE = ' || PKG_SQL_BUILD.WRAP_STR(SVALUE => 'Contracts') || ')');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PSPF.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
/* Учтём сортировки */
PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
/* Учтём фильтры */
@@ -4104,7 +4123,7 @@ text="Проверить, что для расчётных полей дата-
NCOMPANY => NCOMPANY,
NPARENT => NSTAGE,
SUNIT => 'ProjectsStagesPerformers',
- SPROCEDURE => 'PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_COND',
+ SPROCEDURE => PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_PROJECTS.STAGE_CONTRACTS_COND'),
RDATA_GRID => RDG,
RFILTERS => RF);
/* Разбираем его */
@@ -4135,6 +4154,7 @@ text="Проверить, что для расчётных полей дата-
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 18);
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 19);
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 20);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 21);
/* Делаем выборку */
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
null;
@@ -4959,32 +4979,34 @@ text="Проверить, что для расчётных полей дата-
BFILTER => false);
/* Обходим данные */
begin
- /* Собираем запрос */
- CSQL := 'select *
- from (select D.*,
- ROWNUM NROW
- from (select FM.RN NRN,
- PERS.CODE SPERSON,
- SH.AVG_HOURS NLAB_PLAN_FOT
- from CLNPSPFM FM,
- CLNPERSONS PERS,
- CLNPSDEP PSD,
- PRPROF PROF,
- CLNPSPFMHS FMH,
- SLSCHEDULE SH
- where FM.COMPANY = :NCOMPANY
- and FM.PERSRN = PERS.RN
- and FM.DEPTRN = :NINS_DEPARTMENT
- and FM.PSDEPRN = PSD.RN
- and PSD.PRPROF = PROF.RN
- and PROF.RN in (select MP.PRPROF from FCMANPOWER MP where MP.RN = :NFCMANPOWER)
- and ((FM.BEGENG between :DDATE_FROM and :DDATE_TO) or (FM.ENDENG between :DDATE_FROM and :DDATE_TO) or
- ((FM.BEGENG < :DDATE_FROM) and (COALESCE(FM.ENDENG, :DDATE_TO + 1) > :DDATE_TO)))
- and FM.RN = FMH.PRN
- and ((FMH.DO_ACT_FROM between :DDATE_FROM and :DDATE_TO) or (FMH.DO_ACT_TO between :DDATE_FROM and :DDATE_TO) or
- ((FMH.DO_ACT_FROM < :DDATE_FROM) and (COALESCE(FMH.DO_ACT_TO, :DDATE_TO + 1) > :DDATE_TO)))
- and FMH.SCHEDULE = SH.RN %ORDER_BY%) D) F
- where F.NROW between :NROW_FROM and :NROW_TO';
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select FM.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PERS.CODE SPERSON,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' SH.AVG_HOURS NLAB_PLAN_FOT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from CLNPSPFM FM,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CLNPERSONS PERS,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CLNPSDEP PSD,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PRPROF PROF,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' CLNPSPFMHS FMH,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' SLSCHEDULE SH');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where FM.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and FM.PERSRN = PERS.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and FM.DEPTRN = :NINS_DEPARTMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and FM.PSDEPRN = PSD.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PSD.PRPROF = PROF.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PROF.RN in (select MP.PRPROF from FCMANPOWER MP where MP.RN = :NFCMANPOWER)');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ((FM.BEGENG between :DDATE_FROM and :DDATE_TO) or (FM.ENDENG between :DDATE_FROM and :DDATE_TO) or');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ((FM.BEGENG < :DDATE_FROM) and (COALESCE(FM.ENDENG, :DDATE_TO + 1) > :DDATE_TO)))');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and FM.RN = FMH.PRN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ((FMH.DO_ACT_FROM between :DDATE_FROM and :DDATE_TO) or (FMH.DO_ACT_TO between :DDATE_FROM and :DDATE_TO) or');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ((FMH.DO_ACT_FROM < :DDATE_FROM) and (COALESCE(FMH.DO_ACT_TO, :DDATE_TO + 1) > :DDATE_TO)))');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and FMH.SCHEDULE = SH.RN %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
/* Учтём сортировки */
PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
/* Разбираем его */
@@ -4993,15 +5015,16 @@ text="Проверить, что для расчётных полей дата-
/* Делаем подстановку параметров */
PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY);
PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NINS_DEPARTMENT', NVALUE => RPRD.INS_DEPARTMENT);
- PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCMANPOWER', NVALUE => RPRD.FCMANPOWER);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCMANPOWER', NVALUE => RPRD.FCMANPOWER);
PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE_FROM', DVALUE => RPRD.DATE_FROM);
- PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE_TO', DVALUE => RPRD.DATE_TO);
+ PKG_SQL_DML.BIND_VARIABLE_DATE(ICURSOR => ICURSOR, SNAME => 'DDATE_TO', DVALUE => RPRD.DATE_TO);
PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
- PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
+ PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
/* Описываем структуру записи курсора */
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 3);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 4);
/* Делаем выборку */
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
null;
@@ -5187,39 +5210,40 @@ text="Проверить, что для расчётных полей дата-
BFILTER => false);
/* Обходим данные */
begin
- /* Собираем запрос */
- CSQL := 'select *
- from (select D.*,
- ROWNUM NROW
- from (select JB.RN NRN,
- P.RN NPROJECT,
- JBP.RN NJB_PRJCTS,
- P.CODE || ''-'' || P.NAME_USL SPRJ,
- trim(PS.NUMB) || ''-'' || trim(PJ.NUMB) SSTG_JOB,
- PJ.NAME SJOB_NAME,
- PJ.STATE NJOB_STATE,
- JB.DATE_FROM DJOB_BEG,
- JB.DATE_TO DJOB_END,
- PJMP.LABOUR_P NLABOUR_P
- from P8PNL_JB_JOBS JB,
- P8PNL_JB_PRJCTS JBP,
- PROJECTJOB PJ,
- PROJECTJOBMANPOW PJMP,
- PROJECT P,
- PROJECTSTAGE PS
- where JB.IDENT = :NIDENT
- and JB.STAGE = 0
- and JB.PRN = JBP.RN
- and JB.SOURCE = PJ.RN
- and PJ.COMPANY = :NCOMPANY
- and PJ.PRN = P.RN
- and PJ.PROJECTSTAGE = PS.RN(+)
- and PJ.RN = PJMP.PRN
- and PJMP.FCMANPOWER = :NFCMANPOWER
- and PJMP.SUBDIV = :NINS_DEPARTMENT
- and ((JB.DATE_FROM between :DDATE_FROM and :DDATE_TO) or (JB.DATE_TO between :DDATE_FROM and :DDATE_TO) or
- ((JB.DATE_FROM < :DDATE_FROM) and (JB.DATE_TO > :DDATE_TO))) %ORDER_BY%) D) F
- where F.NROW between :NROW_FROM and :NROW_TO';
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select JB.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.RN NPROJECT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' JBP.RN NJB_PRJCTS,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.CODE || ''-'' || P.NAME_USL SPRJ,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' trim(PS.NUMB) || ''-'' || trim(PJ.NUMB) SSTG_JOB,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.NAME SJOB_NAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJ.STATE NJOB_STATE,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' JB.DATE_FROM DJOB_BEG,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' JB.DATE_TO DJOB_END,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PJMP.LABOUR_P NLABOUR_P');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from P8PNL_JB_JOBS JB,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P8PNL_JB_PRJCTS JBP,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECTJOB PJ');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join PROJECTSTAGE PS on PJ.PROJECTSTAGE = PS.RN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECTJOBMANPOW PJMP,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' PROJECT P');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where JB.IDENT = :NIDENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and JB.STAGE = ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0));
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and JB.PRN = JBP.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and JB.SOURCE = PJ.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJ.COMPANY = :NCOMPANY');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJ.PRN = P.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJ.RN = PJMP.PRN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.FCMANPOWER = :NFCMANPOWER');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and PJMP.SUBDIV = :NINS_DEPARTMENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ((JB.DATE_FROM between :DDATE_FROM and :DDATE_TO) or (JB.DATE_TO between :DDATE_FROM and :DDATE_TO) or');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ((JB.DATE_FROM < :DDATE_FROM) and (JB.DATE_TO > :DDATE_TO))) %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
/* Учтём сортировки */
PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
/* Разбираем его */
@@ -5245,6 +5269,7 @@ text="Проверить, что для расчётных полей дата-
PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 8);
PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 9);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 10);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 11);
/* Делаем выборку */
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
null;
@@ -5382,7 +5407,7 @@ text="Проверить, что для расчётных полей дата-
NFCMANPOWER in number, -- Рег. номер трудового ресурса
NLAB_PLAN_FOT in number := 0, -- Трудоёмкость (план, по ФОТ)
NLAB_FACT_RPT in number := 0, -- Трудоёмкость (факт, по отчёту)
- NLAB_PLAN_JOBS in number :=0, -- Трудоёмкость (план, по графику)
+ NLAB_PLAN_JOBS in number := 0, -- Трудоёмкость (план, по графику)
NJB_PERIODS out number -- Рег. номер записи периода балансировки
)
is
@@ -5587,26 +5612,28 @@ text="Проверить, что для расчётных полей дата-
BFILTER => false);
/* Обходим данные */
begin
- /* Собираем запрос */
- CSQL := 'select *
- from (select D.*,
- ROWNUM NROW
- from (select P.RN NRN,
- TO_CHAR(P.DATE_FROM, ''YYYY.MM'') SPERIOD,
- INSD.CODE SINS_DEPARTMENT,
- MP.CODE SFCMANPOWER,
- P.LAB_PLAN_FOT NLAB_PLAN_FOT,
- P.LAB_FACT_RPT NLAB_FACT_RPT,
- P.LAB_FACT_RPT - P.LAB_PLAN_FOT NLAB_DIFF_RPT_FOT,
- P.LAB_PLAN_JOBS NLAB_PLAN_JOBS,
- P.LAB_PLAN_JOBS - P.LAB_PLAN_FOT NLAB_DIFF_JOBS_FOT
- from P8PNL_JB_PERIODS P,
- INS_DEPARTMENT INSD,
- FCMANPOWER MP
- where P.IDENT = :NIDENT
- and P.INS_DEPARTMENT = INSD.RN
- and P.FCMANPOWER = MP.RN %ORDER_BY%) D) F
- where F.NROW between :NROW_FROM and :NROW_TO';
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select P.RN NRN,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' TO_CHAR(P.DATE_FROM, ''YYYY.MM'') SPERIOD,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' INSD.CODE SINS_DEPARTMENT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' MP.CODE SFCMANPOWER,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.LAB_PLAN_FOT NLAB_PLAN_FOT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.LAB_FACT_RPT NLAB_FACT_RPT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.LAB_FACT_RPT - P.LAB_PLAN_FOT NLAB_DIFF_RPT_FOT,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.LAB_PLAN_JOBS NLAB_PLAN_JOBS,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.LAB_PLAN_JOBS - P.LAB_PLAN_FOT NLAB_DIFF_JOBS_FOT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from P8PNL_JB_PERIODS P,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' INS_DEPARTMENT INSD,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' FCMANPOWER MP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where P.IDENT = :NIDENT');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.INS_DEPARTMENT = INSD.RN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.FCMANPOWER = MP.RN %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
/* Учтём сортировки */
PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
/* Разбираем его */
@@ -5626,6 +5653,7 @@ text="Проверить, что для расчётных полей дата-
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 8);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 9);
+ PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 10);
/* Делаем выборку */
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
null;
diff --git a/db/PKG_P8PANELS_SAMPLES.pck b/db/PKG_P8PANELS_SAMPLES.pck
index 6c4641a..a827641 100644
--- a/db/PKG_P8PANELS_SAMPLES.pck
+++ b/db/PKG_P8PANELS_SAMPLES.pck
@@ -185,6 +185,7 @@ create or replace package body PKG_P8PANELS_SAMPLES as
DPFR_FILL_DATE => null,
DPFR_REG_DATE => null,
SPFR_REG_NUMB => null,
+ SSFR_REG_NUMB => null,
SFULLNAME => null,
SOKFS => null,
SOKOPF => null,
@@ -300,25 +301,26 @@ create or replace package body PKG_P8PANELS_SAMPLES as
'Физическое лицо - субъект правовых отношений, представляющий собой одного человека.');
/* Обходим данные */
begin
- /* Собираем запрос */
- CSQL := 'select *
- from (select D.*,
- %ROWNUM% NROW
- from (select AG.AGNABBR SAGNABBR,
- AG.AGNNAME SAGNNAME,
- AG.AGNTYPE NAGNTYPE
- from AGNLIST AG
- where exists (select /*+ INDEX(UP I_USERPRIV_CATALOG_ROLEID) */ null from USERPRIV UP where UP."CATALOG" = AG.CRN and UP.ROLEID in (select /*+ INDEX(UR I_USERROLES_AUTHID_FK) */ UR.ROLEID from USERROLES UR where UR.AUTHID = UTILIZER())
- union all
- select /*+ INDEX(UP I_USERPRIV_CATALOG_AUTHID) */ null from USERPRIV UP where UP."CATALOG" = AG.CRN and UP.AUTHID = UTILIZER())
- and AG.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F
- where F.NROW between :NROW_FROM and :NROW_TO';
- /* Корректировка запроса под СУБД */
- if (PKG_COMPATIBLE.DATABASE_() = 0) then
- CSQL := replace(csql, '%ROWNUM%', 'ROWNUM');
- else
- CSQL := replace(csql, '%ROWNUM%', '(row_number() over())::numeric');
- end if;
+ /* Добавляем подсказку совместимости */
+ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
+ /* Формируем запрос */
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select AG.AGNABBR SAGNABBR,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' AG.AGNNAME SAGNNAME,');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' AG.AGNTYPE NAGNTYPE');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from AGNLIST AG');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where exists (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_ROLEID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where UP."CATALOG" = AG.CRN');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and UP.ROLEID in (select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UR I_USERROLES_AUTHID_FK)') || ' UR.ROLEID');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERROLES UR where UR.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' union all');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' select ' || PKG_SQL_BUILD.SET_HINT(SHINT => 'INDEX(UP I_USERPRIV_CATALOG_AUTHID)') || ' null');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from USERPRIV UP where UP."CATALOG" = AG.CRN and UP.AUTHID = UTILIZER())');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and AG.RN in (select ID from COND_BROKER_IDSMART where IDENT = :NIDENT) %ORDER_BY%) D) F');
+ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
/* Учтём сортировки */
PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
/* Учтём фильтры */