印上一个报告与碧玉元素的动态量报告
我有以下类型的结构与JasperReports的工作室麻烦打印/ 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实现这种结构吗?
它看起来像我确实需要至少两个报表的定义,如果我想要呈现的数据像它看起来像#being印上只是一列”。
这是因为会有两个完全不同的在这些列上打印的数据类型:操作是文本,图像是图像文件
所以基本上在我的DynamicJasper代码中,我只是迭代来自数据库的所有日期,并为每一天创建2个子报表,所以我最终会创建2 *(天数)子报表并将所有这些连接到我的报表生成器。 这听起来像是可以工作的东西吗?
确切的说,我想我会打印在相邻列图像的描述文本旁边的图像只是为了让事情变得更容易....
通常解决办法是这样的:“为了在一个循环的打印报告元件(一个或多个)的倍在一个报告中的任何量,放置ELE并且jasper会自动打印这组元素的次数,因为集合中的bean作为主数据源/ dataAdapter传递给报表。“
如果你觉得这是你的问题的答案,考虑接受它。 –
让2子报表(也许我会做的做它没有和使用分组),但与子报表答案更短,你已经在考虑它。
如果数据在数据库中..
在主报告执行查询发现,为了你的所有的日期,你喜欢。
乐队把日期字段格式化为你想要的。
日期字段下面包含一个子报表,将日期作为参数传递并在子报表中执行查询以查找该日期的所有操作。(在其细节带把行动领域)
以下措施报表包括一个子报告,传递日期参数,并在报表执行查询来查找在该日期的所有图像。 (在其细节带把映像路径和文本)
你做!没有使用任何JR:表成分...
为什么我会跟组办呢?因为这样我可以减少需要执行的查询的数量......但现在如何解决这个问题; )
编辑:OP添加评论说,他喜欢用豆类
豆会是这样的(我已删除setter方法来降低代码发布)
主要的bean 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;
}
}
的的Actio nBean
public class ActionBean {
private String action;
public String getAction() {
return action;
}
}
的ImageBean
这是几乎一样具有ActionBean的,所以没必要张贴代码。
步骤
- 填补了
DateBean
用行动和图像,并把它变成一个List<DateBean> datesBeans
- 传递一个
new JRBeanCollectionDataSource(datesBeans)
作为数据源到主报表。 - 详细带把场
$F{date}
与某些格式
日期(2015年1月1日)
- 下面,包括用于操作子报表并作为数据源传递给子报告
new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{actions})
注意$F{actions}
的类别需要为java.util.List
。 - 在子报表的细节区域放置$ F {action}(因此,所有在数据源中过去的动作都会自动打印,因为它们位于子报表的细节带中)。
-action1(文本) -action2。 。 。 -actionN
6-7。重复步骤4和5,但与ImageBean
在另一个子报表
-image1(图像文件) -image1文本(文本) -image2 -image2文本。 。 。 -imageN -imageN文本
而这就是它...
由于
$F{date}
和报表的都在detail
带输出将在主数据源因此new JRBeanCollectionDataSource(datesBeans)
重复我们所有的DateBean
的
谢谢,但有可能创建类似于java bean集合数据源的东西,因为我正在使用那些嵌入报表的直接sql查询来代替它们?然后我想我可以创建这样的东西:将DateBean的列表传递给主报表,每个DateBean包含两个列表:该日期的动作和图像。然后应该有办法以某种方式迭代这个DateBean列表,并且每次迭代都会将每个日期的动作和图像列表传递给我的子报表并一遍又一遍地打印出来,直到迭代完所有日期。似乎循环功能是我错过的东西。 – Vka
当然,作为子报表的数据源传递:new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($ F {actionList})其中actionList是es类的。 java.util.List和DateBean上你有公共列表> getActionList(){} –
再次感谢,但仍然有一件事我错过了:)现在我不知道如何让Jasper在循环中调用我的子报表。当然,我可以创建一个包含所有DateBean的数据集,但我不知道如何让Jasper为每个DateBean打印一组子报表(actions-table + image-table)。换一种说法。我不知道如何从主报表DateBean列表中提供我的子报表,并为每个dateBean创建一个子报表的新实例。做出这种连接是我现在正在处理的事情...... – Vka
不同意你这可以很容易地创建与贾斯珀报告,简单的使用iReport或其他视觉布局sw。当您不知道结构(需要动态决定)时,动态jasper非常有用,但是您已经证明您已经知道它。 –
谢谢,但我想我仍然需要一些关于如何继续使用iReport的线索(尽管我一直在使用JasperSoft的工作室)。如果只有一天的数据,我可以用Studio来做到这一点:创建一个报告,其中有两个表格/子报表用于当天的动作,一个用于在动作之后打印的n个图像。完美的一天。但是如果我还有几天的时间,我该怎么办?我无法为所有这些创建表/子报表。也许有一种方法可以将这些表格重用到下一个日期的数据并在prev日期之前打印出来? – Vka