【问题标题】:BIRT: Align rows in list elementBIRT:对齐列表元素中的行
【发布时间】:2016-10-31 21:09:50
【问题描述】:

我正在使用 Birt 列表元素从左到右显示我的数据。 (参见this question 作为参考)。例如。详细列出具有 Grid 且网格设置为内联的元素。

我现在面临的问题是,网格中的不同行没有从左到右对齐(可能是由于某些行在某些字段中具有空值)。如何强制 BIRT 正确对齐?

编辑:

对于超过 1 行的较长文本来说,这也是一个问题。换行 / 多行应该由该“输出行”中的所有列表元素反映出来。

【问题讨论】:

    标签: list 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。

    【讨论】:

    • 感谢您的快速回复。我将不得不消化它。我的查询已经存在多个连接和子选择,所以必须看看如何应用它。
    • 这应该没关系。
    • 问题在于 1 列是图像...像这样它不会显示为图像。 (图像不是正确对齐的问题,它们具有固定大小)。
    • 您的查询是否按预期工作?例如。使用 Oracle,您可以在 SQL*Developer 中对其进行测试。
    • 我不是直接用 SQL 做 ti。我使用 KNIME,但是是的,我以您描述的方式获得了输出。我现在的问题是 BIRT 中的表将所有内容呈现为字符串(而不是应该是图像的 1 列)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 2013-01-28
    相关资源
    最近更新 更多