【发布时间】:2016-10-31 21:09:50
【问题描述】:
我正在使用 Birt 列表元素从左到右显示我的数据。 (参见this question 作为参考)。例如。详细列出具有 Grid 且网格设置为内联的元素。
我现在面临的问题是,网格中的不同行没有从左到右对齐(可能是由于某些行在某些字段中具有空值)。如何强制 BIRT 正确对齐?
编辑:
对于超过 1 行的较长文本来说,这也是一个问题。换行 / 多行应该由该“输出行”中的所有列表元素反映出来。
【问题讨论】:
我正在使用 Birt 列表元素从左到右显示我的数据。 (参见this question 作为参考)。例如。详细列出具有 Grid 且网格设置为内联的元素。
我现在面临的问题是,网格中的不同行没有从左到右对齐(可能是由于某些行在某些字段中具有空值)。如何强制 BIRT 正确对齐?
编辑:
对于超过 1 行的较长文本来说,这也是一个问题。换行 / 多行应该由该“输出行”中的所有列表元素反映出来。
【问题讨论】:
不幸的是,在一般情况下,我看不到任何轻松的机会 - 也就是说,如果事先不知道记录的数量,那么您需要不止一行:
student1 student2 student3
student4 student5
我们称这些线为“主线”。一条主线最多可包含 3 条记录。在您的情况下,数字 3 可能不同,但我们可以假设它是一个常数,因为(至少对于 PDF 报告而言)纸张宽度受到限制。
一个可能的解决方案可以像这样工作:
在您的数据集中,为每一行添加两列:MAIN_LINE_NUM 和 COLUMN_NUM,其中含义很明显。例如,这可以通过纯 SQL 使用分析函数来完成(未经测试):
select ...,
trunc((row_number() over (order by ...whatever...) - 1) / 3) + 1 as MAIN_LINE_NUM,
mod(row_number() over (order by ...whatever...) - 1), 3) +1 as COLUMN_NUM
from ...
order by ...whatever... -- The order must be the same as above.
现在您知道每条记录应该去哪里了。
下一个任务是将结果集转换为每条记录如下所示的形式(例如,假设每个学生有 3 个属性 STUDENT_ID、NAME、ADDRESS):
MAIN_LINE
STUDENT_ID_1
NAME_1
ADDRESS_1
STUDENT_ID_2
NAME_2
ADDRESS_2
STUDENT_ID_3
NAME_3
ADDRESS_3
你明白了……
实现这一点的 SQL 技巧是人们应该知道的。
我将以 STUDENT_ID_1、STUDENT_ID_2 和 NAME_1 列为例:
with my_data as
( ... the query shown above including MAIN_LINE_NUM and COLUMN_NUM ...
)
select MAIN_LINE_NUM,
max(case when COLUMN_NUM=1 then STUDENT_ID else null end) as STUDENT_ID_1,
max(case when COLUMN_NUM=2 then STUDENT_ID else null end) as STUDENT_ID_2,
...
max(case when COLUMN_NUM=1 then NAME else null end) as NAME_1,
...
from my_data
group by MAIN_LINE_NUM
order by MAIN_LINE_NUM
如您所见,如果您需要很多不同的列,这将非常笨拙。
另一方面,这使得输出更容易。
为您的数据集创建一个表项,包含 3 列(用于 1、2、3)。最好不要将数据集拖到布局中。相反,请使用“插入元素”上下文菜单。
每个列(STUDENT_ID、NAME、ADDRESS)都需要一个详细信息行。因此,再添加两个详细信息行(默认为一个详细信息行)。
如果您愿意,可以手动添加标题标签,如果不需要,请删除标题行(这是我的假设)。
删除页脚行,因为您可能不需要它。
将列拖到表格中的相应位置。
表格项现在应该是这样的(数据项):
+--------------+--------------+-------------+
+ STUDENT_ID_1 | STUDENT_ID_2 | STUDENT_ID3 |
+--------------+--------------+-------------+
+ NAME_1 | NAME_2 | NAME_3 |
+--------------+--------------+-------------+
+ ADDRESS_1 | ADDRESS_2 | ADDRESS_3 |
+--------------+--------------+-------------+
就是这样!
这是 BIRT 与其他工具(例如Oracle Reports - 请原谅我的 Klatchian。
【讨论】: