Независимо от того, используете ли вы плагин Select2 или встроенный всплывающий список, проблема будет одинаковой. У вас есть форма в ROOM, которая пытается учесть элемент, который не является частью таблицы ROOM (ее значения хранятся в MAP_STUDENT_ROOM). Хитрость заключается в том, чтобы правильно заполнить элемент во время загрузки страницы, чтобы элемент мог правильно отображать текущих назначенных учащихся.
Как настроен источник элемента? Если это не так, установите Тип на SQL Запрос (возврат двоеточия) . Предполагая, что у вас есть элемент первичного ключа на странице для комнаты (например, P1_ID), введите запрос, подобный следующему:
select student_id
from MAP_STUDENT_ROOM
where room_id = :P1_ID
Затем установите Используется в Всегда, заменяя любое существующее значение в состоянии сеанса .
Это должно заставить элемент правильно отображаться при загрузке страницы. Однако вам все равно придется выяснить, как правильно отобразить значения обратно в таблицу MAP_STUDENT_ROOM при отправке страницы. Вам нужно будет добавить логи c, которые сначала удаляют строки из комнаты (P1_ID), которых нет в выделении (например, P1_ASSIGNED_STUDENTS). Вы можете использовать APEX_STRING.SPLIT_NUMBERS , чтобы помочь:
delete from map_student_room
where room_id = :P1_ID
and student_id not in (
select column_value
from apex_string.split_number(:P1_ASSIGNED_STUDENTS, ':')
)
Затем вы можете вставить строки, которые находятся в выделении, но еще не находятся в комнате.
insert into map_student_room (
room_id,
student_id
)
select :P1_ID,
column_value
from apex_string.split_number(:P1_ASSIGNED_STUDENTS, ':')
where column_value not in (
select student_id
from map_student_room
where room_id = :P1_ID
)
Я не тестировал ни один из этого кода, но он должен получить очки.
Другой вариант - использовать интерактивную сетку вместо элемента списка значений. Это классический c сценарий мастер / детализация, в котором ученики могут быть добавлены и удалены под областью формы (обычно это делается только после создания).