解决EBS中混淆经营单位和库存组织问题
十一月 13, 2008 in Oracle EBS二次开发
Oracle EBS 11i , Oracle EBS 12
问题背景
前两天刚好到一个项目上面去了解项目的开发需求,遇到项目中需要将增值税发 票传到金税系统中进行增值税发 票的打印。
Oracle EBS12版本中专门开发了一个金税接口(JMF)模块来解决Oracle EBS和金税系统之间的接口,正好能够满足项目的需求。
财务顾问们按照官方文档和一些官方的演示材料,进行详细的设置和测试,两个星期下来就是无法将数据从应收模块传入金税接口模块。
正好求助我能够从技术的角度进行一下“研究”。
发现问题
我查看了传送AR发 票信息到金税接口请求的程序代码,代码中使用了fnd_log来输出日志信息,使用了Oracle EBS的日志架构,日志思想不错。
- 设置预知文件
- 开启日志输写功能
- 重新运行请求
- 从fnd_log_messages表中查看日志信息
从日志信息很短时间定位到下面这段代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | BEGIN SELECT ...... INTO ...... FROM mtl_system_items_b WHERE organization_id= p_org_id AND inventory_item_id= p_inventory_item_id ; EXCEPTION WHEN no_data_found THEN IF(FND_LOG.LEVEL_EXCEPTION >= FND_LOG.G_CURRENT_RUNTIME_LEVEL) THEN fnd_log.STRING(fnd_log.LEVEL_EXCEPTION , G_MODULE_PREFIX || l_procedure_name , 'no date found '); END IF; RAISE; END; |
看了上面这段代码,如果要抱出异常,那很有可能就是p_org_id有问题了,我想“是不是编写这段程序的同学将经营单位当作库存组织来使用啦,
但是Oracle EBS模块中总不至于犯这样的错误吧?不管怎么样要看看代码才知道怎么回事了”
于是查找调用这个过程的地方,果然看到了如下传给p_org_id这个参数的值:
1 | l_org_id NUMBER := mo_global.get_current_org_id; |
果然是将经营单位当作库存组织来使用了,查看了代码中其它涉及到库存组织的地方,都是错误的。
心想“这个错误也太不应该了吧,好歹也是Oracle EBS系统的一个标准模块啊”,但是后面也想想当年自己刚入门的时候,在自己的程序代码中也曾出现过两者混淆的情况。
经营单位和库存组织
在Oracle EBS系统中,存在很多组织的概念和分类,经营单位和库存组织在系统中都是属于组织,但它们属于不同的分类,因此所具备的特征和能力也不一样。
经营单位(Operating Unit)是指具备独立会计核算能力的单位实体,Oracle EBS系统中地应收、应付、销售、采购、现金管理和项目会计等模块都在经营单位下进行对立会计核算。
简单的按照通常企业的表现来描述,经营单位可以简单的理解为企业中的一个部门(实际上会有较大的差异)
库存组织(Inventory Organization)是用来跟踪库存业务和余额以及分销商品的一种组织形式。Oracle EBS系统中的库存、物料单、工艺设计、在产品、主生产计划/MRP、能力、质量、成本管理、供应链计划等模块都按库存组织进行安全性控制。
库存组织决定了销售和采购模块可获得的物料信息。库存组织可以简单的理解为是企业中的一个仓库(库存组织可以虚拟)
按照上面的说法应该不会讲两者混淆才对啊!
有几个原因导致这个问题的发生:
- 在Oracle EBS系统中,经营单位和库存组织都是组织,两者只是分类不一样而已,因此可以将一个名称同样叫做“OracleSeeker”的组织名称同时设置为经营单位和库存组织,所以内部ID也是一样的
- 在组织定义的基表中,组织内部ID的列名被命名为:ORGANIZATION_ID,而在外键表中有两种常用的写方法来表示:ORGANIZATION_ID 和 ORG_ID,很多时候ORG_ID都表示经营单位,ORGANIZATION_ID表示库存组织,但是有的地方不是,有些混乱
- Oracle EBS中组织架构比较复杂,对于初学者不容易搞清楚经营单位和库存组织的关系
问题的启示
本人记录这个问题,并不是想澄清经营单位和库存组织的概念和关系,而是想通过这个问题也能够对使自己在进行Oracle EBS二次开发的时候能够意识到其它问题:
- 对于一个Oracle EBS二次开发技术顾问来说,掌握技术实现是基础,这样才能更快的完成开发任务
- 仅仅掌握技术并不能做好开发,还需要了解Oracle EBS系统的应用架构和系统功能,这样才能正确地编写程序,不至于出现混淆经营单位和库存组织的情况
- 需要能够灵活运用Oracle EBS提供的各种基础函数和基础架构,如日志记录等等,当程序出现问题的时候才能够更快更好的定位问题。
- 对于开发人员,一定要有“程序一定不会骗人,要骗人也是自己骗自己”的思想来对待任何一个问题,出现问题时不能仅凭表面现象或经验判断,一定要看程序的测试说话
–