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

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

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

Версия 11:47, 30 января 2014

Перепишем отчёт, приведённый в статье "Табличные отчёты с динамическими столбцами" в виде динамического кода вместо классического использования 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>

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

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