您现在的位置是:首页 > 文章详情

Odoo自定义报表 - 浅析

日期:2018-07-09点击:461

大家好,

在Odoo(原OpenERP 开源ERP)架构中,有自定义报表开发【Custom Report Engine】这一功能,但无论在海外还是国内的网站上很难找到相关的解释与介绍。所以,我们整理了相关开发介绍至本博文中。

首先,需要讲解的是 Custom Report Engine 的机制。Odoo自定义报表架构是通过读取模块中report目录下的model文件和report目录下的context文件。来获取自定义报表所需的参数,系统通过这些基本参数,渲染出我们平日里所看到的报表。

Financial Report 财务报表

  • 通过简单地(XML)进行编辑
  • 只可以对aml对象进行控制
  • 只允许对一段时间内的数据进行求和

Custom Report 自定义财务报表

  • 更加灵活
  • 通过Python进行开发

那么,这些参数有哪些呐?

**> @api.model
def get_title(self):
**
说明: 此项目用以定义自定义报表的抬头,主要用途是在系统前端显示自定义报表名称,方便用户查看。
**> @api.model
def get_name(self):
**
说明: 此项目用以定义自定义报表的名称,但此名称将不会显示在前端视图上,它主要的功能是定义了此自定义报表的专属名称,方便之后的Context进行抓取和使用。同时,其他方法,也可以通过叫此名称来调用此模板。

**> @api.model
def get_template(self):
**
说明:此项目用以定义自定义报表所需要使用的模板。因OpenERP原生架构中,自带3大模板,可以渲染出相应的基本视图。其意义在于,方便开发者减少代码编写量。很多,重复的代码,可以直接通过继承的方式获得,而无需全部重新编写。这也是OpenERP(Odoo)架构中继承机制的完美应用。

**> @api.model
def get_report_type(self):
**
说明:此项用以定义报表的类型
(例如:date_range (Profit & Loss), no_date_range (Balance Sheet), date_range_extended (Aged Partner Balances), date_range_cash (Cash Method by default), no_comparison (General Ledger), 当然,您可以添加自己的类型!)
这里定义的报表类型,对报表的意义非常大。data_range说明,此报表可以使用日期期间工具,对报表内的数据进行过滤、筛选、求和等。如果,选择date_range_cash,意味着,报表中的数据将仅仅统计现金账户上的数据,而不会抓取全局数据。同时,现在财务记账机制中有现金收付制和权责发生制,通过定义不同的类型,来实现基于两种制度的报表数据统计计算。

*
*> @api.model
def get_lines(self, context_id, line_id=None):
**
在展开一行时使用Line_ID参数。如果设置了Line_ID,则该方法将返回只有对应于此Line_ID及其域的线。此方法将行返回为字典列表。每个字典对应于一行。在显示时,这些行会与它们需要的顺序相同。

每一行的字典,需要包含以下项目:
id : 所以,它可以为footnotes, unfolding,提供参考,同时如果有动作, active_id 也需要在这里定义.
name : 需要显示的名称
type : 行的类型. 这里定义鼠标点击时,对此行的动作。(行所支持的类型,包含:account_id, line, tax_id, unreconciled_aml,bank_statement_id, partner_id, move_line_id, too_many, payment. 当然,您也可以自行添加)
footnotes : 如果为某一行的名称或者某处定义了 footnotes,(这个定义是来自报表context). 字典 {column_number : footnote_id}将会被自动创建,同时在报表上会显示出相应的footnote
unfoldable : 定义此行是否可以被展开
unfolded : 定义此行默认为已经展开(fetched from context) 仅当unfoldable = True可用
columns : 具有列值的列表.
level : 定义布局.
action_id : 当点击报表行时会触发的动作
colspan : 如果,你希望动作可以跨越多个列,请定义此项.

报告contexts是每个报告和每个用户一次性的临时模型。你需要为每个自定义报表创建一个新的contexts模型。它的接口应该是 :_inherit = "account.report.context.common"

**> def get_report_obj(self):
**

**> def get_columns_names(self):
@api.multi
**

**> def get_columns_types(self):
**
列的类型可以是 : text, date or number

在报告可用前,还有最后几个步骤:

1.修改模型account.report.context.common 中的字典方法 对象 .
_report_name_to_report_model() :
添加一项 name_of_your_report: name_of_the_model
_report_model_to_report_context() :
添加一项 name_of_the_model: name_of_the_context_model
last_step

2.您还可以自定义报表的搜索视图,并将其与您的需求相适应。

创建一个新的report_type 以满足您的需要,例如“'journal_filter'”。将字段添加到与要添加的筛选器对应的上下文(context)对象 。
例如:journal_id = fields.Many2one('account.journal') 通过为过滤器添加下拉菜单来修改模板 'accountReports.searchView'
template2

3.为报表创建客户端操作和菜单项

您可以添加自己的行类型,并更改它将出现在报表上的方式和内容。为此,继承和修改'account.report_financial_line' 模板. 若要触发动作,请使用 'oe-account-web-action'类并 :

使用data-res-model 和 data-active-id 来打开对象的表单视图.
使用 data-action-name来触发相应动作.
您可以选择添加dataforce-context 属性来强制当前context通过动作传递.
请使用data-action-id 来触发动作.

原文链接:https://yq.aliyun.com/articles/608814
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章