我正在处理JR报告并使用iReport生成它们。
我正在为这项任务寻找解决方案:详细信息带必须有六条记录。例如,查询从数据库中获取 3 条记录,然后详细信息带将有 3 行,但我想将剩余的 3 行打印为空白行。
我怎样才能用iReport做到这一点?
我正在处理JR报告并使用iReport生成它们。
我正在为这项任务寻找解决方案:详细信息带必须有六条记录。例如,查询从数据库中获取 3 条记录,然后详细信息带将有 3 行,但我想将剩余的 3 行打印为空白行。
我怎样才能用iReport做到这一点?
我能想到的最好方法是让您的查询返回 6 行(或您设置的行数),那么 jasper 就不需要做任何不寻常的事情了。
这是一个示例,说明您如何使用 oracle 10 或更高版本执行此操作——我相信有更好的方法来执行此操作。
with gen_6
-- creates a table of 6 rows (generate series)
as (SELECT LEVEL as row_num
FROM dual
CONNECT BY LEVEL <= 6),
Your_Query as
-- your query here <BR>
(select SYSDATE, ROWNUM as row_num from dual where rownum <=6)<BR>
select *
from gen_6 left join your_query using (row_num)
order by row_num
供参考
您甚至不需要将“字段”row_num 添加到您的报告中即可。
将查询结果限制为 6,然后像往常一样,将字段放在详细信息带中
然后,在摘要中,创建三行字段。
1 | || || || |
2 | || || || |
3 | || || || |
在Print When Expression
第一行的所有字段中
new Boolean($V{REPORT_COUNT}.intValue() == 3 || $V{REPORT_COUNT}.intValue() == 4 || $V{REPORT_COUNT}.intValue() == 5)
在Print When Expression
第二行的所有字段中
new Boolean($V{REPORT_COUNT}.intValue() == 3 || $V{REPORT_COUNT}.intValue() == 4)
在Print When Expression
第三行的所有字段中
new Boolean($V{REPORT_COUNT}.intValue() == 3)
第一行字段的位置应位于摘要带的最顶部,以便字段看起来好像它们是详细信息部分的一部分。
最简单的方法:您只需要在详细信息带上包含 N 个文本字段即可复制数据源中的记录数或硬编码所需的数字。
例子:
Detail Band
----------------
| FIELD_X
| FIELD_X
----------------
在这种情况下,您将从 DB 收到 3 条记录并打印 6 个值。
另一种选择:使用您需要的规则创建两个子报表,并将其包含在详细信息页面中,一个然后另一个在另一行中。
例子:
Detail Band
----------------
| SUBREPORT_1
| SUBREPORT_2
----------------
在这种情况下,您将从 DB 收到 3 条记录,并将在每个子报表中打印 3 个值,因此在第二个子报表中,您可以将行保留为空白或任何其他规则。
业务示例: 此方法可用于需要为特定贷方或借方分配不同帐户的财务接口。