Статьи

Eclipse BIRT: программная настройка цветов гистограммы с помощью сценариев

Используя Eclipse BIRT для создания отчетов, особенно элемента отчета элемента диаграммы, вы можете столкнуться с ситуацией, когда цвета диаграммы должны быть изменены в зависимости от набора данных (datarow) или параметра отчета. Есть два основных решения, чтобы закончить эту задачу. Один из способов установить цвета — использовать скрипт [ref] с JavaScript (Rhino [ref] ) в конструкторе отчетов. Другое решение — использовать BIRT DEAPI [ref] и добавить скрипт через Java. В этой статье я хочу описать подход с использованием сценариев в файле дизайна отчета / библиотеки / шаблона.

Идея этого решения может быть найдена на форуме разработчиков BIRT [ref] [ref] . Это был мой вопрос, на который ответил один из членов модераторской команды форума, которые также работают в качестве поддержки BIRT.

Перед описанием решения, некоторые термины, используемые в BIRT затмения должны быть представлены.

Параметры отчета

Одним из вариантов передачи данных в отчет является использование параметра отчета. Параметр отчета может иметь простую структуру, такую ​​как числа, строки или более сложную структуру, как любой вид Java-объектов. Их можно использовать где угодно, в любом тексте, например, в элементе отчета или скрипте, в отчете для манипулирования поведением или макет отчета зависит от них. В этом примере я попытаюсь показать, как информация о цвете передается в качестве параметров отчета, которые позже используются в качестве цветов гистограммы. Синтаксис использования элемента отчета в файле rptdesign, rptlibrary или rpttemplate может выглядеть следующим образом:

params["someparameter"].value

Источник данных / Набор данных

Основное содержание отчета доставляется через наборы данных, которые связаны с источниками данных. Они могут иметь любую природу, такую ​​как операторы выбора SQL для таблиц базы данных или XPath к какому-либо месту назначения во входящем XML-файле, Web-сервисах, CSV-файле или Java-объектах. В этом примере я буду использовать набор данных, который содержит информацию о цвете как целочисленные значения. Синтаксис использования элемента отчета в файле rptdesign, rptlibrary или rpttemplate может выглядеть следующим образом:

row["somecolumn"]

Постоянная глобальная переменная

Постоянные глобальные переменные, такие как в названии, — это переменные, которые сохраняются глобально и могут использоваться в любом месте отчета. Для этой задачи цвета сохраняются в постоянной глобальной переменной в виде целочисленных значений красного, зеленого и синего цветов (0-255). Синтаксис для переменной может выглядеть так:

//write
reportContex.setPersistentGlobalVariable("globalParameterId", "content");

//read
reportContex.getPersistentGlobalVariable("red");

Описание решения

Данные из набора данных / datarow или параметра отчета должны быть скопированы в объекты глобального параметра отчета, а затем их можно использовать в одном из методов диаграммы, где для содержимого заданы свойства цвета диаграммы. Решение этой задачи можно разбить на несколько задач:

  • Установка данных цвета в постоянную глобальную переменную.
  • Установка данных из постоянной глобальной переменной на график.

 Установка цветовых данных в постоянную глобальную переменную

Подсказка : следующий код должен быть размещен в методе «onCreate» родительского элемента диаграммы, такого как элемент отчета таблицы, когда информация находится в наборе данных и развернута в элементе элементов таблицы или списка. Если цвета передаются через параметры отчета, тогда скрипт может быть размещен глобально в элементе отчета.

//examples for incomming parameters
reportContex.setPersistentGlobalVariable("red", params["red"].value);
reportContex.setPersistentGlobalVariable("blue", params["blue"].value);
reportContex.setPersistentGlobalVariable("green", params["green"]value);

//examples for datarow from dataset
reportContex.setPersistentGlobalVariable("red", row["Red"]);
reportContex.setPersistentGlobalVariable("blue", row["Blue");
reportContex.setPersistentGlobalVariable("green", row["Green"));

Из приведенного выше кода вы можете видеть, как информация о цвете передается глобальным переменным. Следующим шагом является установка цветов на гистограмме. Для этого нам нужно знать, какой у нас график (здесь гистограмма) и сколько рядов используется для этого графика, поскольку нам нужно также добавить цвета в ряд.

Установка данных из постоянной глобальной переменной на график

Последний шаг задачи — поместить данные из глобальной переменной persistnent в свойство цвета гистограммы. Это делается в методе «onRender» элемента отчета диаграммы и имеет структуру, как в следующем примере:

importPackage(Package.org.eclipse.birt.chart.model.impl);
importPackage(Package.org.eclipse.birt.chart.model.type.impl);
importPackage(Package.org.eclipse.birt.chart.model.attribute);
importPackage(Package.org.eclipse.birt.chart.model.attribute.impl);

function beforeGeneration( chart, icsc ) {
	//one series
	sd = chart.getAxes().get(0).getAssociatedAxes().get(0).getSeriesDefinitions().get(0);
	sd.getSeriesPalette().getEntries().clear();
	var red = parseInt(icsc.getExternalContex().getScriptable().getPersistentGlobalVariable("red"));
	var blue = parseInt(icsc.getExternalContex().getScriptable().getPersistentGlobalVariable("blue"));
	var green = parseInt(icsc.getExternalContex().getScriptable().getPersistentGlobalVariable("green"));
	sd.getSeriesPalette().getEntries().add(GradientImpl.create(ColorDefinitionImpl.create(red, blue, green), ColorDefinitionImpl.create(red, blue, green), -35, false));
	//two series - adding one color more
	sd = chart.getAxes().get(0).getAssociatedAxes().get(1).getSeriesDefinitions().get(0);
	sd.getSeriesPalette().getEntries().clear();
	var red = parseInt(icsc.getExternalContex().getScriptable().getPersistentGlobalVariable("red"));
	var blue = parseInt(icsc.getExternalContex().getScriptable().getPersistentGlobalVariable("blue"));
	var green = parseInt(icsc.getExternalContex().getScriptable().getPersistentGlobalVariable("green"));
	sd.getSeriesPalette().getEntries().add(GradientImpl.create(ColorDefinitionImpl.create(red, blue, green), ColorDefinitionImpl.create(red, blue, green), -35, false));
	// if you need one color without gradient
	sd.getSeriesPalette().getEntries().add(ColorDefinitionImpl.GREEN());	
}

Вы также можете выполнять итерации по серии с помощью итератора, который здесь не показан.

Резюме

Эта статья была посвящена настройке цветов диаграммы с помощью скриптов в BIRT Eclipse. Кроме того, здесь упоминались некоторые основные термины, такие как параметры отчета, набор данных / источники данных и постоянные глобальные переменные. На самом деле подход к этому прост, если вы знаете правильный синтаксис. Это было основной мотивацией для написания этой статьи.