繁体   English   中英

使用Jasper报表在一个报表上打印动态元素数量

[英]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个子报表来做(也许我会在没有和使用分组的情况下完成),但是有了子报表,答案会更短,而您已经在考虑它了。

如果数据在数据库上。

  1. 在主报表中,执行查询以查找所需的所有日期。

  2. 在详细区域中,将日期字段设置为所需的格式。

  3. 日期下方的字段包含一个子报表,将日期作为参数传递,并在子报表中执行查询以查找该日期的所有操作。 (在其详细信息带放置动作字段中)

  4. 在动作子报表下方包括一个子报表,将日期作为参数传递,并在子报表中执行查询以查找该日期的所有图像。 (在其详细信息区域中放置了图像路径和文本)

大功告成!对任何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几乎相同,因此无需发布代码。

脚步

  1. 用操作和图像填充DateBean并将其放入List<DateBean> datesBeans
  2. new JRBeanCollectionDataSource(datesBeans)作为数据源传递到主报表。
  3. 在详细信息带中,将字段$F{date}为某些格式

日期(1.1.2015)

  1. 下面,包括动作的报表,并通过为数据源,以子报表new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{actions})注意类的$F{actions}必须java.util.List
  2. 将$ F {action}放在子报表的详细信息带中(因此,数据源中过去的所有操作都会自动打印,因为它们在子报表的详细信息带中)。

-action1(文本)-action2。 -actionN

6-7。 重复步骤4和5,但将ImageBean放在另一个子报表中

-image1(图像文件)-image1文本(文本)-image2-image2文本。 -imageN -imageN文字

就这样...

由于$F{date}和子报表位于detail区域中,因此将在主数据源上重复输出,因此将为所有DateBeannew JRBeanCollectionDataSource(datesBeans)

通常,解决方案是这样的:“为了在一个报告中循环打印报告元素任意次数,请将元素放置在报告的详细信息范围内,而jasper将自动打印这组元素作为主数据源/数据适配器,传递给该报表的集合中包含bean的次数是多少。”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM