Archives for July 2008

职责失效后出现重复记录

将一个用户的某个职责失效后重新查询,发现出来两个同样的职责,并导致无法新增职责。

解决办法为依序执行下列并发请求:
1, 使责任职责数据与 WF 表同步。
2, 同步 WF 局部表
3, 工作流目录服务用户/职责验证 (参数:修正不匹配用户/职责,添加丢失的用户/职责分配 均为“是”)

基本上,用户职责相关信息存储在 FND_USER, FND_RESPONSIBILITY, WF_LOCAL_USER_ROLES, WF_USER_ROLE_ASSIGNMENTS 这四张表里,如果数据完整性被破坏,则可能导致相关问题。EBS中必须手工同步FND_USER到工作流用户职责表中,也可以设置为定期请求自动同步。

然而光是FND_USER和WF用户数据不同步并不能导致本文所述的问题。追溯该用户所有可能导致该问题的变动,可能可以联系到APC。Oracle EBS 的Advanced Product Catalog(高级产品目录)是11i版本中免费使用的应用,它主要用于工程物料的创建的维护。在APC中可以为物料的创建设置审批流,如果用户从该审批流中移除,则可能导致出现该问题。

处理采购申请审批流待定

如果是对采购订单做审批,在选择“Approve”后订单状态可立即更新为“批准”,但是采购申请的审批则不是这么回事。

图:活动历史记录

图:状态图

Metalink(382935.1) 上给出了解释,大意是说由于系统和当前审批人的联系非常紧密,如果他已登录,则会导致无法处理。这个理由,或者说是这个工作流的设计,有点不着头绪。Metalink 367659.1 列出了所有类似的问题,这些问题都出现在11.5.9 and 11.5.10 两个版本中。

In the case of delegate, deferring the workflow is inevitable as the whole application is closely tied with the person who is logging in.

The response from the delegated-to person has to be processed as if the original approver responds. Since the application is tightly integrated with the person who has logged the above cannot be achieved because the person who has logged in currently is the delegated-to person.

一种推荐的解决办法就是定期执行工作流后台流程 (workflow background process),该程序会定期收集处于待定状态的工作流,并继续推动工作流到下一步骤。

Oracle认证官方博客

Oracle官方博客网站上新开设了Oracle认证的博客,它由Oracle认证团队负责撰写,主要介绍Oracle认证相关知识,包括认证的价值、如何学习认证课程、操作练习等内容。

曾经等待EBS的专家认证登录中国,但是这种行为通常会被前辈们取笑,在他们眼里,认证毫无意义,关键在于经验。在我眼里,认证不是证书本身,不是为了寻找更好的工作,而是通过这一系列系统性的课程和试卷,对EBS有个更加完整的了解和掌握。事实上,在中国,任何认证本身,都难不倒久经考场的中国考生。我想起数年前考Oracle 数据库10g OCA的时候,通读了一遍课程介绍中列出的官方文档,就轻松通过了,而同时在一些论坛上,却看到不少人在寻求题库,同时也有很多人声称自己做了哪些练习题,并炫耀其命中率。

Paul Sorensen (Director, Oracle Certification)承诺每周将更新1至2篇博客,这个频率在我眼里是非常高了。正常情况下,每个月能抽空写一篇有价值的技术博客,已经难能可贵了。对于关注Oracle认证最新情况和动态的人士而言,这里应该能获取到最有价值的信息。

不过,估计这个官方博客将着重讲述Oracle数据库的相关认证,有没有其电子商务套间、中间件的介绍?有没有世界各地区认证情况的介绍?我们试目以待。

P.S: Oracle的博客不提供留言功能,你只能看,不能反馈。

CpContext Info

EBS中的并发程序实在是非常方便好用的工具,尤其是PL/SQL程序和Java程序也可以方便的以并发程序的方式来实现。

Java并发程序通过扩展interface JavaConcurrentProgram 来实现,因而可以通过标准的参数来获得环境变量和数据库链接句柄:

public class CuxProg implements JavaConcurrentProgram
{
public void runProgram(CpContext pCpContext)
{
//请求执行结束状态
mReqCompletion = pCpContext.getReqCompletion();

// 日志
mLogFile = pCpContext.getLogFile();

// 输出
mOutFile = pCpContext.getOutFile();

// JDBC链接
mJConn = pCpContext.getJDBCConnection();

// 并发请求参数
mProgParameters = pCpContext.getParameterList();

// NLS信息
mLocale = pCpContext.getLocale();

// 请求相关信息,包括USERID、应用ID等
mReqDetails = pCpContext.getReqDetails();
}

private ReqDetails mReqDetails;
private ParameterList mProgParameters;
private ReqCompletion mReqCompletion;
private LogFile mLogFile;
private OutFile mOutFile;
private Connection mJConn;
private Locale mLocale;
}

这段代码并不能直接编译执行,可执行的代码可以参考Metalink(305710.1) 上的A SAMPLE JAVA CONCURRENT PROGRAM