Oracle APEX не может сохранить значение в сеансе - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть элемент страницы P2_ITEM_TYPE_ID, который устанавливается в Pre-Render с использованием процесса, вызывающего PL / SQL:

BEGIN
   select ITEM_TYPE_ID INTO :P2_ITEM_TYPE_ID from TABLE1 where ITEM_ID = :P2_ITEM_ID;
   exception
      when no_data_found then
        :P2_ITEM_TYPE_ID := null;
END;

В настоящее время запись для этого ITEM_ID не существует в TABLE1, поэтому исключениеNO_DATA_FOUND выбрасывается, и изначально ITEM_TYPE_ID имеет значение null.

Теперь я хочу установить ITEM_TYPE_ID, щелкнув одну из карточек на странице, захватив ее идентификатор и установив элемент страницы P2_ITEM_TYPE_ID для этого идентификатора.

У меня есть динамическое действие, которое запускает следующий javascript при нажатии карты:

var $item_type_id = this.data;
console.log($item_type_id); //prints out correect ID
apex.item("P2_ITEM_TYPE_ID").setValue($item_type_id);
 console.log(apex.item("P2_ITEM_TYPE_ID").getValue()); //prints out correct value

//set session state of P2_ITEM_TYPE_ID
apex.server.process ( "SAVE_HIDDEN_VALUE_IN_SESSION_STATE", 
{
     x01: $item_type_id,
     pageItems: "#P2_ITEM_TYPE_ID"
}, 
{dataType: 'text'} );

Я знаю, что код работает, так как правильные значения выводятся на консоль, но когда я проверяю сеансстраницы, P2_ITEM_TYPE_ID пуст в сеансе.В чем может быть проблема?

Это похоже на то, как будто что-то мешает изменить это значение.У меня есть идентичные настройки на другой странице с одним небольшим отличием - код в предварительном рендеринге не включает в себя часть исключения, потому что для TEMLE1 всегда есть запись для этого ITEM_ID:

BEGIN
   select ITEM_TYPE_ID INTO :P3_ITEM_TYPE_ID from TABLE1 where ITEM_ID = :P3_ITEM_ID;
END;

Но остальная частькод идентичен, и сессия P3_ITEM_TYPE_ID изменяется без проблем

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

Для этого вам не нужно apex.server.process, вы можете отправить значение элемента на сервер с помощью действия Выполнить код PL / SQL , которое следует за действием, которое у вас уже есть. Поместите имя элемента (например, P2_ITEM_TYPE_ID) в атрибут Элементы для отправки (установите PL / SQL Code равным null;).

0 голосов
/ 13 ноября 2018

Если на этих страницах все одинаково, кроме части EXCEPTION, хорошо - есть обходной путь: используйте функцию агрегирования, например,

select max(ITEM_TYPE_ID) INTO :P2_ITEM_TYPE_ID from TABLE1 where ITEM_ID = :P2_ITEM_ID;

Это предотвратит возврат запроса NO_DATA_FOUND, если для него нет значения :P2_ITEM_ID, и сохранит NULL в :P2_ITEM_TYPE_ID.

...