我有一个典型的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)
答案 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左右的价格范围 - 对我来说,没关系。