Reselect Select2 多值 select 列表中的项目

Reselect item on Select2 multi-value select list

我在 Apex 上使用插件 Select2。

我有这样的场景:

  1. 我有三个表:ROOM、MASTER_STUDENT 和 MAP_STUDENT_ROOM
  2. 一个ROOM可以有很多STUDENT
  3. 创建房间时,用户可以select 多个学生(使用 Select2 from MASTER_STUDENT)
  4. 当用户编辑 ROOM 时,之前 selected 学生显示在 Select2 项目中(selected 项目由 MAP_STUDENT_ROOM),因此用户可以删除或添加更多学生

如何实现第 4 点,项目 Select2 值列表是 MASTER_STUDENT 但默认 select 由 MAP_STUDENT_ROOM 编辑?

我找到了这个documentation,但我不知道如何应用它。

我对Select2插件不熟悉。 您是否考虑过使用内置的 Popup LOV,自 APEX 19.1 以来,它现在允许多选。

无论您使用的是Select2 插件还是内置的Popup LOV,问题都是一样的。您在 ROOM 上有一个表单,它试图考虑一个不属于 ROOM table 的项目(它的值存储在 MAP_STUDENT_ROOM 中)。诀窍是在页面加载期间正确填充项目,以便项目可以正确显示当前分配的学生。

项目的来源是如何配置的?如果不是,请将 Type 设置为 SQL 查询(return 冒号分隔值)。假设您在房间的页面上有一个主键项(例如 P1_ID),请输入如下查询:

select student_id
from MAP_STUDENT_ROOM
where room_id = :P1_ID

然后将 Used 设置为 Always,替换会话状态中的任何现有值

这应该使项目在页面加载时正确显示。但是,您仍然需要弄清楚如何在提交页面时将值正确映射回 MAP_STUDENT_ROOM table。您需要添加一些逻辑,首先从房间 (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
)

我没有测试过这段代码,但它应该能说明问题。

另一种选择是使用交互式网格而不是值列表项。这是一个经典的 master/detail 场景,可以在表单区域下方添加和删除学生(通常仅在创建后完成)。