Использование инкрементного переменной iReport с компонентом списка - PullRequest
0 голосов
/ 30 марта 2011

У меня есть типичный отчет 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>

Для отдельной цели у меня уже есть таблица с названием алфавит с 26 строками id = 1..26, letter = A..Z - это удобная таблица для получения простого списка из 15 целых чисел.

Таким образом, чтобы получить значение приращения ставки, соответствующее данному номеру, я думаю, что это будет:

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

... но я пытаюсь использовать приращение ставки для каждогострока, чтобы получить значение следующей строки.

Кроме того, я должен упомянуть по соображениям упаковки, мне нужно, чтобы это был автономный файл .jrxml, который компилируется в .jasper без каких-либо новых пользовательских классов на пути к классам.

Я чувствую, что я очень близко ... может кто-нибудь помочь мне с отсутствующим куском здесь?(К вашему сведению, я эксперт по Java и SQL, но я новичок в Jasper, мне нравится то, что я вижу до сих пор ...) Я думаю, мне нужно как-то объявить переменную и использовать эту карту, чтобы каждый раз увеличивать ее, а затем каким-то образом получить списоккомпонент для отображения моей последовательности - я бы предпочел иметь все это в одном отчете, так как я не вижу повторного использования такого подотчета, но пример того или иного способа был бы потрясающим.

Я немного обошелся с SQLвыражение с использованием переменной @ и сложного оператора if - это НЕ тема моего вопроса, но я включил его, чтобы проиллюстрировать то, чего я пытаюсь достичь здесь:

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 голосов
/ 01 апреля 2011

Хорошо, я нашел решение - может помочь кому-то еще:

Вместо того, чтобы пытаться инициализировать значение по умолчанию для этого 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);

В операторе вставки таблица элементов может быть любой удобной таблицей с> (произвольным верхним пределом) 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 или около того - для меня это нормально.

...