我在Oracle APEX应用程序中使用动态操作将日期过滤器应用于我的交互式报告。动态操作是由我的"日期来自" (P4027_DATE_FROM)或"日期到"(P4027_DATE_TO)日期框。动态操作提交两个页面项,包含一个PLSQL进程和一个javascript进程。
首先执行PLSQL代码。它使用apex_util.ir_filter将LTE过滤器应用于" Date To"和GTE过滤到"日期来自"。换句话说,我试图创建自己的" BETWEEN"功能。我还在PLSQL代码中包含了一些逻辑,如果一个日期为空,则只执行一个或另一个。
在新报告中使用这些过滤器的前几次运行正常。但是,如果我使用我过去应用的过滤器(使用相同的"日期从"第二次),奇怪的事情开始发生。例如,更改为" Date From"之后会将新日期添加到过滤器列表中,但不会检查(应用)过滤器。更改为"日期至"将检查相应的过滤器,但也检查所有以前使用的过滤器在日期列上使用> =运算符。
这是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进程之后刷新页面并且似乎工作正常
答案 0 :(得分:0)
您是否尝试过使用apex_ir.add_filter?我非常确定apex_util.ir_filter委托给apex_ir,但仍然。
其次,我担心你无能为力。 IR有一个糟糕的API,到目前为止还不存在。理想情况下,您可以定位某些过滤器等,但唉。你无法控制行为。如果我知道报告已被清除或重置,或者在新会话期间,我只会添加一个过滤器 那么为什么不只是应用一次过滤器,然后让用户使用IR功能来更改过滤器而不是重写所述功能?
如果你真的,真的必须有物品来引导它,我只是建议不要使用IR的内置过滤器,因为你可以看到行为不是你想要的,而是过滤通过在源查询中添加过滤器来获得结果。类似的东西:
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)