应用 apex_util.ir_filter 的 Oracle APEX 日期过滤器

Oracle APEX Date Filters Applied with apex_util.ir_filter

我在我的 Oracle APEX 应用程序中使用动态操作将日期过滤器应用于我的交互式报告。动态操作由我的 "Date From" (P4027_DATE_FROM) 或 "Date To"(P4027_DATE_TO) 日期框中发生的更改触发。动态动作提交两个页面项目并包含一个 PLSQL 进程和一个 javascript 进程。

PLSQL 代码首先执行。它使用 apex_util.ir_filter 将 LTE 过滤器应用于 "Date To",将 GTE 过滤器应用于 "Date From"。换句话说,我试图创建自己的 "BETWEEN" 函数。我还在 PLSQL 代码中包含了一些逻辑,以便仅在一个日期为空时执行一个或另一个。

我在新报告中使用这些过滤器的前几次运行良好。但是,如果我使用过去应用的过滤器(第二次使用相同的 "Date From"),奇怪的事情就会开始发生。例如,之后对 "Date From" 的更改会将新日期添加到过滤器列表中,但不会检查(应用)过滤器。对 "Date To" 的更改将检查适当的过滤器,但也会检查所有以前使用的在日期列上使用 >= 运算符的过滤器。

这是 PLSQL 代码:

BEGIN
--clear out functions prior to execution
apex_util.ir_filter(p_page_id=>4027,p_report_column=>'DATE_COL',p_operator_abbr=>'EQ',p_filter_value=>'');

IF (:P4027_DATE_FROM IS NOT NULL AND :P4027_DATE_TO IS NULL) THEN
apex_util.ir_filter(p_page_id=>4027,p_report_column=>'DATE_COL',p_operator_abbr=>'GTE',p_filter_value=>:P4027_DATE_FROM);
ELSIF (:P4027_DATE_FROM IS NOT NULL AND :P4027_DATE_TO IS NOT NULL) THEN
apex_util.ir_filter(p_page_id=>4027,p_report_column=>'DATE_COL',p_operator_abbr=>'GTE',p_filter_value=> :P4027_DATE_FROM);
apex_util.ir_filter(p_page_id=>4027,p_report_column=>'DATE_COL',p_operator_abbr=>'LTE',p_filter_value=> :P4027_DATE_TO);
ELSIF (:P4027_DATE_FROM IS NULL AND :P4027_DATE_TO IS NOT NULL) THEN
apex_util.ir_filter(p_page_id=>4027,p_report_column=>'DATE_COL',p_operator_abbr=>'LTE',p_filter_value=> :P4027_DATE_TO);
ELSE
apex_util.ir_filter(p_page_id=>4027,p_report_column=>'DATE_COL',p_operator_abbr=>'EQ',p_filter_value=>'');
END IF;

END;

javascript 进程在 PLSQL 进程之后刷新页面,似乎工作正常

您是否尝试过使用 apex_ir.add_filter?我很确定 apex_util.ir_filter 代表 apex_ir,但仍然如此。

其次,恐怕您几乎无能为力。 IR 有一个可怕的 API,到目前为止几乎不存在。理想情况下,您可以针对某些过滤器等,但可惜。您无法控制行为。如果我知道报告已清除或重置,或者在新会话期间,我只会添加过滤器。
那么为什么不只应用一次过滤器,然后让用户使用 IR 功能来更改过滤器而不是重写所述功能?

如果你真的,真的必须有项目来引导这个,我只是建议不要使用 IRs 的内置过滤器,因为你可以看到行为不是你想要的,而是过滤通过在源查询中添加过滤器来获得结果。类似于:

AND (:P4027_DATE_TO IS NOT NULL AND from_dt >= :P4027_DATE_TO)
AND (:P4027_DATE_FROM IS NOT NULL AND to_dt <= :P4027_DATE_FROM)