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,就是为了保证计划数量的正确。而该程序正常执行的前提,就是接口中不应存在太多的数据。整个主计划的性能,由此可见一斑。


Jan 28 2010

EBS的后台执行方式

Category: E-Business SuiteZeeno @ 11:35

在应用中,应当避免执行一些长时间运行的操作,毕竟对于一个OLTP环境,快速响应才是重心。在某些情况下,可能无法使用批处理的方案,需要在用户界面做操作,但是某些特殊环节可以后台运行。这时候,在设计功能时就应当考虑异步处理机制,尤其是要用好批处理和后台处理等方式。

对于后台处理方式,EBS中大致有这么几种方式可选:

  1. 并发请求
    并发请求几乎可以实现任何耗时的运算,也是在EBS环境中常用的后台处理方式。比如很多地方都允许设置处理方式,如联机处理、后台处理等。根据系统性能和响应要求自行组合逻辑块。这种方式的优点是实现简单,管理方便,缺点是受限于并发管理器的配置。此外,大多数企业里的并发程序都运行在数据库服务器上,如果涉及到异构系统的数据传递需要考虑到安全方面的问题。
  2. 工作流 (Oracle Workflow)
    如果是逻辑判断比较清晰又比较复杂的话,这是不错的候选方案,实施顾问也可以非常清晰的看到各个流程走向。这个方式的优点是可以将运算逻辑模块化,缺点是偏长于逻辑判断,而不适用于大数据量运算。
  3. 业务事件 (Business Event)
    业务事件依托于Oracle Workflow,允许客户自行订阅并执行客户化代码。业务事件底层用到了AQ,可以将消息从数据库层传递到应用层。这也是我最欣赏的一块内容。EBS内置了很多标准的事件,比如付款、BOM更新、资产转移等。这种方式的优点是代码都在应用层执行,管理方式简单,缺点是标准的业务事件数量太少了。
  4. DBMS_JOB
    这其实算是一种非标准的方式,但是对于客户化应用比较合适。有时候,使用并发请求和业务事件都太过麻烦,但是通过JOB可以非常迅速的剥离执行逻辑,对用户而言,这可以算是比较标准的后台处理方式。这种方式的优点是简单方便,缺点是适用范围有限,适合在数据库层的运算。
  5. 管道 (PIPE)
    Oracle数据库管道技术在EBS系统中,我目前只发现MRP运算时有用到。它在应付多程序间通讯方面有优势,一个极端的应用是你可以在操作系统shell中实时看到某并发请求的运行情况。它的实现逻辑简单来讲,就是一个会话将消息发送的缓冲区,另一个会话从消息缓冲区读取消息。这种方式的优点是通讯方便,缺点是可能需要自行设计多会话间的消息封装机制,并且仅适用于小数据量传递。
  6. 高级队列(AQ)
    EBS中很多异步处理机制都利用了AQ,这相对而言太过于“底层”了,很少在二次开发领域有用到的。在大型的客户化应用中用的较多。

简单来看,对于后台处理方式就以上这么几种了。EBS R12中内置了SOA,可以通过外部平台进行运算,但是我不认为这是EBS系统范畴了。

个人比较推荐的是使用JOB,这在我的经验中是最简单有效的,不过前提是需要自行设计一套错误处理机制。如果涉及异构系统,我优先考虑业务事件。


Jan 12 2010

Oracle E-Business Suite Development & Extensibility Handbook

Category: ReviewZeeno @ 13:59

对于Oracle初学者,我一直推荐其阅读官方文档,但总是得到因为这样那样的理由而没去读的反馈。他们宁可花费近百元去书店买一本名不见经传的书籍,也不愿意免费阅读最权威的文档。起初我以为是语言问题,后来发现不是。哪怕英语水平非常不错的人,也宁可去书店淘上一本。那么,只好归结为个性喜好问题了 :)

对于Oracle E-Business Suite的文档,11i的我全部浏览过了,R12只是部分去阅读过,基本上只是偶尔增加一两章和少量修改。当然,对于近一半文档我也确实仅仅只是“浏览”,毕竟实际工作中不可能对所有模块都深入接触。这部分文档主要还是针对功能层面的,比较适合系统管理员和实施人员阅读。对于开发人员,看的更多的通常是一些专项的技术文档了,尤其汉得流出来的大量文档,也培养了不少甲方开发人员啊。

近期也在阅读一些书籍,主要关注两方面:深入某专题领域的,或是适合初学者的。前者为了自己,后者主要是看看有没有合适的书籍方便新员工的培训。此外,我认为实施顾问了解产品的技术架构,也是非常有益的。深入下去,沉淀一段时期后再来梳理业务问题,或许会对当初的方案有更多的了解和想法。我觉得《Oracle E-Business Suite Development & Extensibility Handbook》(豆瓣链接)就是这样一本非常不错的书。

目录:

  • Introduction to Oracle E-Business Suite . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
  • E-Business Suite Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
  • Application Object Library (AOL) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
  • Multiple Organizations Feature . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
  • Development of Concurrent Programs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89
  • Forms in Oracle Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
  • Reports Development and Customization in Oracle Apps . . . . . . . . . . . . . . 157
  • BI Publisher in Oracle Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
  • OA Framework: Concepts, Development, and Extensions . . . . . . . . . . . . . . 211
  • Custom Look and Feel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
  • Oracle Workflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
  • Oracle XML Gateway . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
  • Moving AOL Objects Between Instances . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
  • Integration Between E-Business Suite and SOA . . . . . . . . . . . . . . . . . . . . . . 425
  • SQL Performance Coding Guidelines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443

