如何使用odoo11.0中Report模块进行输出打印?

最近一直在搞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>
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值