当前位置:文档之家› 02 OAF客户化开发实例之Helpdesk公告用户显示开发实例v1.0

02 OAF客户化开发实例之Helpdesk公告用户显示开发实例v1.0

AIM

MD.070A PPLICATION

E XTENSION T ECHNICAL D ESIGN

Helpdesk公告用户显示开发实例

Author: Peng.Yang

Creation Date: January 28, 2010

Last Updated: June 26, 2010

Document Ref:

Version: 1.0

Approvals:

Peng.Yang

_____

No.

Copy

Document Control

Change Record

Date Author Version Change Reference

28-Jan-2010 Peng.Yang 1.0 No Previous Document

Reviewers

Name Position

Distribution

Copy No. Name Location

1Library Master Project Library

Manager

2Project

3

4

Note To Holders:

If you receive an electronic copy of this document and print it out, please write your

name on the equivalent of the cover page, for document control purposes.

If you receive a hard copy of this document, please write your name on the front

cover, for document control purposes.

ii / 26

Contents

Document Control .................................................................................................................. i i 开发介绍 .. (1)

概述 (1)

完成的目标 (2)

步骤1:创建页面模型组件 (3)

步骤2:创建初始页 (4)

步骤3:自动客户化查询 (6)

步骤4:创建公告明细页面 UI (10)

步骤5:实现试图对象查询 (14)

步骤6:实现下钻到 NotifyShowDetailsPG (15)

步骤7:程序部署到EBS应用服务器中 (18)

步骤8:OAF控制器中的日志查看 (21)

步骤9:如何找到页面所对应的源文件 (21)

Open and Closed Issues for this Deliverable (23)

Open Issues (23)

Closed Issues (23)

iii / 26

开发介绍

概述

本文当讲述了如何实现OAF公告页面显示功能。

1 / 26

完成的目标

完成此开发之后,需要掌握如下的课题:

z OAF开发环境搭建了解

z OAF框架的了解

z OAF开发规范遵循

z OAF页面的基本布局

z通过编写必要的程序实现页面直接的 JSP Forward

z启用 "Warn About Changes" 功能,帮助用户减少不必要的数据丢失工作

z实现实体对象、实体属性和行级的业务逻辑(包括抛出属性和行级的验证异常)

z在业务逻辑中使用视图对象验证和应用模块验证

z在基于实体对象的视图对象中添加一个新的行

z处理按钮的动作

z确保应用程序在使用浏览器中的 Back 按钮是安全的

2 / 26

步骤1:创建页面模型组件

任务1.1: 创建视图对象(VO) NotifyShowVO,主要用于直接查询,不对数据进行任何操作

为了满足搜索结果表的要求,需要创建一个包括了搜索所需要的所有属性的汇总视图。

z从导航栏中选择oracle.apps.cux.helpdesk.server BC4J 包,右键从上下文菜单中选择New View Object...进入New View Object...向导

z跳过欢迎页

z在Name页中,指定连接视图对象的Name为NotifyShowVO,并保证 Package 的值为oracle.apps.cux.helpdesk.server

z下一步直到第5步,直接输入以下 SQL 语句

SELECT ROWNUM line_no,

NOTIFY_ID,

SUBJECT,

NOTICE_DATE,

Content,

NOTICE_USER_TYPE_DESC,

NOTICE_USER_DESC

