odoo之ERP系统

p { line-height: 120% }
a:link { }

odoo大纲

第一部分:数据库postgressql 大象

第二部分:ORM(API)

第三部分:客户端

python软件写:

.py文件

包含两部分:1、自定义部分,由自己写,定义类和功能。

2、继承部分,针对的是原生的模块,继承他原有的功能,添加新的方法。

.xml文件

视图部分:最常用的是form视图和tree视图,等等其他视图,还有页签和其他控件按钮

p { line-height: 120% }
a:link { }

Openerp 基本数据类型:

char: 字符型,size属性定义字符串长度。

text:
文本型,没有长度限制。

boolean:
布尔型(true,
false)

integer: 整数。

float:
浮点型,如
‘rate‘
: fields.float(‘Relative Change rate‘,digits=(12,6)),
digits定义整数部分和小数部分的位数。

date:
日期型

time:
时间型

datetime:
日期时间型

binary:
二进制型

复杂类型:selection,
function, related, reference;

selection

Python代码  

  1. selection: 下拉框字段。定义一个下拉框,允许用户选择值。如:‘state‘: fields.selection(((‘n‘,‘Unconfirmed‘),(‘c‘,‘Confirmed‘)),‘State‘, required=True),这表示state字段有两个选项(‘n‘,‘Unconfirmed‘)和(‘c‘,‘Confirmed‘)。

 function

Python代码  

  1. #函数型,该类型的字段,字段值由函数计算而得,不存储在数据表中。其定义格式为:
  2. fields.function(fnct, arg=None, fnct_inv=None, fnct_inv_arg=None, type=‘float‘, fnct_search=None, obj=None, method=False, store=True)
  3.  type 是函数返回值的类型。
  4. #· method True表示本字段的函数是对象的一个方法,为False表示是全局函数,不是对象的方法。如果method=Trueobj指定method的对象。
  5. #· fcnt 是函数或方法,用于计算字段值。如果method = true, 表示fcnt是对象的方法,其格式如下:def fnct(self, cr, uid, ids, field_name, args, context),否则,其格式如下:def fnct(cr, table, ids, field_name, args, context)ids是系统传进来的当前存取的record idfield_name是本字段名,当一个函数用于多个函数字段类型时,本参数可区分字段。args‘arg=None‘传进来的参数。
  6. #· fcnt_inv是用于写本字段的函数或方法。如果method = true, 其格式是:def fcnt_inv(self, cr, uid, ids, field_name, field_value, args, context),否则格式为:def fcnt_inv(cr, table, ids, field_name, field_value, args, context)
  7. #· fcnt_search 定义该字段的搜索行为。如果method = true, 其格式为:def fcnt_search(self, cr, uid, obj, field_name, args),否则格式为:def fcnt_search(cr, uid, obj, field_name, args)
  8. #· store 表示是否希望在数据库中存储本字段值,缺省值为False。不过store还有一个增强形式,格式为 store={‘object_name‘:(function_name,[‘field_name1‘,‘field_name2‘],priority)} ,其含义是,如果对象‘object_name‘的字段[‘field_name1‘,‘field_name2‘]发生任何改变,系统将调用函数function_name,函数的返回结果将作为参数(arg)传送给本字段的主函数,即fnct。

Python代码   related

  1. #关联字段,表示本字段引用关联表中的某字段。
  2. 格式为:fields.related(关系字段,引用字段,type, relation, string, ...),关系字段是本对象的某字段(通常是one2many or many2many),引用字段是通过关系字段关联的数据表的字段,type是引用字段的类型,
  3. 如果type是many2one or many2many, relation指明关联表。例子如下:
  4. ‘address‘: fields.one2many(‘res.partner.address‘, ‘partner_id‘, ‘Contacts‘),
  5. ‘city‘:fields.related(‘address‘,‘city‘,type=‘char‘, string=‘City‘),
  6. ‘country‘:fields.related(‘address‘,‘country_id‘,type=‘many2one‘, relation=‘res.country‘, string=‘Country‘),
  7. 这里,city引用address的city字段,country引用address的country对象。在address的关联对象res.partner.address中,country_id是many2one类型的字段,所以type=‘many2one‘, relation=‘res.country‘。

reference

引用型,格式为:fields.reference(字段名,
selection, size, ...
)。其中selection是:
1)返回tuple列表的函数,或者
2)表征该字段引用哪个对象(or
model)的tuples列表。reference字段在数据库表中的存储形式是(对象名,ID),如(product.product,3)表示引用对象product.product(数据表product_product)中id=3的数据。reference的例子:

