Oracle APEX经典报表无数据时如何合并列显示文本并保留表头
Oracle APEX经典报表无数据时合并列显示指定文本的实现方法
方法一:修改报表查询语句(无需前端代码)
通过UNION ALL结合NOT EXISTS判断原查询是否有数据,无数据时返回一行填充指定文本的结果,再通过HTML表达式实现列合并:
- 调整原查询
假设原查询为:
SELECT emp_id, emp_name, dept_name FROM employees WHERE dept_id = :P1_DEPT
修改为:
-- 原查询结果 SELECT emp_id, emp_name, dept_name FROM employees WHERE dept_id = :P1_DEPT -- 无数据时返回指定文本行 UNION ALL SELECT '&P1_EMPTY_TEXT.' AS emp_id, NULL AS emp_name, NULL AS dept_name FROM dual WHERE NOT EXISTS (SELECT 1 FROM employees WHERE dept_id = :P1_DEPT)
其中&P1_EMPTY_TEXT.是存储指定文本的页面项(比如'暂无数据'),也可以直接写死文本内容。
- 设置列HTML表达式
进入报表的列属性编辑页面,选中第一列(比如emp_id):
- 在「高级」选项的「HTML表达式」中填入:
<span #IF EMP_ID = '&P1_EMPTY_TEXT.' THEN 'colspan="3"'#>#EMP_ID#</span>
这里colspan="3"的数值要和报表总列数一致。
- 对其他列(
emp_name、dept_name),设置「服务器端条件」:当emp_id != '&P1_EMPTY_TEXT.'时显示,否则隐藏。
- 关闭列转义
将第一列的「转义特殊字符」设置为「否」,确保HTML的colspan属性生效。
方法二:使用JavaScript动态添加空行(无需修改查询)
通过APEX动态动作结合JS,在报表无数据时自动添加跨列的空提示行:
设置报表区域静态ID
进入报表区域的属性页面,在「高级」选项中设置「静态ID」(比如empReport)。创建动态动作
- 触发条件:选择「事件」为「页面加载」,同时添加「After Refresh」事件(关联目标报表区域),确保报表刷新后也能触发。
- 执行动作:选择「执行JavaScript代码」,填入以下代码:
// 获取报表区域和表格对象 var report = apex.region("empReport"); var table = report.node.querySelector(".apexir_WORKSHEET"); var tbody = table.querySelector("tbody"); // 判断是否无数据 if (tbody.children.length === 0) { var colNum = table.querySelector("thead tr").children.length; // 创建空行和单元格 var emptyRow = document.createElement("tr"); var emptyCell = document.createElement("td"); // 设置跨列和样式 emptyCell.colSpan = colNum; emptyCell.textContent = "暂无数据"; // 替换为你的指定文本 emptyCell.style.textAlign = "center"; emptyCell.style.padding = "1rem"; // 添加到表格 emptyRow.appendChild(emptyCell); tbody.appendChild(emptyRow); }
替换代码中的empReport为你设置的报表静态ID,"暂无数据"为你的指定文本。
两种方法各有优势:方法一兼容性强,适合对前端不熟悉的开发者;方法二无需修改查询逻辑,更灵活适配复杂报表场景。
内容的提问来源于stack exchange,提问作者code_error
相关产品推荐
相关产品推荐

