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

Oracle APEX同页面经典报表向交互式网格推送数据求助

Oracle APEX POS页面需求解决方案

一、调整经典报表SQL,动态显示链接列

修改经典报表的SQL语句,仅当搜索结果大于1行时显示添加链接,单行时隐藏链接:

SELECT PRODUCT_ID,
       PRODUCT_NAME, 
       PRODUCT_CODE, 
       QTY, 
       UNIT_PRICE, 
       TOTAL_PRICE,
       -- 仅多行结果时生成添加链接
       CASE WHEN COUNT(*) OVER() > 1 THEN 'javascript:addToIG(''' || PRODUCT_ID || ''');' ELSE NULL END AS LINK,
       -- 隐藏列:记录总行数,用于后续自动判断
       COUNT(*) OVER() AS TOTAL_ROWS
FROM E_PRODUCTS
WHERE upper(PRODUCT_NAME) LIKE '%' || upper(:P52_SEARCH) || '%'
   OR upper(PRODUCT_CODE) LIKE '%' || upper(:P52_SEARCH) || '%'
  • 将TOTAL_ROWS列设置为隐藏(在报表列属性中选择“隐藏”)
  • 将LINK列的类型设置为“链接”,目标为“URL”,值使用#LINK#

二、创建AJAX进程获取产品详情

创建一个AJAX进程用于根据产品ID查询详情,供JavaScript调用:

  1. 导航到页面的“进程”,新建进程
  2. 进程类型:PL/SQL
  3. 进程名称:GET_PRODUCT_DETAILS
  4. PL/SQL代码:
DECLARE
    l_product E_PRODUCTS%ROWTYPE;
BEGIN
    SELECT * INTO l_product
    FROM E_PRODUCTS
    WHERE PRODUCT_ID = apex_application.g_x01;
    
    apex_json.open_object();
    apex_json.write('PRODUCT_ID', l_product.PRODUCT_ID);
    apex_json.write('PRODUCT_NAME', l_product.PRODUCT_NAME);
    apex_json.write('PRODUCT_CODE', l_product.PRODUCT_CODE);
    apex_json.write('QTY', l_product.QTY);
    apex_json.write('UNIT_PRICE', l_product.UNIT_PRICE);
    apex_json.write('TOTAL_PRICE', l_product.TOTAL_PRICE);
    apex_json.close_object();
EXCEPTION
    WHEN NO_DATA_FOUND THEN
        apex_json.open_object();
        apex_json.write('error', '产品不存在');
        apex_json.close_object();
END;
  1. 服务器端条件:无(默认即可)

三、编写JavaScript添加函数(实现多行添加)

在页面的“函数和全局变量声明”中添加以下代码,替换原有openIGRow函数:

function addToIG(productId) {
    // 获取交互式网格实例(替换为你的IG静态ID)
    const ig = apex.region("ig_pos").widget().interactiveGrid("getViews", "grid");
    const model = ig.model;
    const productIdFieldKey = model.getFieldKey("PRODUCT_ID");
    
    // 检查是否已存在相同产品ID的行(可选:避免重复添加)
    const existingRow = model.getRecords().find(row => row[productIdFieldKey] === productId);
    if (existingRow) {
        apex.message.showPageSuccess("该产品已在购物网格中");
        return;
    }
    
    // 通过AJAX获取产品详情
    apex.server.process("GET_PRODUCT_DETAILS", {
        x01: productId
    }, {
        success: function(data) {
            if (data.error) {
                apex.message.showPageError(data.error);
                return;
            }
            
            // 创建新行并赋值
            const newRow = model.createNewRecord();
            model.setValue(newRow, "PRODUCT_ID", data.PRODUCT_ID);
            model.setValue(newRow, "PRODUCT_NAME", data.PRODUCT_NAME);
            model.setValue(newRow, "PRODUCT_CODE", data.PRODUCT_CODE);
            model.setValue(newRow, "QTY", data.QTY);
            model.setValue(newRow, "UNIT_PRICE", data.UNIT_PRICE);
            model.setValue(newRow, "TOTAL_PRICE", data.TOTAL_PRICE);
            
            // 刷新网格显示
            ig.view$.grid("refresh");
            apex.message.showPageSuccess("产品已成功添加");
        },
        error: function() {
            apex.message.showPageError("获取产品信息失败,请重试");
        }
    });
}
  • 注意:将ig_pos替换为你的交互式网格的静态ID(在IG区域属性中设置)

四、实现单行结果自动推送

创建动态动作,在经典报表刷新后判断结果行数,单行时自动添加到IG:

  1. 新建动态动作
  2. 事件:After Refresh
  3. 选择类型:Region
  4. 区域:选择你的经典报表区域
  5. 条件:JavaScript表达式,内容:
// 获取隐藏列TOTAL_ROWS的值(替换为你的经典报表静态ID)
const totalRows = apex.region("classic_search_report").widget().find("td[headers='TOTAL_ROWS']").first().text();
return totalRows === "1";
  • 替换classic_search_report为你的经典报表的静态ID
  1. 动作:Execute JavaScript Code
  2. 代码:
// 获取唯一行的PRODUCT_ID(替换为经典报表静态ID,列索引根据实际调整)
const productId = apex.region("classic_search_report").widget().find("tr:eq(1) td:eq(0)").text();
addToIG(productId);
  • td:eq(0)对应PRODUCT_ID在报表中的列索引(从0开始计数),如果PRODUCT_ID不是第一列,调整索引值

关键说明

  • 确保交互式网格的列名与代码中使用的PRODUCT_ID、PRODUCT_NAME等完全一致(区分大小写)
  • 如果不需要避免重复添加,可删除函数中检查existingRow的代码块
  • 测试时需确保AJAX进程权限正常,页面项P52_SEARCH的提交设置正确

内容的提问来源于stack exchange,提问作者Retal Omar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 10:25:20