def
_links_get(self, cr, uid):

cr.execute(‘select object,name from
res_request_link order by priority‘)

return
cr.fetchall()

...

‘ref‘:fields.reference(‘Document
Ref 2‘, selection=_links_get,
size=128),

...

上例表示,字段ref可以引用哪些对象类型的resource,可引用的对象类型从下拉框选择。下拉框的选项由函数_links_get返回,是(object,name)对的列表,如[("product.product","Product"),
("account.invoice","Invoice"),
("stock.production.lot","Production Lot")] 。

关系类型:one2one,
one2many, many2one, many2many

Openerp

one2one:
一对一关系,格式为:fields.one2one(关联对象Name,
字段显示名,
... )。在V5.0以后的版本中不建议使用,而是用many2one替代。

many2one:
多对一关系,格式为:fields.many2one(关联对象Name,
字段显示名,
...
)。可选参数有:ondelete,可选值为"cascade"和"null",缺省值为"null",表示one端的record被删除后,many端的record是否级联删除。

one2many:
一对多关系,格式为:fields.one2many(关联对象Name,
关联字段,
字段显示名,
... ),例:‘address‘:
fields.one2many(‘res.partner.address‘, ‘partner_id‘,
‘Contacts‘)。

many2many:
多对多关系。例如:

‘category_id‘:fields.many2many(‘res.partner.category‘,‘res_partner_category_rel‘,‘partner_id‘,‘category_id‘,‘Categories‘),

表示以多对多关系关联到对象res.partner.category,关联表为‘res_partner_category_rel‘,关联字段为‘partner_id‘和‘category_id‘。当定义上述字段时,OpenERP会自动创建关联表为‘res_partner_category_rel‘,它含有关联字段‘partner_id‘和‘category_id‘。

change_default:别的字段的缺省值是否可依赖于本字段,缺省值为:False。例子(参见res.partner.address),

‘zip‘:
fields.char(‘Zip‘, change_default=True,
size=24),

这个例子中,可以根据zip的值设定其它字段的缺省值,例如,可以通过程序代码,如果zip为200000则city设为“上海”,如果zip为100000则city为“北京”。

readonly:
本字段是否只读,缺省值:False。

required:
本字段是否必须的,缺省值:False。

states:
定义特定state才生效的属性,格式为:{‘name_of_the_state‘:
list_of_attributes},其中list_of_attributes是形如[(‘name_of_attribute‘,
value), ...]的tuples列表。例子(参见account.transfer):

‘partner_id‘:
fields.many2one(‘res.partner‘, ‘Partner‘,
states={‘posted‘:[(‘readonly‘,True)]}),

string:
字段显示名,任意字符串。

translate:
本字段值(不是字段的显示名)是否可翻译,缺省值:False。

size:
字段长度。

priority:

domain:
域条件,缺省值:[]。在many2many和many2one类型中,字段值是关联表的id,域条件用于过滤关联表的record。例子:

‘default_credit_account_id‘:
fields.many2one(‘account.account‘, ‘Default Credit Account‘,
domain="[(‘type‘,‘!=‘,‘view‘)]"),

本例表示,本字段关联到对象(‘account.account‘)中的,type不是‘view‘的record。

invisible:
本字段是否可见,即是否在界面上显示本字段,缺省值True。

selection:
只用于reference字段类型,参见前文reference的说明

Attributs
说明

?context:
在context
中增加一些变量,这些变量可用于on_change方法及domain条件式。

?on_change:
当本字段值改变时,调用Server端函数。例子:

on_change=”onchange_shop_id(shop_id)”.

?relation:当本字段是一个引用其他数据表的id
时,指定关联数据表名。通常用在related

function
类型的字段中。

?
级联关系:

?ondelete

?set
null: 删除主记录时候,从记录到主记录的引用置为null。

?set
default: 删除主记录时候,从记录到主记录的引用置为缺省值。

?cascade:
删除主记录时候,级联删除从记录。

?restrict:
如果有从记录,不允许删除主记录。

?no
action: 不采取任何动作,即删除主记录,但保留从记录不变。

模板中的标签统一都是以"t-"开始的。

t-name
用于指明模板的名称

t-extend
用于指明该模板是继承自另外哪一个模板,后面会带父模板的名称,如:t-extend=“Login"

t-jQuery
一个jQuery的选择器,后面指明选择器的定义,如:t-jquery=".oe_logiin"

