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。
*