FROM (

SELECT NotifyEO.NOTIFY_ID,

NotifyEO.SUBJECT,

NotifyEO.NOTICE_DATE,

NotifyEO.Content,

fl.MEANING NOTICE_USER_TYPE_DESC, decode(NotifyEO.NOTICE_USER_TYPE,'C',

cux_helpdesk_oaf_pkg.get_segment_desc(NotifyEO.NOTICE_USER_CODE,'segment1'),

'D',cux_helpdesk_oaf_pkg.get_segment_desc(NotifyEO.NOTICE_USER_CODE,'segment2'),

cux_helpdesk_oaf_pkg.get_segment_desc(NotifyEO.NOTICE_USER_CODE,'segment3')

) NOTICE_USER_DESC

FROM CUX_HELPDESK_NOTIFICATIONS NotifyEO,

Fnd_Lookups fl

WHERE NotifyEO.notice_user_type = fl.LOOKUP_CODE

AND fl.lookup_type = 'CUX_NOTICE_USER_TYPE'

AND trunc(nvl(NotifyEO.End_Date,SYSDATE+1)) >= trunc(SYSDATE+1)

3 / 26

ORDER BY trunc(NotifyEO.NOTICE_DATE) DESC,NotifyEO.Exigence_Type DESC,NotifyEO.Notify_Id DESC

)

z select the Generate Java File for View Object Class: NotifyShowVOImpl and View Row Class:

NotifyShowVORowImpl

z完成修改后选择 Test 按钮进行验证测试

z选择下一步按钮两次

z完成

任务1.2: 添加视图对象到 UI 应用模块根节点

实体对象只能够在包含它的应用模块的上下文中使用,在你页面中使用NotifyVO之前必须先将它加入到页面的 UI 应用模块根节点

中。

z从导航栏中选择NotifyAM,右键从上下文菜单中选择Edit NotifyAM...进入DATA Module...向导

z选择Data Model页,将Available View Objects列表中的NotifyShowVO实体对象移到两次到Data Model列表中确定完成,即Data Model中分别为NotifyShowVO1 和 NotifyShowVO2

步骤2:创建初始页

此步骤的任务是创建一个页标题为Notify的页面,并带有提示文本信息。

任务2.1: 创建 NotifyShowPG页

在包oracle.apps.cux.helpdesk.webui中创建一个新的 UI 页

z从导航栏中选择CUX_Helpdesk_OAProject.jpr项目,右键从上下文菜单中选择New…

4 / 26

z在New窗口中,展开Web Tier层次选择OA Components

z在OA Components Items列表中选择Page

z选择确定继续

z在New Page对话框中,输入Name的值为NotifyShowPG;Package的值为oracle.apps.cux.helpdesk.webui(此目录存页面)

z选择确定创建页面

任务2.2: 更改页面布局(Top-Level)区域

z在结构窗口中选择NotifyShowPG中的region1

z设置和验证以下的属性值

属性值

ID PageLayoutRN

Region Style pageLayout

Form True

AM Definition oracle.apps.cux.helpdesk.server.NotifyAM

Window Title 公告显示页面

Title 公告显示页面

AutoFooter True

任务2.3: 运行页面进行测试

5 / 26

步骤3:自动客户化查询

任务3.1: 添加查询结果表到 PageLayoutRN

z在结构窗口中选择PageLayoutRN区域,右键从上下文菜单中选择New > Region Using Wizard

z跳过欢迎页

z在BC4J Objects页中,选择NotifyAM (oracle.apps.cux.helpdesk.server.NotifyAM),然后在Available View Objects列表中选择视图对象实例NotifyShowVO1

z选择下一步按钮

z在Region Properties页中设置Region ID的值为ResultsTable;Region Style的值为table

z选择下一步按钮

z在View Attributes页中,选择Available View Attributes列表中的下列属性到Selected View Attributes列表中

LineNo

NotifyId

6 / 26

Subject

NoticeDate

NoticeUserTypeDesc

NoticeUserDesc

z选择下一步按钮

z在 Region Items 页中,设置如下的属性值:

ID Prompt Style Data Type Attribute Set

LineNo 行号messageStyledText NUMBER

NotifyId 发布标识formValue NUMBER

Subject 发布主题messageStyledText VARCHAR2

NoticeDate 发布日期messageStyledText DATE

NoticeUserTypeDesc 发布者类型messageStyledText VARCHAR2

NoticeUserDesc 发布者messageStyledText VARCHAR2

z选择完成按钮结束

