我一直在努力模仿在 openerp 中为模块 Health GNU 找到的报告。在他们的报告文件夹中有一个报告.odt文件与openerp中的任何sxw报告非常相似,只有少数例外。例如,代替openERP的:
[[repeatIn(objects,'test')]]
我们有一个开始和结束标签,用于制作前一个示例:
<FOR EACH="TEST IN OBJECTS"> .... </FOR>
如何在传统的 sxw 报告中模仿以下内容:
<for each="case in test.critearea">
<if test="case.excluded==0">
#this在桌子
外面 ...values in table...
#table从这里
开始 </if>
<for>
匹配时基本上排除整行。
使用熟悉的语法(如 [[ case.excluded==False ]]
)不起作用。
tryton 报告系统基于 relatorio lib,并使用您发现的 odt/ods。 如果你想使用类似的东西,你必须使用Aeroo(以前是report_openoffice)。它与 RML 的东西不兼容。
这种方法比openerp的内部方法更理智,并且会大大提高您的"报告生产力"。您也可以考虑使用允许您在 HTML 中编写报告report_webkit。
第一个表格单元格中,这有效:[[((case.excluded == False) or removeParentNode('blockTable')) and '']][[case.name]]
虽然我仍然有兴趣知道是否有更合乎逻辑的方法而不是破坏整个创建的可块,特别是因为我将尝试弄清楚在删除父节点"块可"时如何不留下空行。
您可以循环访问由报表相关.py文件上定义的函数生成的列表。
只需在插件上查找示例,其中有很多,例如:
account/report/account_aged_partner_balance.rml: [ 重复输入(get_lines(数据["表单"]), "合作伙伴") ]]
由于[[...]]
的内容只是python代码,因此您可以在迭代之前使用列表推导来过滤掉内容。所以取而代之的是:
[[repeatIn(cases,'case')]]
试试这个:
[[repeatIn([c for c in cases where not case.excluded], 'case'])
或者你可以使用内置的过滤器():
[[repeatIn(filter(lambda c: not c.excluded, cases), 'case'])]]