如何在Oracle APEX中使用自定义格式正确过滤数字列?

时间:2015-05-12 13:45:44

标签: oracle oracle-apex

在我们的APEX报告中,我们使用自定义数字格式将数值舍入到给定(用户定义的精度)。例如。鉴于此数据:

create table round_test(pk number not null primary key, value number);
insert into round_test(pk, value) values (1, 0.11);
insert into round_test(pk, value) values (2, 0.19);
insert into round_test(pk, value) values (3, 0.20);
insert into round_test(pk, value) values (4, 0.21);
insert into round_test(pk, value) values (5, 0.23);
insert into round_test(pk, value) values (7, 0.28);

我已创建了一个交互式报告,以VALUE列显示格式999D9(为了便于说明,我添加了一个显示数据的ORIGINAL_VALUE列没有数字格式,即完全精确 - 见下面的截图。

现在,如果我点击列标题按此列过滤,我会得到重复值(例如0.2出现四次 - 一次为0.19,0.20,0.23和0.28):

Filter drop down

这很糟糕,但是如果我点击其中一个值,则APEX按精确值过滤而不是舍入的值:

Filter result

我怎么能

  • 删除下拉列表中的重复项
  • 强制APEX按舍入值
  • 进行过滤

注意:使用舍入值创建视图并在报告定义中使用它不是一种可行的方法,因为我们的报告包含一个自定义导出功能,允许用户以完整方式导出数据精度。

更新 报告的SQL查询非常简单:

SELECT 
  pk,
  value,
  value AS original_value
FROM round_test 

APEX 4.2(我们目前使用的)和APEX 5.0(我在http://apex.oracle.com用来创建示例)的行为相同。

2 个答案:

答案 0 :(得分:2)

要消除值列表过滤器上的重复项:

首先,你需要在应用程序上创建一个LOV - >共享组件 - >其他组件 - >价值清单

使用此SQL查询:

$(".foo").each( function () {
  console.log( $(this).find('> div > input').length );
});

然后在报告属性上编辑包含'值'的列。值,并在值列表部分指定'列过滤器类型':使用命名的值列表过滤完全匹配,然后在命名的值列表',选择你的那个早些时候创建。

按舍入值过滤:

创建报告,但不是像你那样应用格式掩码(这保持了实际值,尽管在视图上应用了格式)格式化查询上的值,如下所示:

select distinct to_char(value,'999.9') d, round(value) r 
FROM round_test  order by 1 asc

我认为这将满足您的需求。

Here's a working example

答案 1 :(得分:0)

理想的行为是为value设置一个报告列。单击标题将提供标准选项,包括将显示(并允许搜索)舍入的十进制数字的过滤器。不幸的是,Apex并没有让你这么做。使用在初始报告查询中选择的不同值确定过滤器中显示的值;报告的列定义中的后续格式化仅影响值的显示方式,而不影响实际值,因此在过滤器列表中显示重复项。

我认为你的问题的本质是没有对交互式报告过滤器进行大量定制(如果你走这条路线,祝你好运),我认为你必须接受两列{{{ 1}},一个包含实际值,一个包含舍入或以其他方式格式化的值,用于过滤。

正如其他地方所建议的那样,您可以在SQL中为每个报告创建新列:

value

或者,如果您的用户愿意并且有能力,您可以向他们展示如何从SELECT pk, value, to_char(value, 'fm999D9') AS formatted_value FROM round_test 按钮创建计算列:

Actions->Format->Compute

无论创建Actions列的方式如何,都应该隐藏它以阻止它导致导出混乱。然后必须从formatted_value按钮进行过滤:

Actions->Filter