OpenERP的MRP运算的核心对象--Procurement Order
-
[size=3][Odoo V8.0 WMS模块有较大变动,本系列文章中的部分描述不适用与V8及以上版本,以后再做区别说明][/size]俗话说:"英雄不问出处,江湖自有传说"。Procurement Order 在OpenERP的世界里就是这样一个英雄级的对象。对于他的名字坊间就流传着多种不同的称呼:物料获取单,补货单,需求单。他的行踪更是迷离扑朔,神龙见首不见尾。我们今天就和大家雾 里探花寻访这位传说中戴着花,跨着神龙的侠客英雄。
寻访之路从为英雄正名开始。不管英雄是否待见,为一统江湖对其定名的混乱、纷扰,我们以后都用洋名号'Proc'呼之,另冠以‘需求单’尊号。这名起得似乎不咋的,却传承自另外一位史诗级的英雄:MRP(物料需求计划)。
首先一句话介绍MRP。
MRP就是跟踪物料需求来源,结合现有库存情况及库存控制要求并考虑在途,在产物料情况通过综合运算以确定对相关物料进行生产,采购的数量和时间的处理过程, 从而实现库存最小化的要求。听起来似乎很复杂,但在OpenERP中就是对Proc这个单一对象的运算处理过程。所以,可以说掌握了Proc就掌握了OpenERP的MRP。
接下来的介绍中,将会让大家了解到以下的知识点:
# 什么是Proc,作用是什么?
# Proc和产品上的Product Type, Procurement Method, Supply Method的关系
# Proc的创建及其来源
# Proc与Virtual Stock的关系
# Proc中Scheduled Date的来源和作用
# Proc与生产、采购的关系
# Proc的工作流
# Proc的代码分析
# 一个对现有MRP运算的修正的代码实现
初识Procurement Order?
================
简单来说:[b]哪里有物料需求哪里就会有需求单[/b]。这看来是循环定义,纯忽悠。不过这句话真的是精髓,建议大家默念100遍,并在结尾加上“我的上帝”,“我的真主“,"我的佛“...
好了,要了解Proc我们首先要看看他长什么样。
因为是物料的需求,所以他应该出现在OpenERP的Warehouse应用中。顺着这个思路我们一番地毯式排查,在Warehouse--Scheduler--Procurement Exceptions
菜单中终于似乎嗅到了一点他的气味:
[attachimg=1]
可是,但是,可但是,然而,为什么是Exception呢?为什么要以Exception这种低级,肮脏,错误的面貌来示于世人呢?它从何而来,又要归于何处呢?我们是否可以手动创建他呢?手动创建的Procurement Order又是肿么个意思呢?
要知后事如何,且看兄弟姐妹们的回复热情。。。 ;D
[检测到链接无效,已移除]
[检测到链接无效,已移除]
[检测到链接无效,已移除]
[检测到链接无效,已移除]
[检测到链接无效,已移除] -
Shit Happens
==========
上回说到Proc与MRP的正统血缘传承,以及“哪里有物料需求哪里就有'需求单'”的心经口诀。心经之神力也的确立时就有应验。一耽上路,即觅得Proc行踪。正暗自庆幸RP,Luck指数,却发现是些Proc in Exception。心下狐疑之际,江湖号称“水哥”,“姐夫”的两位大侠及时赶到,一番指教让小弟们如醍醐灌顶,不再陷于:“打还是不打,或是用正义的口水驱逐异类入侵”的内心挣扎。
原来,我们看到的的确是Exception状态的Proc。这个列表正如“姐夫”所述是通过过滤器将“生病“或”例外“状态的Proc过滤出来得到的。如果我们点击上面的"Clear"按钮就会清除默认设置的过滤器,Tah Tah, 整个Proc家族尽收眼底了:
[attachimg=1]
但是为什么默认情况下会只显示这些肮脏的“例外“Proc呢? 记得电影《阿甘正传》中阿甘在跑步时踩到了狗屎(shit), 旁边一位失意的商人问他对此事的看法,阿甘表情轻松地说:「Shit Happens.」, 意思是说“人生不如意十之八九,何必太过执着”。 我们暂时先忘了这些肮脏的Exception, 把手弄脏(make hands dirty) 来创建一个Proc看看:
Procurement Reason: Test Proc Mouse
Product: Mouse
Quantity: 10
Location: Stock
其他保持默认,然后点击‘Confirm'按钮。
[attachimg=2]
你会看到Proc的状态变为“Confirmed", 并且出现一个“Run Procurement”按钮。
切换到“Extra Information"页。
[attachimg=3]
留意一下这里的字段名,比如:Bom,Date Closed, Reservation, Purchase Order, Properties等,大多数都没有值。特别留意一下唯一有值的字段“Reservation: MOU:Procurement > Stock"。 在以后虚拟库存数量的计算中会再次回到这里介绍的。
好了,既然有一个可以点击的按钮(Run Procurement),我们这些追求"让自己的手更脏一点吧“的黑手党成员一定会按奈不住,我们点它一下又如何!
'oops', 'shit', ’我靠‘, Exception又来了...
我们现在已经学会了另一个心经了--[b]“Shit Happens“[/b], 微笑,从容。看看Latest Error中告诉我们什么,“该货品未定义供应商”。那我们点击“Mouse”这个产品链接,进入Mouse产品的定义界面一看究竟:
[attachimg=4]
注意这里有几个与Procurement相关的字段:Product Type, Procurement Method, Supply Method。 这里的Procurement Method的默认值是Make to Stock, 而我们之前创建的Proc中好象也有这个字段,只不过默认的值好象是Make to Order, 他们到底有什么关系呢?先把这个问号揣在口袋里吧。Product Type是Stockable Product(库存商品)倒也好理解,可是其他选项:Consumable, Service又做合解呢?Supply Method这里是Buy,如果换做Produce有如何呢?好象陷阱重重,此地不宜久留。
切换到“Procurement & Location":
[attachimg=5]
这里又是一堆跟Proc相关的参数,总体来说是跟时间(Lead Time),地点(Stock Location), 库存规则(最小库存规则)相关的参数。回忆一下上一回对MRP的定义,MRP运算就是在确定的地点,指定的时间,按照库存规则确定物料需量的计算。可是我们该怎么设置这些参数呢?口袋里揣的问号越来越多了,可是我们还有为Mouse设置供应商的任务尚未完成。不求甚解,继续前进...
切换到‘Supplier'界面时,我们已经有点筋疲力尽了,不过这里总算柳暗花明,姐妹弟兄们春天到了:
[attachimg=6]
在这里我们可以定义该产品的
'供应商'--Supplier,
供应商对该产品的称呼--Supplier Product Name,
供应商对该产品的编码--Supplier Product Code,
供应商要求的最小订货批量--Minimal Quantity,
供应商的发货时间--Delivery Lead Time,
供应商供应产品的计量单位--Supplier UOM,
以及根据产品订货数量不同供应商的价层次表(Tier Price)--Price list
通过对上述各字段的解释,大家可以了解到OpenERP对产品上相关供应商的设置内容还是做得很细致的。他不但对供应商供货的价格,数量,时间都有明确的定义,甚至还考虑到了供应商和我们对产品的称呼和代码编号的不同。这样我们在开具采购订单时,内部选择我们熟悉的产品名称和代码,而发给供应商的采购订单上是供应商熟悉的名称和代码。
为了简便操作我们只录入了供应商和最小订货批量(Minimal Quantity)。保存后,返回到刚才的Procurement Exception, 点击“Retry"按钮。
[attachimg=7]
'Tah tah', Proc的状态变为了'running', 我们再切换到‘Extra Info'页面:
[attachimg=8]
Reservation的值依旧不变,Purchase Order却多了一个值,点击进去:
[attachimg=9]
发现一张采购订单的草稿已经创建好了。注意他的状态是“Request for Quotation", 表示还处于请求报价的草稿状态。其供应商正是我们在Mouse产品的Supplier页中定义供应商,而其采购数量则并不等于需求单上的需量10,而是20。这个也好理解,因为我们在产品的供应商信息中定义了采购的最小批量20。
[info height=30 border=red]
事实上,我们在为客户的OE项目中开发了一个模块,可以在产品的供应商定义信息中将最小订购批量设置为警告信息。就是说,由Proc生成的采购订单的数量还是严格按照需求单的数量,但是提供一个警告信息,表示此订单的数量小于供应商要求的最小订货批量。此模块不久就会公开发布到Launchpad上。
[/info]
这个时候如果我们返回Warehouse->Scheduler->Procurement Exceptions, 刚才那个Proc不见了。记得吗,这个需求单已经不再是Exception状态了,你可以Clear默认过滤器,然后比如按产品名称或其他相关字段搜索来找到这张需求单。
那么这张running的需求单什么时候会变成done完成状态?需求单上的Reservation又是肿么个意思?难道我们每次都要手动创建需求单,然后手动去运行他吗?如果我对PC1(demo数据)这个产品创建需求单,有会如何?
欲知后事如何,且听下回分解。。。 -
[quote author=mrshelly link=topic=2923.msg9884#msg9884 date=1336973840]
为什么要为供应商的最小订货量去改模块警告呢? 为神马不是修改供应商的最小订货量?
[/quote]
供应商的最小订货量,这是一个经验值,是和供应商长期接触后从供应商那里得到的刚性指标,本公司的人不可能因为一个订单去改别人的指标。
OpenERP默认的行为是,当你本次需要采购的数量低于供应商的最小订货量,它会把订单行数量改为等于供应商的最小订货量(减少与供应商的沟通确认成本)。
我们的客户希望按实际需求数量下采购订单,而采购员要知道此数量未达到供应商的最小订货量,并与供应商沟通。 -
[quote author=Jeff link=topic=2923.msg9887#msg9887 date=1336975077]
[quote author=mrshelly link=topic=2923.msg9884#msg9884 date=1336973840]
为什么要为供应商的最小订货量去改模块警告呢? 为神马不是修改供应商的最小订货量?
[/quote]
供应商的最小订货量,这是一个经验值,是和供应商长期接触后从供应商那里得到的刚性指标,本公司的人不可能因为一个订单去改别人的指标。
OpenERP默认的行为是,当你本次需要采购的数量低于供应商的最小订货量,它会把订单行数量改为等于供应商的最小订货量(减少与供应商的沟通确认成本)。
我们的客户希望按实际需求数量下采购订单,而采购员要知道此数量未达到供应商的最小订货量,并与供应商沟通。
[/quote]
Jeff解释的非常的清晰。实施上我们的这个模块提供的是一个更多的选项。在产品供应商信息上有一个‘是否将moq显示为警告‘的勾选项。如果不选,则使用默认的方法计算采购量;如果勾选了,则用Proc中的数量作为采购量,但是提供警告信息。
[quote author=hifly link=topic=2923.msg9888#msg9888 date=1336977042]
校长出手,都是精品。
讲的非常好,鼓掌中。。。
有了OpenERP中文版本,演示界面是中文的就更好了。
[/quote]
多谢海飞兄夸奖。
选择英文界面和在文章中多处使用英文术语的原因主要还是为了准确性的考虑。Procurement相关的术语的中文翻译中还是有一些不够准确,希望借这次机会能梳理出一个勘误表。 -
需求在哪里呀,需求在哪里
================
感谢各位朋友的抬爱。有朋友提醒,在以前的回合中过多的无关主题的信口雌黄可能会分散对专题内容的注意力,所以以后会有所收敛。
我们在上一回中介绍了Proc有几个不同的状态,而菜单项"Procurement Exception"只是过滤显示出了因为某些原因而无法进一步处理的"有问题"的Procurement。在保持"Shit Happens"的良好心态下,我们按图索骥解决了问题发生的原因,并且成功运行了Proc, 生成了对应的采购订单。在此过程中我们浮光掠影的了解到产品的定义界面中涉及了很多涉及时间,地点,库存规则等与Proc相关的设置参数。
如果哪位姐妹弟兄在看完上回介绍内容后竟然还对上回中最后提到的那个问题动手做了试验,本人真得就感动的hold不住了。如果你做了,运行该Proc可能会是两个结果:Proc变成了一个没有任何错误提示的Exception状态的Proc, 或者幸运的发现系统生成了一张生产单,如果再仔细一点就会发现系统还生成了一系列跟这张生产单相关的Proc 。
[attachimg=1]
创建的生产单单号为MO/00013,而以上列表中显示的是OpenERP同时生成的与这张生产单相关的Proc
对于第一种结果,那是因为你没有安装生产模块(MRP)。至于为什么对PC1这个产品运行Proc不会象之前那样生成采购单而是生成生产单的原因,想必大家也想到了。这是因为PC1这个产品的定义上Supply Method是Produce而之前的Mouse则是Buy。
[attachimg=2]
好了,我们知道当为定义了不同的Supply Method的产品创建Proc并运行时,OpenERP会生成采购订单或生产单。事实上我们基本可以将为Supply Method为Produce的产品创建的Proc称为"生产计划单",而将Supply Method为Buy的产品创建的Proc称之为"请配单/请购单"。那么在产品定义表单的Supply Method之上还有个Product Type字段。目前我们试验用到的产品(Mouse,PC1)都是Stockable Product,[b]将其换成“Service”又如何(请分别使用produce和buy)?不妨动手试试。[/b]至于Conumable的类型以后再做交待吧
到目前为止我们都是自己创建Proc,然后又自己点击运行按钮运行这个Proc,这是不是太不够自动化了。尤其是象之前那个生成生产单的同时又生成很多相关Proc的情况,难道我们还要一个个的找出他们然后点击那个劳什子"运行"按钮"? 答案当然是不必的。你可能已经注意到在Procurement Exceptions这个菜单项上有个Compute Scheduler这个菜单。点击它就会弹出一个表单,再点击上面的Compute Scheduler按钮就会自动运行所有Confirmed的Proc,当然上面还有一个Automatic Order Porint的选项,也放到以后介绍:
[attachimg=3]
其实,OpenERP连点击这个按钮都想为你省了。当你将Settings-Configuration-Scheduler-Scheduled Actions下的Run Mrp Scheduler定时器激活,并设定时间及运行周期(一般让它在夜深人静的时候运行,因为MRP运行比较耗费系统资源)后,一切就都和谐了。
[attachimg=4]
那么,为什么在生成生产单的同时OpenERP又生成了一堆Proc呢? 要回答这个问题就要对"哪里有物料需求哪里就有需求单" 这句绕口令钻钻牛角尖了。先来考虑一下[b]企业对物料的需求到底有哪几类?企业的物料需求到底源自哪里?[/b]这两个问题看似简单,其实如果回答的靠谱,后面的交代就轻松了。请各位试试回答这两个问题吧! -
首先感谢校长早上五点钟的大作。
实际试验了一下那个手动创建需求单,PC1,需求1个。
[quote] 05/22/2012 [PC1] Basic PC 1.000 PCE on order Running [/quote]
运行了proc之后,单据变成
[b]Running[/b], [b]Reservation :PC1: Stock > Stock[/b]
想着也是,我这样平白无故地创建了一个从 库存->库存的需求,让仓库管理人员原地搬了一下货物,心生愧疚(看了下下面的Proc workflow,看来路还远着呢..)。想把这个Proc单了结了,但是好像这个这个单一直在运行状态,我点击了 Reservation,进去就是一个Stock Moves,这怎么办呢?
[quote]先来考虑一下企业对物料的需求到底有哪几类?企业的物料需求到底源自哪里?[/quote]
[attachimg=2]
1.企业对物料的需求,生产和销售。
2.物料来源.采购和生产。
盼望校长指正。 -
[quote author=ccdos link=topic=2923.msg9932#msg9932 date=1337650504]
Procurement 就是 一个中间过程的单据,根据产品定义的供应方法,分别再生成 采购单 和 生产单,各自进行后续的流程,对否 ?
[/quote]
中间过程单据的说法基本正确,但同时也不妨碍它的独立使用。另外还有多个影响其后续流程的因素,会在后面的话题中介绍
[quote author=Joshua link=topic=2923.msg9933#msg9933 date=1337650833]
实际试验了一下那个手动创建需求单,PC1,需求1个。
[quote] 05/22/2012 [PC1] Basic PC 1.000 PCE on order Running [/quote]
运行了proc之后,单据变成
[b]Running[/b], [b]Reservation :PC1: Stock > Stock[/b]
想着也是,我这样平白无故地创建了一个从 库存->库存的需求,让仓库管理人员原地搬了一下货物,心生愧疚(看了下下面的Proc workflow,看来路还远着呢..)。想把这个Proc单了结了,但是好像这个这个单一直在运行状态,我点击了 Reservation,进去就是一个Stock Moves,这怎么办呢?
[/quote]
还真是有动手做试验的人,如果你注意一下这个字段值在Run Proc前后的变化就能大致看出点名堂了。我们在后面会从代码上剖析其原因
[quote]
1.企业对物料的需求,生产和销售。
2.物料来源.采购和生产。
[/quote]
还不正确
[quote author=mrshelly link=topic=2923.msg9937#msg9937 date=1337665934]
[quote author=digitalsatori]
企业对物料的需求到底有哪几类?企业的物料需求到底源自哪里 ?
[/quote]
1 采购? 自制?
2 最终都是采购?
[/quote]
第二个问题的回答,是否正确取决于这个采购是企业的物料采购还是客户的物料采购。 -
企业对物料的需求可以分为两类,独立需求和相关需求。
独立需求又被称为主生产计划(MPS),是由企业的销售预测(今年哪类产品能卖出多少数量)结合产品大类里的具体产品比例分配计算出来的。一般用于可供销售的最终产品,相关需求是独立需求的产品数量根据BOM展开的原材料或项目工时等。
以上是指基于销售预测的运营方式,如果是按单生产,那就是销售订单上的产品是独立需求,然后为制造这个产品需要投入的原材料就是相关需求。
用于销售的最终产品一定是独立需求,但原材料不一定是相关需求。比如一些配件,你可以直接在产品右侧输入proc,这时就是独立需求了(数量不是从BOM来的)。
没看书,不知回答得靠不靠谱。