diff --git a/app/panels/mech_rec_cost_jobs_manage/fcjobssp.js b/app/panels/mech_rec_cost_jobs_manage/fcjobssp.js index 7f6e6c4..fae1f43 100644 --- a/app/panels/mech_rec_cost_jobs_manage/fcjobssp.js +++ b/app/panels/mech_rec_cost_jobs_manage/fcjobssp.js @@ -247,7 +247,7 @@ CostJobsSpecsInclude.propTypes = { //----------- //Таблица информации о строках сменного задания -const CostJobsSpecsDataGrid = ({ task, haveNote }) => { +const CostJobsSpecsDataGrid = ({ task, haveNote, fromAction }) => { //Собственное состояние - Включение в задание const [includeEquipment, setIncludeEquipment] = useState({ NFCJOBSSP: null, NEQCONFIG: null, NVALUE: 0 }); @@ -255,7 +255,7 @@ const CostJobsSpecsDataGrid = ({ task, haveNote }) => { const [costJobsSpecs, setCostJobsSpecs, issueCostJobsSpecs] = useCostJobsSpecs(task); //Собственное состояние - таблица рабочих центров - const [equipConfiguration, setEquipConfiguration, includeEquipConfiguration, excludeEquipConfiguration] = useEquipConfiguration(task); + const [equipConfiguration, setEquipConfiguration, includeEquipConfiguration, excludeEquipConfiguration] = useEquipConfiguration(task, fromAction); //При изменении состояния сортировки операций const costJobsSpecOrderChanged = ({ orders }) => setCostJobsSpecs(pv => ({ ...pv, orders: [...orders], pageNumber: 1, reload: true })); @@ -468,7 +468,8 @@ const CostJobsSpecsDataGrid = ({ task, haveNote }) => { //Контроль свойств - Таблица информации о строках сменного задания CostJobsSpecsDataGrid.propTypes = { task: PropTypes.number.isRequired, - haveNote: PropTypes.bool.isRequired + haveNote: PropTypes.bool.isRequired, + fromAction: PropTypes.bool.isRequired }; //---------------- diff --git a/app/panels/mech_rec_cost_jobs_manage/hooks.js b/app/panels/mech_rec_cost_jobs_manage/hooks.js index 5f49f01..ef5b645 100644 --- a/app/panels/mech_rec_cost_jobs_manage/hooks.js +++ b/app/panels/mech_rec_cost_jobs_manage/hooks.js @@ -1,9 +1,15 @@ +/* + Парус 8 - Панели мониторинга - ПУП - Выдача сменного задания + Кастомные хуки +*/ + //--------------------- //Подключение библиотек //--------------------- import React, { useState, useCallback, useEffect, useContext } from "react"; //Классы React import { BackEndСtx } from "../../context/backend"; //Контекст взаимодействия с сервером +import { NavigationCtx } from "../../context/navigation"; //Контекст навигации import { object2Base64XML } from "../../core/utils"; //Вспомогательные функции //--------- @@ -39,18 +45,20 @@ const useCostJobs = () => { jobList: [], jobListLoaded: false, selectedJob: {}, - dataLoaded: false + fromAction: false }); //Подключение к контексту взаимодействия с сервером const { executeStored } = useContext(BackEndСtx); + //Подключение к контексту навигации + const { getNavigationSearch } = useContext(NavigationCtx); //При подключении компонента к странице useEffect(() => { - const initPlans = async () => { + const initPlans = async NRN => { const data = await executeStored({ stored: "PKG_P8PANELS_MECHREC.FCJOBS_INIT", - args: {}, + args: { NFCJOBS: NRN ? parseInt(NRN) : null }, respArg: "COUT", isArray: name => name === "XFCJOBS", attributeValueProcessor: (name, val) => (["NHAVE_NOTE"].includes(name) ? val == 1 : val) @@ -59,11 +67,16 @@ const useCostJobs = () => { ...pv, init: true, jobList: [...(data.XFCJOBS || [])], - jobListLoaded: true + selectedJob: data.XFCJOBS_SELECTED ? data.XFCJOBS_SELECTED : {}, + jobListLoaded: true, + fromAction: NRN ? true : false })); }; if (!state.init) { - initPlans(); + //Считаем параметры, переданные из действия + const actionPrms = getNavigationSearch(); + //Иницализируем планы + initPlans(actionPrms.NRN); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); @@ -163,7 +176,7 @@ const useCostJobsSpecs = task => { }; //Хук для таблицы рабочих центров -const useEquipConfiguration = task => { +const useEquipConfiguration = (task, fromAction) => { //Собственное состояние - таблица данных const [equipConfiguration, setEquipConfiguration] = useState({ task: null, @@ -232,6 +245,7 @@ const useEquipConfiguration = task => { stored: "PKG_P8PANELS_MECHREC.EQCONFIG_DG_GET", args: { NFCJOBS: task, + NFROM_ACTION: fromAction ? 1 : 0, CORDERS: { VALUE: object2Base64XML(equipConfiguration.orders, { arrayNodeName: "orders" }), SDATA_TYPE: SERV_DATA_TYPE_CLOB }, NPAGE_NUMBER: equipConfiguration.pageNumber, NPAGE_SIZE: DATA_GRID_PAGE_SIZE, @@ -261,7 +275,8 @@ const useEquipConfiguration = task => { equipConfiguration.selectedRow, equipConfiguration.task, task, - executeStored + executeStored, + fromAction ]); return [equipConfiguration, setEquipConfiguration, includeEquipConfiguration, excludeEquipConfiguration]; diff --git a/app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js b/app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js index d54167e..6ad6111 100644 --- a/app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js +++ b/app/panels/mech_rec_cost_jobs_manage/mech_rec_cost_jobs_manage.js @@ -96,8 +96,7 @@ const MechRecCostJobs = () => { setState(pv => ({ ...pv, selectedJob: job, - showJobList: false, - dataLoaded: false + showJobList: false })); }; @@ -107,8 +106,7 @@ const MechRecCostJobs = () => { setState(pv => ({ ...pv, selectedJob: {}, - showJobList: false, - dataLoaded: false + showJobList: false })); }; @@ -132,7 +130,7 @@ const MechRecCostJobs = () => { <> {`Сменное задание №${state.selectedJob.SDOC_NUMB} на ${state.selectedJob.SPERIOD}`} {`${state.selectedJob.SSUBDIV}`} - + ) : !state.selectedJob.NRN ? ( diff --git a/app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js b/app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js index 75f5021..d02c517 100644 --- a/app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js +++ b/app/panels/mech_rec_cost_prod_plans/datagrids/fcdeliverylistsp.js @@ -20,7 +20,8 @@ import { useCostDeliveryLists } from "./backend_dg"; //Собственные х //Стили const STYLES = { - CONTAINER: { margin: "5px 0px", textAlign: "center" } + CONTAINER: { margin: "5px 0px", textAlign: "center" }, + DATA_GRID_CELL_COVERED: { backgroundColor: "lightblue" } }; //------------------------------------ @@ -32,7 +33,7 @@ const dataCellRender = ({ row, columnDef }) => { //Если "Количество план" равно или меньше "Остаток" if (row["NQUANT_PLAN"] <= row["NREST"]) { return { - cellStyle: { backgroundColor: "lightblue" }, + cellStyle: { ...STYLES.DATA_GRID_CELL_COVERED }, data: row[columnDef] }; } else { diff --git a/app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js b/app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js index be18627..e208026 100644 --- a/app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js +++ b/app/panels/mech_rec_cost_prod_plans/datagrids/goodparties.js @@ -20,7 +20,8 @@ import { useGoodsParties } from "./backend_dg"; //Собственные хук //Стили const STYLES = { - CONTAINER: { margin: "5px 0px", textAlign: "center" } + CONTAINER: { margin: "5px 0px", textAlign: "center" }, + DATA_GRID_CELL_COVERED: { backgroundColor: "lightblue" } }; //------------------------------------ @@ -32,7 +33,7 @@ const dataCellRender = ({ row, columnDef, quantPlanSum }) => { //Если остаток больше суммы "Выдать по норме" - закрашиваем голубым if (row["NRESTFACT"] >= quantPlanSum) { return { - cellStyle: { backgroundColor: "lightblue" }, + cellStyle: { ...STYLES.DATA_GRID_CELL_COVERED }, data: row[columnDef] }; } else { diff --git a/app/panels/mech_rec_dept_cost_jobs/components/filter.js b/app/panels/mech_rec_dept_cost_jobs/components/filter.js index 4ae8604..0c1b1f0 100644 --- a/app/panels/mech_rec_dept_cost_jobs/components/filter.js +++ b/app/panels/mech_rec_dept_cost_jobs/components/filter.js @@ -36,7 +36,8 @@ const currentYear = currentDate.getUTCFullYear(); //Стили const STYLES = { - FILTER_BLOCK: { maxWidth: "200px" } + FILTER_CONTAINER: { display: "flex", flexDirection: "row", justifyContent: "flex-start", alignItems: "flex-end" }, + FILTER_BLOCK: { maxWidth: "200px", display: "flex" } }; //------------------------------------ @@ -71,7 +72,7 @@ DepartmentsDataGrid.propTypes = { //Компонент фильтра const FilterComponent = ({ filter, setFilter, handleMonthChange, handleSelectDeparture }) => { return ( - + Цех @@ -95,7 +96,7 @@ const FilterComponent = ({ filter, setFilter, handleMonthChange, handleSelectDep label="Цех" /> - + handleMonthChange(-1)}> navigate_before diff --git a/app/panels/mech_rec_dept_cost_jobs/components/ins_department_dg.js b/app/panels/mech_rec_dept_cost_jobs/components/ins_department_dg.js index 61a5791..a305bef 100644 --- a/app/panels/mech_rec_dept_cost_jobs/components/ins_department_dg.js +++ b/app/panels/mech_rec_dept_cost_jobs/components/ins_department_dg.js @@ -20,7 +20,8 @@ import { useInsDepartment } from "../hooks"; //Состояние таблицы //Стили const STYLES = { - CONTAINER: { margin: "5px 0px", textAlign: "center" } + CONTAINER: { margin: "5px 0px", textAlign: "center" }, + DATA_GRID_CELL_DEFAULT: { cursor: "pointer", backgroundColor: "#ADD8E6" } }; //------------------------------------ @@ -30,7 +31,7 @@ const STYLES = { //Генерация ссылок на строках const dataCellRender = ({ row, columnDef, handleSelectDeparture }) => { return { - cellStyle: { cursor: "pointer", backgroundColor: "#ADD8E6" }, + cellStyle: { ...STYLES.DATA_GRID_CELL_DEFAULT }, cellProps: { onClick: () => { handleSelectDeparture({ NRN: row["NRN"], SCODE: row["SCODE"].toString(), SNAME: row["SNAME"] }); diff --git a/app/panels/mech_rec_dept_cost_jobs/hooks.js b/app/panels/mech_rec_dept_cost_jobs/hooks.js index 907ab64..e5ef297 100644 --- a/app/panels/mech_rec_dept_cost_jobs/hooks.js +++ b/app/panels/mech_rec_dept_cost_jobs/hooks.js @@ -178,7 +178,7 @@ const useFilter = (currentMonth, currentYear) => { openedDepartment: false, department: { ...department }, workHours: data.NWORKHOURS, - totalWorkHours: filter.workDays * data.NWORKHOURS + totalWorkHours: Math.round(filter.workDays * data.NWORKHOURS) })); }, [executeStored, filter.workDays] diff --git a/db/PKG_P8PANELS_MECHREC.pck b/db/PKG_P8PANELS_MECHREC.pck index 3d01c91..4ae2fb8 100644 --- a/db/PKG_P8PANELS_MECHREC.pck +++ b/db/PKG_P8PANELS_MECHREC.pck @@ -173,12 +173,13 @@ create or replace package PKG_P8PANELS_MECHREC as /* Получение составов оборудования подразделения */ procedure EQCONFIG_DG_GET ( - NFCJOBS in number, -- Рег. номер сменного задания - NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) - NPAGE_SIZE in number, -- Количество записей на странице (0 - все) - CORDERS in clob, -- Сортировки - NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ - COUT out clob -- Сериализованная таблица данных + NFCJOBS in number, -- Рег. номер сменного задания + NFROM_ACTION in number := 0, -- Признак запуска из действия раздела (false - нет, true - да) + NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) + NPAGE_SIZE in number, -- Количество записей на странице (0 - все) + CORDERS in clob, -- Сортировки + NINCLUDE_DEF in number, -- Признак включения описания колонок таблицы в ответ + COUT out clob -- Сериализованная таблица данных ); /* Получение спецификации сменного задания */ @@ -195,7 +196,8 @@ create or replace package PKG_P8PANELS_MECHREC as /* Инициализация записей раздела "Планы и отчеты производства изделий" */ procedure FCJOBS_INIT ( - COUT out clob -- Список записей раздела "Сменные задания" + NFCJOBS in number := null, -- Рег. номер записи (если вызов из действия раздела) + COUT out clob -- Список записей раздела "Сменные задания" ); /* Получение количества рабочих часов в сменах подразделения */ @@ -710,6 +712,25 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Возвращаем результат */ return NRESULT; end UTL_FCPRODPLANSP_MAIN_GET; + + /* Считывание цеха из заголовка сменного задания */ + function UTL_FCJOBS_SUBDIV_GET + ( + NFCJOBS in number -- Рег. номер сменного задания + ) return number -- Рег. номер подразделения + is + NRESULT PKG_STD.TREF; -- Рег. номер подразделения + begin + /* Считываем цех сменного задания */ + begin + select T.SUBDIV into NRESULT from FCJOBS T where T.RN = NFCJOBS; + exception + when others then + NRESULT := null; + end; + /* Возвращаем результат */ + return NRESULT; + end UTL_FCJOBS_SUBDIV_GET; /* Считывание записи строки сменного задания */ function UTL_FCJOBSSP_GET @@ -3041,7 +3062,7 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select P.NRN,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.SDOC_INFO,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NQUANT,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case when (P.NT_SHT_PLAN <> 0) then P.NLABOUR_FACT / P.NT_SHT_PLAN * 100 else 0 end NPROCENT,'); + PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' case when (P.NT_SHT_PLAN <> 0) then ROUND(P.NLABOUR_FACT / P.NT_SHT_PLAN * 100, 2) else 0 end NPROCENT,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.NPRIOR_PARTY,'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' P.SPROD_ORDER'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from (select T.RN NRN,'); @@ -4747,6 +4768,7 @@ create or replace package body PKG_P8PANELS_MECHREC as procedure EQCONFIG_DG_GET ( NFCJOBS in number, -- Рег. номер сменного задания + NFROM_ACTION in number := 0, -- Признак запуска из действия раздела (false - нет, true - да) NPAGE_NUMBER in number, -- Номер страницы (игнорируется при NPAGE_SIZE=0) NPAGE_SIZE in number, -- Количество записей на странице (0 - все) CORDERS in clob, -- Сортировки @@ -4821,8 +4843,14 @@ create or replace package body PKG_P8PANELS_MECHREC as NCOMPANY => NCOMPANY, SMEAS_MNEMO => SDICMUNTS_WD, NRN => NDICMUNTS_WD); - /* Считываем рег. номер подразделения пользователя */ - NSUBDIV := UTL_SUBDIV_RN_GET(NCOMPANY => NCOMPANY, SUSER => UTILIZER()); + /* Если выполняется из заголовка СЗ */ + if (NFROM_ACTION = 1) then + /* Считываем рег. номер цеха из сменного задания */ + NSUBDIV := UTL_FCJOBS_SUBDIV_GET(NFCJOBS => NFCJOBS); + else + /* Считываем рег. номер подразделения пользователя */ + NSUBDIV := UTL_SUBDIV_RN_GET(NCOMPANY => NCOMPANY, SUSER => UTILIZER()); + end if; /* Если подразделение считано */ if (NSUBDIV is not null) then /* Обходим данные */ @@ -4924,6 +4952,7 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Инициализация записей раздела "Планы и отчеты производства изделий" */ procedure FCJOBS_INIT ( + NFCJOBS in number := null, -- Рег. номер записи (если вызов из действия раздела) COUT out clob -- Список записей раздела "Сменные задания" ) is @@ -4931,9 +4960,18 @@ create or replace package body PKG_P8PANELS_MECHREC as SUTILIZER PKG_STD.TSTRING := UTILIZER(); -- Пользователь сеанса NVERSION PKG_STD.TREF; -- Версия контрагентов SDOC_INFO PKG_STD.TSTRING; -- Информация о документе + NSUBDIV PKG_STD.TREF; -- Рег. номер цеха begin /* Считываем версию контрагентов */ FIND_VERSION_BY_COMPANY(NCOMPANY => NCOMPANY, SUNITCODE => 'AGNLIST', NVERSION => NVERSION); + /* Если вызов из действия раздела */ + if (NFCJOBS is not null) then + /* Считываем рег. номер цеха из сменного задания */ + NSUBDIV := UTL_FCJOBS_SUBDIV_GET(NFCJOBS => NFCJOBS); + else + /* Считываем рег. номер подразделения пользователя */ + NSUBDIV := UTL_SUBDIV_RN_GET(NCOMPANY => NCOMPANY, SUSER => SUTILIZER); + end if; /* Начинаем формирование XML */ PKG_XFAST.PROLOGUE(ITYPE => PKG_XFAST.CONTENT_); /* Открываем корень */ @@ -4956,28 +4994,29 @@ create or replace package body PKG_P8PANELS_MECHREC as where S.PRN = T.RN and S.NOTE is not null and ROWNUM = 1) NHAVE_NOTE - from FCJOBS T, + from (select J.* + from FCJOBS J + where J.COMPANY = NCOMPANY + and J.STATE = NFCJOBS_STATUS_NOT_WO + and J.DOCDATE >= TRUNC(sysdate) + and J.SUBDIV = NSUBDIV + and exists (select null from V_USERPRIV UP where UP.CATALOG = J.CRN) + and exists (select null + from V_USERPRIV UP + where UP.JUR_PERS = J.JUR_PERS + and UP.UNITCODE = 'CostJobs') + union + select J_RN.* + from FCJOBS J_RN + where J_RN.RN = NFCJOBS) T, DOCTYPES DT, INS_DEPARTMENT INS, TBOPERMODESP PER - where T.COMPANY = NCOMPANY - and T.STATE = NFCJOBS_STATUS_NOT_WO - and T.DOCDATE >= TRUNC(sysdate) - and DT.RN = T.DOCTYPE + where DT.RN = T.DOCTYPE and T.SUBDIV = INS.RN(+) and T.TBOPERMODESP = PER.RN(+) - and PKG_P8PANELS_MECHREC.UTL_SUBDIV_CHECK(T.COMPANY, T.SUBDIV, SUTILIZER) = 1 - and exists (select null from V_USERPRIV UP where UP.CATALOG = T.CRN) - and exists (select null - from V_USERPRIV UP - where UP.JUR_PERS = T.JUR_PERS - and UP.UNITCODE = 'CostJobs') order by SDOC_INFO) loop - /* Открываем план */ - PKG_XFAST.DOWN_NODE(SNAME => 'XFCJOBS'); - /* Описываем план */ - PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN); /* Если указана смена */ if (REC.STBOPERMODESP is not null) then /* Указываем информацию документа со сменой */ @@ -4986,6 +5025,10 @@ create or replace package body PKG_P8PANELS_MECHREC as /* Указываем информацию документа без смены */ SDOC_INFO := REC.SDOC_INFO; end if; + /* Открываем план */ + PKG_XFAST.DOWN_NODE(SNAME => 'XFCJOBS'); + /* Описываем план */ + PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN); PKG_XFAST.ATTR(SNAME => 'SDOC_INFO', SVALUE => SDOC_INFO); PKG_XFAST.ATTR(SNAME => 'SDOC_NUMB', SVALUE => REC.SDOC_NUMB); PKG_XFAST.ATTR(SNAME => 'SSUBDIV', SVALUE => REC.SSUBDIV); @@ -4993,6 +5036,20 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_XFAST.ATTR(SNAME => 'NHAVE_NOTE', NVALUE => COALESCE(REC.NHAVE_NOTE, 0)); /* Закрываем план */ PKG_XFAST.UP(); + /* Если вызов из действия, то указываем выбранный */ + if (NFCJOBS = REC.NRN) then + /* Открываем план */ + PKG_XFAST.DOWN_NODE(SNAME => 'XFCJOBS_SELECTED'); + /* Описываем план */ + PKG_XFAST.ATTR(SNAME => 'NRN', NVALUE => REC.NRN); + PKG_XFAST.ATTR(SNAME => 'SDOC_INFO', SVALUE => SDOC_INFO); + PKG_XFAST.ATTR(SNAME => 'SDOC_NUMB', SVALUE => REC.SDOC_NUMB); + PKG_XFAST.ATTR(SNAME => 'SSUBDIV', SVALUE => REC.SSUBDIV); + PKG_XFAST.ATTR(SNAME => 'SPERIOD', SVALUE => REC.SPERIOD); + PKG_XFAST.ATTR(SNAME => 'NHAVE_NOTE', NVALUE => COALESCE(REC.NHAVE_NOTE, 0)); + /* Закрываем план */ + PKG_XFAST.UP(); + end if; end loop; /* Закрываем корень */ PKG_XFAST.UP(); @@ -5150,21 +5207,6 @@ create or replace package body PKG_P8PANELS_MECHREC as PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and T.BGNDATE <= :DDATE_TO'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ((T.ENDDATE is null) or ((T.ENDDATE is not null) and (T.ENDDATE >= :DDATE_FROM)))'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and ' || PKG_SQL_BUILD.PKG_NAME(SNAME => 'PKG_P8PANELS_MECHREC.UTL_INS_DEP_HIER_EQ_CHECK') || '(T.COMPANY, T.RN, :DDATE_TO) = 1'); - /*PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists ('); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' select null'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from INS_DEPARTMENT H'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where H.COMPANY = :NCOMPANY'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and exists (select null'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' from SUBDIVSEQ EQ,'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' EQCONFIG EQC'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where EQ.PRN = H.RN'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and EQC.RN = EQ.EQCONFIG'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and EQC.OPER_DATE is not null'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' and EQC.OPER_DATE <= :DDATE_TO'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ' || PKG_SQL_BUILD.ROWLIMIT(NLIMIT => 1, BAND => true) || ')'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ' || PKG_SQL_BUILD.ROWLIMIT(NLIMIT => 1, BAND => true)); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' start with H.RN = T.RN'); - PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' connect by prior H.RN = H.PRN)');*/ PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' ) D) F'); PKG_SQL_BUILD.APPEND(SSQL => CSQL, SELEMENT1 => ' where F.NROW between :NROW_FROM and :NROW_TO'); /* Разбираем его */