任务3.2: 设置和验证查询结果表区域属性值

z在结构窗口中选择Result Table区域,设置和确认如下的属性值:

属性值

ID ResultsTable

Region Style table

AM Definition 必须为空,如果有值必须删除

Additional Text 公告显示表格

Rendered True

Records Displayed 20

Width 100%

7 / 26

这里设置ResultsTable下的LineNo、Subject、NoticeDate、NoticeUserTypeDesc、NoticeUserDesc的Sort Allowed都设成yes 任务3.3: 在NotifyShowVOImpl中增加自动查询代码

import oracle.apps.fnd.framework.OAException;

import oracle.jbo.domain.Number;

public void NotifyQuery(String NotifyId)

{

Number Notify_Id = null;

if (NotifyId != null && (!("".equals(NotifyId.trim()))) )

{

try

{

Notify_Id = new Number(NotifyId);

}

catch(Exception e)

{

throw new OAException("CUX", "CUX_NOTIFY_INVALID_NOTIFY_ID");

}

setWhereClause("NOTIFY_ID = :1");

setWhereClauseParams(null); //Always reset

setWhereClauseParam(0, Notify_Id);

}

else

{

setWhereClause("1 = 1");

setWhereClauseParams(null); //Always reset

}

executeQuery();

}

8 / 26

任务3.4: 在NotifyAMImpl中增加如下代码

public void NotifyShow()

{

String NotifyId = null;

NotifyShowVOImpl vo = getNotifyShowVO1();

vo.NotifyQuery(NotifyId);

} // end NotifyShow()

任务3.5: 为明细页创建控制器

z在结构窗口中选择NotifyShowPG中的ResultsTable,右键从上下文菜单中选择Set New Controller ...

z在New Controller对话框中,指定Package Name的值为oracle.apps.cux.helpdesk.webui;Class Name的值为NotifyShowCO

z选择确定按钮完成控制器创建

任务3.6: 增加控制器逻辑以在页面被请求的时候初始化公告自动查询

为了使NotifyShowPG页面在被请求的时候能够自动的查询NotifyShowVO试图对象下的数据,需要添加如下的代码到NotifyShowCO.processRequest()方法中。

import oracle.apps.fnd.framework.OAApplicationModule;

...

public void processRequest(OAPageContext pageContext, OAWebBean webBean)

{

super.processRequest(pageContext, webBean);

String showdetailflag = pageContext.getParameter("showdetailflag");

if (showdetailflag == null)

{

OAApplicationModule am = pageContext.getApplicationModule(webBean);

am.invokeMethod("NotifyShow", null);

9 / 26

}

}

任务3.7: 测试页面

步骤4:创建公告明细页面 UI

本步骤创建一个简单的只读页,页中的公告明细信息在用户点击公告主题的时候系统自动查询得出。

任务4.1: 创建页

在oracle.apps.cux.helpdesk.webui包中创建一个新的 UI 页面

z从导航栏中选择CUX_Helpdesk_OAProject.jpr项目,右键从上下文菜单中选择New...

z在New窗口中,展开Web Tier层次选择OA Components

z在 OA Components Items列表中选择Page

z选择确定继续

z在New Page对话框中,输入Name的值为NotifyShowDetailsPG;Package的值为oracle.apps.cux.helpdesk.webui

z选择确定创建页面

10 / 26

任务4.2: 更改 pageLayout 区域

z在结构窗口中选择NotifyShowDetailsPG中的region1

z设置和验证以下的属性值

属性值

ID PageLayoutRN

Region Style pageLayout

AM Definition oracle.apps.cux.helpdesk.server.NotifyAM

Window Title 公告查询明晰

Title 公告查询明晰

AutoFooter True

任务4.3: 创建主内容区域

为了使项目显示出合适的缩进,在PageLayoutRN区域中添加defaultSingleColumn区域,由于此区域中所有的项目都和NotifyShowVO2视图实例相对应,使用区域向导快速创建。

