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

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

Перейти к: навигация, поиск

Ниже показано, что столбцы табличного отчёта можно задавать не только в описании отчёта (в файле *.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;
}

Также здесь можно видеть пример того, как можно задать ширину столбца при его описании, добавив "##ширина_в_пикселях" в заголовок столбца. Это же можно определить и при классическом описании столбцов в файле "*.rep.xml".

Внимание! Данное решение/метод/статья относится к версии 6.1 и для других версий может быть неактуальна! Вам нужно самостоятельно поправить решение под свои нужды или воспользоваться помощью на форуме. Будем признательны, если внизу страницы или отдельной статьёй вы разместите исправленное решение для другой версии или подсказки что надо исправить.

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