【发布时间】:2014-04-23 15:49:32
【问题描述】:
我正在使用 Jasper Reports 和 Java 来创建一些报告。在界面中,用户选择 1 个或多个项目,并为每个项目生成一个报告。现在,我有疑问:
SELECT * FROM StockInventory
这是在 jrxml 文件中。但是,通过我的应用程序运行它,它将为表中的每个项目创建一个报告。我想要的是:
SELECT * FROM StockInventory WHERE pk IN (?...)
其中“?...”是用户选择的项目的键。所以,不仅参数是动态的,参数的数量也是动态的。
我的问题是,我不知道如何在 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));
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
}
}
这样做的问题在于,它会遍历用户选择的主键并为每个主键运行查询。如果我可以只用一个动态查询来做到这一点,那就更简单了。
感谢您的帮助!
【问题讨论】:
-
如果您想动态传递查询,我建议您尝试 DynamicReports。它是一个基于 JasperReports 的 java 库,这里有一个例子:mkyong.com/java/…
-
@AlexK 这个问题很有用,但除非我遗漏了什么,否则它不会解释如何在 Java 中实际访问和设置这些参数。
标签: java jasper-reports