z在结构窗口中选择PageLayoutRN区域,右键从上下文菜单中选择New > Region Using Wizard

z在BC4J Objects页中选择NotifyAM (oracle.apps.cux.helpdesk.server.NotifyAM) ,并从Available View Objects列表中选择NotifyShowVO2视图对象实例

z选择下一步到Region Properties页,设置Region ID的值为MainRN;Region Style的值为defaultSingleColumn

z下一步到View Attributes页中,从Available View Attributes列表中选择如下属性列到Selected View Attributes列表中LineNo

NotifyId

Subject

NoticeDate

Content

NoticeUserTypeDesc

NoticeUserDesc

11 / 26

z选择下一步到Region Items页,设置如下的项目属性:

ID Prompt Style Data Type Attribute Set

LineNo 行号messageStyledText NUMBER

NotifyId 发布标识formValue NUMBER

Subject 发布主题messageStyledText VARCHAR2

NoticeDate 发布日期messageStyledText DATE

Content 发布内容messageTextInput VARCHAR2 NoticeUserTypeDesc 发布者类型messageStyledText VARCHAR2

NoticeUserDesc 发布者messageStyledText VARCHAR2

z确定创建数据表

z在结构窗口中选择MainRN,设置Hide Header属性值为True;Text属性值留空

任务4.4: 设置 MainRN 区域的属性

打开MainRN区域下的项目进行如下的属性值设置:

LineNo

属性值

CSS Class OraDataText

Subject

属性值

CSS Class OraDataText

NoticeDate

12 / 26

属性值

CSS Class OraDataText

Content

属性值

CSS Class OraDataText

Read Only True

Height 100

Length 15

NoticeUserTypeDesc

属性值

CSS Class OraDataText

NoticeUserDesc

属性值

CSS Class OraDataText

任务4.5: 增加一个 ”Return to Notify Show” 链接

在NotifyShowDetailsPG页面的底部增加一个”Return to Notify Show”链接

z在结构窗口中选择PageLayoutRN,右键选择New > returnNavigation

z选择自动创建在pageComponents文件夹下的returnNavigation link项目,设置如下的属性值:

13 / 26

属性值

ID ReturnLink

Destination URI OA.jsp?page=/oracle/apps/cux/helpdesk/webui/NotifyShowPG&showdetailflag=Y&retainAM=Y

Text 返回公告显示页面

步骤5:实现试图对象查询

任务5.1: 添加 initShowDetails() 方法到 NotifyAMImpl 类中

后面将会从 UI 控制器调用此方法(OA Framework的编码标准:直接与在控制器中的OAApplicationModule接口进行交互,不要

直接和视图对象进行交互),此方法委派你在NotifyShowVOImpl类中创建的NotifyQuery方法

public void initShowDetails(String NotifyId)

{

NotifyShowVOImpl vo = getNotifyShowVO2();

if (vo == null)

{

MessageToken[] errTokens = { new MessageToken("OBJECT_NAME", "NotifyShowVO2")};

throw new OAException("AK", "FWK_TBX_OBJECT_NOT_FOUND", errTokens);

}

vo.NotifyQuery(NotifyId);

} // end initShowDetails()

任务5.2: 保存并编译

14 / 26

步骤6:实现下钻到 NotifyShowDetailsPG

本步骤中,在上一课中学习的查询结果表中 Subject 列上面添加一个链接,链接导航到一个新的明细页。

任务6.1: 配置 Subject 项目成为一个链接

当用户选择公告主题链接时,显示一个新的明细页。这是属于一个 GET 请求,我们需要做:

z添加NotifySubject参数到 URI,这些参数的值来源于NotifyShowPG的NotifyShowVO1中的Subject

z意味着在NotifyShowDetailsPG打开使用过程中,NotifyShowPG所属的应用模块实例必须保持原有的状态,保证这些页面可以共享一个根应用模块

在NotifyShowPG下选择ResultsTable区域中的Subject项目,设置 Destination URI 的属性值为:

