首页 > 解决方案 > 如何在自定义 JRDatasource 中使用 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} 值初始化。怎么做?如何在自定义数据源中使用报表参数?

标签: javajasper-reportsdatasource

解决方案


最常见的方法是创建一个构造函数并在其中传递参数。

首先删除所有static修饰符,因为您不需要它们,而且您可以同时执行来自不同线程的多个报告(即使您当前没有这样做)

你的构造函数将是

public MyImplementation(String param){
    this.param = param;
}

当你在 jrxml 中使用它时,你传递参数

<dataSourceExpression>
    <![CDATA[new my.package.name.MyImplementation($P{param})]]>
</dataSourceExpression>

推荐阅读