深入理解报表运行机制

原文:http://blog.sina.com.cn/s/blog_57ded94e01014ppd.html

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.3\bin\report\interface.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. CCNA网络工程师学习进程(5)路由器和交换机的登录安全配置和vlan划分
  2. 实现VS2010整合NUnit进行单元测试(转载)
  3. [tp3.2.1]查询(2)
  4. Programming Assignment 2: Randomized Queues and Deques
  5. Android Preview显示
  6. lintcode:next permutation下一个排列
  7. Android 自定义控件-TextView
  8. web api 开发之 filter
  9. xhEditor struts2实现图片上传
  10. spring实现读写分离
  11. 可视化之Earth NullSchool
  12. chrome 浏览器最小字体为12px 的解决办法
  13. 【C/C++】C++11 Lambda
  14. 【Git学习二】深入了解git checkout命令
  15. Spring boot+Thymeleaf+easyui集成:js创建组件页面报错
  16. GoLang函数参数的传递练习
  17. BUGList
  18. LibHaru编译使用
  19. activeMQ安全配置及常见问题解决
  20. convertView&amp;setTag方法的一点理解

热门文章

  1. Android小项目之九 两种上下文的区别
  2. Java Script基础(十二) 正则表达式
  3. linux安装mysql出现Could NOT find Curses (missing CURSES_LIBRARY CURSES_INCLUDE_PATH)解决方法
  4. XE5 Android 开发数据访问手机端 解决乱码的办法
  5. 转: https 单向双向认证说明_数字证书, 数字签名, SSL(TLS) , SASL
  6. IDG合伙人李丰:O2O中的C2C蕴藏巨大商机
  7. C# 线程抛异常
  8. JavaScript之点击文字放大
  9. C#调用SSIS包及读取DataReader目标
  10. JS验证框架(exValidation)