ЦИТК-826 - Доработка панели "Производственный план цеха"

This commit is contained in:
Mikhail Chechnev 2024-06-10 13:52:55 +03:00 committed by GitHub
commit a464dc961f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 327 additions and 384 deletions

View File

@ -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 (
<Paper elevation={4}>
<CostRouteListsOrdDataGrid mainRowRN={row.NRN} />
<CostRouteListsSpecsDataGrid mainRowRN={row.NRN} />
</Paper>
);
};
//Форматирование значений колонок
const dataCellRender = ({ row, columnDef /*, handlePriorEditOpen, handleOrderEditOpen */ }) => {
const dataCellRender = ({ row, columnDef, handlePriorEditOpen }) => {
//!!! Пока отключено - не удалять
// switch (columnDef.name) {
// case "NPRIOR_PARTY":
// return {
// data: (
// <>
// {row["NPRIOR_PARTY"]}
// <IconButton edge="end" title="Изменить приоритет" onClick={() => handlePriorEditOpen(row["NRN"], row["NPRIOR_PARTY"])}>
// <Icon>edit</Icon>
// </IconButton>
// </>
// )
// };
// case "NCHANGE_FACEACC":
// return {
// data: (
// <Box sx={{ textAlign: "center" }}>
// <IconButton title="Изменить заказ" onClick={() => handleOrderEditOpen(row["NRN"], row["SPROD_ORDER"])}>
// <Icon>inventory</Icon>
// </IconButton>
// </Box>
// )
// };
// }
switch (columnDef.name) {
case "NPRIOR_PARTY":
return {
data: (
<>
{row["NPRIOR_PARTY"]}
<IconButton edge="end" title="Изменить приоритет" onClick={() => handlePriorEditOpen(row["NRN"], row["NPRIOR_PARTY"])}>
<Icon>edit</Icon>
</IconButton>
</>
)
};
}
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 (
<div style={STYLES.CONTAINER}>
<Typography variant={"h6"}>Маршрутные листы</Typography>
<Typography variant={"h6"}>В производстве</Typography>
{costRouteLists.dataLoaded ? (
<>
<Box sx={STYLES.TABLE}>
@ -237,13 +192,13 @@ const CostRouteListsDataGrid = ({ task }) => {
rowExpandRender={rowExpandRender}
onOrderChanged={handleOrderChanged}
onPagesCountChanged={handlePagesCountChanged}
dataCellRender={prms => dataCellRender({ ...prms, handlePriorEditOpen, handleOrderEditOpen })}
dataCellRender={prms => dataCellRender({ ...prms, handlePriorEditOpen })}
/>
</Box>
</>
) : null}
{costRouteLists.editPriorNRN ? (
<Dialog open onClose={() => handlePriorEditClose(null)} sx={STYLES.DIALOG_EDITOR}>
<Dialog open onClose={() => handlePriorEditClose(null)}>
<DialogContent>
<Box>
<TextField
@ -267,45 +222,6 @@ const CostRouteListsDataGrid = ({ task }) => {
</DialogActions>
</Dialog>
) : null}
{costRouteLists.editOrderNRN ? (
<Dialog open onClose={() => handleOrderEditClose(null)} sx={STYLES.DIALOG_EDITOR}>
<DialogContent>
<Box>
<TextField
name="editOrderValue"
label="Заказ"
variant="standard"
fullWidth
value={costRouteLists.editOrderValue}
onChange={handleOrderFormChanged}
/>
<Box>
<Button
sx={STYLES.DIALOG_BUTTONS}
variant="contained"
onClick={() => {
pOnlineShowDictionary({
unitCode: "FaceAccounts",
inputParameters: [{ name: "in_NUMB", value: costRouteLists.editOrderValue }],
callBack: res => (res.success === true ? setEditOrderValue(res.outParameters.out_NUMB) : null)
});
}}
>
Лицевые счета
</Button>
<Box>
<Button sx={STYLES.DIALOG_BUTTONS} onClick={handleOrderChange} variant="contained">
Изменить
</Button>
</Box>
</Box>
</Box>
</DialogContent>
<DialogActions>
<Button onClick={() => handleOrderEditClose(null)}>Закрыть</Button>
</DialogActions>
</Dialog>
) : null}
</div>
);
};

View File

@ -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 (
<div style={STYLES.CONTAINER}>
<Typography variant={"subtitle2"}>Заказы</Typography>
{costRouteListsOrd.dataLoaded ? (
<Typography variant={"subtitle2"}>Операции</Typography>
{costRouteListsSpecs.dataLoaded ? (
<P8PDataGrid
{...P8P_DATA_GRID_CONFIG_PROPS}
columnsDef={costRouteListsOrd.columnsDef}
rows={costRouteListsOrd.rows}
columnsDef={costRouteListsSpecs.columnsDef}
rows={costRouteListsSpecs.rows}
size={P8P_DATA_GRID_SIZE.SMALL}
morePages={costRouteListsOrd.morePages}
reloading={costRouteListsOrd.reload}
morePages={costRouteListsSpecs.morePages}
reloading={costRouteListsSpecs.reload}
onOrderChanged={handleOrderChanged}
onPagesCountChanged={handlePagesCountChanged}
/>
@ -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 };

View File

@ -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 = () => {
<div style={STYLES.CONTAINER}>
{state.dataLoaded ? (
<Typography variant={"h6"}>
{`Производственный план цеха "${state.selectedPlan.SSUBDIV}" на ${state.selectedPlan.SPERIOD}`}
{`Производственный план цеха ${state.selectedPlan.SSUBDIV} на ${state.selectedPlan.SPERIOD}`}
</Typography>
) : null}
<Grid container spacing={1}>

View File

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