Табличные отчёты с динамическими столбцами

Материал из BiTel WiKi

(Различия между версиями)
Перейти к: навигация, поиск
DimOn (Обсуждение | вклад)
(Новая страница: «Ниже показано, что столбцы '''табличного отчёта''' можно задавать не только в описании отчёт…»)
Следующая правка →

Версия 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 и для других версий может быть неактуальна! Вам нужно самостоятельно поправить решение под свои нужды или воспользоваться помощью на форуме. Будем признательны, если внизу страницы или отдельной статьёй вы разместите исправленное решение для другой версии или подсказки что надо исправить.

Личные инструменты