OpenERP的MRP运算的核心对象--Procurement Order
-
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来的)。
没看书,不知回答得靠不靠谱。 -
[quote author=Jeff link=topic=2923.msg9947#msg9947 date=1337759600]
企业对物料的需求可以分为两类,独立需求和相关需求。
独立需求又被称为主生产计划(MPS),是由企业的销售预测(今年哪类产品能卖出多少数量)结合产品大类里的具体产品比例分配计算出来的。一般用于可供销售的最终产品,相关需求是独立需求的产品数量根据BOM展开的原材料或项目工时等。
以上是指基于销售预测的运营方式,如果是按单生产,那就是销售订单上的产品是独立需求,然后为制造这个产品需要投入的原材料就是相关需求。
用于销售的最终产品一定是独立需求,但原材料不一定是相关需求。比如一些配件,你可以直接在产品右侧输入proc,这时就是独立需求了(数量不是从BOM来的)。
没看书,不知回答得靠不靠谱。
[/quote]
没看书,但是回答照样标准,一丝不走样。虽然不是我期待的答案,但确实对所介绍的内容的一个很好的补充。其实我的这个需求类型的提问设计的并不好,按照不同的标准划分,就会有不同的答案。
[quote author=dquo link=topic=2923.msg11212#msg11212 date=1338413597]
可变物料/不可变物料?
可变:材料,人?
不可变物料:车间(车间相关服务人员工资,车间水电杂费及车间的房租等)
咨询校长:OE的人的使用方法?象服装等很多非标准流水线工厂,人多人少直接影响生产进度,发现OE有人这个选项,但这个人可以从哪几个方面来影响生产任务单呢?
[/quote]
感谢鱼的热情参与。材料,人或者更准确的说是人所花费的时间都是需求所涉及的对象而非需求本身。关于生产任务单的问题最好能另开帖子讨论,我们就不在这里纠缠了 -
需求的来源和转化
==========
我们在上回介绍了需求单运行时如何因为产品的Supply Method(供应方式)的不同而转化为不同的业务单据(生产单,采购单)以满足Proc所代表的需求,以及如何自动定时来运算需求。如果我们还做了上回介绍中提到的一个试验,那么还会进一步了解到如果产品类型为Service(服务),Supply Mechod(供应方式)为生产的产品所对应的Proc会转化为任务单。这个理解起来也是顺理成章:任务单用以满足对服务的需求。产品类型中还有一个被称为Consumable的,这类产品实际上不会产生需求转化,不参与需求运算。可以简单理解为这种产品有无限库存,随需随取,无需生成采购/生产等单据来满足需求,一般用以定义那些低值易耗的原料,比如生产中需要的螺丝,我们会定期采购大量的螺丝而无需根据生产需求来计算其用量。其实说到这里我们就感受到了需求的来源这个话题,也能基本回答上一回中为什么对以Supply Method为生产的产品运行其相关Proc会在生成生产单的同时又生成了大量与此生产单相关的Proc. 这是因为生产过程会产生对原料的需求,也就是说生产就是一个需求的来源。可是,我们在上回的最后问的是:"需求的最终来源是什么?生产是一个需求的来源,可是生产的目的最终还是用来满足客户的需求。所以,客户的需求是需求的最终来源,在OpenERP里就是销售订单。销售订单的确认即会生成需求单Proc.
再来看看需求类型的问题。其实对于类型的划分按照不同的标准划分就有不同的答案。我这里所想要涉及的Proc的类型划分是在产品定义和Proc定义上都出现的一个字段:Procurement Method. 这里有两个可选项:Make To Order(MTO) 和 Make To Stock(MTS)。我们一般将之翻译为"面向订单的生产"/"面向库存的生产",其实这个翻译不够准确,Make在这里不仅是生产的意思。我们也看到了在前几回的Proc介绍中MTO类型的Proc会转化为采购单而与生产无关。我个人将OpenERP中的MTO理解为"直接需求",MTS理解为"间接需求"或"面向库存的需求" 或 "计划性需求"。那么她们之间到底有什么不同呢?
这里是关键点:[b]MTO能通过运行处理直接生成其他的业务单据(比如:采购单,生产单,任务单)[/b],这在之前的操作中已经了解。[b]而MTS则比较特殊,他本身不会生成其他业务单据,但是它的存在可能会导致其他的MTO类型的Proc的产生[/b]. 我们这就通过创建一个销售订单来证实:销售订单是否会生成需求单,MTS类型的需求单是否"有可能"导致其它MTO类型的需求单的生成:
用以下内容创建一张销售订单:
客户: China Export
订单行:
订单行1- 产品:PC1 数量:10, Procurement Method: [b]MTO[/b]
订单行2- 产品:Keyboard 数量:30, Procurement Method:[b]MTS[/b]
[b]注:Procurement Method 在订单行窗口的Extra Info页中,其默认值来自于产品表单上的Procurement Method的设定,这里注意将PC1从默认的MTS改为MTO[/b]
[attachimg=1]
[attachimg=2]
好了我们的客户同时订了两个不同的产品,我们也为其定义了不同的需求类型,记住订单号:SO014, 然后确认订单。然后到Procurement Exception菜单项这里,点击Clear以清除默认的过滤条件,然后在Source Document中输入SO014,查询与SO014订单相关的Proc:
[attachimg=3]
的确,当订单确认后两个订单行分别生成了相应的Proc,其上的产品,数量,Procurement Method都与订单行一致。如果我们运行这些Proc会怎么样呢?on order(MTO)类型的Proc我们已经做过试验,不出意外的话,会生成一张生产单,和一些生产所需原料的需求单。而from stock(MTS)类型的Proc还不知道会如何反应。点击"Compute Scheduler",在弹出窗口中再点击"Compute Schedulers"。然后返回Procurement Exception菜单项,仍然查询SO014相关的Proc:
[attachimg=4]
会发现的确如前预料,PC1相关的MTO类型的Proc运行后生成了生产单MO/00011,而该生产单又生成了大量的以SO0014:MO/0011为源单据的需求单(绿色框所示)。可是,但是,可但是,我们from stock的Proc却坚决的毫不犹豫的又给了我们一个Exception. 其错误原因倒也写得详细:"库存不足,未定义最小库存规则" 。从这个错误似乎能推出OpenERP对 这个MTS类型的Proc的处理过程:面向库存的需求,当然首先检查库存是否能满足本需求的要求,当库存不足时产生Exception,同时其又似乎尝试做库存补货的操作以使库存量能满足Proc,但是这里又碰到了没有设置补货规则(最小库存规则)的问题。
如果大家还记得第二回中的内容,我们提到过"最小库存规则"这个说法。这里要提醒一点:我们这里讨论的Proc话题基于的是目前最新的OpenERP V6.1 发行版本,V6.0x及以下的版本最小库存的设定在Warehouse-Configuration-Automatic Procurement-Minimum Stock Rule, 而不会如6.1这样在产品定义界面中出现。我们这就为Keyboard设置最小库存规则:
[attachimg=5]
这里的我们对仓库为:Your Company, Stock Location(存货地点)为:Stock设置了最小订货规则。这里的Minimun Quantity和Maximun Quantity的意思是:当库存数量不足10个时,该规则要求补货至最大库存量,即100个。所以Minimun Quantity是前提条件,而最大库存量是计算实际补货需求量的基础。由此我们可以推测出:库存规则的设定,就会衍化出物料需求。根据我们之前强调的“哪里有物料需求哪里就有需求单”的口诀,当这个库存规则条件满足(Minimum Quantity),就会产生物料需求,从而会产生需求单。再来"Compute Schedulers",然后再来搜索SO0014相关的Proc。
发现那个from stock(MTS)类型的Proc仍然是Exception状态,但是仅仅是库存不足的错误提示,而没有了之前未设置库存规则的抱怨了。可是在列表中没有发现有新生成的需求单。其实,新的需求单已经悄然生成,只是不再与SO014这个销售订单有任何直接关系,所以你无法通过源单据为SO014来过滤该Proc. 我们换为查找产品为"Keyboard"的所有Proc:
[attachimg=6]
你会发现一个源单据为OP/00013 的Proc而其需求类型为MTO。这证实了我们之前所说:"MTS类型的需求单本身不会生成其他业务单据,但是它的存在可能会导致其他的MTO类型的Proc的产生." 再来注意一下源单据号,这里的OP代表Order Point, 看来这个需求单的确是因为激发了库存规则(即Order Point)而产生的。至此,我们了解了产品设置界面上:Product Type, Procurement Method,Supply Method, Minmun Stock Rule 之间的关系和对Proc的影响,以及需求的终极来源为销售订单,销售订单的确认导致需求的确认,每个订单行会生成对应的Proc 。
我们接下来还需要了解需求产生的数量,地点,时间,它们在Proc上的反映,以及OpenERP对它们的处理。而要讲清楚这些问题,我们首先必须理解OpenERP的一个独特设计:复式库存计算, 敬请期待。