Reselect Select2 多值 select 列表中的项目
Reselect item on Select2 multi-value select list
我在 Apex 上使用插件 Select2。
我有这样的场景:
- 我有三个表:ROOM、MASTER_STUDENT 和 MAP_STUDENT_ROOM
- 一个ROOM可以有很多STUDENT
- 创建房间时,用户可以select 多个学生(使用 Select2 from MASTER_STUDENT)
- 当用户编辑 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 场景,可以在表单区域下方添加和删除学生(通常仅在创建后完成)。
我在 Apex 上使用插件 Select2。
我有这样的场景:
- 我有三个表:ROOM、MASTER_STUDENT 和 MAP_STUDENT_ROOM
- 一个ROOM可以有很多STUDENT
- 创建房间时,用户可以select 多个学生(使用 Select2 from MASTER_STUDENT)
- 当用户编辑 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 场景,可以在表单区域下方添加和删除学生(通常仅在创建后完成)。