我使用Birt列表元素从左到右显示我的数据。 (参见this question作为参考)。例如。列出具有网格的元素,并将网格设置为内联。
我现在面临的问题是,网格中的不同行没有从左到右对齐(可能是由于某些行在某些字段中具有空值)。如何强制BIRT正确对齐?
编辑:
对于包含超过1行的较长文本,这尤其是一个问题。包装/多行应该由输出"中的所有列表元素反映。
答案 0 :(得分:0)
不幸的是,我没有看到任何机会在通用案例中轻松完成 - 也就是说,如果事先知道记录数量,那么您需要不止一行:
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)。最好不要将数据集拖到布局中。相反,使用" Insert元素"上下文菜单。
每个列都需要一个明细行(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。