Feb 04 2010

MPS Relief Worker

Category: Supply ChainZeeno @ 13:12

MPS计划的冲减主要通过MPS Relief Worker (MPS 冲减工作流程)进行,如有异常,则将导致MPS数量无法冲减,计划不准。作为Oracle ERP的核心功能之一,程序方面自然经过了诸多考验,然而在实际工作环境中,却依然会出现问题。这种问题,或许来自异常的数据量,也可能出在服务器性能上。MPS计划冲减说白了是一件很简单的事情,就是在需要冲减的环节,比如在下达离散任务或创建采购订单等特定事件发生时,系统会自动对比需求数量,并作相应冲减。在技术实现上是如下进行的:

  1. 指定事件(如创建采购订单)发生
  2. 触发器将数据插入接口 MRP_RELIEF_INTERFACE
  3. MPS 冲减工作流程处理接口数据

由于计划管理器的存在,可以保证数据被及时处理。计划管理器其中一个重要的步骤就是由MPS 冲减工作流程处理接口数据,实现冲减逻辑。但是有些时候,却发现系统总是出现很多的意外,比如可能找到这些错误:

mrupwj_update_wip_jobs 中出现 ORACLE 错误 1555

原因:由于 ORA-01555: snapshot too old: rollback segment number 2 with name "_SYSSMU2$" too small
ORA-06512: at "APPS.MRP_UPDATE_MRP_INFO_PK", line 284
ORA-06512: at line 1
, mrupwj_update_wip

mrupwj_update_wip_jobs 中出现 ORACLE 错误 1652

原因:由于 ORA-01652: unable to extend temp segment by 128 in tablespace TEMP
ORA-06512: at "APPS.MRP_UPDATE_MRP_INFO_PK", line 284
ORA-06512: at line 1
, mrupwj_update_wip_jobs 失败。

一方面,是因为DB配置的原因,另一方面,也是程序本身的问题。但是作为实施人员,这两块都无法改动,则只好对症下药,以其他方式来避免此类不是问题的问题了。

对于计划管理在冲减方面的逻辑,处理步骤上大致可以分为以下三步:

Step 1
取所有PROCESS_STATUS=2,并且REQUEST_ID为空的记录,将PROCESS_STATUS标记为3,同时将REQUEST_ID标记为处理的冲减流程请求ID。可以通过以下SQL观察哪些待处理数据:

SELECT *
  FROM mrp_relief_interface rel1
 WHERE inventory_item_id IN
       (SELECT inventory_item_id
          FROM mrp_relief_interface rel2
         WHERE rel2.request_id IS NULL
           AND rel2.error_message IS NULL
           AND rel2.relief_type = 2
           AND rel2.process_status = 2
           AND rownum <= 500
           AND inventory_item_id NOT IN
               (SELECT DISTINCT inventory_item_id
                  FROM mrp_relief_interface rel2
                 WHERE rel2.request_id IS NOT NULL
                   AND rel2.error_message IS NULL
                   AND rel2.relief_type = 2
                   AND rel2.process_status = 3))
   AND rel1.request_id IS NULL
   AND rel1.error_message IS NULL
   AND rel1.relief_type = 2
   AND rel1.process_status = 2;

REQUEST_ID先为计划管理器的并发请求ID,如果需要由MPS冲减工作流程来处理,则更新为新请求的ID。

Step 2
MPS 冲减工作流程在处理时,会根据配置文件预设值确定数量和方式。相关配置文件如下:

  1. MRP:Consume MPS (MRP:冲减 MPS)
    是否冲减MPS,设置为是
  2. MRP:Planning Manager Batch Size MRP:计划管理器批量
    每次处理接口数据的数量,建议值为500。最好不要超过1000
  3. MRP:Planning Manager Max Workers MRP:计划管理器最大工作进程数
    在设置批量大小时,每个MPS冲减流程只处理对应数量的记录,因而如果接口数据量较大,会同时出现多个并发。该配置文件就是用于限制最大并发数量的。

计划管理器也会处理PROCESS_STATUS=3的数据,但是这里的批数量只约束MPS冲减工作流程。

Step 3
如果第二步正常处理,则接口数据会被标志为PROCESS_STATUS=5。Planning Manager启动时,会检查接口数据,并启动Planning Manager Worker (once-a-day tasks),该请求会定期清理接口表中PROCESS_STATUS=5的数据。保留的时间范围由配置文件 MRP:Interface Table History Days 决定,默认是5天。

