今天研究Odoo中选中一条数据进行打印,如何创建对应的打印按钮,以及点击相应的按钮显示相应的要打印的界面,具体如下图所示:
首先需要在模块中创建report目录,例如官方文件所示:
其实点击看看官方的模块式怎么写的就大概明白怎么回事了。这里我用自己的模块大概说一下,也方便以后忘记了可以随时回来看到,report目录结构都基本类似。在bn_oracle_report_pzqweb.py中写了个测试的
其中get_report_values()方法是必须写的,因为在对应的xml文件中需要用到报表所需的数据,方法中的docids就是你选择需要打印的数据的id集合。
用self.env.cr.execute()这个方法执行了原生的SQL语句。
return self._cr.dictfetchall() #返回字典型结果集。
return self._cr.fetchall() #返回列表型结果集。
bn_oracle_report_pzqweb.xml中
<!--测试-->
<report
id="action_bn_oracle_report_pzqweb3"
string="凭证报表测试"
model="bn.oracle.interface.pz.master"
report_type="qweb-html"
name="bn_oracle.report03"
file="bn_oracle.report03"/>
string: 在打印按钮那里的显示名称
id:外id标识
name: 完整主模板名称 模块名.主板模名称 用于管理和调用
file: 完整模板文件名 模块名.模板文件名 用于更好地关联模板
model:相关的模型显示在那个模块进行打印报表 通常在各视图中的打印那里会出现
report_type: 报表类型 是 qweb-pdf 或 qweb-html
还要有一个对应的报表模板,即点击凭证报表测试后显示的要打印的界面。可以看到其中用到head.xxx,lines_data.xxx都是同过之前py文件获得并返回的数据。
<!--测试-->
<template id="report03">
<t t-call="web.html_container">
<t t-call="web.external_layout">
<div class="page">
<table width="80%">
<tbody>
<tr>
<td>凭证编号:
<t t-esc="heard.pz_sequence"/>
</td>
<td>日期:
<t t-esc="heard.throw_date" t-options='{"widget": "date"}'/>
</td>
</tr>
<tr>
<td>Oracle凭证号:
<t t-esc="heard.strjournalname"/>
</td>
<td>抛转状态:
<t t-esc="heard.oracle_state"/>
</td>
</tr>
</tbody>
</table>
<br/>
<table class="table table-condensed" width="100%">
<thead>
<th width="15%">科目</th>
<th width="12%">部门</th>
<th width="10%">人员</th>
<th width="8%">项目</th>
<th width="5%">借方</th>
<th width="5%">贷方</th>
<th width="45%">摘要</th>
</thead>
<tbody>
<t t-foreach="lines_data" t-as="o">
<tr>
<td>
<t t-esc="o[2]"/>
</td>
<td>
<t t-esc="o[3]"/>
</td>
<td>
<t t-esc="o[4]"/>
</td>
<td>
<t t-esc="o[5]"/>
</td>
<td>
<t t-esc="o[6]" t-options='{"widget": "float", "precision": 2}'/>
</td>
<td>
<t t-esc="o[7]" t-options='{"widget": "float", "precision": 2}'/>
</td>
<td>
<t t-esc="o[8]"/>
</td>
</tr>
</t>
<tr>
<td>
</td>
<td>
<strong>合 计:</strong>
</td>
<td>
</td>
<td>
</td>
<td>
<strong>
<t t-esc="sum(line[6] for line in lines_data)"
t-options='{"widget": "float", "precision": 2}'/>
</strong>
</td>
<td>
<strong>
<t t-esc="sum(line[7] for line in lines_data)"
t-options='{"widget": "float", "precision": 2}'/>
</strong>
</td>
<td>
</td>
</tr>
</tbody>
</table>
</div>
</t>
</t>
</template>
到这里基本就ok了,可能写的比较模糊,刚开始写博客,有什么疑问可以大家讨论~
对了,还可以设置打印的纸张,这个可以再odoo运行后用管理员登录,然后选择激活开发者模式,在设置中报告中设置。
可以在纸张类型中选择想打印的纸张格式,纸张格式也可以用自带的也可以自己设置,但只有在报表类型选择为PDF时才显示,html类型想用A4横向的话可以先切换为PDF类型,选择了对应的纸张格式后再把报表类型改回html也可生效。