Табличные отчёты в динамическом коде
Материал из BiTel WiKi
Перепишем отчёт, приведённый в статье "Табличные отчёты с динамическими столбцами" в виде динамического кода вместо классического использования BGBS в файле "*.java".
kernel_test_anycolumn_dyncode.rep.xml
<?xml version="1.0" encoding="UTF-8"?> <report title="Произвольно столбцов на динамическом коде" dyn_class="ru.bitel.bgbilling.modules.reports.ShapeReport" type="java"> <combo name="mode" title="Фигура"> <item id="1" title="Квадрат"/> <item id="2" title="Круг"/> </combo> <textField name="size" title="Размер" textBefore="сторона" textAfter="единиц"/> </report>
Динамический класс должен реализовывать интерфейс "bitel.billing.server.reports.BGCSVReport.CSVFillerDataFields" или "bitel.billing.server.reports.BGCSVReport.CSVFillerData" в зависимости от того, хотите ли вы задавать столбцы в классе или в файле-описании.
Динамический класс package ru.bitel.bgbilling.modules.reports.ShapeReport;
package ru.bitel.bgbilling.modules.reports; 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; /** * Готовый тестовый класс для отчёта "Произвольно столбцов на динамическом коде" (kernel_test_anycolumn_dyncode.rep.xml) * По аналогии с отчётом kernel_test_anycolumn_java * @author dimon */ public class ShapeReport implements bitel.billing.server.reports.BGCSVReport.CSVFillerDataFields { @Override public void fillReport( Connection con, BGReportFilter filter, ReportResult result, Map<String, String> fields ) { int mode = filter.getIntParam( "mode", 1 ); int size = filter.getIntParam( "size", 13 ); List<Map<String, String>> data = new ArrayList<Map<String, String>>( 1000 ); // формируем данные для самой таблицы for(int row=0; row<size; row++) { Map<String, String> map = new HashMap<String, String>(); 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 и для других версий может быть неактуальна! Вам нужно самостоятельно поправить решение под свои нужды или воспользоваться помощью на форуме. Будем признательны, если внизу страницы или отдельной статьёй вы разместите исправленное решение для другой версии или подсказки что надо исправить.