【问题标题】:iReport variable incrementor usage with list componentiReport 变量增量器与列表组件的使用
【发布时间】:2011-11-13 13:00:12
【问题描述】:

我有一个典型的 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)   

【问题讨论】:

    标签: java mysql jasper-reports ireport


    【解决方案1】:

    好的,我想出了一个解决方案 - 可能会帮助其他人:

    我没有尝试初始化该 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);
    

    在插入语句中,items 表可以是任何具有 >(任意上限)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
    

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

    所以唯一的缺点是我的序列有一个固定的上限,所以我只能处理高达 48,000 美元左右的价格范围 - 对我来说,这很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 2012-12-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多