在 Oracle E-Business Suite的二次开发中,基于OAF的开发在JDeveloper OA
Extension中进行,完成后使用XMLImporter工具导入页面定义到数据库中,
之后上传相关的Java Class文件到JAVA_TOP下便可以使用OAF应用了,下面我们来看看OAF的页面导入数据库中发生了什么?
下面以采购订单类型定义页面为例来进行剖析。
一、导出OAF页面设计的XML定义
在OAF页面开发中,开发人员使用JDeveloper可视化工具来设计Web页面,页面有一个个组件嵌套组合而成,最后形成一个XML格式的页面定义文件。
在EBS中可以通过Abort this Page
的功能来查找出页面相关的信息,如页面结构、个性化、页面上下文、Java系统属性、预置文件等等,
利用这个功能查询出页面的路径:
然后使用如下方法来导出页面的XML信息, 使用PLSQL Developer工具,在SQL 窗口中运行如下的命令
PLSQL
jdr_utils.printDocument('/oracle/apps/po/setup/webui/DocumentTypesPG');
;
然后切换到Output标签页,可以看到OAF页面的XML定义,如果页面定义信息过多,可以增加Buffer Size后再次运行,如下便是PO
Document Types页面的定义信息,
从页面定义信息中可以得知OAF页面的组成,所使用的AM, Region使用的CO等信息,通过这个方法可以分析和查看标准的OAF页面和功能.
二、OAF页面元信息存储结构
实现上在使用XMLImporter导入OAF页面信息的时候,XMLImporter解析OAF页面定义XML文件,然后将页面信息分别存储在下图的几个表中。
OAF页面元数据主要存储在上图中的3个表中:
1,JDR_PATHS:存储了页面路径的结构以及OAF页面个性化的结构信息
/oracle/apps/po/setup/webui/DocumentTypesPG这是OAF页面的路径,它会被拆分为树型结构存储在JDR_PATHS表中,请看下面:
SQL
SELECT path_docid,path_name, path_type
FROM jdr_paths
START WITH path_name = 'DocumentTypesPG'
CONNECT BY PRIOR path_owner_docid = path_docid;
PATH_DOCID PATH_NAME PATH_TYPE
------------ ----------------- -----------
78629 DocumentTypesPG DOCUMENT
39543 webui PACKAGE
39542 setup PACKAGE
24179 po PACKAGE
2 apps PACKAGE
1 oracle PACKAGE
其中oralce, apps, po, setup, webui
都是属于PACKAGE类型,而DocumentTypesPG是DOCUMENT,即是一个XML文档
2,JDR_COMPONENTS:存储了页面组件信息,OAF页面组件被分解后存储在此表中
上面从JDR_PATHS表中查询出来类型为DOCUMENT的节点DocumentTypesPG,查询它的组件属性如下:
SQL
SELECT comp_seq, comp_element, comp_level, comp_grouping, comp_id
FROM jdr_paths, jdr_components
WHERE path_docid = 78629
AND path_docid = comp_docid(+)
ORDER BY path_seq, comp_seq;
COMP_SEQ COMP_ELEMENT COMP_LEVEL COMP_GROUPING COMP_ID
-------- --------------------- ---------- ------------------------ --------------------------
0 page 0
1 oa:pageLayout 2 content PageLayoutRN
2 oa:image 4 ui:corporateBranding corporateBrandingImage
3 oa:advancedTable 4 ui:contents DocumentTypesResultsTable
4 oa:column 6 ui:contents TypeColumn
5 oa:sortableHeader 8 ui:columnHeader TypeHeader
6 oa:messageStyledText 8 ui:contents Type
7 oa:column 6 NameColumn
8 oa:sortableHeader 8 ui:columnHeader NameHeader
9 oa:messageStyledText 8 ui:contents DocName
10 oa:column 6 LayoutColumn
11 oa:sortableHeader 8 ui:columnHeader LayoutHeader
12 oa:messageStyledText 8 ui:contents Layout
13 oa:column 6 ContractTermsColumn
14 oa:sortableHeader 8 ui:columnHeader ContractTermsHeader
15 oa:messageStyledText 8 ui:contents ContractTerms
16 oa:column 6 UpdateColumn
17 oa:sortableHeader 8 ui:columnHeader UpdateHeader
18 oa:image 8 ui:contents Update
19 oa:column 6 DeleteColumn
20 oa:sortableHeader 8 ui:columnHeader DeleteHeader
21 oa:switcher 8 ui:contents DeleteSwitcher
22 ui:case 9
23 oa:image 10 DeleteDisabled
24 ui:case 9
25 oa:image 10 DeleteEnabled
26 ui:fireAction 12 ui:primaryClientAction
27 ui:parameter 14 ui:parameters
28 ui:parameter 14
29 ui:parameter 14
30 oa:formValue 6 DocumentTypeCode
31 oa:formValue 6 DocumentSubtype
32 oa:flowLayout 6 ui:tableActions TableActionsRN
33 oa:submitButton 8 ui:contents CreateDocumentType
对比上面查询出来的结果和通过jdr_utils.printDocument(‘/oracle/apps/po/setup/webui/DocumentTypesPG’)工具导出的XML文件内容就会发现,
JDR_COMPONENTS中的数据是将XML文件中的OAF组件分解得到的
3,JDR_ATTRIBUTES:存储了页面各组件的属性
使用下面的SQL查询出页面组件的属性信息
SQL
SELECT comp_seq,
comp_element,
comp_level,
comp_grouping,
comp_id,
comp_ref,
comp_extends,
comp_use,
att_name,
att_value
FROM jdr_paths, jdr_components, jdr_attributes
WHERE path_docid = 78629
AND path_docid = comp_docid(+)
AND comp_docid = att_comp_docid(+)
AND comp_seq = att_comp_seq(+)
ORDER BY path_seq, comp_seq, att_comp_seq, att_seq;
执行结果在此就不列出了,留给读者自己去完成.
从上面的OAF元数据存储不难看出, OAF开发完成后,使用XMLImporter工具导入OAF页面的时候,
XMLImport工具将页面定义XML文件按照组件进行分解,将文档的结构信息存储到JDR_PATHS中;将组件信息保存到JDR_COMPONENTS中;
组件的属性保存到JDR_ATTRIBUTES中.
而当运行OAF页面的时候,OAF引擎根据Function定义中的URL地址,即OAF页面的页面路径,首先到JDR_PATHS表中查询出DOCUMENT的节点,然后再从JDR_COMPOENTS
和 JDR_ATTRIBUTES表中取得组件和属性信息后输出Web页面.
所以发布OAF应用的时候, 页面定义文件是无需上传到JAVA_TOP下的.
熟悉了JDR相关的结构之后,对于我们理解OAF的工作原理,以及解决一些疑难杂症非常有帮助. 同时对于OAF页面的个性化也会涉及到这几张表.