程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Python >> 深入解析OpenERP的報表開發機制

深入解析OpenERP的報表開發機制

編輯:Python
1) OpenERP報表的基本運行機制
OpenERP報表的一般定義語法是:
<report id="c2c_demo_report_x" string="C2C Demo Report" model="hr.holidays"
name="sandbox_c2c_reporting_tools" header="False"/>

這個定義的含義是,在對象hr.holidays上增加報表操作(model="hr.holidays"),該報表操作的顯示字符是C2C Demo Report(string="C2C Demo Report"),當用戶點擊該操作字符(C2C Demo Report),系統調用名為sandbox_c2c_reporting_tools(name="sandbox_c2c_reporting_tools")的Services,該Services返回報表文件(PDF或其他格式文件)。
因此,理解OpenERP報表機制的核心是,理解報表Services機制。

2) OpenERP的報表Service
OpenERP的報表Service的基本接口定義在文件:openerp-server-6.0.3binreportinterface.py,期定義如下:
report_int(netsvc.Service)
__init__(self, name, audience='*')
create(self, cr, uid, ids, datas, context=None)

init方法中最重要的參數是name,該參數是Service Name,其格式是"report.xxx", xxx 必須和報表定義時候的(name="sandbox_c2c_reporting_tools")一致,系統是通過該名字找到該Service。
create方法中,最重要的參數是ids,該參數是報表操作所在的畫面上,選定的對象的id列表。通常,系統會為ids中的每一個對象出一個報表。datas參數通常用於Wizard的情況,即先彈出Wizard畫面,用戶輸入一些數據,點擊按鈕,系統再輸出報表文件。在這種情況,datas參數裡保存著用戶在Wizard畫面上輸入的數據。
顯然,系統的內部動作是,用戶點擊報表動作,系統根據name="sandbox_c2c_reporting_tools"找到相應Service,調用Service的Create方法,返回報表文件。Create方法的返回值格式是:(report_doc,mimetype)。例如,如果返回pdf報表,返回值是(pdf_doc,'pdf')。

3) RML報表
如果直接繼承接口report_int,編寫create方法生成pdf文檔,代碼復雜,工作量大。系統提供了RML格式報表,用於簡化pdf報表開發。其基本原理是,開發RML格式文檔,系統的Create方法讀取rml文件,渲染成pdf文檔,輸出。相關接口如下:
report_rml(report_int)
__init__(self, name, table, tmpl, xsl)
create(self, cr, uid, ids, datas, context)

report_sxw(report_rml)
__init__(self, name, table, rml=False, parser=rml_parse, header='external', store=False)
create(self, cr, uid, ids, data, context=None)

這兩個派生Class中,create方法的參數沒有變化,init方法增加了一些參數,說明如下:
table: 報表關聯的數據對象,渲染rml時候需要調用該對象取得數據。
rml:RML文件路徑及名稱,系統需要讀取該文件渲染成PDF報表。
parser:渲染器,系統的實際做法是,在create方法中調用渲染器的有關方法,將rml渲染成pdf。用戶可以開發自己的渲染器,用於將rml渲染成其他格式,如html、txt等,實際上,系統已經提供了html、txt等的渲染器。

因此,開發rml格式的報表時候,通常只需要開發自己的渲染器(parser),不需要開發report_int。 *
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved