数据定义移植工具:FNDLOAD
4:05 pminOracle EBS二次开发by
在实际的EBS二次开发中,我们经常会碰到需要在各个环境之间移植二次开发的程序对象以及数据定义,如在EBS二次开发中并发请求的定义会涉及到:可执行、并发程序、值集、请求组等的定义,定义需要从开发环境、测试环境、UAT环境一直到正式环境,开发人员完成一个并发请求开发后,同样的定义需要在多个环境中手工完成,势必导致中间出现错误,导致浪费很多时间来进行检查,无形中增加了工作量;而更多的时候系统人员和开发人员是分离的,开发人员和系统管理人员之间还需要进行任务的交接,进一步增加了程序移植工作的难度和工作量。
而FNDLOAD则是为了移植EBS数据定义而诞生的工具,它可以移植定义在AOL中的数据定义,如我们常见的并发程序、值集、预置文件等等,严格来说它可以实现任意两个Oracle数据库之间数据的移植,有了这个工具,我们就无需在多个环境中重复进行手工定义了。
在Oracle EBS环境下,和FNDLOAD工具类似的移植工具随处可见,并被广泛应用,如用来移植BI Publisher报表模板定义的XDOLoader工具;工作流定义移植工具WFLOAD;数据库对象移植工具ODF和XDF.
04年在做一个项目的时候,我简单写过一个通过FNDLOAD工具在多个EBS环境间移植程序定义的文档,其中主要描述了如何使用FNDLOAD将AOL模块中的数据从一个环境移植到另一个环境,下面将从如何掌握并应用FNDLOAD这个工具的角度补充说明。
一、FNDLOAD介绍
数据移植的目的无非是将一个EBS系统下中的某个表中的数据按照条件筛选出来后传到另外EBS系统下数据库中对应的表中。FNNDLOAD的根本原理就是将数据从源数据库中下载到数据文件中,然后再通过FNDLOAD将数据文件上传到目标数据库中。
由于两个数据库系统不能保证是连接的,无法采用Oracle的DBLink技术,因此FNDLOAD采用了数据文件作为两个系统间传递的中介,而为了完成数据的下载和上传,FNDLOAD引入了控制文件(lct):用来定义移植那张表中的数据列,并分DOWNLOAD和UPLOAD模式定义数据抽取和更新的逻辑,DOWNLOAD用在源数据库环境下,UPLOAD应用于目标数据库环境下。
控制文件是FNDLOAD工具的核心,下面我们来分析一下并发请求移植的控制文件($FND_TOP/patch/115/import/afcpprog.lct)的部分内容:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114 |
#
# $Header: afcpprog.lct 120.2.12010000.2 2008/11/21 14:26:27 jvalenti ship $
#
# .lct - Loader Configuration
#
# Entities -
#
# PROGRAM
# INCOMPATABILITY
#
# VALUE_SET (non-MLS) -- Value sets
# | - FND_FLEX_VALUE_SETS
# +--VSET_SECURITY_RULE (MLS) -- Value Security Rules
# | | - FND_FLEX_VALUE_RULES
# | | - FND_FLEX_VALUE_RULES_TL
# | +--VSET_SECURITY_LINE (no-TL) -- Value Security Rule Lines
# | | - FND_FLEX_VALUE_RULE_LINES
# | +--VSET_SECURITY_USAGE (no-TL) -- Security Rule Assignments to
# ....
#
# ----------END FLEX----------
#
# -- DEFINE SECTION --
#
#
# ==================================================
# Executable
# ==================================================
DEFINE EXECUTABLE
KEY EXECUTABLE_NAME VARCHAR2(30)
KEY APPLICATION_SHORT_NAME VARCHAR2(50)
CTX OWNER VARCHAR2(4000)
BASE LAST_UPDATE_DATE VARCHAR2(75)
BASE EXECUTION_METHOD_CODE VARCHAR2(1)
BASE EXECUTION_FILE_NAME VARCHAR2(61)
BASE SUBROUTINE_NAME VARCHAR2(30)
BASE EXECUTION_FILE_PATH VARCHAR2(510)
TRANS USER_EXECUTABLE_NAME VARCHAR2(240)
TRANS DESCRIPTION VARCHAR2(240)
END EXECUTABLE
DEFINE PROGRAM
KEY CONCURRENT_PROGRAM_NAME VARCHAR2(30)
KEY APPLICATION_SHORT_NAME VARCHAR2(50)
CTX OWNER VARCHAR2(4000)
BASE LAST_UPDATE_DATE VARCHAR2(75)
TRANS USER_CONCURRENT_PROGRAM_NAME VARCHAR2(240)
BASE EXEC REFERENCES EXECUTABLE
......
END PROGRAM
#
# -- DOWNLOAD SECTION --
#
# For each entity, specify the statement to use to flesh out
# its entity definition. SELECT columns must be in same order and
# datatype as the entity's attributes as defined above.
#
# PROGRAM
DOWNLOAD PROGRAM
"select v.CONCURRENT_PROGRAM_NAME,
a.APPLICATION_SHORT_NAME,
fnd_load_util.OWNER_NAME(v.LAST_UPDATED_BY) OWNER,
to_char(v.LAST_UPDATE_DATE, 'YYYY/MM/DD') LAST_UPDATE_DATE,
v.USER_CONCURRENT_PROGRAM_NAME,
....
from fnd_concurrent_programs_vl v,
fnd_executables me,
fnd_security_groups s,
fnd_application mea,
fnd_concurrent_request_class c,
fnd_application ca,
fnd_executables e,
fnd_application ea,
fnd_application a
where ((:CONCURRENT_PROGRAM_NAME is null) or
((:CONCURRENT_PROGRAM_NAME is not null) and
(v.CONCURRENT_PROGRAM_NAME like :CONCURRENT_PROGRAM_NAME)))
and ((:APPLICATION_SHORT_NAME is null) or
((:APPLICATION_SHORT_NAME is not null) and
(a.APPLICATION_SHORT_NAME like :APPLICATION_SHORT_NAME)))
......
"
UPLOAD PROGRAM
BEGIN
"begin
if (:UPLOAD_MODE = 'NLS') then
fnd_concurrent_programs_pkg.TRANSLATE_ROW (
:CONCURRENT_PROGRAM_NAME,
:APPLICATION_SHORT_NAME,
:OWNER,
:USER_CONCURRENT_PROGRAM_NAME,
:DESCRIPTION,
:CUSTOM_MODE,
:LAST_UPDATE_DATE);
else
fnd_concurrent_programs_pkg.LOAD_ROW (
:CONCURRENT_PROGRAM_NAME,
:APPLICATION_SHORT_NAME,
:OWNER,
:USER_CONCURRENT_PROGRAM_NAME,
:EXEC_EXECUTABLE_NAME,
:EXEC_APPLICATION_SHORT_NAME,
......
);
end if;
end;" |
三、如何移植多语言定义数据
AOL模块中很多数据的定义都是多语言的,如并发请求的定义,而通过FNDLOAD来进行数据的移植一次只包括一个语言的信息,因此如果定义存在多语言的情况,需要按照语言环境进行多次移植,即生成多个数据文件(ldt),在控制文件的目录下,如$FND_TOP/patch/115/import/下存在US和ZHS这样的语言目录,控制文件内容的开始指定了语言环境, 如LANGUAGE = “US”,而很多控制文件并未分多语言版本,这个需要在运行FNDLOAD命令的时候指定语言环境,所以使用控制文件的时候无需使用指定语言的版本,只要在运行FNDLOAD命令的时候通过下面的命令来切换语言环境
1
2
3
4
5
6
7 |
--中文
NLS_LANG= "AMERICAN_AMERICA.AL32UTF8"
export NLS_LANG
--英文
NLS_LANG= "SIMPLIFIED CHINESE_CHINA.AL32UTF8"
export NLS_LANG |
通过上面的环境设置后再执行FNDLOAD,生成的数据文件就是相应语言环境的定义,只要切换不同的语言环境执行下载,多次生成数据文件就实现了多语言数据的生成;然后执行多次上载操作即可.
NLS_LANG可以通过下面的SQL查询获得:
1
2
3
4 |
'"'||nls_language||'_'||nls_territory||'.'||||'"'nls_langfnd_languages,v$nls_parameterslanguage_code('US','ZHS')parameter='NLS_CHARACTERSET'; |
四、开发员常用FNDLOAD控制文件列表
模块 |
文件名 |
描述 |
FND |
afcpprog.lct |
可执行、并发程序、值集、弹性域 |
FND |
afcpexec.lct |
可执行程序 |
FND |
afattach.lct |
附件 |
FND |
afcpreqg.lct |
请求组 |
FND |
afcprset.lct |
请求集 |
FND |
afffload.lct |
值集、关键性弹性域和描述性弹性域及相关安全性设置 |
FND |
aflvmlu.lct |
Lookups |
FND |
afmdmsg.lct |
消息 |
FND |
afscprof.lct |
profile options 预制文件 |
FND |
afscursp.lct |
Application users,User Responsibilities,Security groups,Applications,Application Responsibilities and Exclusion Functions |
FND |
afsload.lct |
FORM, FUNCTION, MENU, ENTRY, OBJECT, OBJECT_INSTANCE_SET, GRANT |
FND |
affrmcus.lct |
Form个性化定义 |
更多控制文件请到各模块的patch/115/import目录下去查找。
转载:http://space.itpub.net/10951282/viewspace-689341