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 ...
随机推荐
- asyncio:python3未来并发编程主流、充满野心的模块
介绍 asyncio是Python在3.5中正式引入的标准库,这是Python未来的并发编程的主流,非常重要的一个模块.有一个web框架叫sanic,就是基于asyncio,语法和flask类似,使用 ...
- 8.1.Zookeeper概念简介
1.分布式系统概述 理解1: 分布式系统:分布式系统是针对一个大系统而言,将一个大系统分成多个子系统,即多个工程系统. 我们先看下传统的系统模式: 传统的系统模式将多个功能模块全部在一个工程中写 ...
- PAT 1003.我要通过1
答案正确”是自动判题系统给出的最令人欢喜的回复.本题属于 PAT 的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”. 得到“答案正确”的条件是: ...
- java线程基础巩固---Daemon线程的创建以及使用场景分析
daemon线程既守护线程,而在jdk中对于Thread中针对守护线程有专门的API,如下: 而之前在公司项目中就看到过有人使用过Thread中的这个API,但是对于它的使用场景完全不知,所以这次好好 ...
- JAVA面试/笔试经典题
1.short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 对于short s1 = 1; s1 = s1 + 1; 由于s1+1运算时 ...
- MySQL的分表与分区
MySQL分表分区是解决大数据量导致MySQL性能低下的两种方法. 什么是MySQL分表 从表面意思上看,MySQL分表就是将一个表分成多个表,数据和数据结构都有可能会变.MySQL分表分为垂直分表和 ...
- 关于.Net中Process和ProcessStartInfor的使用
本文主要是介绍在.Net中System.Diagnostics命名空间下Process类和ProcessStartInfo类的使用 用于启动一个外部程序所使用的类是Process,至于ProcessS ...
- gradle——入门
为脚本中自定义变量传参: gradle -Pmyprop=myvalue 脚本攻略 https://blog.csdn.net/yanbober/article/details/49314255 强制 ...
- Error from server (ServiceUnavailable): the server is currently unable to handle the request
grep image /root/kubernetes-metrics-server/kubernetes-metrics-server/metrics-server-deployment.yaml ...
- shareSDK集成遇到的问题汇总
问题一.平台添加应用时需要输入的签名(下图)的获取方式 第一步.通过android studio生成签名保存在本地 第二步.查看签名的信息 问题二.由于同事集成了QQ登录和微信登录,后来又需要加入微博 ...