iReport变量incrementor与list组件的使用

时间:2011-03-29 21:38:24

标签: java mysql jasper-reports ireport

我有一个典型的MySQL报告,每页列出一个'项目'。其中一个字段是min_price。我希望我的详细频段列表为每个项目提供一个固定数字(比方说15)'出价金额',根据此起始价计算,再加上作为报告参数传入的'滑动比例',如下所示:

<parameter name="bidIncrementMap" class="java.util.TreeMap">
  <defaultValueExpression><![CDATA[{10,1},{25,2},{50,5},{100,10},{250,20},{500,25},{9999,50}"]]></defaultValueExpression>
</parameter>

出于一个单独的目的,我已经有一个名为alphabet的表,其中26行id = 1..26,letter = A..Z - 这使得一个方便的表可以获得15个整数的简单列表。

因此,要获得与给定数字相对应的出价增量值,我认为它将是:

$P{bidIncrementMap}.floorEntry($F{each_bid}).getValue()

...但我要做的是使用每行的出价增量来获得下一行的值。

另外我应该提到包装的原因,我需要将它作为一个自包含的.jrxml,编译成.jasper而不在类路径上有任何新的自定义类。

我觉得我真的很亲密..有人可以帮我找到丢失的一块吗? (仅供参考,我是Java和SQL专家,但是Jasper新手,喜欢我到目前为止看到的...)我想我需要以某种方式声明一个变量并使用这个地图每次递增它,然后以某种方式得到列表组件显示我的序列 - 我更喜欢把它全部一个报告,因为我看不到重复使用这样的子报告,但任何一种方式的例子都会很棒。

我使用@变量和复杂的if语句对SQL表达式进行了一些讨论 - 这不是我的问题的焦点,但我将其包括在内以说明我在这里要实现的目标:

mysql> select a.id, i.name, i.min_price, @b:=if(a.id=1,i.min_price,@b+if(@b<10,1,if(@b<25,2,if(@b<50,5,if(@b<100,10,if(@b<250,20,if
@b<500,25,50))))))) bid from items i, alphabet a where a.id<=15 and i.id=27 order by a.id;
+----+---------------+-----------+--------+
| id | name          | min_price | bid    |
+----+---------------+-----------+--------+
|  1 | My Item Name  |     40.00 |  40.00 |
|  2 | My Item Name  |     40.00 |  45.00 |
|  3 | My Item Name  |     40.00 |  50.00 |
|  4 | My Item Name  |     40.00 |  60.00 |
|  5 | My Item Name  |     40.00 |  70.00 |
|  6 | My Item Name  |     40.00 |  80.00 |
|  7 | My Item Name  |     40.00 |  90.00 |
|  8 | My Item Name  |     40.00 | 100.00 |
|  9 | My Item Name  |     40.00 | 120.00 |
| 10 | My Item Name  |     40.00 | 140.00 |
| 11 | My Item Name  |     40.00 | 160.00 |
| 12 | My Item Name  |     40.00 | 180.00 |
| 13 | My Item Name  |     40.00 | 200.00 |
| 14 | My Item Name  |     40.00 | 220.00 |
| 15 | My Item Name  |     40.00 | 240.00 |
+----+---------------+-----------+--------+
15 rows in set (0.00 sec)   

1 个答案:

答案 0 :(得分:0)

好的,我找到了解决方案 - 可能会帮助其他人:

而不是尝试初始化该bidIncrementMap的默认值(这是我正在努力的部分 - 我认为在没有静态块的Java中这是不可能的,这是不允许的),我鄙视并决定使用SQL代替。我按如下方式设置了一个包含出价顺序的表:

create table bid_sequence (id int not null auto_increment primary key, bid numeric(10,2) not null);
insert into bid_sequence (bid) (select @p:=if(items.id=1,1,@p+if(@p<10,1,if(@p<30,2,if(@p<80,5,if(@p<140,10,if(@p<300,20,if(@p<500,25,50))))))) bid from items  order by items.id limit 1000);

在insert语句中,items表可以是任何带有&gt;的便捷表。 (任意上限)1000行。

然后,对于我的子报告,我有一个更简单的查询:

select if(bid=$P{min_price},@p:=1,@p:=@p+1) as seat, bid from (
select $P{min_price} as bid from dual 
union select bid from bid_sequence where bid >=  $P{min_price} limit 15) a

(额外的联合是因为起始值可能在序列中的元素之间,所以不是向上或向下舍入,我只是在它之前,然后联合防止重复。)

所以唯一的缺点是我的序列有一个固定的上限,所以我只能处理高达$ 48K左右的价格范围 - 对我来说,没关系。