ЦИТК-979 - Поддержка возможности указания отладочного значения аргумента запроса

This commit is contained in:
Mikhail Chechnev 2025-09-25 14:11:32 +03:00
parent dae416cd83
commit be22cde138
6 changed files with 70 additions and 23 deletions

View File

@ -7,7 +7,7 @@
//Подключение библиотек //Подключение библиотек
//--------------------- //---------------------
import React from "react"; //Классы React import React, { useState } from "react"; //Классы React
import PropTypes from "prop-types"; //Контроль свойств компонента import PropTypes from "prop-types"; //Контроль свойств компонента
import { P8PDialog } from "../../../../components/p8p_dialog"; //Типовой диалог import { P8PDialog } from "../../../../components/p8p_dialog"; //Типовой диалог
import { TITLES } from "../../../../../app.text"; //Общие текстовые ресурсы приложения import { TITLES } from "../../../../../app.text"; //Общие текстовые ресурсы приложения
@ -18,13 +18,27 @@ import { DATA_TYPE } from "../../common"; //Общие константы ред
//----------- //-----------
//Диалог добавления/исправления аргумента запроса //Диалог добавления/исправления аргумента запроса
const ArgIUDialog = ({ name = "", title = "", dataType = DATA_TYPE.NUMB, mandatory = 0, insert = true, onOk, onCancel }) => { const ArgIUDialog = ({ name = "", title = "", dataType = DATA_TYPE.NUMB, mandatory = 0, value = "", insert = true, onOk, onCancel }) => {
//Собственное состояние - текущее состояние аргумента
const [current, setCurrent] = useState({ value, dataType });
//Нажатие на кнопку "Ok" //Нажатие на кнопку "Ok"
const handleOk = values => onOk && onOk({ ...values }); const handleOk = values => onOk && onOk({ ...values });
//Нажатие на кнопку "Отмена" //Нажатие на кнопку "Отмена"
const handleCancel = () => onCancel && onCancel(); const handleCancel = () => onCancel && onCancel();
//При изменении значений в поле ввода
const handleInputChange = (name, value) => {
//Если поменяли тип данных - надо пересмотреть поля для ввода
if (name === "dataType") {
//Сохраним в состоянии новый тип данных и сбросим "отладочное значение", ведь оно зависит от типа данных (от этого состояния зависит свойство inputs, передаваемое в P8PDialog ниже)
setCurrent({ dataType: value, value: "" });
//Мы сами пересчитали форму, туда придут новые настройки элементов ввода через свойство inputs, не надо делать пересчет состояния внутри диалога
return true;
}
};
//Генерация содержимого //Генерация содержимого
return ( return (
<P8PDialog <P8PDialog
@ -34,7 +48,7 @@ const ArgIUDialog = ({ name = "", title = "", dataType = DATA_TYPE.NUMB, mandato
{ name: "title", value: title, label: "Приглашение" }, { name: "title", value: title, label: "Приглашение" },
{ {
name: "dataType", name: "dataType",
value: dataType, value: current.dataType,
label: "Тип данных", label: "Тип данных",
list: [ list: [
{ name: "Строка", value: DATA_TYPE.STR }, { name: "Строка", value: DATA_TYPE.STR },
@ -50,10 +64,17 @@ const ArgIUDialog = ({ name = "", title = "", dataType = DATA_TYPE.NUMB, mandato
{ name: "Нет", value: 0 }, { name: "Нет", value: 0 },
{ name: "Да", value: 1 } { name: "Да", value: 1 }
] ]
},
{
name: "value",
value: current.value,
label: "Значение (для отладки)",
type: current.dataType === DATA_TYPE.NUMB ? "number" : current.dataType === DATA_TYPE.DATE ? "date" : "text"
} }
]} ]}
onOk={handleOk} onOk={handleOk}
onCancel={handleCancel} onCancel={handleCancel}
onInputChange={handleInputChange}
/> />
); );
}; };
@ -64,6 +85,7 @@ ArgIUDialog.propTypes = {
title: PropTypes.string, title: PropTypes.string,
dataType: PropTypes.number, dataType: PropTypes.number,
mandatory: PropTypes.number, mandatory: PropTypes.number,
value: PropTypes.string,
insert: PropTypes.bool, insert: PropTypes.bool,
onOk: PropTypes.func, onOk: PropTypes.func,
onCancel: PropTypes.func onCancel: PropTypes.func

View File

@ -25,10 +25,10 @@ const useQueryArgs = query => {
//Добавление аргумента запроса //Добавление аргумента запроса
const addArg = useCallback( const addArg = useCallback(
async (name, title, dataType, mandatory) => { async (name, title, dataType, mandatory, value) => {
await executeStored({ await executeStored({
stored: "PKG_P8PANELS_QE.QUERY_OPT_ARG_ADD", stored: "PKG_P8PANELS_QE.QUERY_OPT_ARG_ADD",
args: { NRN: query, SNAME: name, STITLE: title, NDATA_TYPE: dataType, NMANDATORY: mandatory }, args: { NRN: query, SNAME: name, STITLE: title, NDATA_TYPE: dataType, NMANDATORY: mandatory, SVALUE: value },
loader: false loader: false
}); });
}, },
@ -37,10 +37,10 @@ const useQueryArgs = query => {
//Исправление аргумента запроса //Исправление аргумента запроса
const editArg = useCallback( const editArg = useCallback(
async (name, title, dataType, mandatory) => { async (name, title, dataType, mandatory, value) => {
await executeStored({ await executeStored({
stored: "PKG_P8PANELS_QE.QUERY_OPT_ARG_EDIT", stored: "PKG_P8PANELS_QE.QUERY_OPT_ARG_EDIT",
args: { NRN: query, SNAME: name, STITLE: title, NDATA_TYPE: dataType, NMANDATORY: mandatory }, args: { NRN: query, SNAME: name, STITLE: title, NDATA_TYPE: dataType, NMANDATORY: mandatory, SVALUE: value },
loader: false loader: false
}); });
}, },

View File

@ -35,14 +35,14 @@ const InspectorQueryArguments = ({ query, args = [], onOptionsChanged = null })
//При добавлении аргумента //При добавлении аргумента
const handleArgAdd = async (arg, cb) => { const handleArgAdd = async (arg, cb) => {
await addArg(arg.name, arg.title, arg.dataType, arg.mandatory); await addArg(arg.name, arg.title, arg.dataType, arg.mandatory, arg.value);
cb && cb(); cb && cb();
notifyOptionsChanged(); notifyOptionsChanged();
}; };
//При изменении аргумента //При изменении аргумента
const handleArgEdit = async (arg, cb) => { const handleArgEdit = async (arg, cb) => {
await editArg(arg.name, arg.title, arg.dataType, arg.mandatory); await editArg(arg.name, arg.title, arg.dataType, arg.mandatory, arg.value);
cb && cb(); cb && cb();
notifyOptionsChanged(); notifyOptionsChanged();
}; };

View File

@ -135,6 +135,7 @@ const useQuery = query => {
args: { NRN: query }, args: { NRN: query },
respArg: "COUT", respArg: "COUT",
isArray: name => ["XENT", "XATTR", "XRL", "XARG"].includes(name), isArray: name => ["XENT", "XATTR", "XRL", "XARG"].includes(name),
attributeValueProcessor: (name, val) => (["value"].includes(name) ? undefined : val),
loader: true loader: true
}); });
setQueryDiagram(serverQueryData2QueryDiagram(data?.XENTS?.XENT || [], data?.XRLS?.XRL || [])); setQueryDiagram(serverQueryData2QueryDiagram(data?.XENTS?.XENT || [], data?.XRLS?.XRL || []));

View File

@ -118,7 +118,8 @@ create or replace package PKG_P8PANELS_QE as
SNAME in varchar2, -- Имя SNAME in varchar2, -- Имя
STITLE in varchar2, -- Заголовок STITLE in varchar2, -- Заголовок
NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*)
NMANDATORY in number -- Флаг обязательности (1 - да, 0 - нет) NMANDATORY in number, -- Флаг обязательности (1 - да, 0 - нет)
SVALUE in varchar2 -- Значение для отладки (строковое представление для всех типов данных)
); );
/* Изменение аргумента запроса */ /* Изменение аргумента запроса */
@ -128,7 +129,8 @@ create or replace package PKG_P8PANELS_QE as
SNAME in varchar2, -- Имя SNAME in varchar2, -- Имя
STITLE in varchar2, -- Заголовок STITLE in varchar2, -- Заголовок
NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*)
NMANDATORY in number -- Флаг обязательности (1 - да, 0 - нет) NMANDATORY in number, -- Флаг обязательности (1 - да, 0 - нет)
SVALUE in varchar2 -- Значение для отладки (строковое представление для всех типов данных)
); );
/* Удаление аргумента запроса */ /* Удаление аргумента запроса */
@ -503,7 +505,8 @@ create or replace package body PKG_P8PANELS_QE as
SNAME in varchar2, -- Имя SNAME in varchar2, -- Имя
STITLE in varchar2, -- Заголовок STITLE in varchar2, -- Заголовок
NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*)
NMANDATORY in number -- Флаг обязательности (1 - да, 0 - нет) NMANDATORY in number, -- Флаг обязательности (1 - да, 0 - нет)
SVALUE in varchar2 -- Значение для отладки (строковое представление для всех типов данных)
) )
is is
RQ P8PNL_QE_QUERY%rowtype; -- Запись запроса RQ P8PNL_QE_QUERY%rowtype; -- Запись запроса
@ -520,7 +523,8 @@ create or replace package body PKG_P8PANELS_QE as
SNAME => SNAME, SNAME => SNAME,
STITLE => STITLE, STITLE => STITLE,
NDATA_TYPE => NDATA_TYPE, NDATA_TYPE => NDATA_TYPE,
NMANDATORY => NMANDATORY); NMANDATORY => NMANDATORY,
SVALUE => SVALUE);
/* Сохраняем обновленную настройку */ /* Сохраняем обновленную настройку */
PKG_P8PANELS_QE_BASE.QUERY_OPT_SET(NRN => RQ.RN, ROPT => ROPT); PKG_P8PANELS_QE_BASE.QUERY_OPT_SET(NRN => RQ.RN, ROPT => ROPT);
end QUERY_OPT_ARG_ADD; end QUERY_OPT_ARG_ADD;
@ -532,7 +536,8 @@ create or replace package body PKG_P8PANELS_QE as
SNAME in varchar2, -- Имя SNAME in varchar2, -- Имя
STITLE in varchar2, -- Заголовок STITLE in varchar2, -- Заголовок
NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*)
NMANDATORY in number -- Флаг обязательности (1 - да, 0 - нет) NMANDATORY in number, -- Флаг обязательности (1 - да, 0 - нет)
SVALUE in varchar2 -- Значение для отладки (строковое представление для всех типов данных)
) )
is is
RQ P8PNL_QE_QUERY%rowtype; -- Запись запроса RQ P8PNL_QE_QUERY%rowtype; -- Запись запроса
@ -559,7 +564,8 @@ create or replace package body PKG_P8PANELS_QE as
SNAME => SNAME, SNAME => SNAME,
STITLE => STITLE, STITLE => STITLE,
NDATA_TYPE => NDATA_TYPE, NDATA_TYPE => NDATA_TYPE,
NMANDATORY => NMANDATORY); NMANDATORY => NMANDATORY,
SVALUE => SVALUE);
/* Сохраняем обновленную настройку */ /* Сохраняем обновленную настройку */
PKG_P8PANELS_QE_BASE.QUERY_OPT_SET(NRN => RQ.RN, ROPT => ROPT); PKG_P8PANELS_QE_BASE.QUERY_OPT_SET(NRN => RQ.RN, ROPT => ROPT);
end QUERY_OPT_ARG_EDIT; end QUERY_OPT_ARG_EDIT;

