Tro*_*oso 1 java jasper-reports
我正在使用 Jasper Reports 和 Java 创建一些报告。在界面中,用户选择1个或多个项目,并为每个项目生成报告。现在,我有查询:
SELECT * FROM StockInventory
Run Code Online (Sandbox Code Playgroud)
这是在 jrxml 文件中。但是,通过我的应用程序运行它,它会为表中的每个项目创建一个报告。我想要的是:
SELECT * FROM StockInventory WHERE pk IN (?...)
Run Code Online (Sandbox Code Playgroud)
其中“?...”是用户选择的项目的键。因此,不仅参数是动态的,而且参数的数量也是动态的。
我的问题是,我不知道如何在 jrxml 中设置参数,也不知道如何从 Java 的 jasperreports 库中设置参数。目前,要设置值,我正在这样做:
Map<String, Object> params = new HashMap<String, Object>();
JasperReport report = JasperCompileManager.compileReport("path\\to\\jrxml");
JasperPrint print = JasperFillManager.fillReport(report, params, new ItemData(keys));
Run Code Online (Sandbox Code Playgroud)
ItemData() 在哪里:
private class ItemData implements JRDataSource
{
private final List<InventoryItem> items;
private int counter;
public ItemData(List<PrimaryKey> keys)
{
items = new ArrayList<InventoryItem>();
InventoryItemDao dao = new InventoryItemDao();
for(PrimaryKey key : keys)
{
InventoryItem item = dao.find(key.getPk(), key.getCpk());
if (item != null)
{
items.add(item);
}
}
counter = -1;
}
@Override
public boolean next() throws JRException
{
if ( counter < items.size() - 1)
{
counter++;
return true;
}
return false;
}
@Override
public Object getFieldValue(JRField jrf) throws JRException
{
// Return the relevant field
}
}
Run Code Online (Sandbox Code Playgroud)
这样做的问题是它会遍历用户选择的主键并为每个主键运行查询。如果我可以只用一个动态查询来做到这一点,那就简单多了。
谢谢你的帮助!
要从 Java 设置参数,您必须将它们放入您的params对象中。
Map<String, Object> params = new HashMap<String, Object>();
params.put("paramName",value);
JasperReport report = JasperCompileManager.compileReport("path\\to\\jrxml");
JasperPrint print = JasperFillManager.fillReport(report, params, new ItemData(keys));
Run Code Online (Sandbox Code Playgroud)
然后在报告中使用它,如 $P{paramName}。请确保,当您在报告中声明参数具有相同的名称 ('paramName') 并且它的类是您的value对象的类时。
如果要使用 IN 子句,则必须使用 Jasper 提供的内置 SQL 子句函数。
格式是$X{IN, <column_name>, <parameter_name>}(在这种情况下,请确保仅使用参数名称,不使用 $P)。
因此,在您的情况下,查询将是:
SELECT * FROM StockInventory WHERE $X{IN,pk,paramName}
'paramName' 参数可以是 java.util.Collection 实例或 java.util.List 实例。
| 归档时间: |
|
| 查看次数: |
4502 次 |
| 最近记录: |