Odoo11新增列印選項及自定義報表
今天研究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也可生效。