如果出现异常,则异常消息会记录在ERROR_MESSAGE,同时将PROCESS_STATUS标记为4。具体处理措施因事而异,如果需要重新处理,则必须先重置状态:

UPDATE mrp_relief_interface m
   SET process_status = 2,
       request_id     = NULL,
       error_message  = NULL
 WHERE m.relief_type = 2
   AND m.process_status = 4;

不要一次性更新太多数据,最好在配置文件 MRP:Planning Manager Batch Size 的数量范围内,分批次进行。在处理时,需要先停止计划管理器,修改完毕后再重新启动计划管理器。

下面的SQL可以检查接口表中各类数据的数量:

SELECT organization_id,
       SUM(decode(process_status, 1, 1, 0)) status1, --Do not process
       SUM(decode(process_status, 2, 1, 0)) status2, --Waiting to be Processed
       SUM(decode(process_status, 3, 1, 0)) status3, --In Process
       SUM(decode(process_status, 4, 1, 0)) status4, --Error
       SUM(decode(process_status, 5, 1, 0)) status5 --Successful completion
  FROM mrp_relief_interface
 GROUP BY organization_id;

需要留意的时,如果在功能逻辑范围内的错误,并不影响整个MPS冲减流程继续下去,但是如果是其他错误,如回滚段不足、快照陈旧等,会令MPS冲减工作流程挂起。在整个流程中,是根据并发请求状态来判断步骤是否完成的,因而可采取的措施是可以尝试手工修改并发请求状态,然后下一步继续执行。这种操作的后果就是冲减数量不正确。也可以先停止整个流程,待问题修正后重新启动MPS。

每次手工启动MPS计划流程时,都必须先执行MPS Relief Worker,就是为了保证计划数量的正确。而该程序正常执行的前提,就是接口中不应存在太多的数据。整个主计划的性能,由此可见一斑。


Dec 09 2009

Error: Delivery xxxx cannot be Ship Confirmed

Category: Supply ChainZeeno @ 09:48

一切正常操作,但是在做发运确认时,依旧提示如下错误:

Error: Delivery [xxxx] cannot be Ship Confirmed.
For more information click the details button.

点击查看错误明细:

Error: In delivery [xxxx] , the total shipped quantity for order number [xxxxx] exceeds the tolerance.The source system for this order is Project Contracts. The maximum shipped quantity allowed for the line [xxxxxx] within this delivery is 30.

Actions suggested to resolve the issue:
1) If delivery lines are pending with over pick flag checked and source line [xxxxxx], please pick confirm them. (Not for Third Party Warehouse)
2) Reduce the shipped quantity for the delivery lines with source line [xxxxxx] to bring within over ship tolerance.

Metalink 943179.1 提到过该现象,是由于发运数量超出Ship Tolerance Above (STA)造成的。这是常规原因,但它并没有涵盖所有的问题。进入Shipping Transactions Lines查ship_tolerance_above值为空,也就是说,默认上限为行上的Requested QTY,而在本案例中,发运数量为30,比需求数量30.409370703164要小。

乍看之下,似乎没有问题,但是事实上这是一个比较基本的,也是普遍的问题。在Oracle ERP中,各个模块和功能对于数字精度的处理方式都是不同的,有些地方最大到小数点后5位,有的地方可以到9位,甚至于,有些功能在应用patch升级后,直接将小数位精度调高(有时候会因为数字不匹配而导致功能异常)。所以在任何时候,都必须对精度问题保持警惕。

在这个案例中,将需求数量调整为30或者30.1(也可以采取四舍五入的简单办法,关键是精度),重新Ship Confirm,一切回归正常。

由于各模块集成度较高,建议在任何可能的情况下,控制数值精度在小数点后5位以内,这是最简单解决此类异常的有效办法。


Aug 18 2009

库存计划:预测方式

Category: Supply ChainZeeno @ 17:24

之前已经提到过,对于Non-MRP的库存计划,其核心便是对未来供应和需求的预测。Oracle库存管理模块提供了基于历史数据的预测算法。预测数据可以来源于其他预测,也可以来源于MRP,或者直接基于历史数据根据一定的数学模型创建预测。要创建预测,必须先定义预测规则,包括了时段类型和统计数据来源等,其中需要解释一下预测方式(也称之为预测模型)。

预测方式只有两种:集中(重点)和统计。

集中

集中预测方式通过评估多种预测技术来测试选定物料,并选择一种最佳预测技术来预测需求。该方式主要通过以下5种模型来预测:

  1. 预测值 = 上年度同期实际需求
  2. 预测值 = 本年度上一期实际需求
  3. 预测值 = 本年度前两期实际需求的平均数
  4. 预测值 = 上年度同期实际需求 x (本年度上一期实际需求 / 上年度上一期实际需求)
  5. 预测值 = 本年度上一期实际需求 x (本年度上一期实际需求 / 本年度上上期实际需求)

集中预测方式仅按照以上模型进行预测。那么,如何评估哪种模型更合适呢?这需要通过绝对百分比误差(APE)来评估预测效果,该值越小,预示着预测精度越高,最终也会选择APE值最小的预测。

APE = (实际需求 – 预测需求) / 实际需求

重点预测方式主要是为了预测某个期间(单期)的需求,实际上,它并不限于需要预测的期间数量,只是针对每一期都采用该方式。

统计

统计预测方式使用指数平滑法、趋势以及季节性算法来预测物料需求,具体包括:

  1. 指数平滑模型
  2. 趋势模型
  3. 季节性模型
  4. 趋势和季节性模型

在系统中,针对选择的模型都必须输入介于0和1之间的因子数值。每种模型具体的计算方式,有兴趣的话可以寻找相关资料自行查阅。如果不清楚因子的具体作用,不妨输入1,数值越靠大,表示越偏向于近期的数据。

不管采用何种预测方式,为了保证预测精度,至少要具备一年的历史数据。


Aug 14 2009

MRP技术概览

Category: Supply ChainZeeno @ 15:21

Oracle是通过基于内存的计划引擎来生成MRP计划的,所谓基于内存,是相对于以前版本中将中间过程存储在数据库中的方式而言,它一次性将所需数据(快照)装入内存,然后在内存中进行各类运算。这些数据包括很多方面,如离散任务、重复性计划、资源需求、采购申请、物料保留、采购订单、安全库存等等。在运算逻辑上,相关资料很多,此处不谈。在技术组件的设计上,大致按以下流程图所示:

可以看到几个关键信息:

  1. 快照监控程序通过数据库管道和基于内存的快照进行进程间的通讯。
  2. 快照删除工作流程清理过期快照数据,有助于提高本次运算速度。
  3. 运算结果数据直接写入操作系统的文件,然后通过SQL*Loader装载数据并进行到下一步骤。
  4. 基于内存的计划员执行计划,期间会调用数个工作器来计算特殊逻辑。

基于内存的计划引擎有个最大的缺点便是,在忙时很容易出现ORA-01555 snapshot too old 的错误。

逻辑计算过程,可以通过 MRP –> 查看计划状态 –> 快照任务 功能来查看。

P.S: 流程是用Visio画的,不是很熟练,缺少一些想象中的示意图形。不过,基本上应该算是清楚的了。


Aug 11 2009

库存计划

Category: Supply ChainZeeno @ 21:57

ERP一个最大的作用就是把理论模型整合成一个简单的功能来使用。在实际应用时,最缺的不是理论,而是缺少简单明了的实现方式。如果一种工具能够通过简单的操作来让使用者实现管理目标的话,那就是最好的工具。在成长性企业中,由于缺少成熟的管理工具和体制,这尤其重要。