t-operation
一般跟在t-jquery后面,指明选择器找到元素后执行的动作,其值有:append(追加)、replace(替换)

t-if
用于指明元素在页面产生的条件,后面是带一个JavaScript的表达式,返回True或False

t-att-###
用于指明一个元素的属性值,###是元素的属性名称,如:t-att-value="javascript表达式"

t-foreach
用于指明一个循环调用,后面一般带的是一个数组

t-as
用于取得循环中的单个值,与t-foreach搭配使用,后面带的是一个变量名,可以循环中使用变量取值

t-esc
用于一个文字输出

t-call
用于调用另外模板,后面带一个模板的名称

t-set
用于设定一个变量,后面带变量的名称,一般跟t-value搭配使用

t-value
用于指定某个变量或元素的值

然后就是基本的函数:

pre.western { font-family: "Courier New", monospace }
p { line-height: 120% }
code.western { font-family: "Courier New", monospace }
a:link { }

python常用方法集合:
_get:
def get_partner_sequence(self,cr,uid,partner_id,context=None):
    code="stock_picking_outgoing_no_%d" %(partner_id)
    no=self.pool.get(‘ir.sequence‘).get(cr, uid, code, context=context)
    if no==False:
        self.create_new_sequence(cr,uid,code,partner_id)
        no=self.pool.get(‘ir.sequence‘).get(cr, uid, code, context=context)
    partner_ids=self.pool.get(‘res.partner‘).search(cr,uid,[(‘id‘,‘=‘,partner_id)])
    partner_obj=self.pool.get(‘res.partner‘).browse(cr,uid,partner_ids)
    no = "%s-%s" %(partner_obj.code,no)
    return no
-crete:
def create(self, cr, uid, vals, context=None):
    context = context or {}
    origin=vals[‘origin‘]
    sql=‘select a.name from sale_origin a left join sale_order b on a.id=b.sale_origin_id where b.name=\‘%s\‘%(origin)
    cr.execute(sql)
    if cr.rowcount>0:
        dict1=cr.dictfetchall()[0]
        origin=dict1[‘name‘]+‘-‘+origin
        vals.update({‘origin‘:origin})
    sql=‘select a.name from purchase_origin a left join purchase_order b on a.id=b.purchase_origin_id where b.name=\‘%s\‘%(origin)
    cr1=cr
    cr1.execute(sql)
    if cr1.rowcount>0:
        dict2=cr1.dictfetchall()[0]
        origin=dict2[‘name‘]+‘-‘+origin
        vals.update({‘origin‘:origin})
    ptype_id = vals.get(‘picking_type_id‘, context.get(‘default_picking_type_id‘, False))
    ptype_obj=self.pool.get(‘stock.picking.type‘).browse(cr, uid, ptype_id, context=context)
    obj_data = self.pool.get(‘ir.model.data‘)
    location_customers_id = obj_data.xmlid_to_res_id(cr, uid, ‘stock.stock_location_customers‘)
    location_workshop_id = obj_data.xmlid_to_res_id(cr, uid, ‘mrp.stock_location_workshop‘)
    # 根据客户来生成不同的编号
if ptype_obj.default_location_dest_id.id==location_customers_id \
        and ptype_obj.code==‘outgoing‘ \
        and ptype_obj.default_location_src_id.id!=location_workshop_id:
        if (‘name‘ not in vals) or (vals.get(‘name‘) in (‘/‘, False)):
            partner_id = vals.get(‘partner_id‘)
            vals[‘name‘] = self.get_partner_sequence(cr,uid,partner_id)
    new_id=super(stock_picking, self).create(cr, uid, vals, context)
    self.action_confirm(cr, uid, [new_id], context=context)
    return new_id
_write方法:
#修改单据下的日期和单头一样
def write(self,cr,uid,ids,vals,context=None):
    if ‘date_done‘ in vals and vals.get(‘date_done‘):
        obj=self.pool(‘stock.move‘)
        move_ids=obj.search(cr,uid,[(‘picking_id‘,‘=‘,ids[0])])
        obj.write(cr,uid,move_ids,{‘date‘:vals.get(‘date_done‘)})
    return super(stock_picking, self).write(cr, uid,ids, vals, context)

_brown方法和search方法用法:

def action_create_wave(self,cr,uid,ids,context=None):    if not context:       context={}    selfobj=self.browse(cr,uid,ids[0],context=context)    pickids=pickobj.search(cr,uid,[(‘origin‘,‘like‘,selfobj.name)]).....................

大致用法就是这样

