Табличные отчёты с динамическими столбцами
Материал из BiTel WiKi
(Новая страница: «Ниже показано, что столбцы '''табличного отчёта''' можно задавать не только в описании отчёт…»)
Следующая правка →
Версия 11:36, 30 января 2014
Ниже показано, что столбцы табличного отчёта можно задавать не только в описании отчёта (в файле *.rep.xml), но и при формировании данных отчёта. Для этого нужно не прописывать в *.rep.xml раздел "fields" как в обычном случае, а в классе отчёта добавить параметр "Map fields" в метод fillReport. Обратите внимание, эти два пункта должны всегда следовать друг из друга.
kernel_test_anycolumn_java.rep.xml
<?xml version="1.0" encoding="UTF-8"?> <report title="Произвольно столбцов на java" type="java"> <combo name="mode" title="Фигура"> <item id="1" title="Квадрат"/> <item id="2" title="Круг"/> </combo> <textField name="size" title="Размер" textBefore="сторона" textAfter="единиц"/> </report>
kernel_test_anycolumn_java.java
import java.sql.Connection; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import bitel.billing.server.admin.reports.BGReportFilter; import bitel.billing.server.reports.BGCSVReport.ReportResult; public void fillReport( Connection con, BGReportFilter filter, ReportResult result, Map fields ) { int mode = filter.getIntParam( "mode", 1 ); int size = filter.getIntParam( "size", 13 ); List data = new ArrayList( 1000 ); // формируем данные для самой таблицы for(int row=0; row<size; row++) { Map map = new HashMap(); for(int col=0; col<size; col++) { if( mode == 1 || iscircleable(row, col, size) ) // если квадрат или точка внутри круга { map.put( "c"+col, String.valueOf( row+1 ) + "/" + String.valueOf( col+1 ) ); } } data.add( map ); } result.setData( data ); // формируем данные о столбцах for(int col=0; col<size; col++) { String colid = "c"+col; String colname = String.valueOf( col+1 ); int colwidth = 24 + col; fields.put( colid, colname +"##" + String.valueOf( colwidth ) ); } } public static boolean iscircleable(int row, int col, int size) { double r = size/2.0d; double x = col - r; double y = row - r; return Math.sqrt(x*x+y*y)<=r; }
Внимание! Данное решение/метод/статья относится к версии 6.1 и для других версий может быть неактуальна! Вам нужно самостоятельно поправить решение под свои нужды или воспользоваться помощью на форуме. Будем признательны, если внизу страницы или отдельной статьёй вы разместите исправленное решение для другой версии или подсказки что надо исправить.