我们使用iReport使我们的客户能够为其产品生成打印目录。这个过程很有效。我们一直在努力解决的问题之一是如何为这些产品目录创建目录。
我决定使用Scriptlet功能来实现这一目标。请注意,我们的报告本质上都是主要详细信息,因为有一个主报告和一个子报告。
首先,我将scriptlet附加到主报告中,并尝试找到一种方法来收集详细报告中的所有产品编号,然后将该值传递回主报告。我无法弄清楚如何将详细信息返回到主报告,因为看起来您只能将子报告中的默认变量传递回主数据库(例如PAGE_NUMBER,COLUMN_NUMBER,PAGE_COUNT,COLUMN_COUNT)。
然后我尝试将Scriptlet附加到详细报告中。好吧,详细报告不知道主人在哪个页面上,所以我开始将主人的page_number传递给详细报告中的变量。这很有效,除了有时细节可能会溢出到主页的页码被跳过的程度。换句话说,如果子报表返回的页面数量超过两页,则下次调用子报表时将丢失页码。
那怎么办呢?
答案 0 :(得分:2)
我找到了一种有效的方法,类似于我上面的一个想法。首先,我无法获得子报表以将值返回到调用报表,然后使用来自scriptlet内部的getVariableValue检索该值。我一直在尝试,但我无法让它发挥作用。
相反,我选择了将相同的scriptlet附加到主节点和子节点的方法。 scriptlet有一个 class 变量,我可以在详细信息中保存我遇到的所有产品编号的运行记录,并且此代码位于scriptlet的afterDetailEval()方法内。请注意,我只希望此代码为子报表运行,因此我检查是否存在特定的详细信息字段,该字段永远不会为空。如果不是,我不运行代码。因此,当主报告调用该事件时,代码不会运行。
现在我从这个例子中学到的部分。该示例中令人钦佩的副作用编程是存在一行维1x1,其中包含对“Print When Expression”属性中的自定义scriptlet方法的调用。好主意啊!所以这个自定义方法无论如何返回false,并且该行永远不会打印。我在Page Footer band中做了同样的事情,这个方法从类变量中收集值,确定页面,并将结果存储在哈希中。然后它重置类变量。
在“报告摘要”栏中,我有另一行永不打印,调用另一种自定义方法。我在这里所做的只是遍历产品编号的地图,并显示每个页面出现的所有页面。完成!
答案 1 :(得分:1)
项目文件夹 jasperreports-x.x.x / demo / samples / tableofcontents 中有一个目录(带子报告)的示例。
还可以看到超链接示例。
超链接,主播和书签
JasperReports允许您创建向下钻取报告,其中介绍了目录 在您的文档中或使用称为超链接的特殊报告元素将查看器重定向到外部文档。