跳转至内容
  • 版块
  • 标签
  • 热门
  • 用户
  • 群组
皮肤
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • 默认(Flatly)
  • 不使用皮肤
折叠

Odoo 中文社区

  1. 主页
  2. 版块
  3. Odoo 开发与实施交流
  4. 深入解析OpenERP的报表开发机制

深入解析OpenERP的报表开发机制

已定时 已固定 已锁定 已移动 Odoo 开发与实施交流
4 帖子 3 发布者 5.2k 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • N 离线
    N 离线
    NewZN
    写于 最后由 编辑
    #1


    1) OpenERP报表的基本运行机制
        OpenERP报表的一般定义语法是:
          <report id="c2c_demo_report_x" string="C2C Demo Report" model="hr.holidays"
              name="sandbox_c2c_reporting_tools" auto="False" 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 条回复 最后回复
    0
    • C 离线
      C 离线
      ccdos
      写于 最后由 编辑
      #2

      mark 先

      1 条回复 最后回复
      0
      • A 离线
        A 离线
        alangwansui
        写于 最后由 编辑
        #3

        在模块中添加一笔 report 记录
        <?xml version="1.0"?>
        <terp>
        <data>
        <report id="sale_category_print"
        string="Sales Orders By Categories"
        model="sale.order"
        name="sale_category.print"
        rml="sale_category/report/sale_category_report.rml"
        menu="True"
        auto="False"/>
        </data>
        </terp>

        id :
        string:
        model:报表渲染对象
        rml  rml文件路径,路径以本模块的路径开始
        menu  True or False  是否在客户端上显示菜单, False 一般用语Wizard 向导是,不需要菜单,
        auto  是否利用缺省方法分析 .RML文件
        name 报表名称    (report_sxw.report_sxw 中的 第一个参数 去掉 ‘report.’) 

        ==================
        sxw2rml  文件
        open用的使用的报表渲染文件,.rml。可由 openoffice 的.sxw 文件转换而来
        具体方法

        手动转换方法 
        要求文件在同一个目录  openerp_sxw2rml.py  ,  normalized_oo2rml.xsl  , name.sxw
        在命令行中  : python openerp_sxw2rml.py  order.sxw  > order.rml


        =================Server PDF Output
        报表分析器
        from report import report_sxw
        import time
        class order(report_sxw.rml_parse):
                        def init(self, cr, uid, name, context):
                                        super(order, self).init(cr, uid, name, context)
                                        self.localcontext.update({
                                        ’time’: time,
                        })
        report_sxw.report_sxw(’report.sale.order’, ’sale.order’, ’addons/sale/report/order.rml’, parser=order, header=True)

        report_sxw.report_sxw参数分别为

        1:报表名称  ('report.'  +  ' xml中定义的name' )
        2:报表使用的对象
        3:rml文件路径 addons/
        4:报表提取方法 , 即为 报表分析器的class名            ( 缺省值  parser=order)
        5: 是否增加公司表头

        ###############sxw模板的构造方法
        数据用[[  ]] 中的python代码填充

        可以使用的对象
        object  报表使用的对象
        data    来自 wizard
        time    time模块
        user    res.user

        方法
        setlang('fr')
        repeatIn(list,varname) 
        setTag
        removeParentNode

        1 条回复 最后回复
        0

        • 登录

        • 没有帐号? 注册

        • 登录或注册以进行搜索。
        • 第一个帖子
          最后一个帖子
        0
        • 版块
        • 标签
        • 热门
        • 用户
        • 群组