zoukankan      html  css  js  c++  java
  • OAF 增删改查/LOV/Button/Sequence 的完整案例开发

    开发配置

    了解EBS服务器目录

    $JAVA_TOP

    JSP中可以引用标准Java类库,也可以引用其他Java类库,客户化开发的类库统一放在$JAVA_TOP下,按目录组织。OAF开发的文件都放在这里。

    $OA_HTML

    $OA_HTML是所有EBS Web文件所在目录,最常见的是HTML文件、图片文件、JSP文件、Applet对应的Jar文件。
    我们开发的jsp等相关文件要用ftp上传到这里;通常我们会再创建一个客户化文件夹,比如cux,方便文件管理。

    $COMMON_TOP/_pages/_oa__html

    第一次运行,Jserv自动将JSP转成Servlet,然后Cache到内存。
    首先是转成Java源文件,然后编译成Class文件,都放在$COMMON_TOP/_pages/_oa__html下,当然如果jsp放在$OA_HTML的子目录下,这里也有子目录。
    一个执行过的jsp文件会对应这里的一个java文件和一个class文件,有时候查错会把这里的java文件拿下来看,因为如果报错,出错行指的是java文件的行,而不是jsp文件的行。

    $OA_MEDIA

    $OA_MEDIA通常存放图片。

    设置开发环境

    设置Windows环境变量JDEV_USER_HOME

    N: 我的电脑/右键/属性/高级/环境变量/用户变量的新建
    变量名:JDEV_USER_HOME
    变量值:随意(JDeveloper主目录jdevhomejdev)

    下载DBC文件

    从服务器$FND_TOP/secure,下载<DB_Host_Name>_.dbc到本地<JDEV_USER_HOME>dbc_filessecure下。

    创建EBS用户和职责

    创建EBS用户如HAND_工号,并创建一个职责用于挂OAF功能。

    额外设置

    设置默认字符集

    N: Tools/Preferences/Environment
    要根据EBS字符集修改;这里我改成UTF-8。我们新建的jsp页面,头部的charset将默认取这个值,如<%@ page contentType=“text/html;charset=GB2312”%>。

    设置默认Project属性:调试信息

    N: Project/Default Project Settings…/Common/Oracle Applications/Run Options
    添加OA Diagnostic、OADeveloperMode

    设置默认Project属性:Forgive Duplicate Directive Attributes

    N: Project/Default Project Settings…/Configurations/Development/Compiler/JSP
    如果JSP页面包含另外一个JSP页面,这两个页面中都Import了某个相同的类,则Build该JSP页面会报“Error(XXX): 错误, 属性定义了两次: language”。解决办法是选中Forgive Duplicate Directive Attributes (Helps JSP 1.1 Compatability)。

    需求概述

    表数据

    OAF的实体表,必须要有5个Who字段,主表SQL:

    create table cux.cux_oaf_employee(
      emp_id             NUMBER        NOT NULL,
      emp_code           VARCHAR2(240) NOT NULL,
      emp_name           VARCHAR2(240) NOT NULL,
      sex                VARCHAR2(2),
      phone              NUMBER,
      email              VARCHAR2(240),
      address            VARCHAR2(240),
      CREATION_DATE      DATE DEFAULT SYSDATE NOT NULL,
      CREATED_BY         NUMBER DEFAULT -1 NOT NULL,
      LAST_UPDATED_BY    NUMBER DEFAULT -1 NOT NULL,
      LAST_UPDATE_DATE   DATE DEFAULT SYSDATE NOT NULL,
      LAST_UPDATE_LOGIN  NUMBER,
      ATTRIBUTE_CATEGORY VARCHAR2(30),
      ATTRIBUTE1         VARCHAR2(240),
      ATTRIBUTE2         VARCHAR2(240),
      ATTRIBUTE3         VARCHAR2(240),
      ATTRIBUTE4         VARCHAR2(240),
      ATTRIBUTE5         VARCHAR2(240),
      ATTRIBUTE6         VARCHAR2(240),
      ATTRIBUTE7         VARCHAR2(240),
      ATTRIBUTE8         VARCHAR2(240),
      ATTRIBUTE9         VARCHAR2(240),
      ATTRIBUTE10        VARCHAR2(240),
      ATTRIBUTE11        VARCHAR2(240),
      ATTRIBUTE12        VARCHAR2(240),
      ATTRIBUTE13        VARCHAR2(240),
      ATTRIBUTE14        VARCHAR2(240),
      ATTRIBUTE15        VARCHAR2(240)
    );
    

    create unique index cux.cux_oaf_employee_u1 on cux.cux_oaf_employee(emp_id);
    create sequence cux.cux_oaf_employee_s start with 10000;
    create synonym cux_oaf_employee_s for cux.cux_oaf_employee_s;
    create synonym cux_oaf_employee for cux.cux_oaf_employee;

    Lov

    Sex 来自如下SQL:

    select t.LOOKUP_CODE,t.MEANING from fnd_lookup_values_vl t where t.LOOKUP_TYPE = 'SEX'
    

    效果图

    查询/修改入口(Update)/删除界面
    在这里插入图片描述
    修改界面:
    在这里插入图片描述

    基础:创建项目框架

    创建基于OA的项目

    参考下表完成:

    参数
    默认目录 <JDEV_USER_HOME>myprojects
    Workspace DEMO.jws
    Project DEMO.jpr
    Default Package demo.oracle.apps.cux.emp
    DBC File <JDEV_USER_HOME>dbc_filessecureVIS.dbc
    用户/密码 HAND_11175/handhand
    应用/职责简称 CUX/HAND
    Database Connection Syfdemo.ml.com

    创建BC4J Package

    BC4J包需要遵循如下格式要求:

    对象 类型
    实体对象 <mycompany>.oracle.apps.<appshortname>.[<modulename>].schema.server
    视图对象 <mycompany>.oracle.apps.<appshortname>.<modulename>.server
    LOV视图对象 <mycompany>.oracle.apps.<appshortname>.<modulename>.lov.server
    页面 <mycompany>.oracle.apps.<appshortname>.<modulename>.webui.XxxxPG
    控制器 <mycompany>.oracle.apps.<appshortname>.<modulename>.webui.XxxxCO

    所以我们创建如下Business Component Package:

    对象 类型
    实体对象 demo.oracle.apps.cux.emp.schema.server
    视图对象 demo.oracle.apps.cux.emp.server
    LOV视图对象 demo.oracle.apps.cux.emp.lov.server
    页面 demo.oracle.apps.cux.emp.lov.webui
    控制器 demo.oracle.apps.cux.emp.webui

    基础:创建所需M对象

    开发之前,应当先规划M对象。
    这里我们将创建1个EO、1个基于EO+SQL的VO用于增删改查、1个基于SQL用于LOV的VO、1个用于管理LOV的AM、一个用于管理程序页面的AM。

    创建Entity Objects:EmpEO

    在demo.oracle.apps.cux.emp.schema.server下创建。

    Name: EmpEO
    Schema Object: CUX_OAF_EMPLOYEE

    设置EmpId为Primary Key。
    在产生Java画面,选中Entity Object Class下的所有复选框。在这里插入图片描述

    创建View Objects:EmpVO

    该VO用来完成增加和修改。在demo.oracle.apps.cux.emp.server下创建。

    Name: EmpVO

    Entity Object,选EmpEO,并选所有字段。

    向导结束后,在EmpVO的Query属性中,启用“Expert”模式,添加表和条件,注意新加的字段放最后:

    SELECT * FROM CUX_OAF_EMPLOYEE
    

    创建View Objects:SexLovVO

    该VO用于LOV。在demo.oracle.apps.cux.emp.lov.server下创建。

    Name: SexLovVO

    一直Next,直接输入SQL:

    select t.LOOKUP_CODE,t.MEANING from fnd_lookup_values_vl t where t.LOOKUP_TYPE = 'SEX'
    

    基础:创建V对象之Lov Region

    创建Lov OA Components:SexLovRN

    1、 新建OA
    Components/Region

    Name: SexLovRN
    Package: demo.oracle.apps.cux.emp.lov.webui
    Style: listOfValues

    向导完成后继续设置如下属性

    Scope: Public
    AM Definition: demo.oracle.apps.cux.emp.lov.server.LovAM
    Adv Search Allowed: True

    2、 新建table

    选中SexLovRN,新建table Using Wizard,选择LovAM下的SexLovVO1,Resion名字为LovTable,选出所有字段,根据实际需要修改Prompt。
    向导完成后继续设置如下属性,所有Item都可以设。

    Search Allowed: True

    查:创建V对象之Search Page

    创建顶层页面:EmpLookPG

    1、 新建OA
    Components/Page

    Name: EmpLookPG
    Package: demo.oracle.apps.cux.emp.webui

    向导完成后继续设置如下属性

    Scope: PageLayout
    AM Definition: demo.oracle.apps.cux.emp.server.Emp AM
    Windows Title: OA_EMP_INFO
    Titile: OA_EMP_INFO

    2、 (可选)页面级消息

    可以考虑加一个页面级别的消息,该消息需要来源AOL Message,以支持多语言。
    至此,可以右键EmpLookPG运行。

    创建查询区域:EMP_Search

    1、 在PageLayout下新建Region

    ID: EMP_Search
    Region Style: Query
    Construction Mode: resultsBasedSearch
    Include Simple Panel: True
    Include Views Panel: True
    Include Advanced Panel:True

    2、在EMP_Search下新建Region Using Wizard

    选择EmpVO1,Region ID设置为Emp_Info,Style选择Table,显示字段:EmpCode,EmpName,Sex,Phone,Email,不显示字段:EmpId。根据需要修改Prompt,Style则要全部改为messageStyledText!

    向导结束后针对Emp_Info的属性设置如下。

    Additional Text: Search Results
    Width: 80%
    User Personalization: True

    而对ResultsTable下的Item,主要关注如下几个属性。

    Search Allowed: 是否允许查询,建议设置必要的字段为True即可
    Sort Allowed: 是否允许排序,建议设置必要的字段为True即可
    Initial Sort Sequence: 对于允许排序的字段,可设置初始排序方法
    Selective Search Criteria:查询是否不允许空查询,数据量大才需要设置为True
    User Personalization: 建议都设置为True

    至此,可以右键EmpLookPG运行,可以执行查询了。

    自己实现查询

    上面的查询区域,是自动出来的(Search Allowed=True的字段),但比较简单,没有LOV,所以仅适用简单查询,要完成复杂查询,需要继续做些开发。

    1、 修改Emp_Search

    Construction Mode: autoCustomizationCriteria
    Include Views Panel: False
    Include Advanced Panel: False

    2、 在Emp_Search建simpleSearchPanel

    把默认生成的Header
    Region2改为SimpleSearchHdr,Text属性改为Search。

    把默认生成的messageComponentLayout
    Region1改为CustomSimpleSearch。

    3、 在CustomSimpleSearch下创建需要的查询字段,类似在Forms中创建查询块

    建三个字段:Code、EmpNameInfo、EmpSex。类型都是messageTextInput,设置CSS Class属性为OraFieldText,其他属性如Selective Search Criteria、Data Type 、Maximum
    Length、Prompt、Length根据需要设置。

    4、 在query
    Components下创建simpleSearchMappings,然后创建查询字段映射

    ID: EmpCode Map
    Search Item: Code
    Results Item: EmpCode

    ID: EmpName Map
    Search Item: EmpNameInfo
    Results Item: EmpName

    ID: Sex Map
    Search Item: EmpSex
    Results Item: Sex

    至此,可以右键EmpLookPG运行,效果和自动产生的查询一样!

    给查询加Lov

    Lov的使用和Forms中类似,需要设置在哪个字段启用Lov,需要设置Return字段。

    升级EmpSex为Lov字段

    Style: LovInput
    External LOV:/demo/oracle/apps/cux/emp/lov/webui/SexLovRN

    并创建如下Lov Mapping:

    ID: lovMap1
    Lov Region Item: LookupCode
    Return Item: EmpSex
    Criteria Item: EmpSex

    注:Criteria Item用来提前自动过滤Lov的内容!

    至此,可以右键EmpLookPG运行,查询字段可以出来Lov了。

    查:如何实现Execute Query

    对于数据量不大的查询或者报表,希望一打开页面就执行查询。根据MVC的关系,用户通过V(Page及其Layout)——UI界面与系统交互,系统通过CO控制页面响应和页面流转,适当时候调用M完成逻辑处理,M(AM、EO、CO)负责和数据库打交道。按照OAF规范,需要在VO中实现查询,AM中编写调用VO的方法,CO中调用AM的方法。

    查:修改M对象

    修改VO的Java类

    在EmpVOImpl.java中加入方法:

    public void init()
    {     
      executeQuery();
    };
    

    修改AM的Java类

    在EmpAMImpl.java中加入方法,去调用VO:

    public void initSearch()
    {
      EmpVOImpl empVO=(EmpVOImpl) this.getEmpVO1();
    

    if (empVO == null)
    {
    //Handle error here
    }
    empVO. Init();
    }

    查:创建C对象

    创建控制器:EmpSearchCO

    给PageLayout或Emp_Info创建控制器,相当于Form中创建触发器。

    Package Name: demo.oracle.apps.cux.emp.webui
    Class Name: EmpSearchCO

    简单理解,自动生成的Java代码中,processRequest是在浏览器初次打开页面时调用,而processFormRequest除此之外,每次用户点击提交按钮时还会再调用。

    所以我们应当在processRequest中执行查询。先引用包:

    import oracle.apps.fnd.framework.OAApplicationModule;
    

    再在processRequest最后添加:

    OAApplicationModule Emp_info = pageContext.getApplicationModule(webBean);
    Emp_info.invokeMethod("InitSearch");
    

    至此常规的查询功能已完全实现。运行效果如下:
    在这里插入图片描述

    增:创建V对象之Create Page

    创建顶层页面:EmpPG

    新建OA Components/Page

    Name: EmpPG
    Package: demo.oracle.apps.cux.emp.webui

    向导完成后继续设置如下属性

    ID: PageLayoutRN
    AM Definition: demo.oracle.apps.cux.emp.server.EmpAM
    Windows Title: ADD_OAF_INFO
    Titile: ADD_OAF_INFO
    Warn About Changes: True

    创建按钮区域和按钮: ButtonBarPN

    1、 在PageLayoutRN下新建Region

    ID: ButtonBarPN
    Region Style: pageButtonBar

    2、 在PageButtons下新建两个按钮,一个CancelBtn,一个SaveBtn

    ID: CancelBtn
    Item Style: submitButton
    Attribute Set: /oracle/apps/fnd/attributesets/Buttons/Cancel
    Disable Server Side Validation: True
    Disable Client Side Validation: True

    ID: SaveBtn
    Item Style: submitButton
    Attribute Set: /oracle/apps/fnd/attributesets/Buttons/Apply

    创建新建区域:MainRN

    1、 在PageLayoutRN下新建Region Using Wizard,VO选择EmpVO1

    ID: MainRN
    Region Style : defaultSingleColumn

    选择所有Item,各字段Prompt根据需要修改。

    向导结束后,将Region Style更改为messageComponentLayout。

    2、 设置各个字段的属性

    先说通常设置:

    Required: 根据需要设置
    Search Allowed: 是否允许查询,建议设置必要的字段为True即可
    Sort Allowed: 是否允许排序,建议设置必要的字段为True即可
    Initial Sort Sequence: 对于允许排序的字段,可设置初始排序方法
    Selective Search Criteria:查询是否不允许空查询,数据量大才需要设置为True
    User Personalization: 建议都设置为True

    再说关键属性:
    Item Style: 想包含在UI中又不显示则用formValue,其他都可顾名思义
    View Instance: 类似Form中的Block_Name,非数据库字段放空
    View Attribute: 类似Form中的Item_Name,非数据库字段放空
    CSS Class: 显示的字段,只读用OraDataText,其他用OraFieldText
    Tip type: 日期字段用dateFormat,其他根据需要设置

    3、 在PageLayoutRN下创建一个提示区pageStatus

    ID: RequiredKey
    Extends: /oracle/apps/fnd/framework/webui/OAReqFieldDescRG
    Width: 100%

    至此,运行效果如下:
    在这里插入图片描述

    要实际完成新增记录,还得写点代码。

    增:修改M对象

    修改AM的Java类

    在EmpAMImpl.java,先引用包:

    import com.sun.java.util.collections.HashMap;
    import oracle.apps.fnd.framework.server.OAApplicationModuleImpl;
    import oracle.apps.fnd.framework.server.OADBTransaction;
    import oracle.jbo.RowSetIterator;
    import oracle.jbo.domain.Number;
    

    再加入3个方法,1个是用来初始化1个空行,1个用来提交,1个用来回滚:

    public void CreateEmp(){   
    	EmpVOImpl EmpVo = (EmpVOImpl) this.getEmpVO1();   
    	if (!EmpVo.isPreparedForExecution()){       
    		EmpVo.init();   
    	}   
    
    EmpVORowImpl row=(EmpVORowImpl) EmpVo.createRow();   
    EmpVo.insertRow(row);    
    row.setNewRowState(EmpVORowImpl.STATUS_INITIALIZED); 
    

    }

    //Save
    public void Save(){
    this.getOADBTransaction().commit();
    }

    //Cancell
    public void Cancell(){
    OADBTransaction trn=getOADBTransaction();
    if(trn.isDirty())
    this.getOADBTransaction().rollback();
    }

    增:创建C对象

    创建控制器:EmpCO

    给EmpPG的pageLayoutRN创建控制器,相当于Form中创建触发器。

    Package Name: demo.oracle.apps.cux.emp.webui
    Class Name: EmpSearchCO

    1、 在processRequest中初始化,同时,处理浏览器的后退动作

    先引用包:

    import oracle.apps.fnd.framework.OAApplicationModule;
    import oracle.apps.fnd.framework.webui.OADialogPage;
    import oracle.apps.fnd.framework.webui.TransactionUnitHelper;
    

    再在processRequest最后添加:

    if (!pageContext.isBackNavigationFired(false))
    {
    	TransactionUnitHelper.startTransactionUnit(pageContext, "EmpTxn");
      	if (!pageContext.isFormSubmission())
      	{
        		OAApplicationModule Emp_info = pageContext.getApplicationModule(webBean);
        		Emp_info.invokeMethod("CreateEmp");
      	} 
    } else { 	
    	if (!TransactionUnitHelper.isTransactionUnitInProgress(pageContext, "EmpTxn",true))
     	 { 
        		OADialogPage dialogPage = new OADialogPage(NAVIGATION_ERROR);    
    		pageContext.redirectToDialogPage(dialogPage); 
     	 } 
    }
    

    2、响应Save、Cancel按钮,注意,如何重定向到查询界面
    先引用包:

    import oracle.apps.fnd.framework.OAViewObject;
    import oracle.apps.fnd.framework.webui.OAWebBeanConstants;
    

    再在processFormRequest最后添加:

    OAApplicationModule Emp_Operation = pageContext.getApplicationModule(webBean); 
    //Save
    if (pageContext.getParameter("SaveBtn") != null){ 
        Emp_Operation.invokeMethod("Save");
    }
    if (pageContext.getParameter("CancellBtn") != null){          
        Emp_Operation.invokeMethod("Cancell");    
        pageContext.forwardImmediately("OA.jsp?page=/demo/oracle/apps/cux/emp/webui/EmpLookPG",null, OAWebBeanConstants.KEEP_MENU_CONTEXT, null,null,false,OAWebBeanConstants.ADD_BREAD_CRUMB_YES);
     } 
    

    增:修改查询V对象

    需要在查询界面添加一个按钮,链接到新建界面。

    添加“Create”按钮

    1、 在EmpLookPG中的Emp_Info下,创建tableActions

    ID: ButtonBtnBar

    2、 在ButtonBtnBar下,创建Item

    ID: CreateBtn
    Item Style: submitButton
    Attribute Set: /oracle/apps/fnd/attributesets/Buttons/Create

    增:修改查询C对象

    修改EmpSearchCO

    1、响应Create按钮

    先引用:

    import oracle.apps.fnd.framework.webui.OAWebBeanConstants;
    

    再在processFormRequest最后加入:

    if (pageContext.getParameter("CreateBtn") != null) {
        pageContext.forwardImmediately("OA.jsp?page=/demo/oracle/apps/cux/emp/webui/EmpPG",null,OAWebBeanConstants.KEEP_MENU_CONTEXT, null, null, false, OAWebBeanConstants.ADD_BREAD_CRUMB_YES);
    }
    

    2、 处理浏览器后退按钮
    在processRequest最后加入:

    if (TransactionUnitHelper.isTransactionUnitInProgress(pageContext, "EmpTxn",false)){
      Emp.invokeMethod("Cancell");;
      TransactionUnitHelper.endTransactionUnit(pageContext,"EmpTxn");
    }
    

    增:如何实现Seqence

    按照Dev Guide,有两种方式,一是编写数据库表触发器,在插入数据时获得Sequence;二是在EO中实现。推荐后者。

    修改EmpEOImp1

    注意EO的Java属性中,勾选“Create Method”。
    先引用:

    import oracle.jbo.domain.Number;
    

    再在create方法最后添加

    Number EmpID=Tra.getSequenceValue("CUX_OAF_EMPLOYEE_S");
    setEmpId(EmpID);
    

    改:修改M对象

    修改VO的Java类

    在EmpVOImpl.java中,先引用:

    import oracle.jbo.domain.Number;
    import oracle.apps.fnd.framework.OAException;
    

    再加入方法:

    public void init(String EmpID)
    {
       if ((EmpID != null) && (!("".equals(EmpID.trim()))))
       {   
         Number EmpId = null; 
         try
         {
           EmpId = new Number(EmpID);
         } 
         catch(Exception e) 
         {
           throw new OAException("CUX", "CUX_OAF_EMPLOYEE_CHECK_ID");
         }
         setWhereClause("SYSTEM_CHECK_ID = :1");
         setWhereClauseParams(null); // Always reset
         setWhereClauseParam(0, EmpId);
         executeQuery();   
      }
    } // end init()
    

    修改AM的Java类

    在EmpAMImpl.java中,先引用:

    import oracle.apps.fnd.framework.OAException;
    import oracle.apps.fnd.common.MessageToken;
    

    再加入方法,去调用VO:

    public void initDetails(String EmpID)
    { 
      EmpVOImpl vo = getEmpVO1();
      if(vo == null)
      {
        MessageToken[] errTokens = { new MessageToken("OBJECT_NAME", "EmpVO1")};
        throw new OAException("AK", "FWK_TBX_OBJECT_NOT_FOUND", errTokens);
      } 
      vo.setMaxFetchSize(1);
      vo.init(EmpID); 
    } // end initDetails()
    

    修改VO:EmpVO

    因为我们修改和增加的VO与查询的VO分开了,做修改时,需要和查询一样,将ID字段转换为有意义的Value给用户。

    改:创建V对象

    可以从头创建,也可以拷贝。

    拷贝EmpPG.xml为EmpUpdatePG.xml

    在Windows资源管理器中使用复制、粘贴。

    将文件EmpUpdatePG.xml加到项目中

    N: File/Import…

    设置字段的View属性

    将原来那些Lov字段的View Instance和View Attribute补上。

    改:创建C对象

    可以从头创建,也可以拷贝。

    拷贝EmpCO.java为EmpUpdateCO.java

    在Windows资源管理器中使用复制、粘贴。

    将文件EmpUpdateCO.java加到项目中

    N: File/Import…
    并把类名改为EmpUpdateCO。

    更改PageLayoutRN的CO

    更改为:demo.oracle.apps.cux.emp.webui.EmpUpdateCO

    更改EmpUpdateCO

    先引用:

    import java.io.Serializable;
    

    1、 processRequest

    public void processRequest(OAPageContext pageContext, OAWebBean webBean)
    {
      super.processRequest(pageContext, webBean);
      if (!pageContext.isBackNavigationFired(false))
      {
        TransactionUnitHelper.startTransactionUnit(pageContext, "EmpUpdateTxn");
        if (!pageContext.isFormSubmission())
        {
          String EmpID = pageContext.getParameter("EmpID");
          Serializable[] params = { EmpID };
          OAApplicationModule am = pageContext.getApplicationModule(webBean);
          am.invokeMethod("initDetails", params);
        }  
      }
      else 
      { 
        if (!TransactionUnitHelper.isTransactionUnitInProgress(pageContext, "EmpUpdateTxn",true))
        { 
          OADialogPage dialogPage = new OADialogPage(NAVIGATION_ERROR); 
          pageContext.redirectToDialogPage(dialogPage); 
        } 
      }
    }
    

    2、 processFormRequest
    将EmpTxn改为EmpUpdateTxn

    改:修改查询V对象

    需要在查询界面添加一个按钮,链接到修改界面,并把ID传递给修改界面。

    添加“Updae”按钮,实际是个图片连接

    在EmpLookPG中的Emp_Info下,创建Item

    ID: Update
    Item Style: image
    Attribute Set: /oracle/apps/fnd/attributesets/Buttons/Update
    Image URI: updateicon_enabled.gif
    Height: 24
    Width: 24
    Action Type: fireAction
    Event: Update

    Parameter如下:

    Name: EmpID
    Value: ${oa.EmpVO1.EmpId}

    改:修改查询C对象

    修改EmpSearchCO

    1、 响应Update按钮
    先引用:

    import oracle.apps.fnd.framework.webui.OAWebBeanConstants;
    

    再在processFormRequest最后加入:

    else if ("Update".equals(pageContext.getParameter(EVENT_PARAM)))
    {  
      pageContext.setForwardURL("OA.jsp?page=/demo/oracle/apps/cux/emp/webui/EmpUpdatePG",
                                null,
                                OAWebBeanConstants.KEEP_MENU_CONTEXT,
                                null,
                                null,
                                true, // Retain AM
                                OAWebBeanConstants.ADD_BREAD_CRUMB_NO, // Do not display breadcrumbs
                                OAWebBeanConstants.IGNORE_MESSAGES);
    }
    

    2、 处理浏览器后退按钮
    在processRequest最后加入:

    else if (TransactionUnitHelper.isTransactionUnitInProgress(pageContext, "EmpUpdateTxn", false))
    {  
      Emp.invokeMethod("cancell"); 
      TransactionUnitHelper.endTransactionUnit(pageContext, "EmpUpdateTxn");
    }
    

    删:修改M对象

    修改AM的Java类

    在EmpAMImpl.java中,先引用:

    import oracle.jbo.domain.Number;
    import oracle.jbo.RowSetIterator;
    

    再加入删除方法:

    //Delete 
     public void DeleteEmp(String EmpId){ 
      if ((EmpID != null) && (!("".equals(EmpID.trim())))){   
        Number sEmpId = null;
        try{
          EmpId = new Number(EmpID);
        } catch(Exception e) {
          throw new OAException("CUX", "CUX_OAF_EMPLOYEE_CHECK_ID");
        }
         EmpVOImpl EmpVo = (EmpVOImpl) this.getEmpVO1();
         int key=Integer.parseInt(EmpId); 
         EmpVORowImpl row = null; 
         int fetchedRowCount = EmpVo.getFetchedRowCount();
         RowSetIterator DeleteIter = EmpVo.createRowSetIterator("Delete"); 
         if(fetchedRowCount>0){ 
             DeleteIter.setRangeStart(0); 
             DeleteIter.setRangeSize(fetchedRowCount); 
             for(int i = 0; i<fetchedRowCount; i++){ 
                 row = (EmpVORowImpl)DeleteIter.getRowAtRangeIndex(i); 
                 Number primarykey = row.getEmpId();
                 if(primarykey.compareTo(key) == 0){ 
                     row.remove();
                     getTransaction().commit();
                     break; 
                 } 
             } 
         } 
         DeleteIter.closeRowSetIterator();}
      }       
    

    删:修改查询V对象

    需要在查询界面添加一个按钮,链接到修改界面,并把ID传递给修改界面。

    添加“Delete”按钮,实际是个图片连接

    在EmpLookPG中的Emp_Info下,创建Item

    ID: Delete
    Item Style: image
    Attribute Set: /oracle/apps/fnd/attributesets/Buttons/Delete
    Image URI: deleteicon_enabled.gif
    Height: 24
    Width: 24
    Action Type: fireAction
    Event: Delete

    Parameter如下:

    Name: EmpID
    Value: ${oa.EmpVO1.EmpId}

    删:修改查询C对象

    修改EmpSearchCO

    1、 响应Delete、以及“删除确认”按钮
    先引用:

    import java.io.Serializable;
    

    再在processFormRequest最后加入:

    else if ("Delete".equals(event)) {
         String EmpID = (String)pageContext.getParameter("EMP_ID");
         Serializable[] ParaS = { EmpID };
         Emp.invokeMethod("DeleteEmp", EmpID); 
    }
    

    发布到EBS

    编译、上传

    1、 右键Demo.jws或Demo.jpr,Rebuild
    2、 将<JDEV_USER_HOME>myclassesdemo上传到服务器$JAVA_TOP/demo
    3、 修改目录属性,cd $JAVA_TOP后运行:chmod -R 775 hand

    把页面定义导入到MDS中

    实际上是用oracle.jrad.tools.xml.importer.XMLImporter将webui目录下的xml文件内容上传到数据库中。

    例如:

    cd $JAVA_TOP
    java oracle.jrad.tools.xml.importer.XMLImporter
    $JAVA_TOP/demo/oracle/apps/cux/hello/webui/SexLovRN.xml -rootdir 
    $JAVA_TOP -username apps -password apps -dbconnection $AD_APPS_JDBC_URL
    

    验证导入

    用如下SQL验证:

    BEGIN
      jdr_utils.printdocument('/demo/oracle/apps/cux/emp/webui/EmpLookPG');
    END;
    

    应该输出XML内容,而不是“Error: Could not find document….”

    重启服务

    如果是更新,则需要重服务。

    cd $ADMIN_SCRIPTS_HOME
    adcgnjar
    admanagedsrvctl.sh stop oacore_server1 //输入weblogic密码 停止完毕后
    admanagedsrvctl.sh start oacore_server1//输入weblogic密码
    

    定义应用对象

    可以参考OA Framework ToolBox Tutorial职责的菜单定义,关键是Function定义,HTML Call中指向xml文件所在路径。实例如下:

    参数
    Function CUX_OAF_DEMO
    Type SSWA jsp function
    Html Call OA.jsp?page=/demo/oracle/apps/cux/emp/webui/EmpLookPG

    菜单和职责定义这里不再详细说明。

                                    </div>
  • 相关阅读:
    LOTUS还能活多久
    关于Domino的DIIOP服务 (转)
    Domino Servlet示例
    Limits on numeric data representation in LotusScript
    用webdav实现从DominoOA到Exchange的日程同步.
    Limits on array variables in LotusScript
    Table of Notes and Domino known limits
    IBM / Lotus Domino 与 WebSphere Portal: 单点登录(转)
    某个domino的word公文本地编辑实现方案
    Domino中部署Servlet
  • 原文地址:https://www.cnblogs.com/AI-xiaocai/p/11481928.html
Copyright © 2011-2022 走看看