ORACLE-APEX 22.1 – Обновление значения выбора в зависимости от изменений в интерактивной сетке

Вопрос или проблема

У меня есть форма и интерактивная сетка на модальном окне. Форма заполняет коллекцию, а интерактивная сетка получает значения из коллекции. В форме есть два выпадающих списка с годовыми значениями (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: Настройка действия после обновления

  1. Триггер события: Убедитесь, что ваше действие после обновления правильно настроено. Вы можете использовать то же событие "Save [Interactive Grid]" для запуска вашего PL/SQL кода.

  2. Обновление элемента страницы: После назначения нового значения переменной P99_AN_INICIAL вы правильно обновляете элемент на странице:

    • Во вкладке "True Action 2" выберите действие Refresh и укажите элемент P99_AN_INICIAL.

Шаг 3: Проверка состояния

После выполнения DA проверьте состояние элемента P99_AN_INICIAL. Если значение не обновляется на форме, возможно, необходимо выполнить следующее:

  1. Проверка условий отображения: Убедитесь, что элемент P99_AN_INICIAL не имеет условий отображения, которые могут предотвращать его правильное обновление.

  2. Использование Refresh общего контейнера: Если P99_AN_INICIAL находится в одном контейнере или в области с интерактивной решеткой, может помочь обновление всего контейнера. Для этого:

    • В качестве действия True Action добавьте Refresh для общего контейнера, содержащего как форму, так и интерактивную решетку. Убедитесь, что указали правильную область.

Шаг 4: Обработка событий на клиенте

Если проблема всё ещё существует, рассмотрите добавление клиентского JavaScript коду для принудительного обновления значения элемента формы:

$('#P99_AN_INICIAL').val(apex.item('P99_AN_INICIAL').getValue()).trigger('change');

Итог

Ваша окончательная настройка Динамического действия будет выглядеть следующим образом:

  1. Событие: Save [Interactive Grid]
  2. Истина:
    • PL/SQL код для обновления P99_AN_INICIAL
    • Refresh для P99_AN_INICIAL
    • (Опционально) Refresh для контейнера или формы
    • (По желанию) JavaScript для обновления значения

Следуя этим шагам, вы сможете корректно обновить значение P99_AN_INICIAL в соответствии с изменениями в интерактивной решетке. Убедитесь в том, чтобы протестировать все изменения и при необходимости корректировать логику на базе тестирования.

Оцените материал
Добавить комментарий

Капча загружается...