Вопрос или проблема
У меня есть форма и интерактивная сетка на модальном окне. Форма заполняет коллекцию, а интерактивная сетка получает значения из коллекции. В форме есть два выпадающих списка с годовыми значениями (P99_AN_INICIAL и P99_AN_FINAL). Когда пользователь изменяет их значения, интерактивная сетка обновляется. Например: P99_AN_INICIAL = 2010 и P99_AN_FINAL = 2015, так что интерактивная сетка будет содержать 5 строк. Если пользователь удаляет первую строку (2010), выпадающий список P99_AN_INICIAL должен обновить свое значение на 2011.
Список значений P99_AN_INICIAL:
SELECT MIN_YEAR – LEVEL AS display_value,
MIN_YEAR – LEVEL AS return_value
FROM (SELECT NVL(:P99_AN_INICIAL, MIN(AN_CALENDARIO)) AS MIN_YEAR
FROM TB_BEM
WHERE ID_PHAROS = :P99_LAST_ID_PHAROS
AND ID_CASO = :GLOBAL_CASE_ID
AND ID_PESSOA = :GLOBAL_PERSON_ID
)
WHERE :P99_ID_BEM IS NOT NULL
CONNECT BY LEVEL <= 20
UNION ALL
SELECT (EXTRACT(YEAR FROM SYSDATE) – 20 + LEVEL) AS display_value,
(EXTRACT(YEAR FROM SYSDATE) – 20 + LEVEL) AS return_value
FROM dual
WHERE :P99_ID_BEM IS NULL
CONNECT BY LEVEL <= 40
ORDER BY return_value ASC;
Я создал DA в интерактивной сетке, чтобы значение P99_AN_INICIAL могло обновляться сразу после удаления строки.
Событие: Сохранить [Интерактивная сетка]
Действие 1:
DECLARE
v_min_year NUMBER;
BEGIN
SELECT MIN(n001)
INTO v_min_year
FROM apex_collections
WHERE collection_name=”EDITAR_BEM”;
APEX_UTIL.SET_SESSION_STATE(‘P99_AN_INICIAL’, v_min_year);
END;
Действие 2:
Обновить элемент страницы P99_AN_INICIAL.
Проблема: значение выпадающего списка не отображается в форме после удаления строки. Кто-нибудь может помочь мне с этим, пожалуйста?
Ответ или решение
Для решения вашей задачи в Oracle APEX 22.1, чтобы обновить значение выпадающего списка (select list) P99_AN_INICIAL
на основании изменений в интерактивной решетке (Interactive Grid), нам необходимо убедиться, что у нас есть правильная логика обработки событий и корректное обновление значений на экране. Вот шаги, которые могут помочь вам исправить ситуацию.
Шаг 1: Создание процесса обработки удаления строки
Вы уже создали динамический процесс (DA) на событие сохранения интерактивной решетки. Однако убедитесь, что у вас правильный синтаксис и логика в PL/SQL блоке. Чтобы удостовериться, что вы правильно получаете минимальный год из коллекции, используйте следующий код:
DECLARE
v_min_year NUMBER;
BEGIN
SELECT MIN(n001)
INTO v_min_year
FROM apex_collections
WHERE collection_name = 'EDITAR_BEM'; -- замените двойные кавычки на одинарные
APEX_UTIL.SET_SESSION_STATE('P99_AN_INICIAL', v_min_year);
END;
Обратите внимание, что вы должны использовать одинарные кавычки для строковых литералов.
Шаг 2: Настройка действия после обновления
-
Триггер события: Убедитесь, что ваше действие после обновления правильно настроено. Вы можете использовать то же событие "Save [Interactive Grid]" для запуска вашего PL/SQL кода.
-
Обновление элемента страницы: После назначения нового значения переменной
P99_AN_INICIAL
вы правильно обновляете элемент на странице:- Во вкладке "True Action 2" выберите действие Refresh и укажите элемент
P99_AN_INICIAL
.
- Во вкладке "True Action 2" выберите действие Refresh и укажите элемент
Шаг 3: Проверка состояния
После выполнения DA проверьте состояние элемента P99_AN_INICIAL
. Если значение не обновляется на форме, возможно, необходимо выполнить следующее:
-
Проверка условий отображения: Убедитесь, что элемент
P99_AN_INICIAL
не имеет условий отображения, которые могут предотвращать его правильное обновление. -
Использование
Refresh
общего контейнера: ЕслиP99_AN_INICIAL
находится в одном контейнере или в области с интерактивной решеткой, может помочь обновление всего контейнера. Для этого:- В качестве действия
True Action
добавьте Refresh для общего контейнера, содержащего как форму, так и интерактивную решетку. Убедитесь, что указали правильную область.
- В качестве действия
Шаг 4: Обработка событий на клиенте
Если проблема всё ещё существует, рассмотрите добавление клиентского JavaScript коду для принудительного обновления значения элемента формы:
$('#P99_AN_INICIAL').val(apex.item('P99_AN_INICIAL').getValue()).trigger('change');
Итог
Ваша окончательная настройка Динамического действия будет выглядеть следующим образом:
- Событие: Save [Interactive Grid]
- Истина:
- PL/SQL код для обновления
P99_AN_INICIAL
- Refresh для
P99_AN_INICIAL
- (Опционально) Refresh для контейнера или формы
- (По желанию) JavaScript для обновления значения
- PL/SQL код для обновления
Следуя этим шагам, вы сможете корректно обновить значение P99_AN_INICIAL
в соответствии с изменениями в интерактивной решетке. Убедитесь в том, чтобы протестировать все изменения и при необходимости корректировать логику на базе тестирования.