ЦИТК-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 React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента 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 { P8PDataGrid, P8P_DATA_GRID_SIZE } from "../../components/p8p_data_grid"; //Таблица данных
import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения import { P8P_DATA_GRID_CONFIG_PROPS } from "../../config_wrapper"; //Подключение компонентов к настройкам приложения
import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером
import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции
import { CostRouteListsOrdDataGrid } from "./fcroutlstord"; //Состояние таблицы заказов маршрутных листов import { CostRouteListsSpecsDataGrid } from "./fcroutlstsp"; //Состояние таблицы заказов маршрутных листов
import { ApplicationСtx } from "../../context/application"; //Контекст приложения
//--------- //---------
//Константы //Константы
@ -26,7 +25,6 @@ const STYLES = {
CONTAINER: { textAlign: "center" }, CONTAINER: { textAlign: "center" },
TABLE: { paddingTop: "15px" }, TABLE: { paddingTop: "15px" },
TABLE_SUM: { textAlign: "right", paddingTop: "5px", paddingRight: "15px" }, TABLE_SUM: { textAlign: "right", paddingTop: "5px", paddingRight: "15px" },
DIALOG_EDITOR: { maxWidth: "250px" },
DIALOG_BUTTONS: { marginTop: "10px", width: "240px" } DIALOG_BUTTONS: { marginTop: "10px", width: "240px" }
}; };
@ -38,37 +36,27 @@ const STYLES = {
export const rowExpandRender = ({ row }) => { export const rowExpandRender = ({ row }) => {
return ( return (
<Paper elevation={4}> <Paper elevation={4}>
<CostRouteListsOrdDataGrid mainRowRN={row.NRN} /> <CostRouteListsSpecsDataGrid mainRowRN={row.NRN} />
</Paper> </Paper>
); );
}; };
//Форматирование значений колонок //Форматирование значений колонок
const dataCellRender = ({ row, columnDef /*, handlePriorEditOpen, handleOrderEditOpen */ }) => { const dataCellRender = ({ row, columnDef, handlePriorEditOpen }) => {
//!!! Пока отключено - не удалять //!!! Пока отключено - не удалять
// switch (columnDef.name) { switch (columnDef.name) {
// case "NPRIOR_PARTY": case "NPRIOR_PARTY":
// return { return {
// data: ( data: (
// <> <>
// {row["NPRIOR_PARTY"]} {row["NPRIOR_PARTY"]}
// <IconButton edge="end" title="Изменить приоритет" onClick={() => handlePriorEditOpen(row["NRN"], row["NPRIOR_PARTY"])}> <IconButton edge="end" title="Изменить приоритет" onClick={() => handlePriorEditOpen(row["NRN"], row["NPRIOR_PARTY"])}>
// <Icon>edit</Icon> <Icon>edit</Icon>
// </IconButton> </IconButton>
// </> </>
// ) )
// }; };
// case "NCHANGE_FACEACC": }
// return {
// data: (
// <Box sx={{ textAlign: "center" }}>
// <IconButton title="Изменить заказ" onClick={() => handleOrderEditOpen(row["NRN"], row["SPROD_ORDER"])}>
// <Icon>inventory</Icon>
// </IconButton>
// </Box>
// )
// };
// }
return { return {
data: row[columnDef] data: row[columnDef]
}; };
@ -90,17 +78,12 @@ const CostRouteListsDataGrid = ({ task }) => {
pageNumber: 1, pageNumber: 1,
morePages: true, morePages: true,
editPriorNRN: null, editPriorNRN: null,
editPriorValue: null, editPriorValue: null
editOrderNRN: null,
editOrderValue: null
}); });
//Подключение к контексту взаимодействия с сервером //Подключение к контексту взаимодействия с сервером
const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx); const { executeStored, SERV_DATA_TYPE_CLOB } = useContext(BackEndСtx);
//Подключение к контексту приложения
const { pOnlineShowDictionary } = useContext(ApplicationСtx);
//Размер страницы данных //Размер страницы данных
const DATA_GRID_PAGE_SIZE = 5; const DATA_GRID_PAGE_SIZE = 5;
@ -191,38 +174,10 @@ const CostRouteListsDataGrid = ({ task }) => {
priorChange(costRouteLists.editPriorNRN, costRouteLists.editPriorValue, costRouteLists.rows); 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 ( return (
<div style={STYLES.CONTAINER}> <div style={STYLES.CONTAINER}>
<Typography variant={"h6"}>Маршрутные листы</Typography> <Typography variant={"h6"}>В производстве</Typography>
{costRouteLists.dataLoaded ? ( {costRouteLists.dataLoaded ? (
<> <>
<Box sx={STYLES.TABLE}> <Box sx={STYLES.TABLE}>
@ -237,13 +192,13 @@ const CostRouteListsDataGrid = ({ task }) => {
rowExpandRender={rowExpandRender} rowExpandRender={rowExpandRender}
onOrderChanged={handleOrderChanged} onOrderChanged={handleOrderChanged}
onPagesCountChanged={handlePagesCountChanged} onPagesCountChanged={handlePagesCountChanged}
dataCellRender={prms => dataCellRender({ ...prms, handlePriorEditOpen, handleOrderEditOpen })} dataCellRender={prms => dataCellRender({ ...prms, handlePriorEditOpen })}
/> />
</Box> </Box>
</> </>
) : null} ) : null}
{costRouteLists.editPriorNRN ? ( {costRouteLists.editPriorNRN ? (
<Dialog open onClose={() => handlePriorEditClose(null)} sx={STYLES.DIALOG_EDITOR}> <Dialog open onClose={() => handlePriorEditClose(null)}>
<DialogContent> <DialogContent>
<Box> <Box>
<TextField <TextField
@ -267,45 +222,6 @@ const CostRouteListsDataGrid = ({ task }) => {
</DialogActions> </DialogActions>
</Dialog> </Dialog>
) : null} ) : 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> </div>
); );
}; };

View File

@ -1,6 +1,6 @@
/* /*
Парус 8 - Панели мониторинга - ПУП - Производственный план цеха Парус 8 - Панели мониторинга - ПУП - Производственный план цеха
Компонент панели: Таблица заказов маршрутного листа Компонент панели: Таблица строк маршрутного листа
*/ */
//--------------------- //---------------------
@ -28,10 +28,10 @@ const STYLES = {
//Тело модуля //Тело модуля
//----------- //-----------
//Таблица заказов маршрутного листа //Таблица строк маршрутного листа
const CostRouteListsOrdDataGrid = ({ mainRowRN }) => { const CostRouteListsSpecsDataGrid = ({ mainRowRN }) => {
//Собственное состояние - таблица данных //Собственное состояние - таблица данных
const [costRouteListsOrd, setCostRouteListsOrd] = useState({ const [costRouteListsSpecs, setCostRouteListsSpecs] = useState({
dataLoaded: false, dataLoaded: false,
columnsDef: [], columnsDef: [],
orders: null, orders: null,
@ -49,19 +49,19 @@ const CostRouteListsOrdDataGrid = ({ mainRowRN }) => {
//Загрузка данных таблицы с сервера //Загрузка данных таблицы с сервера
const loadData = useCallback(async () => { const loadData = useCallback(async () => {
if (costRouteListsOrd.reload) { if (costRouteListsSpecs.reload) {
const data = await executeStored({ const data = await executeStored({
stored: "PKG_P8PANELS_MECHREC.FCROUTLSTORD_DEPT_DG_GET", stored: "PKG_P8PANELS_MECHREC.FCROUTLSTSP_DEPT_DG_GET",
args: { args: {
NFCROUTLST: mainRowRN, NFCROUTLST: mainRowRN,
CORDERS: { VALUE: object2Base64XML(costRouteListsOrd.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB }, CORDERS: { VALUE: object2Base64XML(costRouteListsSpecs.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB },
NPAGE_NUMBER: costRouteListsOrd.pageNumber, NPAGE_NUMBER: costRouteListsSpecs.pageNumber,
NPAGE_SIZE: DATA_GRID_PAGE_SIZE, NPAGE_SIZE: DATA_GRID_PAGE_SIZE,
NINCLUDE_DEF: costRouteListsOrd.dataLoaded ? 0 : 1 NINCLUDE_DEF: costRouteListsSpecs.dataLoaded ? 0 : 1
}, },
respArg: "COUT" respArg: "COUT"
}); });
setCostRouteListsOrd(pv => ({ setCostRouteListsSpecs(pv => ({
...pv, ...pv,
columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef, columnsDef: data.XCOLUMNS_DEF ? [...data.XCOLUMNS_DEF] : pv.columnsDef,
rows: pv.pageNumber == 1 ? [...(data.XROWS || [])] : [...pv.rows, ...(data.XROWS || [])], 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 // eslint-disable-next-line react-hooks/exhaustive-deps
}, [ }, [
costRouteListsOrd.reload, costRouteListsSpecs.reload,
costRouteListsOrd.filters, costRouteListsSpecs.filters,
costRouteListsOrd.orders, costRouteListsSpecs.orders,
costRouteListsOrd.dataLoaded, costRouteListsSpecs.dataLoaded,
costRouteListsOrd.pageNumber, costRouteListsSpecs.pageNumber,
executeStored, executeStored,
SERV_DATA_TYPE_CLOB SERV_DATA_TYPE_CLOB
]); ]);
@ -84,26 +84,26 @@ const CostRouteListsOrdDataGrid = ({ mainRowRN }) => {
//При необходимости обновить данные таблицы //При необходимости обновить данные таблицы
useEffect(() => { useEffect(() => {
loadData(); 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 ( return (
<div style={STYLES.CONTAINER}> <div style={STYLES.CONTAINER}>
<Typography variant={"subtitle2"}>Заказы</Typography> <Typography variant={"subtitle2"}>Операции</Typography>
{costRouteListsOrd.dataLoaded ? ( {costRouteListsSpecs.dataLoaded ? (
<P8PDataGrid <P8PDataGrid
{...P8P_DATA_GRID_CONFIG_PROPS} {...P8P_DATA_GRID_CONFIG_PROPS}
columnsDef={costRouteListsOrd.columnsDef} columnsDef={costRouteListsSpecs.columnsDef}
rows={costRouteListsOrd.rows} rows={costRouteListsSpecs.rows}
size={P8P_DATA_GRID_SIZE.SMALL} size={P8P_DATA_GRID_SIZE.SMALL}
morePages={costRouteListsOrd.morePages} morePages={costRouteListsSpecs.morePages}
reloading={costRouteListsOrd.reload} reloading={costRouteListsSpecs.reload}
onOrderChanged={handleOrderChanged} onOrderChanged={handleOrderChanged}
onPagesCountChanged={handlePagesCountChanged} onPagesCountChanged={handlePagesCountChanged}
/> />
@ -112,8 +112,8 @@ const CostRouteListsOrdDataGrid = ({ mainRowRN }) => {
); );
}; };
//Контроль свойств - Таблица заказов маршрутного листа //Контроль свойств - Таблица строк маршрутного листа
CostRouteListsOrdDataGrid.propTypes = { CostRouteListsSpecsDataGrid.propTypes = {
mainRowRN: PropTypes.number.isRequired 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", stored: "PKG_P8PANELS_MECHREC.FCPRODPLAN_DEPT_INIT",
args: {}, args: {},
respArg: "COUT", 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 })); setState(pv => ({ ...pv, init: true, planList: [...(data?.XFCPRODPLANS || [])], planListLoaded: true }));
} }
@ -352,7 +353,7 @@ const MechRecDeptCostProdPlans = () => {
<div style={STYLES.CONTAINER}> <div style={STYLES.CONTAINER}>
{state.dataLoaded ? ( {state.dataLoaded ? (
<Typography variant={"h6"}> <Typography variant={"h6"}>
{`Производственный план цеха "${state.selectedPlan.SSUBDIV}" на ${state.selectedPlan.SPERIOD}`} {`Производственный план цеха ${state.selectedPlan.SSUBDIV} на ${state.selectedPlan.SPERIOD}`}
</Typography> </Typography>
) : null} ) : null}
<Grid container spacing={1}> <Grid container spacing={1}>

View File

@ -85,14 +85,6 @@ create or replace package PKG_P8PANELS_MECHREC as
SPRIOR_PARTY in varchar -- Новое значение приоритета партии SPRIOR_PARTY in varchar -- Новое значение приоритета партии
); );
/* Изменение заказа маршрутного листа */
procedure FCROUTLST_FACEACC_UPDATE
(
NFCROUTLST in number, -- Рег. номер маршрутного листа
SFACEACC_NUMB in varchar, -- Номер заказа
NFCPRODPLANSP in number -- Рег. номер строки плана
);
/* Получение таблицы маршрутных листов, связанных со спецификацией плана */ /* Получение таблицы маршрутных листов, связанных со спецификацией плана */
procedure FCROUTLST_DEPT_DG_GET procedure FCROUTLST_DEPT_DG_GET
( (
@ -104,8 +96,8 @@ create or replace package PKG_P8PANELS_MECHREC as
COUT out clob -- Сериализованная таблица данных COUT out clob -- Сериализованная таблица данных
); );
/* Получение таблицы заказов маршрутного листа */ /* Получение таблицы строк маршрутного листа */
procedure FCROUTLSTORD_DEPT_DG_GET procedure FCROUTLSTSP_DEPT_DG_GET
( (
NFCROUTLST in number, -- Рег. номер маршрутного листа NFCROUTLST in number, -- Рег. номер маршрутного листа
NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) 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'; -- Единица измнения 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 := 'Предпросмотр'; -- Тип ПД для изображений предпросмотра 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 T.OUT_UNITCODE = 'CostProductPlansSpecs'
and S.RN = T.IN_DOCUMENT and S.RN = T.IN_DOCUMENT
and P.RN = S.PRN and P.RN = S.PRN
and P.CATEGORY = 1 and P.CATEGORY = NFCPRODPLAN_CATEGORY
and P.COMPANY = NCOMPANY and P.COMPANY = NCOMPANY
and ROWNUM = 1; and ROWNUM = 1;
exception exception
@ -2744,8 +2737,6 @@ create or replace package body PKG_P8PANELS_MECHREC as
is is
RFCROUTLST FCROUTLST%rowtype; -- Запись маршрутного листа RFCROUTLST FCROUTLST%rowtype; -- Запись маршрутного листа
begin begin
/* Дорабатывается */
P_EXCEPTION(0, 'На стадии разработки.');
/* Проверяем нет ли лишних символов */ /* Проверяем нет ли лишних символов */
if ((SPRIOR_PARTY is not null) and (REGEXP_COUNT(SPRIOR_PARTY, '[^0123456789]+') > 0)) then if ((SPRIOR_PARTY is not null) and (REGEXP_COUNT(SPRIOR_PARTY, '[^0123456789]+') > 0)) then
P_EXCEPTION(0, 'Значение приоритета должно быть целым числом.'); P_EXCEPTION(0, 'Значение приоритета должно быть целым числом.');
@ -2803,61 +2794,6 @@ create or replace package body PKG_P8PANELS_MECHREC as
SINT_NUMB => RFCROUTLST.INT_NUMB); SINT_NUMB => RFCROUTLST.INT_NUMB);
end FCROUTLST_PRIOR_PARTY_UPDATE; 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 procedure FCROUTLST_DEPT_DG_GET
( (
@ -3140,8 +3076,8 @@ create or replace package body PKG_P8PANELS_MECHREC as
raise; raise;
end FCROUTLST_DEPT_DG_GET; end FCROUTLST_DEPT_DG_GET;
/* Получение таблицы заказов маршрутного листа */ /* Получение таблицы строк маршрутного листа */
procedure FCROUTLSTORD_DEPT_DG_GET procedure FCROUTLSTSP_DEPT_DG_GET
( (
NFCROUTLST in number, -- Рег. номер маршрутного листа NFCROUTLST in number, -- Рег. номер маршрутного листа
NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) 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; -- Номер строки по NROW_TO PKG_STD.TREF; -- Номер строки по
CSQL clob; -- Буфер для запроса CSQL clob; -- Буфер для запроса
ICURSOR integer; -- Курсор для исполнения запроса ICURSOR integer; -- Курсор для исполнения запроса
SPROD_ORDER PKG_STD.TSTRING; -- Заказ МЛ NSTATE PKG_STD.TNUMBER; -- Состояние
NQUANT PKG_STD.TLNUMBER; -- Количество МЛ
NPRIOR_ORDER PKG_STD.TLNUMBER; -- Приоритет заказа МЛ
/* Проверка наличия записей спецификации "Заказы" */ /* Считывание текстового представления состояния строки маршрутного листа */
function FCROUTLSTORD_EXISTS function FCROUTLSTSP_STATE_NAME_GET
( (
NFCROUTLST in number -- Рег. номер маршрутного листа NSTATE in number -- Состояние строки маршрутного листа
) return number -- Наличие записей спецификации заказы (0 - нет, 1 - да) ) return varchar2 -- Наименование состояния строки маршрутного листа
is is
NRESULT PKG_STD.TNUMBER; -- Наличие записей спецификации заказы (0 - нет, 1 - да) SRESULT PKG_STD.TSTRING; -- Наименование состояния строки маршрутного листа
begin begin
/* Проверяем наличие */ /* Считываем наименование состояния по домену */
begin begin
select 1 select V.NAME
into NRESULT into SRESULT
from DUAL from DMSDOMAINS T,
where exists (select null DMSENUMVALUES V
from FCROUTLSTORD T where T.CODE = SFCROUTLSTSP_STATE_DOMAIN
where T.PRN = NFCROUTLST and V.PRN = T.RN
and ROWNUM = 1); and V.VALUE_NUM = NSTATE;
exception exception
when others then when others then
NRESULT := 0; SRESULT := null;
end; end;
/* Возвращаем результат */ /* Возвращаем результат */
return NRESULT; return SRESULT;
end FCROUTLSTORD_EXISTS; end FCROUTLSTSP_STATE_NAME_GET;
/* Получение значений из заголовка МЛ */
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;
begin begin
/* Читем сортировки */ /* Читем сортировки */
RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); 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, SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
BVISIBLE => false); BVISIBLE => false);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SPROD_ORDER', SNAME => 'SSTATE',
SCAPTION => 'Заказ', SCAPTION => 'Состояние',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR, SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
BVISIBLE => true, BVISIBLE => true);
BORDER => true);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NQUANT', SNAME => 'SOPER_NUMB',
SCAPTION => 'Количество', SCAPTION => 'Номер операции',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
BVISIBLE => true, BVISIBLE => true);
BORDER => true);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NPRIOR_ORDER', SNAME => 'SROUTSHTSP_NAME',
SCAPTION => 'Приоритет заказа', 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, SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
BVISIBLE => true, BVISIBLE => true);
BORDER => true); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
/* Если у маршрутного листа есть записи спецификации "Заказы" - работаем по ним */ SNAME => 'NQUANT_FACT',
if (FCROUTLSTORD_EXISTS(NFCROUTLST => NFCROUTLST) = 1) then SCAPTION => 'Факт',
/* Обходим данные */ SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
begin BVISIBLE => true);
/* Добавляем подсказку совместимости */ PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL); SNAME => 'NT_SHT_PLAN',
/* Формируем запрос */ SCAPTION => 'Трудоемкость план',
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *'); SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,'); BVISIBLE => true);
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW'); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,'); SNAME => 'NLABOUR_FACT',
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' F.NUMB SPROD_ORDER,'); SCAPTION => 'Трудоемкость факт',
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT NQUANT,'); SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.PRIOR_ORDER NPRIOR_ORDER,'); BVISIBLE => true);
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCROUTLSTORD T'); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' left outer join FACEACC F on T.PROD_ORDER = F.RN'); SNAME => 'SMUNIT',
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where T.PRN = :NFCROUTLST'); SCAPTION => 'ЕИ трудоемкости',
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.COMPANY = :NCOMPANY'); SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_STR,
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F'); BVISIBLE => true);
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Обходим данные */
/* Учтём сортировки */ begin
PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL); /* Добавляем подсказку совместимости */
/* Разбираем его */ CSQL := PKG_SQL_BUILD.COMPATIBLE(SSQL => CSQL);
ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT'); /* Формируем запрос */
PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => 'select *');
/* Делаем подстановку параметров */ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select D.*,');
PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW');
PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,');
PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.STATE NSTATE,');
PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCROUTLST', NVALUE => NFCROUTLST); 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_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1); 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_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ( select I.CODE from INS_DEPARTMENT I where T.SUBDIV = I.RN ) SSUBDIV,');
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 3); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT_PLAN NQUANT_PLAN,');
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 4); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.QUANT_FACT NQUANT_FACT,');
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 5); 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,');
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ( select D.MEAS_MNEMO from DICMUNTS D where T.MUNIT = D.RN ) SMUNIT');
null; PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from FCROUTLSTSP T');
end if; PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where T.PRN = :NFCROUTLST');
/* Обходим выбранные записи */ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.COMPANY = :NCOMPANY');
while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0) PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' %ORDER_BY%) D) F');
loop PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO');
/* Добавляем колонки с данными */ /* Учтём сортировки */
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, PKG_P8PANELS_VISUAL.TORDERS_SET_QUERY(RDATA_GRID => RDG, RORDERS => RO, SPATTERN => '%ORDER_BY%', CSQL => CSQL);
SNAME => 'NRN', /* Разбираем его */
ICURSOR => ICURSOR, ICURSOR := PKG_SQL_DML.OPEN_CURSOR(SWHAT => 'SELECT');
NPOSITION => 1, PKG_SQL_DML.PARSE(ICURSOR => ICURSOR, SQUERY => CSQL);
BCLEAR => true); /* Делаем подстановку параметров */
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NCOMPANY', NVALUE => NCOMPANY);
SNAME => 'SPROD_ORDER', PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_FROM', NVALUE => NROW_FROM);
ICURSOR => ICURSOR, PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NROW_TO', NVALUE => NROW_TO);
NPOSITION => 2); PKG_SQL_DML.BIND_VARIABLE_NUM(ICURSOR => ICURSOR, SNAME => 'NFCROUTLST', NVALUE => NFCROUTLST);
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, PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
SNAME => 'NPRIOR_ORDER', PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 2);
ICURSOR => ICURSOR, PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3);
NPOSITION => 4); PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 4);
/* Добавляем строку в таблицу */ PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 5);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
end loop; PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7);
exception PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 8);
when others then PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 9);
PKG_SQL_DML.CLOSE_CURSOR(ICURSOR => ICURSOR); PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 10);
raise; PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 11);
end; /* Делаем выборку */
else if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
/* Считываем значения из заголовка МЛ */ null;
FCROUTLST_INFO_GET(NFCROUTLST => NFCROUTLST, end if;
SPROD_ORDER => SPROD_ORDER, /* Обходим выбранные записи */
NQUANT => NQUANT, while (PKG_SQL_DML.FETCH_ROWS(ICURSOR => ICURSOR) > 0)
NPRIOR_ORDER => NPRIOR_ORDER); loop
/* Добавляем колонки с данными */ /* Добавляем колонки с данными */
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NRN', NVALUE => NFCROUTLST, BCLEAR => true); PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'SPROD_ORDER', SVALUE => SPROD_ORDER); SNAME => 'NRN',
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NQUANT', NVALUE => NQUANT); ICURSOR => ICURSOR,
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, SNAME => 'NPRIOR_ORDER', NVALUE => NPRIOR_ORDER); NPOSITION => 1,
/* Добавляем строку в таблицу */ BCLEAR => true);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); /* Читаем состояние из курсора */
end if; 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); 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 procedure INCOMEFROMDEPS_DEPT_DG_GET
@ -3370,6 +3321,11 @@ create or replace package body PKG_P8PANELS_MECHREC as
SCAPTION => 'Рег. номер', SCAPTION => 'Рег. номер',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
BVISIBLE => false); 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, PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'SDOC_INFO', SNAME => 'SDOC_INFO',
SCAPTION => 'Документ (тип, №, дата)', 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 => ' from (select D.*,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => PKG_SQL_BUILD.SQLROWNUM() || ' NROW'); 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 => ' 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 => ' DT.DOCCODE ||');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' '', '' || TRIM(T.DOC_PREF) ||'); 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 => ' ''-'' || 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_NUM(ICURSOR => ICURSOR, IPOSITION => 1);
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 2); 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_STR(ICURSOR => ICURSOR, IPOSITION => 3);
PKG_SQL_DML.DEFINE_COLUMN_DATE(ICURSOR => ICURSOR, IPOSITION => 4); 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_DATE(ICURSOR => ICURSOR, IPOSITION => 5);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 6);
/* Делаем выборку */ /* Делаем выборку */
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
null; null;
@ -3461,17 +3419,21 @@ create or replace package body PKG_P8PANELS_MECHREC as
NPOSITION => 1, NPOSITION => 1,
BCLEAR => true); BCLEAR => true);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW, PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLS(RROW => RDG_ROW,
SNAME => 'SDOC_INFO', SNAME => 'SSTATE',
ICURSOR => ICURSOR, ICURSOR => ICURSOR,
NPOSITION => 2); 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, PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
SNAME => 'NQUANT_FACT', SNAME => 'NQUANT_FACT',
ICURSOR => ICURSOR, ICURSOR => ICURSOR,
NPOSITION => 3); NPOSITION => 4);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW, PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLD(RROW => RDG_ROW,
SNAME => 'DDUE_DATE', SNAME => 'DDUE_DATE',
ICURSOR => ICURSOR, ICURSOR => ICURSOR,
NPOSITION => 4); NPOSITION => 5);
/* Добавляем строку в таблицу */ /* Добавляем строку в таблицу */
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW); PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_ROW(RDATA_GRID => RDG, RROW => RDG_ROW);
end loop; end loop;
@ -3533,7 +3495,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
begin begin
select F.NOMEN_MODIF select F.NOMEN_MODIF
into NRESULT into NRESULT
from FCPRODPLANSP T, from FCPRODPLANSP T,
FCMATRESOURCE F FCMATRESOURCE F
where T.RN = NFCPRODPLANSP where T.RN = NFCPRODPLANSP
and F.RN = T.MATRES; and F.RN = T.MATRES;
@ -3579,7 +3541,40 @@ create or replace package body PKG_P8PANELS_MECHREC as
SPARENT => 'NVALUE_BY_DAYS'); SPARENT => 'NVALUE_BY_DAYS');
end loop; end loop;
end INIT_DAYS; 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 begin
/* Если это выбор плана */
if (NINCLUDE_DEF = 1) then
/* Расчет факта выпусков плана */
FCPRODPLANSP_CALC(NFCPRODPLAN => NFCPRODPLAN, NCOMPANY => NCOMPANY);
end if;
/* Читем сортировки */ /* Читем сортировки */
RO := PKG_P8PANELS_VISUAL.TORDERS_FROM_XML(CORDERS => CORDERS); 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_FROM => NROW_FROM,
NROW_TO => NROW_TO); 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, PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NRN', SNAME => 'NRN',
@ -3629,6 +3624,13 @@ create or replace package body PKG_P8PANELS_MECHREC as
BVISIBLE => true, BVISIBLE => true,
BORDER => true, BORDER => true,
NWIDTH => 200); 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, PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NMAIN_QUANT', SNAME => 'NMAIN_QUANT',
SCAPTION => 'План', SCAPTION => 'План',
@ -3646,7 +3648,7 @@ create or replace package body PKG_P8PANELS_MECHREC as
SCAPTION => 'Запущено', SCAPTION => 'Запущено',
SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB, SDATA_TYPE => PKG_P8PANELS_VISUAL.SDATA_TYPE_NUMB,
BVISIBLE => true, BVISIBLE => true,
NWIDTH => 80); NWIDTH => 90);
PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG, PKG_P8PANELS_VISUAL.TDATA_GRID_ADD_COL_DEF(RDATA_GRID => RDG,
SNAME => 'NVALUE_BY_DAYS', SNAME => 'NVALUE_BY_DAYS',
SCAPTION => 'План/факт по дням', 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 => ' (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.CODE SMATRES_CODE,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' MRES."NAME" SMATRES_NAME,'); 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.MAIN_QUANT NMAIN_QUANT,');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' T.REL_FACT NREL_FACT,'); 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) || ')'); 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 => ' where P.RN = :NFCPRODPLAN');
PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and P.COMPANY = :NCOMPANY'); 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.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 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 => ' 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 => ' 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 => 2);
PKG_SQL_DML.DEFINE_COLUMN_STR(ICURSOR => ICURSOR, IPOSITION => 3); 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 => 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 => 6);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 7); 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 => 8);
PKG_SQL_DML.DEFINE_COLUMN_NUM(ICURSOR => ICURSOR, IPOSITION => 9);
/* Делаем выборку */ /* Делаем выборку */
if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then if (PKG_SQL_DML.EXECUTE(ICURSOR => ICURSOR) = 0) then
null; null;
@ -3772,18 +3777,19 @@ create or replace package body PKG_P8PANELS_MECHREC as
SNAME => 'SMATRES_NAME', SNAME => 'SMATRES_NAME',
ICURSOR => ICURSOR, ICURSOR => ICURSOR,
NPOSITION => 4); 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, PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
SNAME => 'NMAIN_QUANT', SNAME => 'NMAIN_QUANT',
ICURSOR => ICURSOR, ICURSOR => ICURSOR,
NPOSITION => 5); NPOSITION => 6);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
SNAME => 'NREL_FACT', SNAME => 'NREL_FACT',
ICURSOR => ICURSOR, ICURSOR => ICURSOR,
NPOSITION => 6); NPOSITION => 7);
PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW, PKG_P8PANELS_VISUAL.TROW_ADD_CUR_COLN(RROW => RDG_ROW,
SNAME => 'NFCROUTLST_QUANT', SNAME => 'NFCROUTLST_QUANT',
ICURSOR => ICURSOR, ICURSOR => ICURSOR,
NPOSITION => 7); NPOSITION => 8);
/* Считываем рег. номер связанной спецификации из "Производственная программа" */ /* Считываем рег. номер связанной спецификации из "Производственная программа" */
NFCPRODPLANSP_MAIN := UTL_FCPRODPLANSP_MAIN_GET(NCOMPANY => NCOMPANY, NFCPRODPLANSP => NFCPRODPLANSP); 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; NSUM_FACT := 0;
/* Добавляем значения по графику сдачи */ /* Добавляем значения по графику сдачи */
for REC in (select TMP.DOC_DATE, for REC in (select TMP.DOC_DATE,
COALESCE(SUM(TMP.QUANT_PLAN), 0) QUANT_PLAN, COALESCE(sum(TMP.QUANT_PLAN), 0) QUANT_PLAN,
COALESCE(SUM(TMP.QUANT_FACT), 0) QUANT_FACT COALESCE(sum(TMP.QUANT_FACT), 0) QUANT_FACT
from (select T.DOC_DATE, from ( /* Указаны в спецификации */
T.QUANT_PLAN, select T.DOC_DATE,
0 QUANT_FACT T.QUANT_PLAN,
0 QUANT_FACT
from FCPRODPLANDLVSH T from FCPRODPLANDLVSH T
where T.PRN = NFCPRODPLANSP where T.PRN = NFCPRODPLANSP
and T.DOC_DATE >= DDATE_FROM and T.DOC_DATE >= DDATE_FROM
and T.DOC_DATE <= DDATE_TO and T.DOC_DATE <= DDATE_TO
union union
/* Связаны со спецификацией плана или связанной строкой "Производственная программа" */
select D.WORK_DATE, select D.WORK_DATE,
0, 0,
SUM(S.QUANT_FACT) sum(S.QUANT_FACT)
from FCROUTLST FL, from INCOMEFROMDEPS D,
DOCLINKS DL, INCOMEFROMDEPSSPEC S
INCOMEFROMDEPS D, where ( /* Связь по МЛ связанной строки "Производственная программа" */
INCOMEFROMDEPSSPEC S (D.RN in (select DL.OUT_DOCUMENT
where FL.RN in (select SL.DOCUMENT from SELECTLIST SL,
from SELECTLIST SL FCROUTLST FL,
where SL.IDENT = NFCROUTLST_IDENT DOCLINKS DL
and SL.UNITCODE = 'CostRouteLists') where SL.IDENT = NFCROUTLST_IDENT
and FL.STATE = 1 and SL.UNITCODE = 'CostRouteLists'
and DL.IN_DOCUMENT = FL.RN and FL.RN = SL.DOCUMENT
and DL.IN_UNITCODE = 'CostRouteLists' and FL.STATE = 1
and DL.OUT_UNITCODE = 'IncomFromDeps' and DL.IN_DOCUMENT = FL.RN
and D.RN = DL.OUT_DOCUMENT and DL.IN_UNITCODE = 'CostRouteLists'
and D.DOC_STATE = 2 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_FROM
and D.WORK_DATE <= DDATE_TO and D.WORK_DATE <= DDATE_TO
and S.PRN = D.RN and S.PRN = D.RN
and S.NOMMODIF = NMODIF and S.NOMMODIF = NMODIF
group by D.WORK_DATE) TMP group by D.WORK_DATE) TMP
group by TMP.DOC_DATE) group by TMP.DOC_DATE)
loop loop
/* Добавляем значение план/факт в соответствующую колонку */ /* Добавляем значение план/факт в соответствующую колонку */
PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW, PKG_P8PANELS_VISUAL.TROW_ADD_COL(RROW => RDG_ROW,
@ -3870,9 +3891,13 @@ create or replace package body PKG_P8PANELS_MECHREC as
is is
NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса NCOMPANY PKG_STD.TREF := GET_SESSION_COMPANY(); -- Организация сеанса
NVERSION PKG_STD.TREF; -- Версия контрагентов NVERSION PKG_STD.TREF; -- Версия контрагентов
DDATE_FROM PKG_STD.TLDATE; -- Дата с
DDATE_TO PKG_STD.TLDATE; -- Дата по
begin begin
/* Считываем версию контрагентов */ /* Считываем версию контрагентов */
FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION); FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION);
/* Определяем период записей */
P_FIRST_LAST_DAY(DCALCDATE => sysdate, DBGNDATE => DDATE_FROM, DENDDATE => DDATE_TO);
/* Начинаем формирование XML */ /* Начинаем формирование XML */
PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_); 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) || ', ' || DT.DOCCODE || ', ' || trim(P.PREFIX) || '-' || trim(P.NUMB) || ', ' ||
TO_CHAR(P.DOCDATE, 'dd.mm.yyyy') SDOC_INFO, TO_CHAR(P.DOCDATE, 'dd.mm.yyyy') SDOC_INFO,
D.CODE as SSUBDIV, D.CODE as SSUBDIV,
E.CODE as SPERIOD TO_CHAR(E.STARTDATE, 'mm.yyyy') as SPERIOD
from FCPRODPLAN P, from FCPRODPLAN P,
FINSTATE FS, FINSTATE FS,
DOCTYPES DT, DOCTYPES DT,
@ -3891,7 +3916,6 @@ create or replace package body PKG_P8PANELS_MECHREC as
where P.CATEGORY = NFCPRODPLAN_DEPT_CTGR where P.CATEGORY = NFCPRODPLAN_DEPT_CTGR
and P.STATUS = NFCPRODPLAN_STATUS and P.STATUS = NFCPRODPLAN_STATUS
and P.COMPANY = NCOMPANY and P.COMPANY = NCOMPANY
and P.DOCDATE >= trunc(sysdate, 'mm')
and P.SUBDIV in (select C.DEPTRN and P.SUBDIV in (select C.DEPTRN
from CLNPSPFM C, from CLNPSPFM C,
CLNPSPFMTYPES CT CLNPSPFMTYPES CT
@ -3914,6 +3938,8 @@ create or replace package body PKG_P8PANELS_MECHREC as
and D.RN = P.SUBDIV and D.RN = P.SUBDIV
and DT.RN = P.DOCTYPE and DT.RN = P.DOCTYPE
and E.RN = P.CALC_PERIOD 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) */ and exists (select /*+ INDEX(UP I_USERPRIV_JUR_PERS_ROLEID) */
null null
from USERPRIV UP from USERPRIV UP