View File

@ -6,7 +6,8 @@ create or replace package PKG_P8PANELS_QE_BASE as
SNAME PKG_STD.TSTRING, -- Имя SNAME PKG_STD.TSTRING, -- Имя
STITLE PKG_STD.TSTRING, -- Заголовок STITLE PKG_STD.TSTRING, -- Заголовок
NDATA_TYPE PKG_STD.TNUMBER, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) NDATA_TYPE PKG_STD.TNUMBER, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*)
NMANDATORY PKG_STD.TNUMBER -- Флаг обязательности (1 - да, 0 - нет) NMANDATORY PKG_STD.TNUMBER, -- Флаг обязательности (1 - да, 0 - нет)
SVALUE PKG_STD.TLSTRING -- Значение для отладки (строковое представление для всех типов данных)
); );
/* Типы данных - Коллекция аргументов */ /* Типы данных - Коллекция аргументов */
@ -90,7 +91,8 @@ create or replace package PKG_P8PANELS_QE_BASE as
SNAME in varchar2, -- Имя SNAME in varchar2, -- Имя
STITLE in varchar2, -- Заголовок STITLE in varchar2, -- Заголовок
NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*)
NMANDATORY in number -- Флаг обязательности (1 - да, 0 - нет) NMANDATORY in number, -- Флаг обязательности (1 - да, 0 - нет)
SVALUE in varchar2 -- Значение для отладки (строковое представление для всех типов данных)
); );
/* Изменение аргумента в коллекции */ /* Изменение аргумента в коллекции */
@ -101,7 +103,8 @@ create or replace package PKG_P8PANELS_QE_BASE as
SNAME in varchar2, -- Имя SNAME in varchar2, -- Имя
STITLE in varchar2, -- Заголовок STITLE in varchar2, -- Заголовок
NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*)
NMANDATORY in number -- Флаг обязательности (1 - да, 0 - нет) NMANDATORY in number, -- Флаг обязательности (1 - да, 0 - нет)
SVALUE in varchar2 -- Значение для отладки (строковое представление для всех типов данных)
); );
/* Удаление аргумента из коллекции */ /* Удаление аргумента из коллекции */
@ -366,6 +369,7 @@ create or replace package body PKG_P8PANELS_QE_BASE as
SATTR_USE constant PKG_STD.TSTRING := 'use'; -- Применение в запросе SATTR_USE constant PKG_STD.TSTRING := 'use'; -- Применение в запросе
SATTR_SHOW constant PKG_STD.TSTRING := 'show'; -- Отображение в запросе SATTR_SHOW constant PKG_STD.TSTRING := 'show'; -- Отображение в запросе
SATTR_PARENT_ENTITY constant PKG_STD.TSTRING := 'parentEntity'; -- Идентификатор родительской сущности SATTR_PARENT_ENTITY constant PKG_STD.TSTRING := 'parentEntity'; -- Идентификатор родительской сущности
SATTR_VALUE constant PKG_STD.TSTRING := 'value'; -- Значение
/* Константы - зарезервированные имена рагументов */ /* Константы - зарезервированные имена рагументов */
SARG_NAME_PAGE constant PKG_STD.TSTRING := 'NPAGE'; -- Номер страницы SARG_NAME_PAGE constant PKG_STD.TSTRING := 'NPAGE'; -- Номер страницы
@ -432,7 +436,8 @@ create or replace package body PKG_P8PANELS_QE_BASE as
SNAME in varchar2, -- Имя SNAME in varchar2, -- Имя
STITLE in varchar2, -- Заголовок STITLE in varchar2, -- Заголовок
NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*)
NMANDATORY in number -- Флаг обязательности (1 - да, 0 - нет) NMANDATORY in number, -- Флаг обязательности (1 - да, 0 - нет)
SVALUE in varchar2 -- Значение для отладки (строковое представление для всех типов данных)
) return TARG -- Описание аргумента ) return TARG -- Описание аргумента
is is
RARG TARG; -- Буфер для результата RARG TARG; -- Буфер для результата
@ -475,6 +480,7 @@ create or replace package body PKG_P8PANELS_QE_BASE as
RARG.STITLE := STITLE; RARG.STITLE := STITLE;
RARG.NDATA_TYPE := NDATA_TYPE; RARG.NDATA_TYPE := NDATA_TYPE;
RARG.NMANDATORY := NMANDATORY; RARG.NMANDATORY := NMANDATORY;
RARG.SVALUE := SVALUE;
/* Вернем полученное */ /* Вернем полученное */
return RARG; return RARG;
end TARG_MAKE; end TARG_MAKE;
@ -493,6 +499,7 @@ create or replace package body PKG_P8PANELS_QE_BASE as
PKG_XFAST.ATTR(SNAME => SATTR_TITLE, SVALUE => RARG.STITLE); PKG_XFAST.ATTR(SNAME => SATTR_TITLE, SVALUE => RARG.STITLE);
PKG_XFAST.ATTR(SNAME => SATTR_DATA_TYPE, NVALUE => RARG.NDATA_TYPE); PKG_XFAST.ATTR(SNAME => SATTR_DATA_TYPE, NVALUE => RARG.NDATA_TYPE);
PKG_XFAST.ATTR(SNAME => SATTR_MANDATORY, NVALUE => RARG.NMANDATORY); PKG_XFAST.ATTR(SNAME => SATTR_MANDATORY, NVALUE => RARG.NMANDATORY);
PKG_XFAST.ATTR(SNAME => SATTR_VALUE, SVALUE => RARG.SVALUE);
/* Закрываем описание аргумента */ /* Закрываем описание аргумента */
PKG_XFAST.UP(); PKG_XFAST.UP();
end TARG_TO_XML; end TARG_TO_XML;
@ -521,6 +528,7 @@ create or replace package body PKG_P8PANELS_QE_BASE as
RRES.STITLE := PKG_XPATH.ATTRIBUTE(RNODE => XNODE, SNAME => SATTR_TITLE); RRES.STITLE := PKG_XPATH.ATTRIBUTE(RNODE => XNODE, SNAME => SATTR_TITLE);
RRES.NDATA_TYPE := PKG_XPATH.ATTRIBUTE_NUM(RNODE => XNODE, SNAME => SATTR_DATA_TYPE); RRES.NDATA_TYPE := PKG_XPATH.ATTRIBUTE_NUM(RNODE => XNODE, SNAME => SATTR_DATA_TYPE);
RRES.NMANDATORY := PKG_XPATH.ATTRIBUTE_NUM(RNODE => XNODE, SNAME => SATTR_MANDATORY); RRES.NMANDATORY := PKG_XPATH.ATTRIBUTE_NUM(RNODE => XNODE, SNAME => SATTR_MANDATORY);
RRES.SVALUE := PKG_XPATH.ATTRIBUTE(RNODE => XNODE, SNAME => SATTR_VALUE);
/* Освободим документ */ /* Освободим документ */
PKG_XPATH.FREE(RDOCUMENT => XDOC); PKG_XPATH.FREE(RDOCUMENT => XDOC);
exception exception
@ -570,7 +578,8 @@ create or replace package body PKG_P8PANELS_QE_BASE as
SNAME in varchar2, -- Имя SNAME in varchar2, -- Имя
STITLE in varchar2, -- Заголовок STITLE in varchar2, -- Заголовок
NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*)
NMANDATORY in number -- Флаг обязательности (1 - да, 0 - нет) NMANDATORY in number, -- Флаг обязательности (1 - да, 0 - нет)
SVALUE in varchar2 -- Значение для отладки (строковое представление для всех типов данных)
) )
is is
RARG TARG; -- Добавляемый аргумент RARG TARG; -- Добавляемый аргумент
@ -584,7 +593,11 @@ create or replace package body PKG_P8PANELS_QE_BASE as
P_EXCEPTION(0, 'Аргумент с именем "%s" уже существует.', SNAME); P_EXCEPTION(0, 'Аргумент с именем "%s" уже существует.', SNAME);
end if; end if;
/* Формируем аргумент */ /* Формируем аргумент */
RARG := TARG_MAKE(SNAME => SNAME, STITLE => STITLE, NDATA_TYPE => NDATA_TYPE, NMANDATORY => NMANDATORY); RARG := TARG_MAKE(SNAME => SNAME,
STITLE => STITLE,
NDATA_TYPE => NDATA_TYPE,
NMANDATORY => NMANDATORY,
SVALUE => SVALUE);
/* Добавляем его в коллекцию */ /* Добавляем его в коллекцию */
RARGS.EXTEND(); RARGS.EXTEND();
RARGS(RARGS.LAST) := RARG; RARGS(RARGS.LAST) := RARG;
@ -598,7 +611,8 @@ create or replace package body PKG_P8PANELS_QE_BASE as
SNAME in varchar2, -- Имя SNAME in varchar2, -- Имя
STITLE in varchar2, -- Заголовок STITLE in varchar2, -- Заголовок
NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*) NDATA_TYPE in number, -- Тип данных (см. константы PKG_STD.DATA_TYPE_*)
NMANDATORY in number -- Флаг обязательности (1 - да, 0 - нет) NMANDATORY in number, -- Флаг обязательности (1 - да, 0 - нет)
SVALUE in varchar2 -- Значение для отладки (строковое представление для всех типов данных)
) )
is is
RARG TARG; -- Добавляемый аргумент RARG TARG; -- Добавляемый аргумент
@ -613,7 +627,11 @@ create or replace package body PKG_P8PANELS_QE_BASE as
P_EXCEPTION(0, 'Не указан индекс изменяемого аргумента.'); P_EXCEPTION(0, 'Не указан индекс изменяемого аргумента.');
end if; end if;
/* Формируем аргумент */ /* Формируем аргумент */
RARG := TARG_MAKE(SNAME => SNAME, STITLE => STITLE, NDATA_TYPE => NDATA_TYPE, NMANDATORY => NMANDATORY); RARG := TARG_MAKE(SNAME => SNAME,
STITLE => STITLE,
NDATA_TYPE => NDATA_TYPE,
NMANDATORY => NMANDATORY,
SVALUE => SVALUE);
/* Обновляем аргумент в коллекции */ /* Обновляем аргумент в коллекции */
begin begin
RARGS(NINDEX) := RARG; RARGS(NINDEX) := RARG;