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()

原文地址:https://www.cnblogs.com/cnshen/p/3162492.html