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

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. 第十章、numpy模块

    目录 第十章.numpy模块 一.导入方式 二.作用 三.通过函数创建numpy数组 四. numpy数组运算 五.重点 第十章.numpy模块 一.导入方式 import numpy as np#约 ...

  2. VM12及CentOS-6.10的安装

    VM12的安装破解步骤 1:打开VMware 12安装界面后,点击[下一步]2:勾选[我接受许可协议中的条款]安装VMware Workstation 12 ,然后点击[下一步]3:修改默认安装路径, ...

  3. vim文本编辑及文件查找应用1

    vim编辑器:    文本编辑器:        文本:纯文本,ASCII text;Unicode(全球通用); 文本编辑种类:        行编辑器:sed        全屏编辑器:nano, ...

  4. Codeforces 1082 毛毛虫图构造&最大权闭合子图

    A #include<bits/stdc++.h> using namespace std; typedef long long ll; , MAXM = ; //int to[MAXM ...

  5. 解决使用vue打包时vendor文件过大或者是app.js文件很大的问题

    这篇文章主要介绍了使用vue打包时vendor文件过大或者是app.js文件很大问题的解决方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下 第一次使用vue2.0开发,之前都是用的angu ...

  6. ARDUINO UNO烧录BOOTLOADER

    批量烧录为了速度加快,使用USBASP工具,配合PROGISP软件进行烧录. 因为脱离了ARDUINO IDE,所以需要研究AVR单片机的熔丝位设置问题. 刷ATMEGA32U4芯片,需要这样设置: ...

  7. Acwing-202-最幸运的数字(同余, 欧拉定理)

    链接: https://www.acwing.com/problem/content/204/ 题意: 8是中国的幸运数字,如果一个数字的每一位都由8构成则该数字被称作是幸运数字. 现在给定一个正整数 ...

  8. ASP.NET MVC5入门指南(2)*入门介绍*创建您的第一个应用

    开始吧 首先安装Visual Studio 2017.然后,打开Visual Studio. Visual Studio是一个IDE或集成开发环境.就像使用Microsoft Word编写文档一样,您 ...

  9. Codeforces 871C 872E Points, Lines and Ready-made Titles

    题 OvO http://codeforces.com/contest/871/problem/C ( Codeforces Round #440 (Div. 1, based on Technocu ...

  10. 【Winfrom-TreeView】 跟随系统改变Style

    C#: public class NativeTreeView : System.Windows.Forms.TreeView { [DllImport("uxtheme.dll" ...