如何在报告中进行拆分和小计?

时间:2014-02-14 08:46:22

标签: perl latex template-toolkit

我需要使用perl + Template Toookit和LaTeX生成业务报告。

事情进展顺利,但每当字段发生变化时,我都会遇到休息(例如分页符或特殊标题)和小计的问题。

因此,例如,每当字段“类别”发生变化时,我都需要为该类别总计销售额,并显示另一个类别列表正在开始的标题;然后在字段“组”时执行相同的操作 - 增加了对“组”由类别组成的兴趣,因此这两个事物应该嵌套。

我猜任何使用Microsoft Access(或可能是任何其他商业报告应用程序)构建报告的人都应该熟悉这个问题。

理想情况下,这将在元级别上解决,因此我不必每次都重建代码,而只是指定哪些字段应该生成中断或小计。

我(自愿)受限于LaTeX和TT:LaTeX因为它对排版的控制,以及生成自定义图形和TT(或其他任何在perl中工作的东西)的可能性,因为学习曲线。

1 个答案:

答案 0 :(得分:0)

TT中没有内置的小计功能,但您可以将数据放入Data::Table对象中,这样您就可以在“元”级别处理小计,正如您所说。 / p>

根据所涉及的列数,创建本地哈希以维持运行总计可能同样简单: NB:未经测试,仅示例代码

[%-
MACRO printrow(rowtype, line) BLOCK;
    # however you print the row as LaTeX
    # rowtype is 'row', 'subtotal' or 'grandtotal' for formatting purposes
END;

SET sumcols = [ 'col3', 'col4', 'col5' ]; # cols to be accumulated
SET s_tot = {}; SET g_tot = {};
FOREACH i IN sumcols;
    SET s_tot.$i = 0; # initialise
    SET g_tot.$i = 0;
END;

FOREACH row IN data;
    IF s_tot.col2 AND s_tot.col2 <> row.col2; # start of new group
        printrow('subtotal', s_tot);
        FOREACH i IN sumcols;
            SET s_tot.$i = 0; #re-init
        END;
    END;
    printrow('row', row);
    SET s_tot.col2 = row.col2; # keep track of group level

    FOREACH i IN sumcols;
        SET s_tot.$i = s_tot.$i + row.$i;
        SET g_tot.$i = g_tot.$i + row.$i;
    END;
END;
printrow('grandtotal', g_tot);
-%]

当然,如果你有超过几个分组级别,这可能会非常混乱。您可以使s_tot一组哈希值来管理每个级别,以避免对级别进行硬编码。正如他们所说,这只是读者的练习。