OracleERP R12 实用技术开发


Oracle ERP R12 实用技术开发.doc Oracle ERP R12 技术实践 E-BUSINESS SUITE 实用开发技巧 文档作者: Siman.He < 贺斌 > MSN : Simanhe_1@hotmail.com 创建日期: 2008-07-23 更新日期: 2008-07-23 文档编号: 当前版本: Demo 1.0 审批签字: Oracle ERP R12 实用技术开发.doc 文档控制 变更记录 50 日期 作者 版本 变更说明 10/10/07 贺斌 1.0 初版 审阅 姓名 职位 分发 拷贝编号 姓名 位置/岗位 1 2 3 4 Oracle ERP R12 实用技术开发.doc 目录 文档控制 ...................................................................................................................................2 本文档目的........................................................................................................................5 系统基本常识....................................................................................................................5 MOAC 知识点 .................................................................................................................11 R12 常用安全性函数.......................................................................................................14 WEB 相关的应用 ............................................................................................................15 1 计算物料的可用量/可保留量【物料可用量/可保留量 Open API】 .......................18 1.功能简介....................................................................................................................18 2.开发简介....................................................................................................................18 3.常见问题....................................................................................................................19 4.异常处理....................................................................................................................19 2 客户信息【R12 中如何取得客户的相关信息】...........................................................20 1.功能简介....................................................................................................................20 2.开发参考....................................................................................................................20 3 RMA 退货 API 使用【RMA 退货接口 Open Interface/Open API】......................22 1.功能简介....................................................................................................................22 2.开发参考....................................................................................................................22 3.异常处理....................................................................................................................24 4.常见问题....................................................................................................................24 4 RCV 接口使用【RCV 接口开发 Open Interface/Open API】.................................25 1.功能简介....................................................................................................................25 2.开发参考....................................................................................................................27 3.异常处理....................................................................................................................27 4.常见问题....................................................................................................................27 5 动态开发银行对帐单导入开发【对帐单导入】 ..........................................................28 1.银行对帐单导入 ........................................................................................................28 2.开发参考....................................................................................................................29 3.常见问题....................................................................................................................31 6 银行自动对帐开发【银行自动对帐开发】 ..................................................................32 1.功能简介....................................................................................................................32 2.开发参考....................................................................................................................32 3.异常处理....................................................................................................................40 4.常见问题....................................................................................................................40 7 销售订单接口【API 注意事项】...................................................................................42 Oracle ERP R12 实用技术开发.doc 1.功能简介....................................................................................................................42 2.开发参考....................................................................................................................42 3.差异............................................................................................................................42 8 销售订单的拆单【开发接口 API】 ..............................................................................43 1.功能简介....................................................................................................................43 2.开发参考....................................................................................................................43 3.异常处理....................................................................................................................44 4.常见问题....................................................................................................................44 9 按 OU 生成日记帐【接口表开发】 ..............................................................................46 1.描述............................................................................................................................46 2.开发参考....................................................................................................................46 10 总帐日记帐追随到各个子模块 ...............................................................................47 1.描述............................................................................................................................47 2.开发参考....................................................................................................................47 3.异常处理....................................................................................................................49 4.常见问题....................................................................................................................50 Oracle ERP R12 实用技术开发.doc 本文档目的 目前公司Oracle ERP R12的项目越来越多,把一些通用的技术整理下来以便大家共 同学习,避免少走弯路,总结中可能存在不足之处,请大家加以补充和指正。 系统基本常识 系统客户化应用的建立 1. 建立表空间(CUXD 主要应用于客户化的表,CUXX 应用于客户化的索引) create tablespace CUXD datafile '/u01/oracle/test/db/apps_st/data/cuxd01.dbf' size 200M reuse autoextend on next 100M; create tablespace CUXX datafile '/u01/oracle/test/db/apps_st/data/cuxx01.dbf' size 200M reuse autoextend on next 100M; 2. 数据库用户 create USER CUX identified by CUX default tablespace CUX temporary tablespace temp 3. 授权 GRANT RESOURCE TO CUX; GRANT ANALYZE ANY TO CUX; GRANT CREATE TYPE TO CUX; GRANT CREATE TABLE TO CUX; GRANT CREATE VIEW TO CUX; GRANT ALTER SESSION TO CUX; GRANT QUERY REWRITE TO CUX; GRANT CREATE CLUSTER TO CUX; GRANT CREATE SESSION TO CUX; GRANT CREATE SEQUENCE TO CUX; GRANT CREATE SNAPSHOT TO CUX; GRANT CREATE SYNONYM TO CUX; GRANT CREATE TRIGGER TO CUX; GRANT DROP ANY OUTLINE TO CUX; GRANT DROP ANY INDEX TO CUX; GRANT DROP ANY VIEW TO CUX; GRANT ALTER ANY OUTLINE TO CUX; GRANT CREATE ANY OUTLINE TO CUX; GRANT CREATE DATABASE LINK TO CUX; GRANT EXECUTE ON SYSTEM.AD_DDL TO CUX; GRANT EXECUTE ON SYSTEM.AD_DDL TO CUX; Oracle ERP R12 实用技术开发.doc GRANT SELECT ANY TABLE TO CUX; GRANT SELECT ANY SEQUENCE TO CUX; 在建立客户化的表时,有些项目可能只建立了一个索引的表空间 CUXD 这样可能不利 于我们以后的性能分析和性能调优,所以建议大伙建立表空间 CUXX,将索引放在这 个表空间上。另外对于客户化 的表,也请在系统中注册下,目的为了数据收集时可以 将客户化的表数据也能进行统计分析。 cux_ad_dd.Register_Table('CUX','CUX_XXXX'); Procedure Register_Table(p_Appl_Short_Name In Varchar2, p_Tab_Name In Varchar2) Is l_Col_Name Varchar2(100); l_Col_Seq Number; l_Col_Type Varchar2(100); l_Col_Width Number; l_Nullable Varchar2(1); l_Translate Varchar2(1); l_Precision Number; l_Scale Number; Cursor c Is Select Column_Name, Column_Id, Data_Type, Data_Length, Nullable, 'N', Data_Precision, Data_Scale From All_Tab_Columns Where Owner = p_Appl_Short_Name And Table_Name = p_Tab_Name Order By Column_Id; Begin /* Register Table Command */ Ad_Dd.Register_Table(Upper(p_Appl_Short_Name), Upper(p_Tab_Name), 'T', 512, 10, 70); /* Register Column Command */ Open c; Loop Fetch c Into l_Col_Name, l_Col_Seq, l_Col_Type, l_Col_Width, l_Nullable, l_Translate, l_Precision, l_Scale; Exit When c%Notfound; Ad_Dd.Register_Column(Upper(p_Appl_Short_Name), Upper(p_Tab_Name), l_Col_Name, l_Col_Seq, l_Col_Type, l_Col_Width, l_Nullable, l_Translate, l_Precision, l_Scale); End Loop; End Register_Table; Oracle ERP R12 实用技术开发.doc 创建客户化应用 通过菜单 系统管理员>应用>注册 进入“应用”定义窗口,新建如下记录: 应用:XXX Customization Application 简称:CUX 基本路径:CUX_TOP 说明:XXX 客户化应用 注册ORACLE用户 通过菜单 系统管理员>安全性>ORACLE>注册,打开"Oracle 用户"窗口,新增如下记 录: 数据库用户:CUX 权限:启用 安装组:1 说明:XXX Customization Application Oracle ERP R12 实用技术开发.doc *.安装组的值默认给1 ,发现如果给0时客户化的应用可能会出现问题 定义数据组 通过菜单 系统管理员>安全性>ORACLE>数据组,打开"数据组"窗口,查询‘标准’ 数据组,新增如下记录: Oracle ERP R12 实用技术开发.doc 应用:XXX Customization Application Oracle 标识:APPS 描述: 创建客户化应用目录结构 用 APPLMGR 用户(如 appltest)创建客户化应用的目录结构 用 APPLMGR 用户(如 appltest)登录应用服务器,在$APPL_TOP 下创建如下目录结 构,其中 cux 要和上面的简称 CUX 匹配。 APPL_TOP (/u01/oracle/test/apps/apps_st/appl) | CUX_TOP (/u01/oracle/test/apps/apps_st/appl /cux/12.0.0) | --------------------------------------------------------------------------------- | | | | | | | | | | | | | Oracle ERP R12 实用技术开发.doc admin forms lib html log mesg out reports bin wf setup sql package | | | | | ---- ---- ---- ---- | | | | | | | | US ZHS US ZHS US ZHS wft sql 应用环境配置(设置CUX_TOP) 用 FTP 的帐号来修改应用环境配置文件 INSTANCE.env(一般放在 APPL_TOP 下),INSTANCENAME_HOSTNAME.env(如 TEST.env,TEST_erptest.env)使 用编辑器打开文件后,查找.XML 的文字就可以看到 INSTANCE.env 调用的 XML 脚 本的路径,如: ############################################################ ######## # The CONTEXT_FILE variable stores the location of the context file. ############################################################ ######## CONTEXT_FILE="/u01/oracle/test/inst/apps/test_ebstest/appl/admin/test_ebs test.xml" export CONTEXT_FILE 根据 CONTEXT_FILE 的路径 /u01/oracle/test/inst/apps/test_ebstest/appl/admin/test_ebstest.xml 找到 test_ebstest.xml 后新增 CUX_TOP(新建 CUX_TOP 时,我们可以去参考 AU_TOP) /u01/oracle/test/apps/apps_st/appl/cux/12.0.0 然后重新启动应用。 系统并发管理器.应用,Apache脚本路径 R12中的重起应用和Apache的路径存放在$INST_TOP/admin/scripts 。 在建立客户化的应用这个环节,在做AUTO Config 的时候XML文件可能被还原。 所以建议参考公司BBS上 Oracle ERP R12 实用技术开发.doc MOAC知识点 Moac功能简介 MOAC: Oracle Applications Multiple Organizations Access Control Multiple Organizations architecture (Multi-Org) includes a new feature Multiple Organizations Access Control (MOAC) in Release 12. The Access Control feature is backward compatible, which means that there are no code or procedural changes if MOAC is not implemented (i.e. The user is assigned one operating unit for a responsibility). . The Access Control feature in Release 12 allows the user to enter or query records in one or more operating units without changing application responsibility. It is the system administrator’s discretion to either implement the feature or use the same multiple organizations profile option setting available before Release 12 by using the single operating unit mode (i.e. one operating unit for a responsibility). In Release 12, the multiple organizations context value is no longer initialized by the FND_GLOBAL.APPS_INITIALIZE routine thereby reducing unnecessary context setting and resource consumption for applications that do not use operating unit context for data security. To use the single operating unit mode you must set the "Initialization SQL Statement – Custom profile" the "mo_global.init('S',null);" to initialize operating unit context based on the "MO: Operating Unit" profile option and the "MO: Security Profile" profile option should not be set. Fresh install of Release 12 Application is enabled with multiple organizations, however, the system administrator must create operating units to use multi organizations sensitive application products. The user can create new operating units in the Accounting Setup Manager page in addition to HRMS’s Define Organizations page. 以上是MOAC的一个比较官方的介绍。详细的叙述请参考Note:420787.1 下面我们用比 较通俗的语言来叙述MOAC。 MOAC的运用其实早在Oracle 11i HRMS上就广泛被使用,现在在R12上被发扬光大。 主要目的是可以实现多组织之间的权限的切换,而不需要切换职责。 针对开发而言。我们会经常碰到的几个问题是: 1. 系统基表有值,同意词没有值。 2. 系统标准的报表中的值集有值,而客户化的报表使用标准字集选不出值。 3. 开发的FORM要求只能查看当前职责能看到的OU的权限。 解决方法: 问题1 :在PL/SQL上执行时,先初始化,其中’M’为多组织,也可以使用模块应用简 称 Begin MO_GLOBAL.INIT(‘M’) ; End ; Oracle ERP R12 实用技术开发.doc 问题2 :进入系统管理Æ 并发Æ 程序(TAB 请求) 业务实体模式 :多个 问题3 :客户化的FORM在PRE-FORM TRIGGERS上加初始化。 MO_GLOBAL.INIT(‘M’) ; 再对需要限制的OU上加入 ( mo_global.check_access(operating_unit) = 'Y' OR fnd_profile.VALUE('XLA_MO_SECURITY_PROFILE_LEVEL') IS NULL ) 这样系统就可以访问到当前职责上所有能被访问的OU。 启用安全性配置文件 1. 定义安全性配置文件 路径:中国 HRMS 管理员 Æ 安全性 Æ 配置文件 Oracle ERP R12 实用技术开发.doc 在安全性配置文件中,针对ERP的组织而言,我们只能多组织名为OU的组合来进 行设置。例如在上图中选择包含的组织,假如选择的组织为IO(INVENTORY ORGANIZATION)时MOAC其实是无效的,它只针对OU生效,但是在排除中可 以选择IO,这样的话在某个职责的OU中就看不到该IO。 安全性配置文件与职责/用户关联 系统管理员Æ Profile Æ 系统 (MO:安全性配置文件) 将定义好的安全性配置文件与职责或者用户相关联。然后进入中国 HRMS 管理员 职责运行请求 维护安全性清单 这样定义的安全性配置文件就可以生效了。 Oracle ERP R12 实用技术开发.doc R12 常用安全性函数 在R12 中会使用大量安全性函数来控制权限 主要的功能函数在包mo_global中,这里我主要介绍我们常用功能函数来介绍。 1. MO_GLOBAL.INIT(’M’) 用来初始化,通过此函数可以初始化MOAC(安全性配 置文件)中可以看到的OU,但是在PL/SQL中则可以看到所有的OU数据。 2. MO_GLOBAL.CHECK_ACCESS () 主要用于查看当前的OU在当前的职责中是否 有查看权限。前提是必须有MO_GLOBAL.INIT(’M’)初始化,这个在R12的标准 Form界面经常可以看到。 3. MO_GLOBAL.SET_ORG_ACCESS 此函数可以在当前的SESSION中设置OU在职 责中的权限,一般来说我们主要用户接口程序的开发。例如我们开发的接口数据有 些不会在每个职责下单独到请求,这样太浪费资源了。但是我们尽管在当前的职责 的安全性配置文件设置的很高,假如配置文件的OU需要加增时还是会出现找不到 org_id的情况,所以可以通过调用 MO_GLOBAL.SET_ORG_ACCESS来临时设置 OU访问的权限。此函数共包含3个参数,我们只需要参数1,3就好了。请见下 mo_global.set_org_access(p_org_id, NULL, fnd_global.application_short_name); 其他的一些函数和技术以及VPD单独去使用,在R12种就没有很大的必要,因为安全性配 置文件完全可以搞定,不必去单独做这些(这只是我个人的想法),当然了解下VPD对自 身的技术发展还是有好处的。总而言之针对R12的安全性的东西,只要去看mo_global这个 包就完全可以搞定。当然可客户化的form中,请在when-new-form-instance或者pre-form 的Form触发器中使用MO_GLOBAL.INIT(’M’)来初始化这样就可以做数据的安全性有合 理的控制。 Oracle ERP R12 实用技术开发.doc WEB相关的应用 WEB个性化设定 如何启用个性化 在启用个性化时,首先需要在系统管理员中设定个性化导入和导出的路径。(建议 设定在用户层) FND Xliff 导出根路径 /OA_DOC/ (随便给服务器上的一个路径) Xliff 导入根路径 /OA_DOC/ (随便给服务器上的一个路径) 以下是其用个性化的Profile,可以结合自己的需求设定 FND:“个性化植入”模式 是 FND:已启用“个性化区域”链接 是 个性化自助定义 是 创建植入的个性化 是 推出应用后,重新进入时,就可以生效。假如设定没有生效时,请在$INST_TOP下 Oracle ERP R12 实用技术开发.doc 重起下Apache . 如何启用弹性域 和Form的个性化类似在WEB上也可以做对应的个性化和启用弹性域字段。 如何在WEB中查询对应的SQL语句 当启用个性化后,在WEB页面上会出现一个 关于此页的TAB页签。点击进入。 进入全部展开后,查询你要的字段的名称,一般情况下在其右边会出现其对应的VO, 点击进入就可以看到当前VO的SQL语句。 有时也存在有些VO在页面上无法点击进入的情况,碰到这种情况,则需要把VO的 XML文件从服务器上Download下来查看。通常的做法是点击业务组建详细参考资料 后,根据视图对象的路径去查找 ($JAVA_TOP/) 。 Oracle ERP R12 实用技术开发.doc WEB Discover的安全性初始化 在 R12 种 WEB Discover 的安全性控制主要是通过一些同义词的使用来管理的。而这 些同义词必须要通过初始化 MO_GLOBAL.INIT(’M’)才能有值。由于 WEB Discover 并不经过 Form 界面,所以必须通过其他的设置来初始化职责。这里 oracle 提供了一个初始化的 Profile 初始化 SQL 语句 - 自定义 ,在职责层 值设置为 :BEGIN mo_global.init('M'); END ; 这里需要特别说明的是,千万千万别设置在 Site 层,要不 然系统就会挂掉。 Oracle ERP R12 实用技术开发.doc 1 计算物料的可用量/可保留量【物料可用量/可保留量Open API】 1.功能简介 在计算物料的可保留量的时候,我们通常的做法是 MTL_ONHAND_QUANTITIES 中的 TRANSACTION_QUANTITY 的数量按照组织+物料+子库+货位+批次…的方式 进行累计,然后再减去物料在 MTL_RESERVATIONS 中对应的保留。很多的时候没有去考 虑此时库存事务处理接口表(MTL_MATERIAL_TRANSACTIONS_TEMP)中物料数量,这样计算 出来的数量可能会不准确。以下是考虑了库存事务处理接口表的物料数量的计算方 式。大家不妨可以参考一下。 2.开发简介 /*-------------------------------------------------------------------------------- $ Header PTAC , SKip Siman He , 2008.03.25 * Procedure GET_ITEM_ATT_QTY * Purpose : 计算物料的可用量 ---------------------------------------------------------------------------- */ FUNCTION get_item_att_qty(p_item_id NUMBER, p_organization_id NUMBER, p_subinventory_code VARCHAR2) RETURN NUMBER IS l_onhand_qty NUMBER; l_resv_qty NUMBER; l_qoh NUMBER; l_rqoh NUMBER; l_qr NUMBER; l_qs NUMBER; l_att NUMBER; l_atr NUMBER; l_tree_mode NUMBER; l_msg_count VARCHAR2(100); l_msg_data VARCHAR2(1000); l_return_status VARCHAR2(1); x_return VARCHAR2(1); BEGIN -- Transact mode l_tree_mode := 2; inv_quantity_tree_pub.clear_quantity_cache; inv_quantity_tree_pub.query_quantities p_api_version_number => 1.0, p_init_msg_lst => 'F', x_return_status => l_return_status, x_msg_count => l_msg_count, x_msg_data => l_msg_data, p_organization_id => p_organization_id, p_inventory_item_id => p_item_id, p_tree_mode => l_tree_mode, p_is_revision_control => FALSE, p_is_lot_control => FALSE, p_is_serial_control => FALSE, p_revision => NULL, p_lot_number => NULL, p_lot_expiration_date => NULL, p_subinventory_code => p_subinventory_code, p_locator_id => NULL, p_onhand_source => inv_quantity_tree_pvt.g_all_subs, x_qoh => l_qoh, x_rqoh => l_rqoh, x_qr => l_qr, Oracle ERP R12 实用技术开发.doc x_qs => l_qs, x_att => l_att, --可用量 x_atr => l_atr); --可保留量 RETURN l_att; END; 3.常见问题 在使用过程中目前没有发现问题。 4.异常处理 无 。 Oracle ERP R12 实用技术开发.doc 2 客户信息【R12 中如何取得客户的相关信息】 1.功能简介 R12 的版本的客户信息搞的十分复杂,这里总结下客户的一些简单的取值的方法。也 许性能不是最高的,但是取值的方式比较简单,总结出来和大家分享下。 2.开发参考 如何最简单的取得客户相关信息。 1. 客户信息 AR_CUSTOMERS 2. 客户地址信息 以 SHIP_TO 地址为例,下面 cust_acct_site_id 其实就是客户的地址 的 address_id,在大多数的情况下我们都可能是通过客户的 site_use_id,去找对 应的客户地址,如 AR 里面的 SHIP_TO/BILL_TO 地址,OM 里面的 SHIP_TO/BILL_TO 地址都是这样的情况。 SELECT site.site_use_id, acs.customer_id, acs.customer_number customer_num, acs.customer_name customer_name, site.cust_acct_site_id customer_site_id, site.location customer_site_code, loc.city customer_city, loc.address1, loc.address2, loc.address3, loc.address4 FROM ar_customers acs, hz_cust_site_uses_all site, hz_cust_acct_sites_all acct_site, hz_party_sites party_site, hz_locations loc WHERE acct_site.party_site_id = party_site.party_site_id AND party_site.location_id = loc.location_id AND acct_site.cust_account_id = acs.customer_id AND acct_site.cust_acct_site_id = site.cust_acct_site_id AND site.site_use_code = 'SHIP_TO' AND site.status = 'A' AND acct_site.status = 'A' 3. 客户的联系人 AR_CONTACTS_V SELECT acv.contact_id, acv.customer_id, acv.address_id, acv.first_name, acv.last_name, acv.contact_party_id, acv.party_relationship_id, acv.rel_party_id FROM ar_contacts_v acv WHERE contact_id = 1040 Oracle ERP R12 实用技术开发.doc 以上有几个重要的字段 CONTACT_PARTY_ID 连接 HZ_PARTIES.PARTY_ID = CONTACT_PARTY_ID 可以得到联系人的基本信息。类型 与在系统中建了一个这样的联系人,其他信息都不在这个里面。 REL_PARTY_ID 看到这个字段我们就可以联想到这个肯定是和联系人相关的信息,如电话,邮件地 址具体的细节请看第 4 点。 PARTY_RELATIONSHIP_ID 这个字段主要是将联系人与其对应的客户 Party_id 相关联,关联表为 HZ_RELATIONSHIPS(HZ_RELATIONSHIPS.RELATIONSHIP_ID = PARTY_RELATIONSHIP_ID) 4. 客户的联系人的联系电话/WEB/Mailer SELECT acv.contact_id, acv.customer_id, acv.address_id, acv.first_name, acv.last_name, acv.contact_party_id, acv.party_relationship_id, acv.rel_party_id, apv.phone_id, apv.contact_point_type, apv.primary_flag, apv.phone_type, apv.phone_number, apv.status FROM ar_contacts_v acv, ar_phones_v apv WHERE acv.contact_id = 1040 AND acv.rel_party_id = apv.owner_table_id AND apv.owner_table_name = 'HZ_PARTIES' AND apv.contact_point_type = 'PHONE' AND apv.status = 'A' 其中 apv.primary_flag 代表是否为主要的联系电话,apv.status 为联系人电话的状 态,有效为’A’,apv.contact_point_type 的值有 PHONE/ EMAIL/ WEB 这 3 个类型, 分别为 3 种不同的值. 5. 客户地址层上的联系电话/WEB/Mailer SELECT apv.phone_id, apv.contact_point_type, apv.primary_flag, apv.phone_type, apv.phone_number, apv.status FROM ar_phones_v apv WHERE apv.owner_table_id = 3202 AND apv.owner_table_name = 'HZ_PARTY_SITES' AND apv.contact_point_type = 'PHONE' AND apv.status = 'A' 3202 是客户地点的 party_id,每个字段的含义和上面的第 4 点相同。 Oracle ERP R12 实用技术开发.doc 3 RMA退货API使用【RMA 退货接口Open Interface/Open API】 1.功能简介 主要介绍 RMA(销售退货)的接口开发技巧。RMA 的接口其实是 RCV 接口中的一个部 分,但是有些处理方式会有所不同。和 RCV 的接收或者直接入库一样,RMA 同样需 要新建接收头信息和行信息。当对同一笔销售订单行多次退货时,情况就会比较特 殊。 业务场景: ERP 传送给外围系统销售退货行信息,外围系统将原行信息拆成多笔后回传给 ERP。 问题分析: 此需要其实是 2 个接口程序。分别为 ERP 传给外围系统接口,以及外围系统回传给 ERP 做 RMA 的接口。(这里主要看 ERP 这边的处理方式)调用的标准请求为 RVCTP 2.开发参考 接口表接收头表 RCV_HEADERS_INTERFACE 的主要重要字段: 重要字段 默认值 诠释 PROCESSING_STATUS_CODE PENDING 默认 RECEIPT_SOURCE_CODE CUSTOMER 默认 TRANSACTION_TYPE NEW 默认 VALIDATION_FLAG Y 默认 AUTO_TRANSACT_CODE DELIVER 默认 接口表接收行表 RCV_TRANSACTIONS_INTERFACE 的主要重要字段: 重要字段 默认值 诠释 PROCESSING_STATUS_CODE PENDING 默认 TRANSACTION_STATUS_CODE PENDING 默认 PROCESSING_MODE_CODE BATCH 默认 RECEIPT_SOURCE_CODE CUSTOMER 默认 TRANSACTION_TYPE RECEIVE 默认 VALIDATION_FLAG Y 默认 AUTO_TRANSACT_CODE DELIVER 默认 DESTINATION_TYPE_CODE INVENTORY 默认 INSPECTION_STATUS_CODE NOT INSPECTED 默认 *.以下的案例只是针对销售退货至仓库 rcv_headers_interface_rec rcv_headers_interface%ROWTYPE; rcv_transactions_interface_rec rcv_transactions_interface%ROWTYPE; SELECT rcv_headers_interface_s.NEXTVAL INTO l_header_interface_id FROM dual; Oracle ERP R12 实用技术开发.doc SELECT ool.line_id, ool.ordered_quantity INTO l_rtn_line_id, l_order_qty FROM oe_order_lines_all ool WHERE flow_status_code = 'AWAITING_RETURN' START WITH ool.line_id = l_line_id CONNECT BY PRIOR ool.line_id = ool.split_from_line_id; rcv_headers_interface_rec.header_interface_id := l_header_interface_id; rcv_headers_interface_rec.group_id := l_group_id; rcv_headers_interface_rec.processing_status_code := 'PENDING'; rcv_headers_interface_rec.receipt_source_code := 'CUSTOMER'; rcv_headers_interface_rec.transaction_type := 'NEW'; rcv_headers_interface_rec.validation_flag := 'Y'; rcv_headers_interface_rec.customer_id := l_customer_id; rcv_headers_interface_rec.auto_transact_code := 'DELIVER'; rcv_headers_interface_rec.expected_receipt_date := l_transaction_date; rcv_headers_interface_rec.last_update_date := SYSDATE; rcv_headers_interface_rec.last_updated_by := fnd_global.user_id; rcv_headers_interface_rec.last_update_login := fnd_global.login_id; rcv_headers_interface_rec.creation_date := SYSDATE; rcv_headers_interface_rec.created_by := fnd_global.user_id; INSERT INTO rcv_headers_interface VALUES rcv_headers_interface_rec; SELECT rcv_transactions_interface_s.NEXTVAL INTO rcv_transactions_interface_rec.interface_transaction_id FROM dual; rcv_transactions_interface_rec.header_interface_id := l_header_interface_id; rcv_transactions_interface_rec.group_id := l_group_id; rcv_transactions_interface_rec.processing_status_code := 'PENDING'; rcv_transactions_interface_rec.transaction_status_code := 'PENDING'; rcv_transactions_interface_rec.processing_mode_code := 'BATCH'; rcv_transactions_interface_rec.validation_flag := 'Y'; rcv_transactions_interface_rec.receipt_source_code := 'CUSTOMER'; rcv_transactions_interface_rec.customer_id := l_customer_id; rcv_transactions_interface_rec.customer_site_id := l_customer_site_id; rcv_transactions_interface_rec.oe_order_header_id := l_header_id; -- 这里的 oe_order_line_id 是上面运算得到的 rcv_transactions_interface_rec.oe_order_line_id := l_rtn_line_id; rcv_transactions_interface_rec.source_document_code := 'RMA'; rcv_transactions_interface_rec.transaction_type := 'RECEIVE'; rcv_transactions_interface_rec.auto_transact_code := 'DELIVER'; rcv_transactions_interface_rec.destination_type_code := 'INVENTORY'; rcv_transactions_interface_rec.inspection_status_code := 'NOT INSPECTED'; rcv_transactions_interface_rec.validation_flag := 'Y'; rcv_transactions_interface_rec.item_id := l_inventory_item_id; rcv_transactions_interface_rec.transaction_date := l_transaction_date; rcv_transactions_interface_rec.quantity := l_transaction_qty; rcv_transactions_interface_rec.unit_of_measure := l_unit_uom_code; rcv_transactions_interface_rec.to_organization_id := l_organization_id; 以上的代码中得到 l_rtn_line_id 是通过 ERP 传给外围系统的原始 line_id 来得到的。 为什么要这样做。其实在 EBS 系统中,当对一个销售行退货 300 时(假如此时的 line_id = 1 ,line_qty = 1000)成功后销售行会自动新增一笔行信息。此时的纪录就变 为以下的情况: LINE_ID LINE_QTY STATUS SPLIT_FROM_LINE_ID 1 300 CLOSED 2 700 AWAITING_RETURN 1 而此时再想对 Line_id = 1 的销售行退货时,系统就会报错。这是就需要根据 Line_id = 1 的销售行信息找到对应的 Line_id = 2 的销售行再进行销售退货。而再次退货 400 时,就变为以下情况: LINE_ID LINE_QTY STATUS SPLIT_FROM_LINE_ID 1 300 CLOSED Oracle ERP R12 实用技术开发.doc 2 400 CLOSED 1 3 300 AWAITING_RETURN 2 在先前的版本中,当做完 RMA 时需要再对 RMA 做个 Release 的动作来推工作流,如 WSH_PICKING_BATCHES_PUB.RELEASE_BATCH,而在 R12 这个版本中则不需要再额外调用此 程序来推工作流,通过系统的 trace 文件发现,在实际的处理过程中已经调用此项功 能。 3.异常处理 碰到错误的时候,我们通常会去接口表 PO_INTERFACE_ERROR 中查询错误的原 因。当错误消息比较模糊时。这时可以打开系统的 Log 信息去追踪错误的发生的代 码,大多数情况下,系统的 Log 信息还是相当完整的,仔细的观察肯定能找到原因。 4.常见问题 无 Oracle ERP R12 实用技术开发.doc 4 RCV接口使用【RCV 接口开发Open Interface/Open API】 1.功能简介 在 Oracle EBS 中 RCV 接口主要提供采购接收,采购直接入库,退货至供应商,退货 至接收,销售退货(RMA)等等。本文档就不一一列举出来了。只针对部分比较棘手的 开发来做说明。 业务场景: Oracle ERP 系统将审批完成后的采购订单以分配行的纪录传送给 Other System , Other System 做完接收后,将接收后的数据回传给 ERP 做接收。Other System 做完入 库后,把入库后的数据回传给 ERP。 问题分析: 采购订单的传送是以 PO_DISTRIBUTION_ID 为条件来处理的。 知识点一:采购接收到采购入库,根据 PO_DISTRIBUTION_ID 如何找到对应的 PARENT_TRANSACTION_ID 。 针对一个 PO_LINE_LOCATION_ID 只有一个 PO_DISTRIBUTION_ID 的情况, 可以直接根据 PO_LINE_LOCATION_ID + SHIPMENT_LINE_ID 到 RCV_TRANSACTION 中找到. 针对一个 PO_LINE_LOCATION_ID 有多个 PO_DISTRIBUTION_ID ,且存在数 量相等的 PO_DISTRIBUTION_ID 。要找到 PO_DISTRIBUTION_ID 对应的这个时候 直接到 RCV_TRANSACTION 中找其对应的 Receive 数据时,可能会找到多个。由于 没有入库,PO_DISTRIBUTION_ID 在 RCV_TRANSACTION 中的数据这个时候是为 空。 其实当我们做了一笔 PO 并审批通过后,会在 MTL_Supply 中存在可以用来接收 的 PO_DISTRIBUTION_ID 的数量。如下图: Oracle ERP R12 实用技术开发.doc 在 MTL_Supply 中这笔纪录的 SUPPLY_TYPE_CODE 为“PO”,且 SHIPMENT_HEADER_ID 和 SHIPMENT_LINE_ID 为空。 当我们做完接收时,这个时候 SUPPLY_TYPE_CODE 为 “RECEIVING”,且 SHIPMENT_HEADER_ID 和 SHIPMENT_LINE_ID ,RCV_TRANSACTION_ID, 都为接收时产生的数据。而这个时候在 RCV_SUPPLY 以及 RCV_TRANSACTIONS 纪录的接收数量只能反映在 PO_LINE_LOCATION_ID 这个层面上。 这样根据 MTL_Supply 表中的纪录,我们就可以找到对应的 PARENT_TRANSACTION_ID 纪录,然后做采购接收Æ 采购入库 。 知识点二: 采购订单接收时接收数据分组 。 当通过 API 做采购接收时,可以控制住接收数据的分组。如按照 PO_DISTRIBUTION_ID 和 PO_LINE_LOCATION_ID 分组。系统中默认的分组方式 为 PO_LINE_LOCATION_ID 。 当 API 做接收时,我们不输入 PO_DISTRIBUTION_ID 这个字段的值,这个时候系 统会根据接口表中本次 GROUP_ID 的数据以 PO_LINE_LOCATION_ID 来分组。当 以 PO_LINE_LOCATION_ID 来分组时接收界面的目的地类型为多个(如上图),且 PO_LINE_LOCATION_ID 下来的所有的 PO_DISTRIBUTION_ID 都在这个组下去, PO_DISTRIBUTION_ID 有实际接收数量的则为实际数量,没有的则数量为 0 当 API 做接收时,我们输入 PO_DISTRIBUTION_ID 这个字段的值,这个时候系统 会根据接口表中本次 GROUP_ID 的数据以 PO_DISTRIBUTION_ID 来分组。接收界面 的目的地类型为库存或者接收 Oracle ERP R12 实用技术开发.doc 2.开发参考 RCV 的直接入库脚本 RCV 接收—> 入库脚本 3.异常处理 在 RCV 的接收或者入库的时候,系统有时会报错一个标准的错误。如: 碰到此类错误的时候,我们通常会去接口表 PO_INTERFACE_ERROR 中查询错误的 原因。当错误消息比较模糊时。这时可以打开系统的 DEBUG 信息去追踪错误的发生 的代码。 4.常见问题 RCV 的接口相对比较成熟,抱错信息主要集中在子库不在指定的组织之中。或者缺少 一些接口重要的字段,以及接收或入库数据超量。 Oracle ERP R12 实用技术开发.doc 5 动态开发银行对帐单导入开发【对帐单导入】 1.银行对帐单导入 银行对帐单导入是企业在银行的往来帐明细帐数据传送给 Oracle ERP 的一个接口, 主要是用于 Oracle ERP 的系统的明细帐与银行的往来明细帐的匹配和核查。目前由于 银行间没有统一的对帐单格式,所以需要多个格式的对帐单导入程序来完成。 业务场景: 北京某国资委大型企业,和20多家银行有往来明细帐,且各个银行的对帐格式都 不同(全国人民都在使用银行提供自己指定的帐单格式,银行肯定不会为了一家公司 去改变帐单格式)。 问题分析: 对于20多家的银行对帐单格式,解决的方式由3种。 第1种:做20个对帐单导入程序(不推荐) 第2种:业务上去调整对帐单的格式,使其成为一种固定的模版(靠说服客户) 第3种:开发动态的对帐单导入程序,运行时只需要在 LOV 中选择对应的银行 下面主要介绍第3种方式。 其实第3种方式的模版也是固定的,只是借用 Oracle 标准的 Form 界面银行对帐单 映射来完成。如下图 Oracle ERP R12 实用技术开发.doc 我们只需要模版的名称,以及下面的列名和位置就可以了。 名称是方便我们选择XXX银行,列名就是一个银行的对帐单上出现的字段,位置是 对帐单的电子档在 Excel 上的列的位置。上图中的列名的字段其实是有过滤的,因为我 们要对标准视图 CE_BANK_STMT_INT_MAP_V 和 CE_BANK_STMT_MAP_HDR_V 的值有所限制。在国内的银行的对帐单上最多就对 帐单号,对帐单日期,银行帐 号,事务交易日期,借/贷方金额,事务处理编码,备注,期初金额,期末金额(可能 要预留一个字段放 OU,这样的业务是2个OU公用一个银行帐号)这些字段。常用的字 段主要是上图中的7个,其中 STATEMENT_NUMBER 这个字段在头和行中都存在主 要是为了让头信息和行信息通过此字段来关联。 2.开发参考 通过上图中的列的位置(1,2,3,4,5,6,7)我们可以对应 Excle 中对应的列字 段,所以文件的 列起初传人到数据库中时是以 cell_1, cell_2 .. cell_7 来存放。 INSERT INTO cux_temp_matrix_cells (working_id, line_no, cell_1, cell_2, cell_3, cell_4, cell_5, cell_6, cell_7, cell_8, cell_9, cell_10, cell_11, cell_12, cell_13, cell_14, cell_15, Oracle ERP R12 实用技术开发.doc cell_16, cell_17, cell_18, cell_19, cell_20, cell_21, cell_22, cell_23, cell_24, cell_25, cell_26, cell_27, cell_28, cell_29, cell_30) VALUES (p_working_id, p_line_no, upper(r_cells(1)), r_cells(2), r_cells(3), r_cells(4), r_cells(5), r_cells(6), r_cells(7), r_cells(8), r_cells(9), r_cells(10), r_cells(11), r_cells(12), r_cells(13), r_cells(14), r_cells(15), r_cells(16), r_cells(17), r_cells(18), r_cells(19), r_cells(20), r_cells(21), r_cells(22), r_cells(23), r_cells(24), r_cells(25), r_cells(26), r_cells(27), r_cells(28), r_cells(29), r_cells(30)); 然后使用动态的 SQL 来对应数据并,导入到对用的接口表字段中 l_stmt_header_sql := 'insert into cux_ce_statement_headers_int(' || l_map_cloumn_h || ') ' || 'select ' || l_temp_cloumn_h || ' from cux_temp_matrix_cells where ' || '(' || l_stmt_column_h || ' = ' || '''' || l_stmt_value || '''' || ' and rownum =1 )'; EXECUTE IMMEDIATE l_stmt_header_sql; 这里 l_map_cloumn_h 字符为客户化头表的字段 ,l_temp_cloumn_h 为 Excle 中对应的 列 ,l_stmt_column_h 为对帐单号 l_stmt_value 为其值,这里作为条件 。同理行信息也是这样 处理 l_stmt_line_sql := 'insert into cux_ce_statement_lines_int(' || l_map_cloumn_l || ') ' || 'select ' || l_temp_cloumn_l || ',' || '''' || l_account_num || '''' || ' bank_account_num from cux_temp_matrix_cells where ' || l_stmt_column_l || ' = ' || '''' || l_stmt_value || ''''; EXECUTE IMMEDIATE l_stmt_line_sql; Oracle ERP R12 实用技术开发.doc 备注: cux_ce_statement_lines_int 以及 cux_ce_statement_headers_int 与 ce_statement_headers_int 和 ce_statement_lines_interface 的字段基本一样只把日期类 型的字段的类型改为字符类型。 通过上面的动态导入,就可以将 CSV 中的列与对帐单的接口表的字段对应上了,然后再对客户化的接口 表进行校验,成功后导入到对帐单接口表中,通过运行以下并发。 l_req_id := fnd_request.submit_request('CE', 'ARPLABIM', NULL, NULL, FALSE, 'IMPORT', g_bank_branch_id, NULL, NULL, NULL, NULL, NULL, to_char(SYSDATE, 'YYYY/MM/DD HH24:MI:SS'), NULL, NULL, NULL, NULL, NULL, NULL, 'N', NULL); 通过以上的动态处理,可以通过设置上图的模版字段,把字段的位置与导入文件的列数对应就可以将 其导入。以后新增多少家银行都不用再修改程序了,目前我们已经接触到了 20 多家的银行,均可以正常 导入。 cux_ce_statement_imp_pkg.pck 3.常见问题 导入数据中金额列或者说数字类型的列不能以科学记数发如 11,222,333,444,目前程序的格式 是以逗号分割,当然主要是为了方便 csv 上处理数据才使用逗号分割,我们也可以使用其他的分 割符(如’|’)去处理,程序的修改量非常小。 Oracle ERP R12 实用技术开发.doc 6 银行自动对帐开发【银行自动对帐开发】 1.功能简介 银行自动对帐程序是 Oracle ERP 的一个标准的银行与 ERP 系统的帐务匹配的程序。 由于标准功能的对帐的条件比较苛刻,所以对企业基本都通过客户化开发去完成这个 功能。比较通用的对帐方式为 银行帐户+币种+日期+金额 以及银行帐户+币种+金额 。 比较成熟的对帐方式为先用银行帐户+币种+日期+金额 找不到匹配的记录后再选择用 银行帐户+币种+金额的方式再次去匹配。下面简单介绍下自动对帐时的开发技巧。 自动对帐程序的开发主要分 3 个大步骤。 1. 将要匹配的 AP/AR/GL 等对帐数据放入系统标准的对帐临时表中 2. 编写对帐的规则来替换标准的对帐规则 3. 做好对帐程序的详细日志信息,方便查错。 4. 最好本次将可用的事物处理数据存放在客户化的接口表中,方便查找是否缺少数 据。 2.开发参考 取可用的事务处理数据 修改 CE_AUTO_BANK_MATCH 程序,新建一个 CUX_POPULATE_AVAILABLE_GT 的过程来替代 POPULATE_AVAILABLE_GT 的 取值方式。 /*----------------------------------------------------------------- $ Header PATC , SKip (Siman.he) , 2008.01.16 * Version 1.0 * Purpose : 取所有可以用来与银行对帐单对帐的可用事务处理数据(AR/AP/GL) * Logic PTAC 的对帐单目前只针对 AR/AP/GL 先根据对帐单的类型来决定哪个模块先进性匹配 CASH:收款 和应收收款匹配 cux_ce_222_transactions_v JE_CREDIT:贷记 与GL 匹配 cux_ce_101_transactions_v JE_DEBIT:借记 与GL 匹配 cux_ce_101_transactions_v MISC:杂项 与应收收款匹配 cux_ce_222_transactions_v PAYMENT:付款 与应付付款匹配 cux_ce_200_transactions_v REFUND:退款 与应付付款匹配 cux_ce_200_transactions_v -----------------------------------------------------------------*/ PROCEDURE cux_populate_available_gt(p_bank_account_id NUMBER) IS l_inserted_count NUMBER; BEGIN ce_auto_bank_rec.debug('>>CE_AUTO_BANK_MATCH.cux_populate_available_gt '); Oracle ERP R12 实用技术开发.doc -- clean up the temp table DELETE ce_available_transactions_tmp; /*---------------------------------------------------------- $ Header PTAC Skip , siman.he 2008.01.14 * Function Description : 取 AP 付款数据 -------------------------------------------------------- */ IF ce_auto_bank_match.av_200_inserted_flag = 'N' THEN ce_auto_bank_rec.debug('inserting data from ce_200_transactions_v'); INSERT INTO ce_available_transactions_tmp (seq_id, row_id, multi_select, bank_account_id, bank_account_name, bank_account_num, bank_name, bank_branch_name, trx_id, trx_type, type_meaning, trx_number, check_number, currency_code, amount, bank_account_amount, amount_cleared, gl_date, status_dsp, status, trx_date, cleared_date, maturity_date, exchange_rate_date, exchange_rate_type, user_exchange_rate_type, exchange_rate, bank_charges, bank_errors, batch_name, batch_id, agent_name, customer_name, payment_method, vendor_name, customer_id, supplier_id, reference_type_dsp, reference_type, reference_id, actual_amount_cleared, creation_date, created_by, last_update_date, last_updated_by, remittance_number, cash_receipt_id, application_id, count_cleared, bank_currency_code, trx_currency_type, code_combination_id, Oracle ERP R12 实用技术开发.doc period_name, journal_entry_name, document_number, journal_entry_line_number, clearing_trx_type, journal_category, base_amount, receipt_class_id, receipt_method_id, receipt_class_name, deposit_date, value_date, reversed_receipt_flag, legal_entity_id, org_id, ce_bank_acct_use_id, reconciled_status_flag) SELECT ce_available_transactions_s.NEXTVAL, row_id, multi_select, bank_account_id, bank_account_name, bank_account_num, bank_name, bank_branch_name, trx_id, trx_type, type_meaning, trx_number, check_number, currency_code, amount, bank_account_amount, amount_cleared, gl_date, status_dsp, status, trx_date, cleared_date, maturity_date, exchange_rate_date, exchange_rate_type, user_exchange_rate_type, exchange_rate, bank_charges, bank_errors, batch_name, batch_id, agent_name, customer_name, payment_method, vendor_name, customer_id, supplier_id, reference_type_dsp, reference_type, reference_id, actual_amount_cleared, creation_date, created_by, last_update_date, last_updated_by, remittance_number, cash_receipt_id, application_id, count_cleared, bank_currency_code, trx_currency_type, code_combination_id, period_name, journal_entry_name, document_number, Oracle ERP R12 实用技术开发.doc journal_entry_line_number, clearing_trx_type, journal_category, base_amount, receipt_class_id, receipt_method_id, receipt_class_name, deposit_date, value_date, reversed_receipt_flag, legal_entity_id, org_id, ce_bank_acct_use_id, 'N' FROM cux_ce_200_transactions_v WHERE bank_account_id = p_bank_account_id; ce_auto_bank_match.av_200_inserted_flag := 'Y'; END IF; /*---------------------------------------------------------- $ Header PTAC Skip , siman.he 2008.01.14 * Function Description : AR 应收帐款的可用事务处理数据 -------------------------------------------------------- */ IF ce_auto_bank_match.av_222_inserted_flag = 'N' THEN -- AP data has not been inserted into the GT table ce_auto_bank_rec.debug('inserting data from ce_222_transactions_v'); INSERT INTO ce_available_transactions_tmp (seq_id, row_id, multi_select, bank_account_id, bank_account_name, bank_account_num, bank_name, bank_branch_name, trx_id, trx_type, type_meaning, trx_number, check_number, currency_code, amount, bank_account_amount, amount_cleared, gl_date, status_dsp, status, trx_date, cleared_date, maturity_date, exchange_rate_date, exchange_rate_type, user_exchange_rate_type, exchange_rate, bank_charges, bank_errors, batch_name, batch_id, agent_name, customer_name, payment_method, vendor_name, customer_id, supplier_id, reference_type_dsp, reference_type, reference_id, actual_amount_cleared, Oracle ERP R12 实用技术开发.doc creation_date, created_by, last_update_date, last_updated_by, remittance_number, cash_receipt_id, application_id, count_cleared, bank_currency_code, trx_currency_type, code_combination_id, period_name, journal_entry_name, document_number, journal_entry_line_number, clearing_trx_type, journal_category, base_amount, receipt_class_id, receipt_method_id, receipt_class_name, deposit_date, value_date, reversed_receipt_flag, legal_entity_id, org_id, ce_bank_acct_use_id, reconciled_status_flag) SELECT ce_available_transactions_s.NEXTVAL, row_id, multi_select, bank_account_id, bank_account_name, bank_account_num, bank_name, bank_branch_name, trx_id, trx_type, type_meaning, trx_number, check_number, currency_code, amount, bank_account_amount, amount_cleared, gl_date, status_dsp, status, trx_date, cleared_date, maturity_date, exchange_rate_date, exchange_rate_type, user_exchange_rate_type, exchange_rate, bank_charges, bank_errors, batch_name, batch_id, agent_name, customer_name, payment_method, vendor_name, customer_id, supplier_id, reference_type_dsp, reference_type, reference_id, actual_amount_cleared, creation_date, created_by, last_update_date, Oracle ERP R12 实用技术开发.doc last_updated_by, remittance_number, cash_receipt_id, application_id, count_cleared, bank_currency_code, trx_currency_type, code_combination_id, period_name, journal_entry_name, document_number, journal_entry_line_number, clearing_trx_type, journal_category, base_amount, receipt_class_id, receipt_method_id, receipt_class_name, deposit_date, value_date, reversed_receipt_flag, legal_entity_id, org_id, ce_bank_acct_use_id, 'N' FROM cux_ce_222_transactions_v WHERE bank_account_id = p_bank_account_id; ce_auto_bank_match.av_222_inserted_flag := 'Y'; END IF; /*---------------------------------------------------------- $ Header PTAC Skip , siman.he 2008.01.14 * Function Description : 总帐日记帐的可用事务处理数据 -------------------------------------------------------- */ IF ce_auto_bank_match.av_101_inserted_flag = 'N' THEN ce_auto_bank_rec.debug('inserting data from ce_101_transactions_v'); INSERT INTO ce_available_transactions_tmp (seq_id, row_id, multi_select, bank_account_id, bank_account_name, bank_account_num, bank_name, bank_branch_name, trx_id, trx_type, type_meaning, trx_number, check_number, currency_code, amount, bank_account_amount, amount_cleared, gl_date, status_dsp, status, description, trx_date, cleared_date, maturity_date, exchange_rate_date, exchange_rate_type, user_exchange_rate_type, exchange_rate, bank_charges, bank_errors, Oracle ERP R12 实用技术开发.doc batch_name, batch_id, agent_name, customer_name, payment_method, vendor_name, customer_id, supplier_id, reference_type_dsp, reference_type, reference_id, actual_amount_cleared, creation_date, created_by, last_update_date, last_updated_by, remittance_number, cash_receipt_id, application_id, count_cleared, bank_currency_code, trx_currency_type, code_combination_id, period_name, journal_entry_name, document_number, journal_entry_line_number, clearing_trx_type, journal_category, base_amount, receipt_class_id, receipt_method_id, receipt_class_name, deposit_date, value_date, reversed_receipt_flag, legal_entity_id, org_id, ce_bank_acct_use_id, reconciled_status_flag) SELECT ce_available_transactions_s.NEXTVAL, row_id, multi_select, bank_account_id, bank_account_name, bank_account_num, bank_name, bank_branch_name, trx_id, trx_type, type_meaning, trx_number, check_number, currency_code, amount, bank_account_amount, amount_cleared, gl_date, status_dsp, status, description, trx_date, cleared_date, maturity_date, exchange_rate_date, exchange_rate_type, user_exchange_rate_type, exchange_rate, bank_charges, bank_errors, batch_name, batch_id, Oracle ERP R12 实用技术开发.doc agent_name, customer_name, payment_method, vendor_name, customer_id, supplier_id, reference_type_dsp, reference_type, reference_id, actual_amount_cleared, creation_date, created_by, last_update_date, last_updated_by, remittance_number, cash_receipt_id, application_id, count_cleared, bank_currency_code, trx_currency_type, code_combination_id, period_name, journal_entry_name, document_number, journal_entry_line_number, clearing_trx_type, journal_category, base_amount, receipt_class_id, receipt_method_id, receipt_class_name, deposit_date, value_date, reversed_receipt_flag, legal_entity_id, org_id, ce_bank_acct_use_id, 'N' FROM cux_ce_101_transactions_v WHERE bank_account_id = p_bank_account_id; ce_auto_bank_match.av_101_inserted_flag := 'Y'; END IF; SELECT COUNT(1) INTO l_inserted_count FROM ce_available_transactions_tmp; /*---------------------------------------------------------- $ Header PTAC Skip , siman.he 2008.01.14 * Function Description : 使用Debug 来查看对帐单的可用使用处理的数据。 -------------------------------------------------------- */ IF ce_auto_bank_rec.g_ce_debug_flag NOT IN ('Y', 'C') THEN DELETE FROM cux_ce_auto_bank_temp; INSERT INTO cux_ce_auto_bank_temp SELECT * FROM ce_available_transactions_tmp; COMMIT; END IF; ce_auto_bank_rec.debug('l_inserted_count=' || l_inserted_count); EXCEPTION WHEN OTHERS THEN ce_auto_bank_rec.debug('EXCEPTION: cux_populate_available_gt' || SQLERRM); RAISE; END cux_populate_available_gt; *. 以上程序中的 View 是在标准 View 上加了一些状态的限制。如无特殊条件限制也可以直 接使用标准的 View 来使用。 Oracle ERP R12 实用技术开发.doc 修改对帐的规则 由于项目的实际需求,一般情况下我们只对 AP/AR/GL 来对帐,所以对帐的规则只 针对这些类型的数据。对帐的前提是先按照币种+金额+日期来对,没有找到数据时 再按照币种+金额再次去对帐。而系统标准的对帐的条件十分苛刻,所以我们需要开 发一个新的匹配的 match_engine 来替代标准的。开发的技巧是 Copy match_engine 中的有效的代码新生成过程 CUX_MATCH_LINE,当调用到可用事务处理数据时, 再用客户化的可用事务处理去匹配。详细的代码由于太多。就不在此叙述了。(特别 感谢甘立周在纳爱斯项目提供了一个好的框架) ce_auto_bank_match.pck ce_auto_bank_rec.pck 3.异常处理 开发自动对帐程序时,通常会发现有些数据无法匹配上,而在银行的对帐单的可 用事务处理记录里面又可以看到它。碰到这些问题,通常的原因是我们用作匹配的数 据不全。这个时候就要求我们在开发的过程中去写好 debug 信息或者建立一张客户化 的表,当 debug 的模式被开启时,先清除客户化表中的数据,然后插入要做匹配的数 据。碰到问题时,直接看下客户化的表就知道用来做匹配的数据是否完成。 4.常见问题 在 Oracle R12 从 12.01 到 12.0.4 的版本中均存在一个 Bug .当银行对帐单的状态变为 已调节后,在撤销对帐单后,然后再重新对帐时,发现从总帐日记帐的有些科目的可 用事务处理的值重复(以下是程序修改后的界面,无异常)。 造成异常重复数据的原因: 当我们日记帐过账后会在 CE_STATEMENT_RECONCILS_ALL 中产生一条对应记录 与总帐日记帐的明细记录来对应。表中 JE_HEADER_ID , REFERENCE_ID 分别和日记 Oracle ERP R12 实用技术开发.doc 帐的 JE_HEADER_ID ,JE_LINE_NUM 字段对应,并将 CE_STATEMENT_RECONCILS_ALL 中的 CURRENT_RECORD_FLAG 字段设置为 ‘Y’ . 然而当撤销对帐单后 CURRENT_RECORD_FLAG 的值没有被修改为 ‘N’ ,这样导致再次 重新对帐后,在进入可用事务处理界面时,系统在计算可用事务处理数据时重新在表 CE_STATEMENT_RECONCILS_ALL 中再次生成一条记录,该记录除了 STATEMENT_LINE_ID 与先前对帐单的 ID 号不同外,其他的重要字段均完全相同,且 CURRENT_RECORD_FLAG 字段设置为 ‘Y’ 。而可用事务处理的数据来源是通过 JE_HEADER_ID , REFERENCE_ID 分别和日记帐的 JE_HEADER_ID 对应 JE_LINE_NUM 以及 CURRENT_RECORD_FLAG= ‘Y’ 来作为条件匹配,所以这个时候 界面上会出现2条相同的记录,从而影响系统自动对帐的标准功能的使用。 解决方案: 目前 Oracle 提供了一个 Patch ce_statement_recons_pkg_6888494.pkb ce_statement_recons_pkg_6888494.pkb 该程序是将撤销对帐单后的对帐单的 CURRENT_RECORD_FLAG 的值更新为‘N’ . Oracle ERP R12 实用技术开发.doc 7 销售订单接口【API注意事项】 1.功能简介 当使用标准的 API 做销售订单的导入时,系统中会出现一个不为大家所注意的问 题。就是当启用必输弹性域时,API 会出现错误,尽管将 profile HZ:在导入期间验证 弹性域 设置为 否 时发现在 R12.0.4 的版本中对 API oe_order_pub.process_order 不起 作用。通过一路的追踪发现程序在调用 OE_Validate_Header 验证 Attributes 时只判 断了 OE_ORDER_CACHE.IS_FLEX_ENABLED('OE_HEADER_ATTRIBUTES') 这个条 件而没有去判断 Profile 的值。所以就是这个原因导致需要验证 ATTRIBUTE 的值,API 报错。 2.开发参考 碰到使用 API 的情况时,需要对标准的 API OE_Validate_Header.Attributes 存储过 程进行修改或者使用接口表来完成。这里我就不介绍接口表和 API 的使用方法了。 3.差异 API 与接口表其实都有各自的好处,但从安全性的角度上看,接口表的验证要比较严 格些,就是无法立即返回结果。API 在开发过程中是比较方面,唯一的缺陷是销售订 单导入在弹性域验证上有个小小的瑕疵,必须通过修改后才能使用。具体的做法只能 看各个项目上的实际需求。 Oracle ERP R12 实用技术开发.doc 8 销售订单的拆单【开发接口API】 1.功能简介 销售订单的拆单,在 Oracle EBS 中只要应用 3 个方面。分别是销售订单界面上通 过在活动按钮功能中选用分解行来拆单以及在销售发货的挑库界面中进行拆单。其目 的就是分解销售订单的行数量以及变换子库出货。但是当我们做销售出库时有时也会 出现系统自动拆单的情况,这是因为物料在子库的可用量不足的情况下时,发货时会 分批发货,导致了出现拆单的情况。 2.开发参考 如何通过开发实现自动拆单,拆单的先前的条件是行状态应该为'AWAITING_SHIPPING'; /*---------------------------------------------------------------------------- $ Header PTAC , SKip Siman He , 2008.0£¶.17 * FUNCTION : VALIDATE_SHIP_QTY * Version 1.0 * Purpose :当出货的数量小于销售订单行的数量时需要自用拆单 * -------------------------------------------------------------------------- */ PROCEDURE oe_split_line(p_line_id IN NUMBER, p_ship_qty IN NUMBER, p_inv_item_id IN NUMBER, o_spilted_line_id OUT NUMBER, o_errcode OUT NUMBER, o_errmsg OUT VARCHAR2) IS x_return_status VARCHAR2(100); x_line_id NUMBER; CURSOR csr_order_info IS SELECT line.ordered_quantity qty, line.order_quantity_uom uom, line.line_id, line.request_date, line.ship_from_org_id, line.ship_to_org_id, head.header_id, head.org_id, head.order_number, line.line_number FROM oe_order_headers_all head, oe_order_lines_all line WHERE line.header_id = head.header_id AND line.line_id = p_line_id AND line.flow_status_code = 'AWAITING_SHIPPING'; l_order_info csr_order_info%ROWTYPE; l_line_tab oe_oe_form_line.split_line_tbl_type; l_status VARCHAR2(2000); l_msg_count VARCHAR2(2000); l_msg_data VARCHAR2(2000); BEGIN o_errcode := 0; OPEN csr_order_info; FETCH csr_order_info Oracle ERP R12 实用技术开发.doc INTO l_order_info; CLOSE csr_order_info; /*fnd_global.apps_initialize(user_id => 2881, resp_id => 21623, resp_appl_id => 660);*/ IF l_order_info.qty > p_ship_qty THEN l_line_tab(1).line_id := l_order_info.line_id; l_line_tab(1).ordered_quantity := l_order_info.qty - p_ship_qty; l_line_tab(1).ship_to_org_id := l_order_info.ship_to_org_id; l_line_tab(1).request_date := l_order_info.request_date; l_line_tab(1).ship_from_org_id := l_order_info.ship_from_org_id; l_line_tab(2).ordered_quantity := p_ship_qty; l_line_tab(2).ship_to_org_id := l_order_info.ship_to_org_id; l_line_tab(2).request_date := l_order_info.request_date; l_line_tab(2).ship_from_org_id := l_order_info.ship_from_org_id; oe_oe_form_line.split_line(p_split_by => 'USER', x_line_tbl_type => l_line_tab, p_change_reason_code => NULL, p_change_comments => NULL, x_return_status => l_status, x_msg_count => l_msg_count, x_msg_data => l_msg_data); IF l_status = 'S' THEN SELECT line_id INTO o_spilted_line_id FROM oe_order_lines_all ool WHERE flow_status_code = 'AWAITING_SHIPPING' AND ool.ordered_quantity = p_ship_qty AND ool.split_from_line_id = l_order_info.line_id AND rownum = 1; ELSE o_spilted_line_id := NULL; o_errcode := -20001; o_errmsg := l_msg_data; RETURN; END IF; END IF; EXCEPTION WHEN OTHERS THEN o_spilted_line_id := NULL; o_errcode := -20001; o_errmsg := SQLERRM; END; 3.异常处理 无 4.常见问题 在调用 API 有时会出现异常,报错的信息一般是找不到 ORG_ID,这个因为我们在职 责中启用了 MOAC(多组织安全性)的原因导致的。碰到这样的问题就先检查该销售订 单的 ORG_ID 是否包含在该职责的安全性配置文件中。或者我们干脆选择一个没有启 用 MOAC 的职责来使用,但是职责默认的 OU 必须是数据的 OU,否则还是出现错误。 所以需要临时给当前 session 设置 OU 的权限。 mo_global.set_org_access(p_org_id, NULL, fnd_global.application_short_name); Oracle ERP R12 实用技术开发.doc Oracle ERP R12 实用技术开发.doc 9 按OU生成日记帐【接口表开发】 1.描述 在 R12 中,各个子模块数据产生会计分录传总帐时,系统标准的功能是将 GL_INTERFACE 中的数据不分 OU 打包生产一个日记帐。这样希望做 OU 屏蔽功能的需要 实现起来就相当困难。 如何将子模块中传入的数据按照 OU 来生产日记帐呢? 2.开发参考 在Oracle EBS 的处理 GL_INTERFACE,GL_INTERFACE_CONTROL 数据的时候,通常我 们 Group_id 这个字段的值是空,当运行完导入日记帐的请求后,才会出现值。所以我们可以在 插入 GL_INTERFAC 和 GL_INTERFACE_CONTROL 数据时将同一 OU 的数据打包,就是给相 同的 Group_id,系统就会自动的按照 OU 来生成日记帐的明细。当然在 R12 中有些数据走的不 是接口表,所以这里我们只能对走接口表的数据来进行管理。通过其他方式的,只能使用 MOAC(多组织安全性)去控制该职责的数据。 Oracle ERP R12 实用技术开发.doc 10 总帐日记帐追随到各个子模块 1.描述 在 R12 的版本中,各个子模块传送到总帐,并生成日记帐,如何通过总帐反过去追随 呢?。首先我们要了解 Oracle 的设置的原理,下面主要对 AR 收款/AR 发票/AP 付款/AP 发票来做为例子来讲解。 Oracle 在开发这块的时候启用了几个重要的 Table ,分别是 xla_events, xla_ae_headers , xla_ae_lines , xla_transaction_entities,ra_cust_trx_line_gl_dist_all,gl_import_references 。 这些表中的数据是什么时候得到的呢? 1. 在我们做产生会计科目的时候,首先会将数据写入到表 xla_events 中,运行完请求后, 会在表中 xla_ae_headers 和 xla_ae_lines 产生具体的日记帐的分录。再通过连接关系表 gl_import_references 就可以与日记帐的分录一一对应。 2. 产生的 xla_ae_headers , xla_ae_lines 分录如何与子模款联系在一起?其实是通过关联表 xla_transaction_entities 来得到的,一般都是以 source_id_int_1 字段来与子模块的事物 处理 ID 来关联 。 通过上面的 2 点我们就可以反追溯到日记帐的原始单据上。 2.开发参考 -- AP Payments SELECT aca.check_id source_id, aca.check_number source_num, aca.org_id, hou.NAME company_name, h.period_name, h.accounting_date, aca.status_lookup_code, te.ledger_id, h.application_id, te.entity_code, l.code_combination_id, fnd_flex_ext.get_segs('SQLGL', 'GL#', gl.chart_of_accounts_id, l.code_combination_id) account, xla_oa_functions_pkg.get_ccid_description(gl.chart_of_accounts_id, l.code_combination_id) account_description, ap_checks_pkg.get_posting_status(aca.check_id) posting_flag, fnd_flex_keyval.segment_value(1) company_code, fnd_flex_keyval.segment_value(3) type_name, l.accounting_class_code, h.balance_type_code, h.completed_date, l.accounted_dr, l.accounted_cr, l.currency_code, l.entered_dr, l.entered_cr FROM xla_ae_headers h, Oracle ERP R12 实用技术开发.doc xla_ae_lines l, xla_events e, xla_transaction_entities te, gl_ledgers gl, ap_checks_all aca, hr_operating_units hou WHERE e.event_id = h.event_id AND e.application_id = h.application_id AND h.ae_header_id = l.ae_header_id AND h.application_id = l.application_id AND nvl(nvl(accounted_cr, accounted_dr), 0) <> 0 AND h.application_id = 200 AND gl.ledger_id = h.ledger_id AND te.application_id = h.application_id AND te.entity_id = h.entity_id AND te.entity_code = 'AP_PAYMENTS' AND te.ledger_id = 2022 AND nvl(te.source_id_int_1, -99) = aca.check_id AND hou.organization_id = aca.org_id AND ap_checks_pkg.get_posting_status(aca.check_id) IN ('Y', 'P') AND h.period_name = p_period_name AND (mo_global.check_access(aca.org_id) = 'Y'); -- AP Invioce SELECT aia.invoice_id source_id, aia.invoice_num source_num, aia.org_id, hou.NAME company_name, h.period_name, h.accounting_date, aia.invoice_type_lookup_code, te.ledger_id, ap_invoices_pkg.get_approval_status(aia.invoice_id, aia.invoice_amount, aia.payment_status_flag, aia.invoice_type_lookup_code) source_status, l.code_combination_id, fnd_flex_ext.get_segs('SQLGL', 'GL#', gl.chart_of_accounts_id, l.code_combination_id) account, xla_oa_functions_pkg.get_ccid_description(gl.chart_of_accounts_id, l.code_combination_id) account_description, ap_invoices_pkg.get_posting_status(aia.invoice_id) posting_flag, h.application_id, te.entity_code, l.code_combination_id, fnd_flex_keyval.segment_value(1) company_code, fnd_flex_keyval.segment_value(3) type_name, l.accounting_class_code, h.balance_type_code, h.completed_date, l.accounted_dr, l.accounted_cr, l.currency_code, l.entered_dr, l.entered_cr FROM xla.xla_ae_headers h, xla.xla_ae_lines l, xla.xla_events e, xla.xla_transaction_entities te, gl_ledgers gl, ap_invoices_all aia, hr_operating_units hou WHERE e.event_id = h.event_id AND e.application_id = h.application_id AND h.ae_header_id = l.ae_header_id Oracle ERP R12 实用技术开发.doc AND h.application_id = l.application_id AND nvl(nvl(accounted_cr, accounted_dr), 0) <> 0 AND h.application_id = 200 AND gl.ledger_id = h.ledger_id AND te.application_id = h.application_id AND te.entity_id = h.entity_id AND te.entity_code = 'AP_INVOICES' AND te.ledger_id = 2022 AND aia.invoice_id = nvl(te.source_id_int_1, -99) AND hou.organization_id = aia.org_id AND ap_invoices_pkg.get_posting_status(aia.invoice_id) IN ('Y', 'P') AND h.balance_type_code = 'A' AND h.period_name = p_period_name -- AR Transaction SELECT l.accounted_dr accounted_dr, l.accounted_cr accounted_cr, fnd_flex_ext.get_segs('SQLGL', 'GL#', 50328, l.code_combination_id) account_description FROM xla_ae_lines l, xla_ae_headers h, xla_transaction_entities te WHERE te.application_id = h.application_id AND te.entity_id = h.entity_id AND h.ae_header_id = l.ae_header_id AND h.application_id = l.application_id AND nvl(nvl(accounted_cr, accounted_dr), 0) <> 0 AND te.application_id = 222 AND te.entity_code = 'TRANSACTIONS' AND te.source_id_int_1 = l_customer_trx_id ORDER BY h.ae_header_id, l.displayed_line_number; -- AR Receipts SELECT l.accounted_dr accounted_dr, l.accounted_cr accounted_cr, fnd_flex_ext.get_segs('SQLGL', 'GL#', 50328, l.code_combination_id) account_description FROM xla_ae_lines l, xla_ae_headers h, xla_transaction_entities te WHERE te.application_id = h.application_id AND te.entity_id = h.entity_id AND h.ae_header_id = l.ae_header_id AND h.application_id = l.application_id AND nvl(nvl(accounted_cr, accounted_dr), 0) <> 0 AND te.application_id = 222 AND te.entity_code = 'RECEIPTS' AND te.source_id_int_1 = l_cash_receipt_id ORDER BY h.ae_header_id, l.displayed_line_number; -- XLA 连日记帐 SELECT * FROM gl_import_references gir, xla_ae_lines xal, xla_ae_headers xah, gl_je_headers gjh, gl_je_lines gjl WHERE gir.gl_sl_link_id = xal.gl_sl_link_id AND xal.ae_header_id = xah.ae_header_id AND gir.je_header_id = gjl.je_header_id AND gir.je_line_num = gjl.je_line_num AND gjh.je_header_id = gjl.je_header_id 3.异常处理 无 Oracle ERP R12 实用技术开发.doc 4.常见问题 无
还剩49页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 2 人已下载

下载pdf

pdf贡献者

落忆无痕

贡献于2014-11-22

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf