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

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

openerp学习笔记 统计、分析、报表(过滤条件向导、分组报表、图形分析、比率计算、追加视图排序)的更多相关文章

  1. OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

  2. openerp学习笔记 模块结构分析

    以OpenERP7.0中的 hr_expense 模块为例: 如图中代码所示: __init__.py :和普通 Python 模块中的__init__.py 作用相同,主要用于引用模块根目录下的.p ...

  3. openerp学习笔记 搜索视图(自己创建的、自己的、本部门的、本部门及下属部门的、今日的、日期从,日期至、多条件模糊搜索、or、and)

    自己创建的: domain="[('create_uid','=',uid)]" 自己的: domain="[('employee_id','=','#kl_user_e ...

  4. openerp学习笔记 视图中字段只变化(on_change)联动其他字段值、选择和过滤

    1.修改产品数量时,自动计算产品销售金额.销售成本和销售利润<field name="num" on_change="on_change_product(produ ...

  5. Dynamic CRM 2013学习笔记(八)过滤查找控件 (类似省市联动)

    我们经常要实现类似省市联动一样的功能,常见的就是二个查找控件,一个选择了省后,另一个市的查找控件就自动过滤了,只显示当前省下的市,而不是所有的市.当然这是最简单的,实际工作中还有更复杂的功能要通过过滤 ...

  6. Python学习笔记(二):条件控制语句与循环语句及常用函数的用法

    总结的内容: 1.条件控制语句 2.while循环语句 3.for循环语句 4.函数的用法 一.条件控制语句 1.介绍 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决 ...

  7. openerp学习笔记 context 的应用

    1.在Action中定义,context用于传递搜索条件和分组条件,在搜索视图中默认显示: 示例代码: <record model="ir.actions.act_window&quo ...

  8. Web Service学习笔记(webservice、soap、wsdl、jws详细分析)

    Web Service概述 Web Service的定义 W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的API ...

  9. Web Service学习笔记(webservice、soap、wsdl、jws详细分析) (转)

    Web Service概述 Web Service的定义 W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的API ...

随机推荐

  1. 简单的文件ftp上传

    目录 简单的文件ftp上传 简单的文件ftp上传 server import socket import struct service=socket.socket() service.bind(('1 ...

  2. 入坑django2

    数据模型 关于时间的字段设置 add_date = models.DateTimeField('保存日期',default = timezone.now) mod_date = models.Date ...

  3. SpringMVC----视图层框架

    Spring Web模型-视图-控制器(MVC)框架是围绕DispatcherServlet设计的,DispatcherServlet将接收的请求分派给应用程序.SpringMVC具有配置处理程序映射 ...

  4. DataTable To List<T> DataTable Linq学习笔记

    LINQ 查询适用于实现的数据源 IEnumerable<T>接口或System.Query.IQueryable接口. DataTable类默认是没有实现以上接口的. 所以要在DataT ...

  5. 2.Java NIO 简介

    概述 Java NIO 是 JDK 1.4 发布的一套全新的IO API(New IO 简称 NIO),由于 JDK 1.7 对 NIO 的更新,目前 NIO 被广泛应用,以至于 将 JDK 1.7 ...

  6. CentOS7连接无线网络

    背景  CentOS7.6最小化安装,没有网线,幸好有无线网卡.下面我们直接进入主题.  附:安装教程 主题--连接无线网络 最小化安装后,裸机没有ifconfig,没有iw,最可怕的是没有网线 但我 ...

  7. Python3.8新特性-- 海象操作符

    “理论联系实惠,密切联系领导,表扬和自我表扬”——我就是老司机,曾经写文章教各位怎么打拼职场的老司机. 不记得没关系,只需要知道:有这么一位老司机, 穿上西装带大家打拼职场! 操起键盘带大家打磨技术! ...

  8. vue+django前后端项目部署

    一.python3的安装 1.安装python前的库环境: yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel ...

  9. linux中centos6.9环境下的python3.6和pip的安装

    安装python3.6可能使用的依赖# yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqli ...

  10. Python:用filter函数求素数 (再理解generator)

    目的:更熟悉应用generator. 参考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017404530360000 素数定义: 素数:质数 ...