近期项目一个需求,需要对子表中多个相同id的记录只展示一个主表的记录。
效果如下:

一个PO、TITLE、ISBN(以下简称PO)代表一条子表的记录,而底下的N.W、MEAS、PLT SIZE(以下简称N.W)则是代表其主表的记录,已知,所有的PO都会有一个N.W,所以你在jasper的detail里书写是,每一条PO都会产生一个N.W依附在下面,就无法实现我们需要的多个相同id的PO只展示同一个N.W,那么这时我们就需要用到函数对子表的id进行缓存。
首先我们创建一个函数previous_mark_id,类型设置为Integer,或者你的id是string类型就设置为string,随后把Increment type选择为Report,计算类型不需要变动,默认即可

随后我们需要创建Group,选中判断是否为同一子表的id,点击下一步创建所需的Header或Footer


把mark_id传入该Group组内,那么该组就会通过这个mark_id进行缓存记录这一个mark_id,最后我们在组内创建需要的Field或StaticText,在Print When Expression中写入把这个mark_id与我们的函数previous_mark_id进行判断,当$F{mark_id}!=$V{previous_mark_id}时,子表所对应的主表记录即可展示,反之不出现。

新增:group组内若有计算属性,例:sum
则需要对该值进行组的分类,如果是group1组的需要把Reset type设置为Group1,否则这个计算属性值会一直累计到下一个组的记录中去。例如组1记录叠加到组2,组1&组2的记录叠加到组3.

还有不懂的可以问我哦,我是寻狗师。
文章讲述了如何在Jasper报告中处理子表需求,即针对具有相同ID的子表记录,只显示一个与其关联的主表记录。通过创建函数缓存mark_id,使用Group和PrintWhenExpression进行条件展示,以及处理Group内的计算属性,实现数据的精确呈现。
2255

被折叠的 条评论
为什么被折叠?