默认信息带出来的写法:_defaults={     ‘product_qty‘:1,     ‘price‘:1,     ‘stste‘:‘draft‘,}

get-search-browse方法共用

点击备注id带出他的内容:def sale_requirements_change(self,cr,uid,ids,requirements_id=None,context=None):    result={}    if requirements_id:       require_ids=self.pool.get(‘custorment.requirement‘).search(cr,uid,[(‘id‘,‘=‘,requirements_ids)])       obj=self.pool.get(‘custorment.requirement‘).browse(cr,uid,require_ids,context=None)       result[‘requirement_text‘]=obj.name     else:        result[‘requirement_text‘]=return{‘value‘:result}



name_search: 固定用法
# 输入工序序号会自动带出工序名
def name_search(self, cr,user,name=‘‘, args=None, operator=‘ilike‘, context=None, limit=100):
    if not args:
        args=[]
    args=args[:]
    ids=[]
    if name:
        ids=self.search(cr,user,[(‘sequence‘,‘ilike‘,name)]+args,limit=limit,context=context)
    else:
        ids=self.search(cr,user,args,limit=limit,context=context)
    return self.name_get(cr,user,ids,context)

class:用法
class mrp_routing_workcenter_ref(osv.osv):
    _inherit=‘mrp.routing.workcenter‘
_columns={
        ‘ban_channeng‘:fields.float(u‘班产能,digits=(5,1)),
        ‘machine_id‘:fields.many2one(‘mrp.machine‘,u‘机台),
        ‘user_id‘:fields.many2one(‘res.users‘,u‘工人),
        ‘workcenter_proline‘:fields.one2many(‘routing.workcenter.price‘,‘workcenter_proid‘,u‘单身关联, copy=True),
        ‘produce_description‘:fields.char(u‘工序描述,),
        ‘yjweight‘:fields.float(string=u‘应交重量,digits=(6,2)),
    }
    _defaults={
        ‘produce_description‘:‘‘,
    }
取消关联
def unlink(self, cr, uid, ids, context=None):
    sale_origins = self.read(cr, uid, ids, [‘state‘], context=context)
    unlink_ids = []
    for s in sale_origins:
        if s[‘state‘] in [‘draft‘,‘cancel‘]:
            unlink_ids.append(s[‘id‘])
        else:
            raise osv.except_osv((u‘警告!‘),(u‘已确认订单不可删除))
    return osv.osv.unlink(self, cr, uid, unlink_ids, context=context)
时间: 2024-08-24 02:30:17

odoo之ERP系统的相关文章

工厂ERP系统对企业高效管理的好处是什么?

对于工厂类企业来说,无论是小到厨具工厂,大到汽车工厂,再到航天设备工厂,其生产流程都是复杂,从开始的产品设计到零部件等所有物料的采购,再到生产组装,测试再调试,再到完成,需要经历几十上千步工序与细节,工厂的管理工作难度,那是相当大,但是,随着数据信息化系统的普及,工厂类企业实现智能高效化管理的愿望,得以实现,在这里,我们以工厂ERP系统为例,讲述一下工厂ERP系统对工厂类企业实现智能高效化管理的作用. 1.各环节工作,无缝流转 信息的沟通直观重要,对于企业来说,信息的沟通越是顺通,那么办公效率也

【技巧】如何选择生产行业ERP系统?主要功能是什么?

不知道从什么时候开始,大数据.商业智能开始成为热词,几乎所有的互联网行业都在有意跟这两个词扯上关系,同时,几乎所有的企业也都跟大数据.商业智能扯上了关系,尤其以生产行业为甚,都纷纷用上了能够实现大数据.商业智能的生产行业ERP系统. 其实一切都是有原因的,现下,科技发展迅速,很多企业面临着转型,对于不少的生产制造型实体企业来说,更是如此:这类企业想要转型,除了要在技术上实现突破,达到高效率.低消耗外,在企业整体资源把控和管理上,更是需要一个大的突破,来帮助企业在战略层面上,实现规范.统筹化管理,

钟表行业ERP系统开发解决方案

广州erp系统开发公司[米研网络]http://www.miyeen.com钟表行业是离散为主.流程为辅的制造业,生产过程主要是金属配件加工及各部件装配. 一.钟表行业面临的主要问题有: a.同一款手表通过壳面带不同的搭配可以组成几种甚至几十种手表,因而车间装配很是繁琐而且容易出现做错货的现象,<米研钟表生产管理软件>可以针对样式搭配实现标准化配置,从而实现标准化领料,在源头控制做错事件的发生,从而提高钟表生产的效益: b.钟表行业另一个显著特点翻单频繁,而配件商规模较小,难以实现智能配件档案

