#java #jasper-reports #datasource
#java #jasper-отчеты #источник данных
Вопрос:
Я использую Jaspersoft Studio 6.11 с Jasper Server 7.5.0.
Я хочу создать источник данных, который использует параметры отчета. Мой источник данных основан на этом примере: https://community.jaspersoft.com/wiki/how-create-and-use-jrdatasource-adapter
public class MyImplementation implements JRDataSource {
//This should be initialized from report parameter $P{param}= "Frank,Joseph,Marco,Carl,Lenny,Homer,Teodor,Leopold"
private static String param;
private static String[] nameArray;
private static final Integer[] ageArray = {50,30,40,46,44,26,32,21};
private int counter = -1;
private HashMap<String, Integer> fieldsNumber = new HashMap<String, Integer>();
private int lastFieldsAdded = 0;
@Override
public boolean next() throws JRException {
if (counter<nameArray.length-1) {
counter ;
return true;
}
return false;
}
@Override
public Object getFieldValue(JRField jrField) throws JRException {
Integer fieldIndex;
if (fieldsNumber.containsKey(jrField.getName()))
fieldIndex = fieldsNumber.get(jrField.getName());
else {
fieldsNumber.put(jrField.getName(), lastFieldsAdded);
fieldIndex = lastFieldsAdded;
lastFieldsAdded ;
}
if (fieldIndex == 0) return nameArray[counter];
else if (fieldIndex == 1) return ageArray[counter];
return "";
}
public static JRDataSource getDataSource(){
nameArray = param.split(",")
return new MyImplementation();
}
}
String param
должен быть инициализирован значением параметра отчета $ P {param}.
Как это сделать?
Как использовать параметры отчета в пользовательском источнике данных?
Ответ №1:
Наиболее распространенный способ сделать это — создать конструктор и передать в нем параметры.
Сначала удалите все ваши static
модификаторы, потому что они вам не нужны, а также для того, чтобы вы могли выполнять несколько отчетов одновременно из разных потоков (даже если вы в настоящее время этого не делаете)
Ваш конструктор будет
public MyImplementation(String param){
this.param = param;
}
И когда вы используете его в jrxml, вы передаете параметр
<dataSourceExpression>
<![CDATA[new my.package.name.MyImplementation($P{param})]]>
</dataSourceExpression>