安全库存是一种建立于统计学理论基础上的,根据平均消耗速度变化情况建立的保险库存。在量化计算上,有很多影响因素,比如历史需求、提前期、期望服务水平等等。在SAP中,关于安全库存方面有很清晰的功能区分和设置,比如动态安全库存、安全时间等。Oracle电子商务套件中也有专门关于库存优化(Inventory Optimization)的内容,里面有多种优化工具和技术,不过这些都适合专业分析人士使用。其实,Oracle库存管理模块就已经提供了更适合业务部门(初级用户)使用的、更简单的方式来制定库存计划:最小最大计划和再订购点计划,两者使用方式和适用对象有所不同,各有优缺点。

  • 最小最大计划。
    要求预先手工设置库存物料的最小值和最大值,这是一份相对静态的数据,系统判断现有量是否到达最小值这一临界点来决定是否需要采购。同时,要提供订货量范围和提前期等信息,以确保订货量符合经济订货原则,又满足供货商的订货要求,这在很多场合下非常重要。对于需求比较固定,日均耗用比较平稳的物料,这种方式是可以考虑。对于项目专用的物料,一般不考虑使用。
  • 再订购点计划。
    该方式根据预设的安全库存量自动判断是否需要订购。安全库存量的设置可以是手工的,也可以根据预测自动装入。预测是根据一些可选的模型来自动计算的,它是一门科学,也是一种艺术。这种方式多数情况下无法灵活划分采购数量范围(可以根据安全库存量和预测数量确定),仓库管理员可能会有一种无法把控的感觉。也就是说,需要有稳定的供货来源,而这样的供应商却是比较难找的。
    算法为:再订购点 = 安全库存量 + 提前期 x 日均耗量。

从数理统计方面讲,两者都是建立在复杂的运算逻辑之上的,不过简而言之,两种方式都是通过计算库存量是否达到一个临界点,如果到了,就按照规则自动生成供货需求(通常是指采购申请)。所不同的是,再订购点是一种相对动态的安全库存管理算法,它的可靠性更多地依赖于预测的准确性,而预测的准确性则依赖于计划的准确性。对于项目制造型企业,这个很有难度。

在考虑动态安全库存时不得不联系到MRP,必须承认,在实际应用中,MRP很少有成功的案例。在很多时候,MRP是最受人追捧的计划手段,但是它的实际效果往往和预期的有很大出入,原因在于它是一种基于需求的计划。如果一个企业中,项目风险控制能力和计划水平有限,往往导致需求的不确定,此时,基于需求的计划便往往适得其反。很多企业,MRP并没有带来效益,反而成了一种灾难。而上面所述的两种计划手段更多的是基于历史需求,尽管有很多预测模型可供选择,但是它们也只是为了平滑需求曲线,并不会造成太大的偏差。因而基于历史库存消耗量的库存计划,更能让人感觉可靠。

如果生产计划做不好,就慎用MRP,从而也要慎用基于需求的库存策略,在预测中,需要减少需求的因素。而最小最大计划,则更适用于通用库存物料。不过,安全库存量依旧是一个成熟的、有依据的数据(有一整套的理论模型),不妨用于做最小最大计划中订购量数值的参考。

Continue reading “库存计划”


Aug 03 2009

ABC分析

Category: Supply ChainZeeno @ 16:10

ABC分析法在存储管理领域顶顶大名,是一种非常简单、易行、有效的管理办法。在工作中,我们经常需要将工作任务分成主、次,重要、次要,其实都是一般的道理。

ABC分析法又称巴累托分析法、ABC分类管理法、重点管理法等。它是根据事物在技术或经济方面的主要特征,进行分类、排队,分清重点和一般,以有区别地实施管理的一种分析方法。由于它把被分析的对象分成A、B、C三类,所以称为ABC分析法。更具体的定义和操作方法,可以参考百度百科的知识条目

在Oracle库存管理模块,ABC分析被简化了到了极致,可以通过非常简单的几步操作就可以完成分析。通常,我们已经使用了自行开发的报表工具来进行统计分析,但是考虑到Oracle已经提供的几种统计途径(标准),而且在实际工作中,ABC分类并不要求非常精致的数据,标准功能已经基本上达到了目的。本文简单介绍该功能的使用。

第1步:收集数据

即针对某一个特殊管理问题,收集特征数据。Oracle将其命名为一次“ABC编译”。

导航:ABC 代码 –> ABC 编译,选择新建

该界面用于命名此次统计,并选择统计范围和方式。保存后选择“编译”,后台即提交一个请求进行数据统计。

内容范围:

  • 库存组织:编译时将包含该库存组织下所有的物料,包括零成本的或无现有量的。
  • 子库存:编译时仅包含在“物料/子库存”中定义过的物料。

估价范围:

  • 组织:即根据物料在整个库存组织范围内的估价。
  • 子库存:仅针对所选子库存范围内进行估价。

编译标准:值,是指单位成本乘以数量的值。

Continue reading “ABC分析”


Next Page »