我需要使用perl + Template Toookit和LaTeX生成业务报告。
事情进展顺利,但每当字段发生变化时,我都会遇到休息(例如分页符或特殊标题)和小计的问题。
因此,例如,每当字段“类别”发生变化时,我都需要为该类别总计销售额,并显示另一个类别列表正在开始的标题;然后在字段“组”时执行相同的操作 - 增加了对“组”由类别组成的兴趣,因此这两个事物应该嵌套。
我猜任何使用Microsoft Access(或可能是任何其他商业报告应用程序)构建报告的人都应该熟悉这个问题。
理想情况下,这将在元级别上解决,因此我不必每次都重建代码,而只是指定哪些字段应该生成中断或小计。
我(自愿)受限于LaTeX和TT:LaTeX因为它对排版的控制,以及生成自定义图形和TT(或其他任何在perl中工作的东西)的可能性,因为学习曲线。
答案 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
一组哈希值来管理每个级别,以避免对级别进行硬编码。正如他们所说,这只是读者的练习。