基本上已经讲清楚了EBS的整体架构和二次开发相关技术。通览全书,从作者角度看,或许OAF是一种重心,这也是当前EBS二次开发领域比较重要的一块。不过我觉得,OAF开发从投入产出来看其实并不是很划算,开发效率没Form高,页面效果没其他应用Web 2.0技术的产品好,如APEX。其次,Custom Look and Feel 也是比较新鲜的一个主题,官方文档中几乎没有涉及。

书中的内容,光从知识性角度看,有2/3是在EBS官方文档中有了的。尤其是涉及一些基础架构的东西,还不如阅读文档比较通畅明了。Workflow 和 XML Gateway 简直有充数之嫌,实在太过粗糙了。FNDLOAD的介绍或许还没有我之前博客中介绍的详细。SOA这一块也简单了点,其实从个人角度看,或许可以把Workflow字数移到这边来多讲一些比较好,毕竟,Workflow在R12中的应用比重虽然依然非常巨大,但是对二次开发而言,比重很轻,而且这毕竟也是一种趋势。

不管如何,从二次开发角度来看,这是一本非常不错的书籍。市场上太多的书不是侧重于Apps DBA,就是侧重于功能和实施,对于二次开发,这本书介绍了几乎所有在实际工作中常见的开发技术,是值得推荐的。


Jan 09 2010

使用EBS日志功能

Category: E-Business SuiteZeeno @ 15:26

目前,EBS系统中存在多种日志记录方式,有用于PL/SQL的,有用于Java的,有OAF等开发框架自带的,也有Forms Server之类服务器专用的诊断方式。通常来讲,所有二次开发,为了统一规范和便于管理,应当将将客户化系统中日志记录和Oracle EBS中的日志记录进行整合,用统一的方式进行日志记录和诊断。

Oracle EBS调试日志级别

系统中将调试日志级别分为6个级别,分别是:

Type Level Description
UNEXPECTED 6 未知异常
ERROR 5 错误
EXCEPTION 4 异常
EVENT 3 事件
PROCEDURE 2 过程
STATEMENT 1 语句,该级别最低,记录的日志信息也最详细。

该级别通过配置文件 FND:调试日志级别 控制。

调试日志模块

日志必须指定当前所执行的程序,也就是所谓的模块。模块用于区分不用程序产生的日志,比如我的一套用于将EBS事件通过手机短消息发送出去的整套程序统一定义成日志模块:oracle.apps.cux.msg.transport。如此,不论是简单的PL/SQL、Form或并发程序产生的短信内容,都可以作为一个整体进行日志记录。模块名可以自行定义,该定义需要有意义,并能和其他程序明确区分。该特性由配置文件 FND:调试日志模块 控制。

不需要修改代码,诊断时可以根据需要随时启用或关闭调试日志,由配置文件 FND:启用调试日志 控制。

调用示例

先在程序中创建过程,如:

PROCEDURE trace(x_level   IN NUMBER,
                x_message IN VARCHAR2) IS
BEGIN
  IF (x_level >= fnd_log.g_current_runtime_level) THEN
    IF (fnd_log.test(x_level, 'oracle.apps.cux.msg.transport')) THEN
      fnd_log.STRING(log_level => x_level,
                     module    => 'oracle.apps.cux.msg.transport',
                     message   => x_message);
    END IF;
  END IF;
EXCEPTION
  WHEN OTHERS THEN
    NULL;
END trace;

然后用以下方式调用:

trace(fnd_log.level_procedure, 'Enter get_num');

日志查看

SELECT *
  FROM fnd_log_messages f
 WHERE f.user_id = 1113
   AND f.log_sequence > 492519740
 ORDER BY f.log_sequence;

对于普通的二次开发(一些较大的平台可能需要有自己的诊断方式),建议使用通过的方式记录日志,否则,如果各行其是,或者随手就自己设计一套日志记录方式的,当开发数量到达一定规模时,会让管理工作变得复杂。

题外:
这是早期时给团队中二次开发制订的相关规范的一部分,记在Confluence上。近日考虑撤出该平台,在角落里翻出来的一篇。另外,知识库的建设真是一项即简单又麻烦的工作……


Jan 08 2010

Oracle DBA 2009年度薪水统计

Category: UncategorizedZeeno @ 08:19

尽管你可能经常碰到一些看上去很糟糕的DBA,尽管你可能觉得DBA的工作其实蛮简单,甚至有时候根本不知道他们的工作有什么意义,但是无可否认的是,在这个行业中,Oracle DBA的薪水还是可以排得上号的。在中国,高级DBA可以获得10~15万的年薪,而对于某些特别出色的专家而言,年薪20~30万的也不乏其人。

Oracle 发布了全球2009年度DBA薪水统计报告,基本上可以看出,DBA依然是一份越老越吃香的职业:

在国内不乏有一些人认为,认证的获取无关紧要,关键是看实际工作能力和经验。Oracle 就专门做了这么一番统计:

暂且不论该统计数据从何而来,但是那些未取得认证的人看过后是否有一种异样的冲动?其实,把认证和工作能力等同起来讨论本身就是毫无意义的,就好比去说一个博士比一个本科生人品更好一样。在中国,估计没有哪个专职DBA未获得认证的,剩下的,可能以兼职居多。

在该报告中,可以按地区(没有中国),按公司规模,甚至按认证数目来进行统计。总而言之,对于职业发展毫无目标的人,这是一个不错的参考。


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位以内,这是最简单解决此类异常的有效办法。


« Previous PageNext Page »