Oracle Apex交互式网格:选Code列后联动更新Description列的方法
解决Oracle Apex交互式网格Code选择后自动更新Description列的问题
问题背景
现有名为Visit Duration的Oracle Apex交互式网格,数据源SQL如下:
Select ROWID, CODE, (Select odm.First_Name || ' ' || odm.Last_Name from OPC_DOCTORS_MACHINES odm where odm.CODE = ovd.CODE) as DESCRIPTION, V_CODE, VISIT_DURATION, PAIEMENT, D_DISCOUNT, DISCOUNT from OPC_VISIT_DURATION ovd
其中CODE是关联OPC_DOCTORS_MACHINES表的外键,DESCRIPTION列取值自该关联表的医生姓名。需求是用户选择CODE列的值时,同行DESCRIPTION自动同步对应名称,但常规动态动作无法实现。
解决方案
1. 配置CODE列为选择列表
先把CODE列设置为选择列表类型,数据源直接绑定OPC_DOCTORS_MACHINES表:
- 列表查询用:
SELECT CODE AS VALUE, First_Name || ' ' || Last_Name AS DISPLAY_VALUE FROM OPC_DOCTORS_MACHINES - 这一步是为了让用户能选择有效的CODE值,同时为后续的同步提供基础。
2. 添加交互式网格初始化JavaScript
直接利用交互式网格的模型事件监听,比动态动作更可靠:
打开网格的属性面板,找到高级下的JavaScript初始化代码,填入以下代码:
function(config) { config.initActions = function(actions) { // 监听单元格值变更事件 this.model.subscribe( 'cellChange', function(event) { const record = event.record; const column = event.column; // 只处理CODE列的变更 if (column.property === 'CODE') { const codeVal = record.getValue('CODE'); if (codeVal) { // 调用AJAX进程获取对应医生姓名 apex.server.process( 'GET_DOCTOR_FULLNAME', { x01: codeVal }, { success: function(response) { // 更新当前行的DESCRIPTION列 record.setValue('DESCRIPTION', response.result); } } ); } else { // CODE为空时清空DESCRIPTION record.setValue('DESCRIPTION', ''); } } } ); }; return config; }
3. 创建AJAX回调进程
在应用中新建一个AJAX回调进程,命名为GET_DOCTOR_FULLNAME:
- 进程类型选PL/SQL代码,输入以下代码:
declare l_fullname varchar2(200); begin select First_Name || ' ' || Last_Name into l_fullname from OPC_DOCTORS_MACHINES where CODE = apex_application.g_x01; -- 返回JSON格式结果 apex_json.open_object; apex_json.write('result', l_fullname); apex_json.close_object; exception when no_data_found then apex_json.open_object; apex_json.write('result', ''); apex_json.close_object; end;
- 确保进程的授权方案设置为允许前端访问(比如选
APEX_AUTHENTICATED_USERS)。
4. 调整DESCRIPTION列属性
- 把
DESCRIPTION列的可编辑设置为是,确保程序能更新该列的值; - 如果不想让用户手动修改,可同时把保护设置为始终,这样用户无法编辑,但程序仍能更新。
为什么常规动态动作无效?
交互式网格的单元格更新是基于模型的,常规动态动作的触发条件(比如"当值改变")可能无法准确捕捉到网格内部的单元格状态变化,而直接监听网格模型的cellChange事件是官方推荐的处理方式,能确保事件触发的准确性。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

