最近一直在搞report这一块,大致的操作我已经搞懂了,现在就来总结一下对report的操作。
**
一、对于单个数据进行打印的操作。
**
比如对一条记录record进行打印,这是最最基本的打印,基本操作如下:
1、建立xxx_report.xml
<report
# report的id,唯一,有用
id="action_report_model_name"
#生成文件的名称
string="file_name"
# 当前需要打印的record所在的model
model="model_name"
# 报告类型html or pdf
report_type="qweb-html"
# 需要用到的某个模块的某个model
file="model所在文件夹名称.model"
# 模板名称,通常与file名称相同。
name="model所在文件夹名称.template_id"
/>
2、建立file所用的文件
这里需要创建report在写report模板的时候用到的数据,所以建立一个这样的类。
class AccountMoveReport(models.AbstractModel):
# 这里的名字很特别,使用'report.' odoo会自动识别它是报告用的模块
# 在report.xml中,你用到的文件名称要去掉'report.'
_name = 'report.l10n_cn_voucher.report_account_move'
@api.model
def render_html(self, docids, data=None):
report_obj = self.env['report']
report = report_obj._get_report_from_name('l10n_cn_voucher.report_account_move')
docs = self.env[report.model].browse(docids)
docargs = {
'doc_ids': docids,
'doc_model': report.model,
'docs': docs,
'paginate': self._paginate,
'account_name': self._get_account_name,
'account_partner': self._get_account_partner,
'exchange_rate': self._get_exchange_rate,
'unit_price': self._get_unit_price,
'rmb_format': self._rmb_format,
'rmb_upper': self._rmb_upper,
}
res = report_obj.render('l10n_cn_voucher.report_account_move', docargs)
return res
@api.model
def get_report_values(self, docids, data=None):
docs = self.env['account.move'].browse(docids)
docargs = {
'doc_ids': docids,
'doc_model': docs._name,
'docs': docs,
'paginate': self._paginate,
'account_name': self._get_account_name,
'account_partner': self._get_account_partner,
'exchange_rate': self._get_exchange_rate,
'unit_price': self._get_unit_price,
'rmb_format': self._rmb_format,
'rmb_upper': self._rmb_upper,
}
return docargs
实际上这两个函数都是继承过来的函数,复写他,render_html这个函数不太懂,get_report_values这个懂,
get_report_values函数就是为了提供给模板数据,例如’account_name’:self._get_account_name,前面是模板需要用的名字,后面是你自己写的函数。
3、接下来就是写report的template了:
这一块的具体用法在odoo的源代码中可以自己去仿写,使用html写的,自己还得对html学习。
<template id="report_account_move">
<t t-call="web.html_container">
<t t-call="web.internal_layout">
<div class="page">
</div>
</t>
</t>
</template>
二、对很多数据处理后生成报表:
比如我要生成一个科目汇总表,那么在左侧菜单栏中我要添加一个生成科目汇总表的menuitem,点击它就可以弹出wizard,选择要打印的数据,并打印。
1、建立wizard_model和wizard_view:
odoo自带了一般打印的模块,所以只要在此基础上添加和复写字段和功能就可以了。
class AccountingReportTemplate(models.TransientModel):
_inherit = "account.common.account.report"
_name = "account.summary.report.tem"
_description = "Accounting Report"
account_report = fields.Selection([('as', '科目汇总表')], string='类型', required=True, readonly=True,
default='as')
period_id = fields.Many2one('account.period', string='会计期间', required=True)
filter_cmp = fields.Selection([('filter_no', 'No Filters'), ('filter_date', 'Date')], string='Filter by',
required=True, default='filter_no')
date_from_cmp = fields.Date(string='Start Date')
date_to_cmp = fields.Date(string='End Date')
fiscalyear_id = fields.Many2one('account.fiscalyear', string='Fiscal Year', required=True)
def _print_report(self, data):
data = self.pre_print_report(data)
# 更新data值
data['form'].update(self.read(['account_report', 'company_id', 'fiscalyear_id', 'period_id', 'date_from_cmp', 'date_to_cmp', 'filter_cmp','target_move'])[0])
records = self.env[data['model']].browse(data.get('ids', []))
# 这里的操作就是调出report.xml中的id的名称,所以id名字很重要,data传到report_action中。
return self.env.ref('l10n_cn_acreport.action_report_summary_template').with_context(landscape=True).report_action(records, data=data)
wizard_view不写了,很简单。
2、写report,report.model,report_template
<report
id="action_report_summary_template"
model="account.summary.report.tem"
string="科目汇总表"
report_type="qweb-pdf"
<!--这里name和file的名称一定要相同!不然模板里不会触发调用report_model--!>
name="l10n_cn_acreport.account_summary_report_template"
file="l10n_cn_acreport.account_summary_report_template"
menu="False"
/>
report_model
class ReportFinancial(models.AbstractModel):
_name = 'report.l10n_cn_acreport.account_summary_report_template'
@api.model
def get_report_values(self, docids, data=None):
pass
report_template:
<template id="account_summary_report_template">
</template>