zoukankan      html  css  js  c++  java
  • openerp学习笔记 统计、分析、报表(过滤条件向导、分组报表、图形分析、比率计算、追加视图排序)

    待解决:图形中当改变分组时,图例不正确
                
    存储比率计算时,分组合计不正确

    wizard:过滤条件向导,用于输入过滤条件

    wizard/sale_chart.py

     # -*- coding: utf-8 -*-
    from openerp.osv import fields, osv
    import datetime

    class dispatch_sale_chart(osv.osv_memory):
        _name = "dispatch.sale.chart"
        _description = u"产品报表向导"
       
        def _get_date_from(self, cr, uid, context=None):
            """Return default date_from value"""
            DATE_FORMAT = "%Y-%m"
            return datetime.datetime.strftime(datetime.date.today(), DATE_FORMAT)+'-01'
       
        def _get_date_to(self, cr, uid, context=None):
            """Return default date_to value"""
            DATE_FORMAT = "%Y-%m-%d"
            return datetime.datetime.strftime(datetime.date.today(), DATE_FORMAT)
       
        _columns = {
            'date_from':fields.date(u'日期从', select=True, required=True),
            'date_to':fields.date(u'日期至', select=True, required=True),
            'target_state': fields.selection([('draft', u'草稿'),('confirmed', u'已确认'),('all', u'全部')], u'选择状态', required=True), #暂未使用   
        }
       
        _defaults = {
            'target_state': 'all',
            'date_from': _get_date_from,
            'date_to': _get_date_to,
        }

        #动态调用 模块 中的 action , 组合默认过滤条件(domain)和默认分组(context)
        def dispatch_sale_chart_open_window(self, cr, uid, ids, context=None):
            mod_obj = self.pool.get('ir.model.data')
            act_obj = self.pool.get('ir.actions.act_window')
            if context is None:
                context = {}
            data = self.read(cr, uid, ids, [], context=context)[0]
            result = mod_obj.get_object_reference(cr, uid, 'kl_dispatch', 'action_dispatch_sale_profit_tree')
            id = result and result[1] or False
            result = act_obj.read(cr, uid, [id], context=context)[0]
           
            if context.get('emp_profit', False): #职员利润统计
                result['context'] = str({'group_by_no_leaf':1,'group_by':['department_id', 'employee_id']}) #默认按部门、职员分组,不显示明细
            else:
                result['context'] = str({'group_by_no_leaf':1,'group_by':['category', 'product']}) #默认按产品类别、产品名称分组,不显示明细
               
            result['domain'] = str([('date', '>=', data.get('date_from')), ('date', '<=', data.get('date_to'))]) #日期查询条件
            '''
            if data.get('target_state') == 'all':
                result['domain'] = str([('date', '>=', data.get('date_from')), ('date', '<=', data.get('date_to'))])
            else:
                result['domain'] = str([('date', '>=', data.get('date_from')), ('date', '<=', data.get('date_to')), ('state', '=', data.get('target_state'))])
            '''
           
            result['name'] = '利润统计(' + data.get('date_from') + '至' + data.get('date_to') + ')' #显示页面标题

            return result

    dispatch_sale_chart()

    # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

    wizard/sale_chart_view.xml

    <?xml version="1.0" encoding="utf-8"?>
    <openerp>
        <data>
            <record id="view_dispatch_sale_chart" model="ir.ui.view">
                <field name="name">dispatch_sale_chart_form</field>
                <field name="model">dispatch.sale.chart</field>
                <field name="arch" type="xml">
                    <form string="销售报表向导" version="7.0">
                        <group>
                            <field name="date_from" class="oe_inline"/> -
                            <field name="date_to" class="oe_inline"/>
                        </group>
                        <footer>
                            <button string="查询报表" name="dispatch_sale_chart_open_window" type="object" class="oe_highlight"/>
                            or
                            <button string="取消" class="oe_link" special="cancel"/>
                        </footer>
                    </form>
                </field>
            </record>

            <record id="action_dispatch_sale_emp_profit_chart" model="ir.actions.act_window">
                <field name="name">职员利润统计</field>
                <field name="res_model">dispatch.sale.chart</field>
                <field name="view_type">form</field>
                <field name="view_mode">tree,form</field>
                <field name="view_id" ref="view_dispatch_sale_chart"/>
                <field name="target">new</field>
                <field name="context">{'emp_profit':True}</field> <!--职员利润-->
            </record>
           
            <record id="action_dispatch_sale_product_profit_chart" model="ir.actions.act_window">
                <field name="name">产品利润统计</field>
                <field name="res_model">dispatch.sale.chart</field>
                <field name="view_type">form</field>
                <field name="view_mode">tree,form</field>
                <field name="view_id" ref="view_dispatch_sale_chart"/>
                <field name="target">new</field>
                <field name="context">{'product_profit':True}</field> <!--产品利润-->
            </record>
           
            <menuitem name="利润统计"  id="menu_dispatch_sale_profit_chart" parent="menu_dispatch_report_root" groups="group_dispatch_manager" sequence="20"/>
              
            <menuitem name="职员利润统计"  id="menu_dispatch_sale_emp_profit_chart" action="action_dispatch_sale_emp_profit_chart"
               parent="menu_dispatch_sale_profit_chart" sequence="10"/>
              
            <menuitem name="产品利润统计"  id="menu_dispatch_sale_product_profit_chart" action="action_dispatch_sale_product_profit_chart"
               parent="menu_dispatch_sale_profit_chart" sequence="20"/>
        </data>
    </openerp>

    report:分组报表、图形分析

    report/sale_report.py

    # -*- coding:utf-8 -*-
    import pooler
    import logging
    import netsvc
    import tools
    logger = netsvc.Logger()
    import datetime
    import time
    import math
    from osv import fields,osv
    from openerp.tools.translate import _  #用于翻译代码中的静态字符串

    class dispatch_sale_report(osv.osv):
        _name='dispatch.sale.report'
       _description=u"销售单视图" #增加产品类别的关联,用于查询报表
       _auto = False
       _rec_name = 'name'

        _columns={
            'name':fields.char(u'单号', size=64, readonly=True),
            'date':fields.date(u'日期', readonly=True),
            'month':fields.char(_size=10, string = u'月份', readonly=True),
            "customer":fields.many2one("dispatch.customer", u"客户", readonly=True),
            "product":fields.many2one("dispatch.product", u"产品", readonly=True),
            'category':fields.many2one('product.category', u'产品分类', readonly=True),
            'price':fields.float(u'单价', digits=(18, 2), readonly=True),
            'num':fields.integer(u'数量', readonly=True),
            'cost':fields.float(u'成本', digits=(18, 2), readonly=True),
            'sum_sale':fields.float(digits=(18, 2), string = u'销售金额', readonly=True),
            'sum_cost':fields.float(digits=(18, 2), string = u'成本金额', readonly=True),
            'sum_profit':fields.float(digits=(18, 2), string = u'利润金额', readonly=True),
            'employee_id':fields.many2one('hr.employee',u'业务员', readonly=True),
            'department_id':fields.many2one('hr.department',u'部门', readonly=True),
            'klbh':fields.char(u'开龙单号',size=64, readonly=True),
            "work_order":fields.many2one("dispatch.work_order","服务单", readonly=True),
            'note':fields.text(u'备注', readonly=True),
            'state': fields.selection([('draft', u'草稿'),('confirmed', u'已确认')], u'状态', readonly=True),
            'create_uid': fields.many2one('res.users', u"创建用户", readonly=True),
        }
       
        def init(self, cr):
            tools.drop_view_if_exists(cr, 'dispatch_sale_report')
            cr.execute("""
                create or replace view dispatch_sale_report as (
                    select sale.id, sale.name, sale.date, sale.month, sale.customer, sale.product, product.category, sale.price, sale.num,
                               sale.cost, sale.sum_sale, sale.sum_cost, sale.sum_profit, sale.employee_id, sale.department_id,
                               sale.klbh, sale.work_order, sale.note, sale.state, sale.create_uid
                    from dispatch_sale as sale
                    inner join dispatch_product as product on (product.id = sale.product)                                                            
                )
            """)
       
    dispatch_sale_report()

    report/sale_report_view.xml

    <?xml version="1.0"?>
    <openerp>
      <data>

        <!-- views dispatch_sale_profit_tree -->
        <record model="ir.ui.view" id="dispatch_sale_profit_tree">
            <field name="name">dispatch.sale.profit.tree</field>
            <field name="model">dispatch.sale.report</field>
           <field name="type">tree</field>
            <field name="priority">1</field>
            <field name="arch" type="xml">
                <tree string="销售利润表"create="false" edit="false" delete="false">
                    <field name="date" invisible="1"/>
                    <field name="month" invisible="1"/>
                    <field name="name" invisible="1"/>
                    <field name="customer" invisible="1"/>
                    <field name="category" invisible="1"/>
                    <field name="product" invisible="1"/>
                    <field name="num" sum="合计"/>
                    <field name="price" invisible="1"/>
                    <field name="cost" invisible="1"/>
                    <field name="sum_sale" sum="合计"/>
                    <field name="sum_cost" sum="合计"/>
                    <field name="sum_profit" sum="合计"/>
                    <field name="employee_id" invisible="1"/>
                    <field name="department_id" invisible="1"/>
                  <field name="work_order" invisible="1"/>
                  <field name="klbh" invisible="1"/>
                    <field name="state" invisible="1"/>
                </tree>
            </field>
        </record>
       
         <record id="dispatch_sale_profit_graph" model="ir.ui.view">
              <field name="name">dispatch.sale.profit.graph</field>
              <field name="model">dispatch.sale.report</field>
              <field name="arch" type="xml">
                  <graphstring="销售利润表"type="bar">
                      <field name="product"/>
                      <field name="sum_profit"/>
                      <field name="category" group="True"/>
                  </graph>
              </field>
         </record>
       
        <!-- views dispatch_sale_profit_filter -->
        <record model="ir.ui.view" id="dispatch_sale_profit_filter">
            <field name="name">dispatch.sale.profit.filter</field>
            <field name="model">dispatch.sale.report</field>
           <field name="type">search</field>
            <field name="arch" type="xml">
                <search string="销售单">
                    <field name="customer"/>
                    <field name="category"/>
                    <field name="product"/>
                    <field name="department_id"/>
                    <field name="employee_id"/>
                    <field name="month"/>
                    <separator/>
                    <filter icon="terp-check" domain="[('state','=','draft')]" string="草稿" name="draft"/>
                    <filter icon="terp-check" domain="[('state','=','confirmed')]" string="已确认" name="confirm"/>
                   <filter icon="terp-check" domain="[('state','in',('draft', 'confirmed'))]" string="全部" name="all"/>
                    <group expand="0" string="分组">
                        <filter string="产品类别" icon="terp-personal+" domain="[]" context="{'group_by':'category'}"/>
                        <filter string="产品" icon="terp-personal+" domain="[]" context="{'group_by':'product'}"/>
                        <filter string="客户" icon="terp-personal" domain="[]" context="{'group_by':'customer'}"/>
                        <filter string="部门" icon="terp-personal+" domain="[]" context="{'group_by':'department_id'}"/>
                        <filter string="员工" icon="terp-personal" domain="[]" context="{'group_by':'employee_id'}"/>
                        <filter string="按月" icon="terp-personal" domain="[]" context="{'group_by':'month'}"/>
                        <filter string="状态" icon="terp-stock_effects-object-colorize" domain="[]" context="{'group_by':'state'}"/>
                    </group>
                </search>
            </field>
        </record>

        <!-- action 默认tree,graph视图 -->
        <record model="ir.actions.act_window" id="action_dispatch_sale_profit_tree">
            <field name="name">销售利润统计</field>
            <field name="sequence" eval="10"/>
            <field name="type">ir.actions.act_window</field>
            <field name="res_model">dispatch.sale.report</field>
            <field name="view_type">form</field>
           <field name="view_mode">tree,graph</field>
            <field name="view_id" ref="dispatch_sale_profit_tree"/>
            <field name="search_view_id" ref="dispatch_sale_profit_filter"/>
        </record>


        <!-- action 添加tree视图,可用于视图排序显示 -->
        <record model="ir.actions.act_window.view" id="action_dispatch_sale_profit_tree1">
           <field name="sequence" eval="10"/>
           <field name="view_mode">tree</field>
           <field name="view_id" ref="dispatch_sale_profit_tree"/>
           <field name="act_window_id" ref="action_dispatch_sale_profit_tree"/>
        </record>

        <!-- action 添加graph视图,可用于视图排序显示 -->
        <record model="ir.actions.act_window.view" id="action_dispatch_sale_profit_graph">
           <field name="sequence" eval="20"/>
           <field name="view_mode">graph</field>
           <field name="view_id" ref="dispatch_sale_profit_graph"/>
           <field name="act_window_id" ref="action_dispatch_sale_profit_tree"/>
        </record>
       
      </data>
    </openerp>

    report:数据库创建视图中计算比率

    # -*- coding: utf-8 -*-
    from openerp import tools
    from openerp.osv import fields, osv

    class dispatch_transfer_order_report(osv.osv):
        _name = "dispatch.transfer_order.report"
        _description = u"转机单统计"
        _auto = False
        _rec_name = 'storefront'
        _order = 'storefront'
        _columns = {
            'year': fields.char(u'年', size=4, readonly=True),
             'month': fields.char(u'月', size=8,readonly=True),    
             "storefront":fields.many2one("dispatch.storefront",u"店面", readonly=True),
             "sale_num":fields.float(u"销售数量",readonly=True),
             "transfer_num":fields.float(u"转机数量",readonly=True ),
            "transfer_rate":fields.float(u"转机率",readonly=True),
        }

        def init(self, cr):
            tools.drop_view_if_exists(cr, 'dispatch_transfer_order_report')
            cr.execute("""
                create or replace view dispatch_transfer_order_report as (
                    select
                       min(transfer_order.id) as id,
                        storefront.id as storefront,
                       to_char(transfer_order.date, 'YYYY') as year,
                        transfer_order.month as month,
                        sum(transfer_order.transfer_num) as transfer_num,
                        sum(transfer_order.sale_num) as sale_num,
                       sum(transfer_order.transfer_num)/sum(transfer_order.sale_num) as transfer_rate
                    from dispatch_transfer_order as transfer_order
                    inner join dispatch_storefront as storefront on (storefront.id = transfer_order.storefront)
                    group by storefront.id,
                             to_char(transfer_order.date, 'YYYY'),
                             transfer_order.month   
                                            
                )
            """)
           
    dispatch_transfer_order_report()

  • 相关阅读:
    使用RoboCopy 命令[转载]
    取得超级管理员权限
    重置网络命令win7
    ASP.NET Global.asax详解【转】
    逆波兰式算法
    设计模式【转自JackFrost的博客】
    VS2013 F12无法转到函数的定义处,总是从“元数据”获取的问题 ——解决方法
    扩展方法 C#
    委托Func和Action【转】
    添加路由
  • 原文地址:https://www.cnblogs.com/cnshen/p/3162492.html
Copyright © 2011-2022 走看看