Синтаксис отчетов openerp

Я изо всех сил пытался имитировать в openerp отчет, найденный в Tryton для модуля Health GNU. В их папке отчета лежит файл report.odt, очень похожий на любой отчет sxw, найденный в openerp, за некоторыми исключениями. Например, вместо openERP:

[[repeatIn(objects,'test')]]

у нас есть открывающий и закрывающий тег для создания предыдущего примера как такового:

<FOR EACH="TEST IN OBJECTS"> .... </FOR>

Как я могу имитировать следующее в традиционном отчете sxw:

<for each="case in test.critearea">
<if test="case.excluded==0"> #это вне таблицы
...values in table... #таблица начинается здесь
</if>
<for>
что фактически исключает всю строку при сопоставлении.
использование знакомого синтаксиса, такого как [[ case.excluded==False ]], не работает .


person 3a2roub    schedule 16.12.2012    source источник


Ответы (4)


Система отчетов tryton основана на relatorio lib и, как вы обнаружили, использует odt/ods. если вы хотите использовать что-то подобное, вы должны использовать Aeroo (ранее report_openoffice). Это не совместимо с материалом RML.

Этот подход гораздо более разумен, чем внутренний openerp, и значительно повысит вашу «производительность отчетов». Вы также можете использовать report_webkit, позволяющий создавать отчеты в формате HTML.

person simahawk    schedule 17.12.2012
comment
Спасибо, simahawk, я знаком с aeroo и report_webkit, но мы потратили много времени на создание и доработку отчета с использованием внутреннего подхода openerp, и на данный момент не можем внести это серьезное изменение в архитектуру отчетов. это хлопотно, но после того, как мы повозились с файлами sxw и rml, нам удалось получить то, что мы хотели. - person 3a2roub; 18.12.2012

в первой ячейке таблицы это сработало:
[[((case.excluded == False) or removeParentNode('blockTable')) and '']][[case.name]]
хотя мне все еще интересно узнать, есть ли более логичный способ вместо уничтожения всей созданной таблицы блокировки, тем более что я буду пытаться выяснить, как не оставлять пустую строку при удалении родительского узла 'blocktable'.

person 3a2roub    schedule 16.12.2012

Вы можете выполнить итерацию по списку, сгенерированному функцией, определенной в связанном файле .py отчета.

Просто поищите примеры в аддонах, их много, например:

account/report/account_aged_partner_balance.rml: [[ repeatIn(get_lines(data['form']), 'partner') ]]

person Mario    schedule 18.12.2012

Поскольку содержимое [[...]] – это просто код Python, вы можете использовать списковые включения для отфильтровать вещи перед итерацией. Итак, вместо этого:

[[repeatIn(cases,'case')]]

попробуй это:

[[repeatIn([c for c in cases where not case.excluded], 'case'])

или вы можете использовать встроенный filter():

[[repeatIn(filter(lambda c: not c.excluded, cases), 'case'])]]
person Phil Frost    schedule 30.12.2012