Выберите элемент в списке выбора нескольких значений Select2 - PullRequest
0 голосов
/ 28 апреля 2020

Я использую плагин Select2 на Apex.

У меня есть такой сценарий:

  1. У меня есть три таблицы: ROOM, MASTER_STUDENT и MAP_STUDENT_ROOM
  2. Одна ROOM может иметь много STUDENT
  3. Пользователь может выбрать более одного студента (с помощью Select2 из MASTER_STUDENT) при создании ROOM
  4. Когда пользователь редактирует ROOM, ранее выбранного студента показывают в элементе Select2 (выбранный элемент с помощью MAP_STUDENT_ROOM), так что пользователь может удалить или добавить еще ученика

Как достичь пункта 4, элемент списка значений Select2 имеет значение MASTER_STUDENT, но MAP_STUDENT_ROOM выбрано по умолчанию?

Я нашел это документация , но я не знаю, как ее применить.

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Я не знаком с плагином Select2. Рассматривали ли вы использование встроенного всплывающего LOV, который, начиная с APEX 19.1, теперь допускает множественный выбор.

0 голосов
/ 30 апреля 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...