From 57a37ae1670d0d45e7f58bb3321b7f6f202cd774 Mon Sep 17 00:00:00 2001 From: Dollerino Date: Thu, 30 May 2024 15:54:31 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A6=D0=98=D0=A2=D0=9A-826=20-=20=D0=94=D0=BE?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D0=BF=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=BB=D0=B8=20"=D0=9F=D1=80=D0=BE=D0=B8=D0=B7=D0=B2?= =?UTF-8?q?=D0=BE=D0=B4=D1=81=D1=82=D0=B2=D0=B5=D0=BD=D0=BD=D1=8B=D0=B9=20?= =?UTF-8?q?=D0=BF=D0=BB=D0=B0=D0=BD=20=D1=86=D0=B5=D1=85=D0=B0"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fcroutlst.js | 126 +---- .../{fcroutlstord.js => fcroutlstsp.js} | 54 +- .../mech_rec_dept_cost_prod_plans.js | 5 +- db/PKG_P8PANELS_MECHREC.pck | 526 +++++++++--------- 4 files changed, 327 insertions(+), 384 deletions(-) rename app/panels/mech_rec_dept_cost_prod_plans/{fcroutlstord.js => fcroutlstsp.js} (68%) diff --git a/app/panels/mech_rec_dept_cost_prod_plans/fcroutlst.js b/app/panels/mech_rec_dept_cost_prod_plans/fcroutlst.js index 0a96738..b78e113 100644 --- a/app/panels/mech_rec_dept_cost_prod_plans/fcroutlst.js +++ b/app/panels/mech_rec_dept_cost_prod_plans/fcroutlst.js @@ -9,13 +9,12 @@ import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React import PropTypes from "prop-types"; //Контроль свойств компонента -import { Typography, Box, Paper, Dialog, DialogContent, DialogActions, Button, TextField } from "@mui/material"; //Интерфейсные элементы +import { Typography, Box, Paper, Dialog, DialogContent, DialogActions, Button, TextField, IconButton, Icon } from "@mui/material"; //Интерфейсные элементы import { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции -import { CostRouteListsOrdDataGrid } from "./fcroutlstord"; //Состояние таблицы заказов маршрутных листов -import { ApplicationСtx } from "../../context/application"; //Контекст приложения +import { CostRouteListsSpecsDataGrid } from "./fcroutlstsp"; //Состояние таблицы заказов маршрутных листов //--------- //Константы @@ -26,7 +25,6 @@ const STYLES = { CONTAINER: { textAlign: "center" }, TABLE: { paddingTop: "15px" }, TABLE_SUM: { textAlign: "right", paddingTop: "5px", paddingRight: "15px" }, - DIALOG_EDITOR: { maxWidth: "250px" }, DIALOG_BUTTONS: { marginTop: "10px", width: "240px" } }; @@ -38,37 +36,27 @@ const STYLES = { export const rowExpandRender = ({ row }) => { return ( - + ); }; //Форматирование значений колонок -const dataCellRender = ({ row, columnDef /*, handlePriorEditOpen, handleOrderEditOpen */ }) => { +const dataCellRender = ({ row, columnDef, handlePriorEditOpen }) => { //!!! Пока отключено - не удалять - // switch (columnDef.name) { - // case "NPRIOR_PARTY": - // return { - // data: ( - // <> - // {row["NPRIOR_PARTY"]} - // handlePriorEditOpen(row["NRN"], row["NPRIOR_PARTY"])}> - // edit - // - // - // ) - // }; - // case "NCHANGE_FACEACC": - // return { - // data: ( - // - // handleOrderEditOpen(row["NRN"], row["SPROD_ORDER"])}> - // inventory - // - // - // ) - // }; - // } + switch (columnDef.name) { + case "NPRIOR_PARTY": + return { + data: ( + <> + {row["NPRIOR_PARTY"]} + handlePriorEditOpen(row["NRN"], row["NPRIOR_PARTY"])}> + edit + + + ) + }; + } return { data: row[columnDef] }; @@ -90,17 +78,12 @@ const CostRouteListsDataGrid = ({ task }) => { pageNumber: 1, morePages: true, editPriorNRN: null, - editPriorValue: null, - editOrderNRN: null, - editOrderValue: null + editPriorValue: null }); //Подключение к контексту взаимодействия с сервером const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx); - //Подключение к контексту приложения - const { pOnlineShowDictionary } = useContext(ApplicationСtx); - //Размер страницы данных const DATA_GRID_PAGE_SIZE = 5; @@ -191,38 +174,10 @@ const CostRouteListsDataGrid = ({ task }) => { priorChange(costRouteLists.editPriorNRN, costRouteLists.editPriorValue, costRouteLists.rows); }; - //При открытии изменения заказа - const handleOrderEditOpen = (NRN, sProdOrderValue) => { - setCostRouteLists(pv => ({ ...pv, editOrderNRN: NRN, editOrderValue: sProdOrderValue })); - }; - - //При закрытии изменения заказа - const handleOrderEditClose = () => { - setCostRouteLists(pv => ({ ...pv, editOrderNRN: null, editOrderValue: null })); - }; - - //Изменение заказа - const setEditOrderValue = value => { - setCostRouteLists(pv => ({ ...pv, editOrderValue: value })); - }; - - //При изменении значения заказа - const handleOrderFormChanged = e => { - setEditOrderValue(e.target.value); - }; - - //При нажатии на изменение заказа - const handleOrderChange = () => { - //Изменяем значение - //priorChange(costRouteLists.editPriorNRN, costRouteLists.editPriorValue); - //Закрываем окно - handleOrderEditClose(); - }; - //Генерация содержимого return (
- Маршрутные листы + В производстве {costRouteLists.dataLoaded ? ( <> @@ -237,13 +192,13 @@ const CostRouteListsDataGrid = ({ task }) => { rowExpandRender={rowExpandRender} onOrderChanged={handleOrderChanged} onPagesCountChanged={handlePagesCountChanged} - dataCellRender={prms => dataCellRender({ ...prms, handlePriorEditOpen, handleOrderEditOpen })} + dataCellRender={prms => dataCellRender({ ...prms, handlePriorEditOpen })} /> ) : null} {costRouteLists.editPriorNRN ? ( - handlePriorEditClose(null)} sx={STYLES.DIALOG_EDITOR}> + handlePriorEditClose(null)}> { ) : null} - {costRouteLists.editOrderNRN ? ( - handleOrderEditClose(null)} sx={STYLES.DIALOG_EDITOR}> - - - - - - - - - - - - - - - - ) : null}
); }; diff --git a/app/panels/mech_rec_dept_cost_prod_plans/fcroutlstord.js b/app/panels/mech_rec_dept_cost_prod_plans/fcroutlstsp.js similarity index 68% rename from app/panels/mech_rec_dept_cost_prod_plans/fcroutlstord.js rename to app/panels/mech_rec_dept_cost_prod_plans/fcroutlstsp.js index ec4ca3b..0161b88 100644 --- a/app/panels/mech_rec_dept_cost_prod_plans/fcroutlstord.js +++ b/app/panels/mech_rec_dept_cost_prod_plans/fcroutlstsp.js @@ -1,6 +1,6 @@ /* Парус 8 - Панели мониторинга - ПУП - Производственный план цеха - Компонент панели: Таблица заказов маршрутного листа + Компонент панели: Таблица строк маршрутного листа */ //--------------------- @@ -28,10 +28,10 @@ const STYLES = { //Тело модуля //----------- -//Таблица заказов маршрутного листа -const CostRouteListsOrdDataGrid = ({ mainRowRN }) => { +//Таблица строк маршрутного листа +const CostRouteListsSpecsDataGrid = ({ mainRowRN }) => { //Собственное состояние - таблица данных - const [costRouteListsOrd, setCostRouteListsOrd] = useState({ + const [costRouteListsSpecs, setCostRouteListsSpecs] = useState({ dataLoaded: false, columnsDef: [], orders: null, @@ -49,19 +49,19 @@ const CostRouteListsOrdDataGrid = ({ mainRowRN }) => { //Загрузка данных таблицы с сервера const loadData = useCallback(async () => { - if (costRouteListsOrd.reload) { + if (costRouteListsSpecs.reload) { const data = await executeStored({ - stored: "PKG_P8PANELS_MECHREC.FCROUTLSTORD_DEPT_DG_GET", + stored: "PKG_P8PANELS_MECHREC.FCROUTLSTSP_DEPT_DG_GET", args: { NFCROUTLST: mainRowRN, - CORDERS: { VALUE: object2Base64XML(costRouteListsOrd.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB }, - NPAGE_NUMBER: costRouteListsOrd.pageNumber, + CORDERS: { VALUE: object2Base64XML(costRouteListsSpecs.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB }, + NPAGE_NUMBER: costRouteListsSpecs.pageNumber, NPAGE_SIZE: DATA_GRID_PAGE_SIZE, - NINCLUDE_DEF: costRouteListsOrd.dataLoaded ? 0 : 1 + NINCLUDE_DEF: costRouteListsSpecs.dataLoaded ? 0 : 1 }, respArg: "COUT" }); - setCostRouteListsOrd(pv => ({ + setCostRouteListsSpecs(pv => ({ ...pv, columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], @@ -72,11 +72,11 @@ const CostRouteListsOrdDataGrid = ({ mainRowRN }) => { } // eslint-disable-next-line react-hooks/exhaustive-deps }, [ - costRouteListsOrd.reload, - costRouteListsOrd.filters, - costRouteListsOrd.orders, - costRouteListsOrd.dataLoaded, - costRouteListsOrd.pageNumber, + costRouteListsSpecs.reload, + costRouteListsSpecs.filters, + costRouteListsSpecs.orders, + costRouteListsSpecs.dataLoaded, + costRouteListsSpecs.pageNumber, executeStored, SERV_DATA_TYPE_CLOB ]); @@ -84,26 +84,26 @@ const CostRouteListsOrdDataGrid = ({ mainRowRN }) => { //При необходимости обновить данные таблицы useEffect(() => { loadData(); - }, [costRouteListsOrd.reload, loadData]); + }, [costRouteListsSpecs.reload, loadData]); //При изменении состояния сортировки - const handleOrderChanged = ({ orders }) => setCostRouteListsOrd(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true })); + const handleOrderChanged = ({ orders }) => setCostRouteListsSpecs(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true })); //При изменении количества отображаемых страниц - const handlePagesCountChanged = () => setCostRouteListsOrd(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true })); + const handlePagesCountChanged = () => setCostRouteListsSpecs(pv => ({ ...pv, pageNumber: pv.pageNumber + 1, reload: true })); //Генерация содержимого return (
- Заказы - {costRouteListsOrd.dataLoaded ? ( + Операции + {costRouteListsSpecs.dataLoaded ? ( @@ -112,8 +112,8 @@ const CostRouteListsOrdDataGrid = ({ mainRowRN }) => { ); }; -//Контроль свойств - Таблица заказов маршрутного листа -CostRouteListsOrdDataGrid.propTypes = { +//Контроль свойств - Таблица строк маршрутного листа +CostRouteListsSpecsDataGrid.propTypes = { mainRowRN: PropTypes.number.isRequired }; @@ -121,4 +121,4 @@ CostRouteListsOrdDataGrid.propTypes = { //Интерфейс модуля //---------------- -export { CostRouteListsOrdDataGrid }; +export { CostRouteListsSpecsDataGrid }; diff --git a/app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js b/app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js index 0c499e6..0e4a5b5 100644 --- a/app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js +++ b/app/panels/mech_rec_dept_cost_prod_plans/mech_rec_dept_cost_prod_plans.js @@ -218,7 +218,8 @@ const MechRecDeptCostProdPlans = () => { stored: "PKG_P8PANELS_MECHREC.FCPRODPLAN_DEPT_INIT", args: {}, respArg: "COUT", - isArray: name => name === "XFCPRODPLANS" + isArray: name => name === "XFCPRODPLANS", + attributeValueProcessor: (name, val) => (name === "SPERIOD" ? undefined : val) }); setState(pv => ({ ...pv, init: true, planList: [...(data?.XFCPRODPLANS || [])], planListLoaded: true })); } @@ -352,7 +353,7 @@ const MechRecDeptCostProdPlans = () => {
{state.dataLoaded ? ( - {`Производственный план цеха "${state.selectedPlan.SSUBDIV}" на ${state.selectedPlan.SPERIOD}`} + {`Производственный план цеха №${state.selectedPlan.SSUBDIV} на ${state.selectedPlan.SPERIOD}`} ) : null} diff --git a/db/PKG_P8PANELS_MECHREC.pck b/db/PKG_P8PANELS_MECHREC.pck index 777435e..4d7fda5 100644 --- a/db/PKG_P8PANELS_MECHREC.pck +++ b/db/PKG_P8PANELS_MECHREC.pck @@ -85,14 +85,6 @@ create or replace package PKG_P8PANELS_MECHREC as SPRIOR_PARTY in varchar -- Новое значение приоритета партии ); - /* Изменение заказа маршрутного листа */ - procedure FCROUTLST_FACEACC_UPDATE - ( - NFCROUTLST in number, -- Рег. номер маршрутного листа - SFACEACC_NUMB in varchar, -- Номер заказа - NFCPRODPLANSP in number -- Рег. номер строки плана - ); - /* Получение таблицы маршрутных листов, связанных со спецификацией плана */ procedure FCROUTLST_DEPT_DG_GET ( @@ -104,8 +96,8 @@ create or replace package PKG_P8PANELS_MECHREC as COUT out clob -- Сериализованная таблица данных ); - /* Получение таблицы заказов маршрутного листа */ - procedure FCROUTLSTORD_DEPT_DG_GET + /* Получение таблицы строк маршрутного листа */ + procedure FCROUTLSTSP_DEPT_DG_GET ( NFCROUTLST in number, -- Рег. номер маршрутного листа NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) @@ -333,7 +325,8 @@ create or replace package body PKG_P8PANELS_MECHREC as STASK_ATTR_MEAS constant PKG_STD.TSTRING := 'meas'; -- Единица измнения /* Константы - дополнительные параметры */ - SCOL_PATTERN_DATE constant PKG_STD.TSTRING := 'dd_mm_yyyy'; -- Паттерн для динамической колонки граф ("день_месяц_год") + SCOL_PATTERN_DATE constant PKG_STD.TSTRING := 'dd_mm_yyyy'; -- Паттерн для динамической колонки граф ("день_месяц_год") + SFCROUTLSTSP_STATE_DOMAIN constant PKG_STD.TSTRING := 'TFCROUTLSTSP_STATE'; -- Мнемокод домена состояния спецификации маршрутного листа /* Константы - типовые присоединённые документы */ SFLINKTYPE_PREVIEW constant PKG_STD.TSTRING := 'Предпросмотр'; -- Тип ПД для изображений предпросмотра @@ -662,7 +655,7 @@ create or replace package body PKG_P8PANELS_MECHREC as and T.OUT_UNITCODE = 'CostProductPlansSpecs' and S.RN = T.IN_DOCUMENT and P.RN = S.PRN - and P.CATEGORY = 1 + and P.CATEGORY = NFCPRODPLAN_CATEGORY and P.COMPANY = NCOMPANY and ROWNUM = 1; exception @@ -2744,8 +2737,6 @@ create or replace package body PKG_P8PANELS_MECHREC as is RFCROUTLST FCROUTLST%rowtype; -- Запись маршрутного листа begin - /* Дорабатывается */ - P_EXCEPTION(0, 'На стадии разработки.'); /* Проверяем нет ли лишних символов */ if ((SPRIOR_PARTY is not null) and (REGEXP_COUNT(SPRIOR_PARTY, '[^0123456789]+') > 0)) then P_EXCEPTION(0, 'Значение приоритета должно быть целым числом.'); @@ -2803,61 +2794,6 @@ create or replace package body PKG_P8PANELS_MECHREC as SINT_NUMB => RFCROUTLST.INT_NUMB); end FCROUTLST_PRIOR_PARTY_UPDATE; - /* Изменение заказа маршрутного листа */ - procedure FCROUTLST_FACEACC_UPDATE - ( - NFCROUTLST in number, -- Рег. номер маршрутного листа - SFACEACC_NUMB in varchar, -- Номер заказа - NFCPRODPLANSP in number -- Рег. номер строки плана - ) - is - RFCROUTLST FCROUTLST%rowtype; -- Запись маршрутного листа - NFACEACC PKG_STD.TREF; -- Рег. номер лицевого счета - - /* Проверка наличия связей с другими строками плана */ - function FCROUTLST_CHECK_OTHER_PROD - ( - NFCROUTLST in number, -- Рег. номер маршрутного листа - NFCPRODPLANSP in number -- Рег. номер строки плана - ) 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 D - where D.OUT_UNITCODE = 'CostRouteLists' - and D.OUT_DOCUMENT = NFCROUTLST - and D.IN_UNITCODE = 'CostProductPlansSpecs' - and D.IN_DOCUMENT <> NFCPRODPLANSP); - exception - when others then - NRESULT := 0; - end; - /* Возвращаем результат */ - return NRESULT; - end FCROUTLST_CHECK_OTHER_PROD; - begin - /* Дорабатывается */ - P_EXCEPTION(0, 'На стадии разработки.'); - /* Считываем запись маршрутного листа */ - UTL_FCROUTLST_GET(NFCROUTLST => NFCROUTLST, RFCROUTLST => RFCROUTLST); - /* Определяем рег. номер лицевого счета */ - FIND_FACEACC_NUMB(NFLAG_SMART => 0, - NFLAG_OPTION => 1, - NCOMPANY => RFCROUTLST.COMPANY, - SNUMB => SFACEACC_NUMB, - NRN => NFACEACC); - /* Если есть связи с другими строками плана */ - if (FCROUTLST_CHECK_OTHER_PROD(NFCROUTLST => NFCROUTLST, NFCPRODPLANSP => NFCPRODPLANSP) = 1) then - null; - end if; - end FCROUTLST_FACEACC_UPDATE; - /* Получение таблицы маршрутных листов, связанных со спецификацией плана */ procedure FCROUTLST_DEPT_DG_GET ( @@ -3140,8 +3076,8 @@ create or replace package body PKG_P8PANELS_MECHREC as raise; end FCROUTLST_DEPT_DG_GET; - /* Получение таблицы заказов маршрутного листа */ - procedure FCROUTLSTORD_DEPT_DG_GET + /* Получение таблицы строк маршрутного листа */ + procedure FCROUTLSTSP_DEPT_DG_GET ( NFCROUTLST in number, -- Рег. номер маршрутного листа NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) @@ -3159,62 +3095,32 @@ create or replace package body PKG_P8PANELS_MECHREC as NROW_TO PKG_STD.TREF; -- Номер строки по CSQL clob; -- Буфер для запроса ICURSOR integer; -- Курсор для исполнения запроса - SPROD_ORDER PKG_STD.TSTRING; -- Заказ МЛ - NQUANT PKG_STD.TLNUMBER; -- Количество МЛ - NPRIOR_ORDER PKG_STD.TLNUMBER; -- Приоритет заказа МЛ + NSTATE PKG_STD.TNUMBER; -- Состояние - /* Проверка наличия записей спецификации "Заказы" */ - function FCROUTLSTORD_EXISTS + /* Считывание текстового представления состояния строки маршрутного листа */ + function FCROUTLSTSP_STATE_NAME_GET ( - NFCROUTLST in number -- Рег. номер маршрутного листа - ) return number -- Наличие записей спецификации заказы (0 - нет, 1 - да) + NSTATE in number -- Состояние строки маршрутного листа + ) return varchar2 -- Наименование состояния строки маршрутного листа is - NRESULT PKG_STD.TNUMBER; -- Наличие записей спецификации заказы (0 - нет, 1 - да) + SRESULT PKG_STD.TSTRING; -- Наименование состояния строки маршрутного листа begin - /* Проверяем наличие */ + /* Считываем наименование состояния по домену */ begin - select 1 - into NRESULT - from DUAL - where exists (select null - from FCROUTLSTORD T - where T.PRN = NFCROUTLST - and ROWNUM = 1); + select V.NAME + into SRESULT + from DMSDOMAINS T, + DMSENUMVALUES V + where T.CODE = SFCROUTLSTSP_STATE_DOMAIN + and V.PRN = T.RN + and V.VALUE_NUM = NSTATE; exception when others then - NRESULT := 0; + SRESULT := null; end; /* Возвращаем результат */ - return NRESULT; - end FCROUTLSTORD_EXISTS; - - /* Получение значений из заголовка МЛ */ - procedure FCROUTLST_INFO_GET - ( - NFCROUTLST in number, -- Рег. номер маршрутного листа - SPROD_ORDER out varchar2, -- Заказ - NQUANT out number, -- Количество - NPRIOR_ORDER out number -- Приоритет заказа - ) - is - begin - /* Считываем информацию из заголовка */ - begin - select (select F.NUMB from FACEACC F where T.FACEACC = F.RN), - T.QUANT, - T.PRIOR_ORDER - into SPROD_ORDER, - NQUANT, - NPRIOR_ORDER - from FCROUTLST T - where T.RN = NFCROUTLST; - exception - when others then - SPROD_ORDER := null; - NQUANT := null; - NPRIOR_ORDER := null; - end; - end FCROUTLST_INFO_GET; + return SRESULT; + end FCROUTLSTSP_STATE_NAME_GET; begin /* Читем сортировки */ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); @@ -3232,106 +3138,151 @@ create or replace package body PKG_P8PANELS_MECHREC as SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'SPROD_ORDER', - SCAPTION => 'Заказ', + SNAME => 'SSTATE', + SCAPTION => 'Состояние', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, - BVISIBLE => true, - BORDER => true); + BVISIBLE => 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); + SNAME => 'SOPER_NUMB', + SCAPTION => 'Номер операции', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, - SNAME => 'NPRIOR_ORDER', - SCAPTION => 'Приоритет заказа', + SNAME => 'SROUTSHTSP_NAME', + SCAPTION => 'Операция', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SSUBDIV', + SCAPTION => 'Цех, участок', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => 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); - /* Если у маршрутного листа есть записи спецификации "Заказы" - работаем по ним */ - if (FCROUTLSTORD_EXISTS(NFCROUTLST => NFCROUTLST) = 1) then - /* Обходим данные */ - 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 => ' F.NUMB SPROD_ORDER,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT NQUANT,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.PRIOR_ORDER NPRIOR_ORDER,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCROUTLSTORD T'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join FACEACC F on T.PROD_ORDER = F.RN'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where T.PRN = :NFCROUTLST'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.COMPANY = :NCOMPANY'); - 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_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); - /* Делаем выборку */ - 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 => 'SPROD_ORDER', - ICURSOR => ICURSOR, - NPOSITION => 2); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NQUANT', ICURSOR => ICURSOR, NPOSITION => 3); - PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, - SNAME => 'NPRIOR_ORDER', - ICURSOR => ICURSOR, - NPOSITION => 4); - /* Добавляем строку в таблицу */ - 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; - else - /* Считываем значения из заголовка МЛ */ - FCROUTLST_INFO_GET(NFCROUTLST => NFCROUTLST, - SPROD_ORDER => SPROD_ORDER, - NQUANT => NQUANT, - NPRIOR_ORDER => NPRIOR_ORDER); - /* Добавляем колонки с данными */ - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NFCROUTLST, BCLEAR => true); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SPROD_ORDER', SVALUE => SPROD_ORDER); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NQUANT', NVALUE => NQUANT); - PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPRIOR_ORDER', NVALUE => NPRIOR_ORDER); - /* Добавляем строку в таблицу */ - PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); - end if; + BVISIBLE => 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); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NT_SHT_PLAN', + SCAPTION => 'Трудоемкость план', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'NLABOUR_FACT', + SCAPTION => 'Трудоемкость факт', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, + BVISIBLE => true); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SMUNIT', + SCAPTION => 'ЕИ трудоемкости', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => 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.STATE NSTATE,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.OPER_NUMB SOPER_NUMB,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' trim(T.OPER_NUMB) || '', '' || '); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' trim(COALESCE(( select O.NAME from FCOPERTYPES O where T.OPER_TPS = O.RN ), T.OPER_UK)) SROUTSHTSP_NAME,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ( select I.CODE from INS_DEPARTMENT I where T.SUBDIV = I.RN ) SSUBDIV,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT_PLAN NQUANT_PLAN,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT_FACT NQUANT_FACT,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.T_SHT_PLAN NT_SHT_PLAN,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.LABOUR_FACT NLABOUR_FACT,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ( select D.MEAS_MNEMO from DICMUNTS D where T.MUNIT = D.RN ) SMUNIT'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCROUTLSTSP T'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where T.PRN = :NFCROUTLST'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.COMPANY = :NCOMPANY'); + 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_NUM(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_STR(ICURSOR => ICURSOR, IPOSITION => 10); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 11); + /* Делаем выборку */ + 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_SQL_DML.COLUMN_VALUE_NUM(ICURSOR => ICURSOR, IPOSITION => 2, NVALUE => NSTATE); + PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, + SNAME => 'SSTATE', + SVALUE => FCROUTLSTSP_STATE_NAME_GET(NSTATE => NSTATE)); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SOPER_NUMB', + ICURSOR => ICURSOR, + NPOSITION => 3); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SROUTSHTSP_NAME', + ICURSOR => ICURSOR, + NPOSITION => 4); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SSUBDIV', ICURSOR => ICURSOR, NPOSITION => 5); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NQUANT_PLAN', + ICURSOR => ICURSOR, + NPOSITION => 6); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NQUANT_FACT', + ICURSOR => ICURSOR, + NPOSITION => 7); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NT_SHT_PLAN', + ICURSOR => ICURSOR, + NPOSITION => 8); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, + SNAME => 'NLABOUR_FACT', + ICURSOR => ICURSOR, + NPOSITION => 9); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SMUNIT', ICURSOR => ICURSOR, NPOSITION => 10); + /* Добавляем строку в таблицу */ + 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 FCROUTLSTORD_DEPT_DG_GET; + end FCROUTLSTSP_DEPT_DG_GET; /* Получение таблицы ПиП на основании маршрутного листа, связанных со спецификацией плана */ procedure INCOMEFROMDEPS_DEPT_DG_GET @@ -3370,6 +3321,11 @@ create or replace package body PKG_P8PANELS_MECHREC as SCAPTION => 'Рег. номер', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => false); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SSTATE', + SCAPTION => 'Состояние', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'SDOC_INFO', SCAPTION => 'Документ (тип, №, дата)', @@ -3403,6 +3359,7 @@ create or replace package body PKG_P8PANELS_MECHREC as 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 => ' SUBSTR(F_DOCSTATE_PLAN_FACT(T.DOC_STATE), 1, 20) SSTATE,'); 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) ||'); @@ -3444,9 +3401,10 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Описываем структуру записи курсора */ 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_DATE(ICURSOR => ICURSOR, IPOSITION => 4); - PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 5); + PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 4); + PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 5); + PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6); /* Делаем выборку */ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then null; @@ -3461,17 +3419,21 @@ create or replace package body PKG_P8PANELS_MECHREC as NPOSITION => 1, BCLEAR => true); PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, - SNAME => 'SDOC_INFO', + SNAME => 'SSTATE', ICURSOR => ICURSOR, NPOSITION => 2); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, + SNAME => 'SDOC_INFO', + ICURSOR => ICURSOR, + NPOSITION => 3); PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NQUANT_FACT', ICURSOR => ICURSOR, - NPOSITION => 3); + NPOSITION => 4); PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, SNAME => 'DDUE_DATE', ICURSOR => ICURSOR, - NPOSITION => 4); + NPOSITION => 5); /* Добавляем строку в таблицу */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); end loop; @@ -3533,7 +3495,7 @@ create or replace package body PKG_P8PANELS_MECHREC as begin select F.NOMEN_MODIF into NRESULT - from FCPRODPLANSP T, + from FCPRODPLANSP T, FCMATRESOURCE F where T.RN = NFCPRODPLANSP and F.RN = T.MATRES; @@ -3579,7 +3541,40 @@ create or replace package body PKG_P8PANELS_MECHREC as SPARENT => 'NVALUE_BY_DAYS'); end loop; end INIT_DAYS; + + /* Расчет факта выпусков плана */ + procedure FCPRODPLANSP_CALC + ( + NFCPRODPLAN in number, -- Рег. номер планов и отчетов производства изделий + NCOMPANY in number -- Рег. номер организации + ) + is + NIDENT PKG_STD.TREF; -- Идентификатор отмеченных записей + NTMP PKG_STD.TREF; -- Буфер + begin + /* Генерируем идентификатор отмеченных записей */ + NIDENT := GEN_IDENT(); + /* Цикл по записям спецификации плана */ + for REC in (select T.RN from FCPRODPLANSP T where T.PRN = NFCPRODPLAN) + loop + /* Добавляем запись в отмеченные записи */ + P_SELECTLIST_INSERT(NIDENT => NIDENT, NDOCUMENT => REC.RN, SUNITCODE => 'CostProductPlansSpecs', NRN => NTMP); + end loop; + /* Расчет факта */ + P_FCPRODPLANSP_BASE_CALC_FACT(NCOMPANY => NCOMPANY, NIDENT => NIDENT); + /* Очистка отмеченных записей */ + P_SELECTLIST_CLEAR(NIDENT => NIDENT); + exception + when others then + /* Очистка отмеченных записей */ + P_SELECTLIST_CLEAR(NIDENT => NIDENT); + end FCPRODPLANSP_CALC; begin + /* Если это выбор плана */ + if (NINCLUDE_DEF = 1) then + /* Расчет факта выпусков плана */ + FCPRODPLANSP_CALC(NFCPRODPLAN => NFCPRODPLAN, NCOMPANY => NCOMPANY); + end if; /* Читем сортировки */ RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); /* Преобразуем номер и размер страницы в номер строк с и по */ @@ -3588,7 +3583,7 @@ create or replace package body PKG_P8PANELS_MECHREC as NROW_FROM => NROW_FROM, NROW_TO => NROW_TO); /* Инициализируем таблицу данных */ - RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 6); + RDG := PKG_P8PANELS_VISUAL.TDATA_GRID_MAKE(BFIXED_HEADER => true, NFIXED_COLUMNS => 7); /* Описываем колонки таблицы данных */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NRN', @@ -3629,6 +3624,13 @@ create or replace package body PKG_P8PANELS_MECHREC as BVISIBLE => true, BORDER => true, NWIDTH => 200); + PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, + SNAME => 'SSUBDIV', + SCAPTION => 'Цех-получатель', + SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, + BVISIBLE => true, + BORDER => true, + NWIDTH => 180); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NMAIN_QUANT', SCAPTION => 'План', @@ -3646,7 +3648,7 @@ create or replace package body PKG_P8PANELS_MECHREC as SCAPTION => 'Запущено', SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, BVISIBLE => true, - NWIDTH => 80); + NWIDTH => 90); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, SNAME => 'NVALUE_BY_DAYS', SCAPTION => 'План/факт по дням', @@ -3682,6 +3684,7 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select PORD.NUMB from FACEACC PORD where (PORD.RN = T.PROD_ORDER)) SPROD_ORDER,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' MRES.CODE SMATRES_CODE,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' MRES."NAME" SMATRES_NAME,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select INS_D.CODE from INS_DEPARTMENT INS_D where INS_D.RN = T.SUBDIV) SSUBDIV,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.MAIN_QUANT NMAIN_QUANT,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.REL_FACT NREL_FACT,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' (select COALESCE(sum(F.QUANT), ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0) || ')'); @@ -3702,6 +3705,7 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where P.RN = :NFCPRODPLAN'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.COMPANY = :NCOMPANY'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.PRN = P.RN'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.MAIN_QUANT <> ' || PKG_SQL_BUILD.WRAP_NUM(NVALUE => 0)); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.MATRES = MRES.RN'); 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'); @@ -3744,10 +3748,11 @@ create or replace package body PKG_P8PANELS_MECHREC as 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_STR(ICURSOR => ICURSOR, IPOSITION => 4); - PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 5); + 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); /* Делаем выборку */ if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then null; @@ -3772,18 +3777,19 @@ create or replace package body PKG_P8PANELS_MECHREC as SNAME => 'SMATRES_NAME', ICURSOR => ICURSOR, NPOSITION => 4); + PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, SNAME => 'SSUBDIV', ICURSOR => ICURSOR, NPOSITION => 5); PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NMAIN_QUANT', ICURSOR => ICURSOR, - NPOSITION => 5); + NPOSITION => 6); PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NREL_FACT', ICURSOR => ICURSOR, - NPOSITION => 6); + NPOSITION => 7); PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, SNAME => 'NFCROUTLST_QUANT', ICURSOR => ICURSOR, - NPOSITION => 7); + NPOSITION => 8); /* Считываем рег. номер связанной спецификации из "Производственная программа" */ NFCPRODPLANSP_MAIN := UTL_FCPRODPLANSP_MAIN_GET(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP); /* Если есть связанная спецификация из производственной программы */ @@ -3798,39 +3804,54 @@ create or replace package body PKG_P8PANELS_MECHREC as NSUM_FACT := 0; /* Добавляем значения по графику сдачи */ for REC in (select TMP.DOC_DATE, - COALESCE(SUM(TMP.QUANT_PLAN), 0) QUANT_PLAN, - COALESCE(SUM(TMP.QUANT_FACT), 0) QUANT_FACT - from (select T.DOC_DATE, - T.QUANT_PLAN, - 0 QUANT_FACT + COALESCE(sum(TMP.QUANT_PLAN), 0) QUANT_PLAN, + COALESCE(sum(TMP.QUANT_FACT), 0) QUANT_FACT + from ( /* Указаны в спецификации */ + select T.DOC_DATE, + T.QUANT_PLAN, + 0 QUANT_FACT from FCPRODPLANDLVSH T where T.PRN = NFCPRODPLANSP and T.DOC_DATE >= DDATE_FROM and T.DOC_DATE <= DDATE_TO - union + union + /* Связаны со спецификацией плана или связанной строкой "Производственная программа" */ select D.WORK_DATE, - 0, - SUM(S.QUANT_FACT) - from FCROUTLST FL, - DOCLINKS DL, - INCOMEFROMDEPS D, - INCOMEFROMDEPSSPEC S - where FL.RN in (select SL.DOCUMENT - from SELECTLIST SL - where SL.IDENT = NFCROUTLST_IDENT - and SL.UNITCODE = 'CostRouteLists') - and FL.STATE = 1 - and DL.IN_DOCUMENT = FL.RN - and DL.IN_UNITCODE = 'CostRouteLists' - and DL.OUT_UNITCODE = 'IncomFromDeps' - and D.RN = DL.OUT_DOCUMENT - and D.DOC_STATE = 2 + 0, + sum(S.QUANT_FACT) + from INCOMEFROMDEPS D, + INCOMEFROMDEPSSPEC S + where ( /* Связь по МЛ связанной строки "Производственная программа" */ + (D.RN in (select DL.OUT_DOCUMENT + from SELECTLIST SL, + FCROUTLST FL, + DOCLINKS DL + where SL.IDENT = NFCROUTLST_IDENT + and SL.UNITCODE = 'CostRouteLists' + and FL.RN = SL.DOCUMENT + and FL.STATE = 1 + and DL.IN_DOCUMENT = FL.RN + and DL.IN_UNITCODE = 'CostRouteLists' + and DL.OUT_UNITCODE = 'IncomFromDeps')) or + /* Прямая связь со связанной строкой "Производственная программа" */ + (D.RN in (select L.OUT_DOCUMENT + from DOCLINKS L + where L.IN_DOCUMENT = NFCPRODPLANSP_MAIN + and L.IN_UNITCODE = 'CostProductPlansSpecs' + and L.OUT_UNITCODE = 'IncomFromDeps')) or + /* Прямая связь с обрабатываемой строкой */ + (D.RN in (select L.OUT_DOCUMENT + from DOCLINKS L + where L.IN_DOCUMENT = NFCPRODPLANSP + and L.IN_UNITCODE = 'CostProductPlansSpecs' + and L.OUT_UNITCODE = 'IncomFromDeps'))) + and D.DOC_STATE = NFCPRODPLAN_STATUS and D.WORK_DATE >= DDATE_FROM and D.WORK_DATE <= DDATE_TO and S.PRN = D.RN and S.NOMMODIF = NMODIF group by D.WORK_DATE) TMP - group by TMP.DOC_DATE) + group by TMP.DOC_DATE) loop /* Добавляем значение план/факт в соответствующую колонку */ PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, @@ -3870,9 +3891,13 @@ create or replace package body PKG_P8PANELS_MECHREC as is NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса NVERSION PKG_STD.TREF; -- Версия контрагентов + DDATE_FROM PKG_STD.TLDATE; -- Дата с + DDATE_TO PKG_STD.TLDATE; -- Дата по begin /* Считываем версию контрагентов */ FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION); + /* Определяем период записей */ + P_FIRST_LAST_DAY(DCALCDATE => sysdate, DBGNDATE => DDATE_FROM, DENDDATE => DDATE_TO); /* Начинаем формирование XML */ PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_); /* Открываем корень */ @@ -3882,7 +3907,7 @@ create or replace package body PKG_P8PANELS_MECHREC as DT.DOCCODE || ', ' || trim(P.PREFIX) || '-' || trim(P.NUMB) || ', ' || TO_CHAR(P.DOCDATE, 'dd.mm.yyyy') SDOC_INFO, D.CODE as SSUBDIV, - E.CODE as SPERIOD + TO_CHAR(E.STARTDATE, 'mm.yyyy') as SPERIOD from FCPRODPLAN P, FINSTATE FS, DOCTYPES DT, @@ -3891,7 +3916,6 @@ create or replace package body PKG_P8PANELS_MECHREC as where P.CATEGORY = NFCPRODPLAN_DEPT_CTGR and P.STATUS = NFCPRODPLAN_STATUS and P.COMPANY = NCOMPANY - and P.DOCDATE >= trunc(sysdate, 'mm') and P.SUBDIV in (select C.DEPTRN from CLNPSPFM C, CLNPSPFMTYPES CT @@ -3914,6 +3938,8 @@ create or replace package body PKG_P8PANELS_MECHREC as and D.RN = P.SUBDIV and DT.RN = P.DOCTYPE and E.RN = P.CALC_PERIOD + and E.STARTDATE >= DDATE_FROM + and E.ENDDATE <= DDATE_TO and exists (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */ null from USERPRIV UP