不要对过滤器进行 javascript 解析。这是一个坏主意——想想你将如何实现它?有大量的编码需要完成,还有大量的 ajax。随着 apex 5 就在拐角处,当 API 和标记即将发生巨大变化时,它会给您带来什么?
也不要仅仅屈服于要求。首先确定它在技术上的可行性。如果不是,请确保您非常清楚地说明了时间消耗的含义。拥有这些不同的价值计数的真正价值是什么?也许还有另一种方法可以实现他们想要的?也许这只不过是一种尝试性的解决方案,而不是真正问题的核心。需要考虑的事情...
话虽如此,这里有两个选项:
第一种方法:计算交互式报表的不同聚合
您可以通过“操作”按钮将这些添加到 IR。
请注意,此聚合将是最后一行!在我在这里发布的示例中,将每页的行数减少到 5 会将聚合行推到分页集 3!
第二种方法:APEX_IR 和 DBMS_SQL
您可以使用 apex_ir API 检索 IR 的查询,然后使用它进行计数。
(Apex 4.2) APEX_IR.GET_REPORT
(Apex 5.0) APEX_IR.GET_REPORT
一些提示:
通过查询 apex_application_page_regions 检索区域 ID
确保您的源查询不包含#...# 替换字符串。 (如#OWNER#。)
然后获取报表SQL,重写,执行。例如:
DECLARE
l_report apex_ir.t_report;
l_query varchar2(32767);
l_statement varchar2(32000);
l_cursor integer;
l_rows number;
l_deptno number;
l_mgr number;
BEGIN
l_report := APEX_IR.GET_REPORT (
p_page_id => 30,
p_region_id => 63612660707108658284,
p_report_id => null);
l_query := l_report.sql_query;
sys.htp.prn('Statement = '||l_report.sql_query);
for i in 1..l_report.binds.count
loop
sys.htp.prn(i||'. '||l_report.binds(i).name||' = '||l_report.binds(i).value);
end loop;
l_statement := 'select count (distinct deptno), count(distinct mgr) from ('||l_report.sql_query||')';
sys.htp.prn('statement rewrite: '||l_statement);
l_cursor := dbms_sql.open_cursor;
dbms_sql.parse(l_cursor, l_statement, dbms_sql.native);
for i in 1..l_report.binds.count
loop
dbms_sql.bind_variable(l_cursor, l_report.binds(i).name, l_report.binds(i).value);
end loop;
dbms_sql.define_column(l_cursor, 1, l_deptno);
dbms_sql.define_column(l_cursor, 2, l_mgr);
l_rows := dbms_sql.execute_and_fetch(l_cursor);
dbms_sql.column_value(l_cursor, 1, l_deptno);
dbms_sql.column_value(l_cursor, 2, l_mgr);
dbms_sql.close_cursor(l_cursor);
sys.htp.prn('Distinct deptno: '||l_deptno);
sys.htp.prn('Distinct mgr: '||l_mgr);
EXCEPTION WHEN OTHERS THEN
IF DBMS_SQL.IS_OPEN(l_cursor) THEN
DBMS_SQL.CLOSE_CURSOR(l_cursor);
END IF;
RAISE;
END;
我将 apex_ir.get_report 和 dbms_sql 中的示例代码放在一起。
Oracle 11gR2 DBMS_SQL reference
但有一些严重的警告:列列表很棘手。如果用户可以控制所有列并且可以删除一些列,那么这些列将从选择列表中消失。例如,在我的示例中,让用户隐藏 DEPTNO 列会使整个代码崩溃,因为即使它会从内部查询中消失,我仍然会对该列进行计数。您可以通过不让用户控制它来阻止它,或者首先解析语句等...
祝你好运。