[英]Jasper Dynamic Reports - using jasper reports to generate a report getting errors
[英]Printing dynamic amount of elements on one report with Jasper reports
我在使用JasperReports Studio / DynamicJasper打印以下结构时遇到麻烦:
Date (1.1.2015)
-action1 (text)
-action2
.
.
.
-actionN
-image1 (image-file)
-image1 text (text)
-image2
-image2 text
.
.
.
-imageN
-imageN text
Date (2.1.2015)
-action1 (text)
-action2
.
.
.
-actionN
-image1 (image-file)
-image1 text (text)
-image2
-image2 text
.
.
.
-imageN
-imageN text
因此,最初的想法是打印出一天附上的所有动作和图像,然后在第二天执行相同的操作,直到数据库中没有日子为止。基本上所有这些数据都应作为一份报告打印出来,描述所有内容一天又一天地详细到各个波段。
基本上可以有任意几天,然后每天都有任意数量的动作和图像。 最好将所有这些内容打印出来,就像只有一列一样:首先是动作列表,然后是动作列表正下方的图像列表。
最初,我试图实现这个Jasper Studio,因为这是我迄今为止用于创建的所有其他报告的工具。
很快,我意识到,至少就我所知,似乎无法用Studio创建这种结构。
基本上,问题在于似乎没有办法向Studio创建的报表中添加动态数量的表。
因此,这就是为什么我开始研究DynamicJasper的原因。
如果我错了,请随时纠正我,但是可以通过使用DynamicJasper的子报表功能来通过DynamicJasper实现这种结构吗?
如果我希望像这样显示数据那样看起来像##只打印在一列上,那么我肯定至少需要两个子报表定义。
这是因为在这些列上将打印两种完全不同的数据类型:操作是文本,图像是图像文件。
因此,基本上,在我的DynamicJasper代码中,我将迭代所有来自数据库的日期,并每天创建2个子报表,这样我最终将创建2 *(天数)子报表,并将所有这些连接到我的reportbuilder中。 这听起来像可行的东西吗?
确切地说,我想我会在图像旁边的相邻列上打印图像的描述文本,以使事情变得更容易。
让我们用2个子报表来做(也许我会在没有和使用分组的情况下完成),但是有了子报表,答案会更短,而您已经在考虑它了。
如果数据在数据库上。
在主报表中,执行查询以查找所需的所有日期。
在详细区域中,将日期字段设置为所需的格式。
日期下方的字段包含一个子报表,将日期作为参数传递,并在子报表中执行查询以查找该日期的所有操作。 (在其详细信息带放置动作字段中)
在动作子报表下方包括一个子报表,将日期作为参数传递,并在子报表中执行查询以查找该日期的所有图像。 (在其详细信息区域中放置了图像路径和文本)
大功告成!对任何jr:table组件都不用...
我为什么要用分组呢?,因为这样我可以减少需要执行的查询数量...但是现在如何解决呢? )
编辑:OP添加了他喜欢使用bean的注释
Bean将是这样的(我已删除了setter以减少发布的代码)
主豆DateBean
public class DateBean {
private Date date;
private List<ActionBean> actions;
private List<ImageBean> images;
public Date getDate() {
return date;
}
public List<ActionBean> getActions() {
return actions;
}
public List<ImageBean> getImages() {
return images;
}
}
动作豆
public class ActionBean {
private String action;
public String getAction() {
return action;
}
}
ImageBean
这与ActionBean几乎相同,因此无需发布代码。
脚步
DateBean
并将其放入List<DateBean> datesBeans
new JRBeanCollectionDataSource(datesBeans)
作为数据源传递到主报表。 $F{date}
为某些格式 日期(1.1.2015)
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{actions})
注意类的$F{actions}
必须java.util.List
。 -action1(文本)-action2。 。 。 -actionN
6-7。 重复步骤4和5,但将ImageBean
放在另一个子报表中
-image1(图像文件)-image1文本(文本)-image2-image2文本。 。 。 -imageN -imageN文字
就这样...
由于
$F{date}
和子报表位于detail
区域中,因此将在主数据源上重复输出,因此将为所有DateBean
的new JRBeanCollectionDataSource(datesBeans)
通常,解决方案是这样的:“为了在一个报告中循环打印报告元素任意次数,请将元素放置在报告的详细信息范围内,而jasper将自动打印这组元素作为主数据源/数据适配器,传递给该报表的集合中包含bean的次数是多少。”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.