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调用:
- 导航到页面的“进程”,新建进程
- 进程类型:PL/SQL
- 进程名称:
GET_PRODUCT_DETAILS - 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;
- 服务器端条件:无(默认即可)
三、编写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:
- 新建动态动作
- 事件:After Refresh
- 选择类型:Region
- 区域:选择你的经典报表区域
- 条件: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
- 动作:Execute JavaScript Code
- 代码:
// 获取唯一行的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
相关产品推荐
相关产品推荐