OA.jsp?page=/oracle/apps/cux/helpdesk/webui/NotifyShowDetailsPG&NotifyId={@NotifyId}&NotifySubject={@Subject}&re

tainAM=Y&addBreadCrumb=Y

在运行的时候,OA Framework 自动替换在两个大括号之间的视图属性的具体值。例如:&NotifyId={@NotifyId}变为&NotifyId

=1234

任务6.2: 为明细页创建控制器

z在结构窗口中选择NotifyShowDetailsPG中的PageLayoutRN,右键从上下文菜单中选择Set New Controller ...

z在New Controller对话框中,指定Package Name的值为oracle.apps.cux.helpdesk.webui;Class Name的值为

NotifyShowDetailsCO

z选择确定按钮完成控制器创建

任务6.3: 增加控制器逻辑以在页面被请求的时候初始化公告查询

为了使NotifyShowDetailsPG页面在被请求的时候能够自动的查询NotifyShowVO试图对象下的数据,需要添加如下的代码到

NotifyShowDetailsCO.processRequest()方法中。

15 / 26

其中引用了NotifyId参数的值

import java.io.Serializable;

import oracle.apps.fnd.framework.OAApplicationModule;

...

public void processRequest(OAPageContext pageContext, OAWebBean webBean)

{

// Always call this first.

super.processRequest(pageContext, webBean);

// Get the NotifyId parameter from the URL

String NotifyId = pageContext.getParameter("NotifyId");

// Now we want to initialize the query for our single Notify

// with all of its details.

OAApplicationModule am = pageContext.getApplicationModule(webBean);

Serializable[] parameters = { NotifyId };

am.invokeMethod("initShowDetails", parameters);

}

任务6.4: 通过编程来实现页标题文本的动态显示

按照 BLAF UI Guidelines on Header Components 准则,需要在明细页的标题上显示当前被选择的公告主题,为此需要覆盖上一步NotifyDetailsCO.processRequest() 的方法,以下添加红色部分内容或直接覆盖processRequest方法

假设 CUX_NOTIFY_HEADER_TEXT 消息已经在系统中创建,其消息定义的内容为公告主题: &NOTIFY_SUBJECT

import https://www.doczj.com/doc/b29383582.html,mon.MessageToken;

import https://www.doczj.com/doc/b29383582.html,yout.OAPageLayoutBean;

...

public void processRequest(OAPageContext pageContext, OAWebBean webBean)

{

// Always call this first.

super.processRequest(pageContext, webBean);

// Get the NotifyId parameter from the URL

String NotifyId = pageContext.getParameter("NotifyId");

// Code from Step 4.3 ommitted for clarity... The following should be

// added after the code you added above.

16 / 26

// Get the NotifySubject parameter from the URL

String NotifySubject = pageContext.getParameter("NotifySubject");

// Always use a translated value from Message Dictionary when setting

// strings in your controllers.

// Instantiate an array of message tokens and set the value for the

// NOTIFY_SUBJECT token.

MessageToken[] tokens = { new MessageToken("NOTIFY_SUBJECT", NotifySubject)};

// Now, get the translated message text including the token value.

String pageHeaderText =

pageContext.getMessage("CUX", "CUX_NOTIFY_HEADER_TEXT", tokens);

// Set the Notify-specific page title (which also appears in

// the breadcrumbs). Note that we know this controller is

// associated wit the pageLayout region, which is why we cast the

// webBean to an OAPageLayoutBean before calling setTitle.

((OAPageLayoutBean)webBean).setTitle(pageHeaderText);

// Now we want to initialize the query for our single Notify

// with all of its details.

OAApplicationModule am = pageContext.getApplicationModule(webBean);

Serializable[] parameters = { NotifyId };

am.invokeMethod("initShowDetails", parameters);

}

任务6.5: 保存测试

17 / 26

相关主题
文本预览
相关文档 最新文档