You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 03:45:21