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()
openerp学习笔记 统计、分析、报表(过滤条件向导、分组报表、图形分析、比率计算、追加视图排序)的更多相关文章
- OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...
- openerp学习笔记 模块结构分析
以OpenERP7.0中的 hr_expense 模块为例: 如图中代码所示: __init__.py :和普通 Python 模块中的__init__.py 作用相同,主要用于引用模块根目录下的.p ...
- openerp学习笔记 搜索视图(自己创建的、自己的、本部门的、本部门及下属部门的、今日的、日期从,日期至、多条件模糊搜索、or、and)
自己创建的: domain="[('create_uid','=',uid)]" 自己的: domain="[('employee_id','=','#kl_user_e ...
- openerp学习笔记 视图中字段只变化(on_change)联动其他字段值、选择和过滤
1.修改产品数量时,自动计算产品销售金额.销售成本和销售利润<field name="num" on_change="on_change_product(produ ...
- Dynamic CRM 2013学习笔记(八)过滤查找控件 (类似省市联动)
我们经常要实现类似省市联动一样的功能,常见的就是二个查找控件,一个选择了省后,另一个市的查找控件就自动过滤了,只显示当前省下的市,而不是所有的市.当然这是最简单的,实际工作中还有更复杂的功能要通过过滤 ...
- Python学习笔记(二):条件控制语句与循环语句及常用函数的用法
总结的内容: 1.条件控制语句 2.while循环语句 3.for循环语句 4.函数的用法 一.条件控制语句 1.介绍 Python条件语句是通过一条或多条语句的执行结果(True或者False)来决 ...
- openerp学习笔记 context 的应用
1.在Action中定义,context用于传递搜索条件和分组条件,在搜索视图中默认显示: 示例代码: <record model="ir.actions.act_window&quo ...
- Web Service学习笔记(webservice、soap、wsdl、jws详细分析)
Web Service概述 Web Service的定义 W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的API ...
- Web Service学习笔记(webservice、soap、wsdl、jws详细分析) (转)
Web Service概述 Web Service的定义 W3C组织对其的定义如下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的API ...
随机推荐
- 《python解释器源码剖析》第8章--python的字节码与pyc文件
8.0 序 我们日常会写各种各样的python脚本,在运行的时候只需要输入python xxx.py程序就执行了.那么问题就来了,一个py文件是如何被python变成一系列的机器指令并执行的呢? 8. ...
- Pysnooper 一款大受欢迎的Debug模块
Github地址 安装 PIP pip install pysnooper import pysnooper @pysnooper.snoop() def number_to_bits(number) ...
- centos nginx https 配置
1,如果想配置一个域名到指定目录咋弄呢?下面这个 server { listen ; server_name 这里换成你的域名,例如baidu.com; set $root_path '/home/w ...
- @font-face字图标问题
链接:http://www.exp99.com/htmlcss/htmlcss_229.html
- 性能篇——函数调用结果的 LRU 缓存
1. 应用场景: 多次调用同一函数 2. 普通写法: def say(name): print("hellow:%s"%name) now = datetime.datetime. ...
- java8 stream/optional个人测试demo记录
备忘记录 package cc.ash; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConst ...
- 解决tomcat控制台乱码+清除过期缓存条目后可用空间仍不足 - 请考虑增加缓存的最大空间问题
一.乱码 1.打开Tomcat的目录,找到conf文件夹,一般修改server.xml中的编码集,改为utf-8即可 2.若server.xml中编码设置的就是utf-8,可以修改logging.pr ...
- loj2424 「NOIP2015」子串[字符串DP]
给定字符串 A,B,要求从 A 中取出互不重叠的 k 个非空子串,按照出现顺序拼起来后等于 B.求方案数.n ≤ 1000,m ≤ 200. 主要是状态的转移.先设计出$f_{i,j,k}$表长度$B ...
- App支付宝登录授权
一.在支付宝开放平台申请App应用,并且配置后台信息 https://openhome.alipay.com/platform/appManage.htm#/apps 填写自己的申请信息 添加应用功能 ...
- 用 D3.js 画一个手机专利关系图, 看看苹果,三星,微软间的专利纠葛
前言 本文灵感来源于Mike Bostock 的一个 demo 页面 原 demo 基于 D3.js v3 开发, 笔者将其使用 D3.js v5 进行重写, 并改为使用 ES6 语法. 源码: gi ...