为什么我会认为SAP是世界上最好用最牛逼的ERP系统,没有之一?

为什么我认为SAP是世界上最好用最牛逼的ERP系统,没有之一?玩过QAD.Tiptop.用友等产品,深深觉得SAP是贵的有道理! 一套好的ERP系统,不仅能够最大程度承接适配企业的管理和业务流程,在技术上面也能够做到快速部署和挑战.而对用户而言,好用且逻辑性强,体验好.便利可掌控才是能够抓住用户的需求点.很可惜的是,纵观世界上这么多的ERP系统,真正能够为用户考虑而且有自己的核心竞争力的并不多. 我认为一套好的ERP系统,不仅仅是一套软件,更是一个管理思想.选型ERP,要从以下几方面考虑: 一.

B2C 电商网站需要怎样的 ERP 系统

B2C 电商网站需要怎样的 ERP 系统 主要由如下一些系统组成:1.进销存系统,你的产品的采供销当然最好是由系统来实现:2.BI系统,BI包括所有的流量.订单.商品.库存.发货等所有数据节点,亦包含全站的各种积分.优惠券.会员体系等分支系统:3.仓储以及配送发货体系,里面涵盖的数据节点非常非常多,比如说库存(库存里面也分可销售库存.冻结库存.RMA库存等多个状态).配送体系的节点也很多比如说分拣.打包.称重.打印.发货,发货之后需跟物流公司对接知道到达的配送节点:4.客服系统以及CRM系统,客

解析大型.NET ERP系统 电子邮件系统帐户集成

为保证ERP系统的信息流准确快速的传递,需要给系统设计一个消息盒子机制.当系统中发生业务操作后,需要提醒下一个环节的操作人员,以保证ERP信息流快速准确传递.比如生产任务单(工作单,加工单,制单)过帐完成后,需要通知仓库准备材料供车间领料生产.消息盒子的界面大致如下所示: 消息盒子包含业务通知(Messages)和工作流审批(Workflow).业务通知比如采购人员下达采购订单PO后,需要通知仓库人员准备收货.工作流审批是以审批为基础的单据流程控制. 在实现消息盒子过程中,遇到一个客户需要将消息

Super超级ERP系统---(7)货位管理

货位是ERP系统总的仓库管理中必不可少的,仓库是有货架组成,货架上的每个格子就是一个货位,所有货位上的商品的库存总和就是仓库商品的库存.仓库的货位主要分为货架和托盘,货架就是仓库的固定货位,托盘就是移动货位,或者称为移动托盘. 仓库的货位类型可以分为存货位,拣货货位,移动货位三种大的类型.按正残品又可分为正品货位和残品货位. 货架上的每个货位都编排有相应的货位号,一般规则是区号+巷道+左右面+货架号+层数+列数. 1.货位库存 根据商品可以查询商品所在的货位和库存 根据货位可以查询当前货位上的商

Hitpoint:ERP系统如何帮助外贸企业实现价值最大化

外贸企业如何实现价值最大化?是每个外贸企业财务管理的最终目标.实现这一目标有三大常规途径,包括:资金成本最小化.现金流量最大化和持续发展能力最大化.而外贸ERP系统通过对整个供应链资源进行管理,加上系统先进的事先计划.事中控制和事后优化等思想,实现了这三大常规途径. 一.实施外贸ERP系统有助于外贸企业降低资金成本,实现价值最大化. 借助外贸ERP系统的支持,外贸企业打破了陈旧的管理企业模式,对外贸企业生产经营实行全方位系统化管理.譬如汉特财务软件,它是通过数据集中.资源共享,建立以资本为纽带,

论ERP系统开发 一:数据处理结构 - 数据流向 以及 数据模型

在ERP系统的开发过程中,或者用我更喜欢的说法,在erp的制作过程中,很多的操作是数据的流向,数据的操作,数据的继续流量,这种类似流水线的数据处理, 譬如订单的处理,要经过订单抓取,订单状态核对,订单财务审核,订单人工审核,订单物流号获取,订单发货,等等,就是: 1-2-3-4-5-6-7-8,1是我们的初始数据,  8是我们的最终结果,当然,在实际的操作过程中,并不是单条线这么简单,很多的是各条线的交叉混杂,让整个系统看起来复杂的多, 系统软件是世界的抽象,我们这个时间是简单的,通过无限的循环