BIRT技术问题:如何将同一数据集不同行的数据插入单个动态文本?
按指定顺序调用数据集生成动态文本
要按固定顺序(父亲→母亲→孩子)生成目标文本,核心是按角色精准定位对应的数据行,再拼接你已经掌握的单个人信息格式。以下是具体实现方式:
直接拼接写法
如果使用支持Groovy表达式的报表工具(如JasperReports),可以直接通过数据集的find方法按角色查找行,再取出字段值:
Genetic relationship between <VALUE-OF>dataSet.find{it["role"] == "Father"}["title"]</VALUE-OF> <VALUE-OF>dataSet.find{it["role"] == "Father"}["firstname"]</VALUE-OF> <VALUE-OF>dataSet.find{it["role"] == "Father"}["surname"]</VALUE-OF>, <VALUE-OF>dataSet.find{it["role"] == "Mother"}["title"]</VALUE-OF> <VALUE-OF>dataSet.find{it["role"] == "Mother"}["firstname"]</VALUE-OF> <VALUE-OF>dataSet.find{it["role"] == "Mother"}["surname"]</VALUE-OF> and <VALUE-OF>dataSet.find{it["role"] == "Child"}["title"]</VALUE-OF> <VALUE-OF>dataSet.find{it["role"] == "Child"}["firstname"]</VALUE-OF> <VALUE-OF>dataSet.find{it["role"] == "Child"}["surname"]</VALUE-OF> is...
注:把代码中的dataSet替换成你实际使用的数据集名称。
简洁写法(定义变量复用)
如果觉得重复代码太多,可以先定义变量存储各角色的数据行,再引用字段:
<VALUE-OF>def father = dataSet.find{it["role"] == "Father"}</VALUE-OF> <VALUE-OF>def mother = dataSet.find{it["role"] == "Mother"}</VALUE-OF> <VALUE-OF>def child = dataSet.find{it["role"] == "Child"}</VALUE-OF> Genetic relationship between <VALUE-OF>father["title"]</VALUE-OF> <VALUE-OF>father["firstname"]</VALUE-OF> <VALUE-OF>father["surname"]</VALUE-OF>, <VALUE-OF>mother["title"]</VALUE-OF> <VALUE-OF>mother["firstname"]</VALUE-OF> <VALUE-OF>mother["surname"]</VALUE-OF> and <VALUE-OF>child["title"]</VALUE-OF> <VALUE-OF>child["firstname"]</VALUE-OF> <VALUE-OF>child["surname"]</VALUE-OF> is...
替代方案(无Groovy支持时)
如果你的工具不支持Groovy表达式,可以给三个角色分别创建筛选后的子数据集(比如筛选条件为role = 'Father'),然后直接引用对应子数据集的字段值,写法和单个人的格式一致,只是分别引用不同子数据集的字段即可。
内容的提问来源于stack exchange,提问作者Khongthon P.
相关产品推荐
相关产品推荐

