Oracle EBS Form Builder使用Java beans创建窗体

  最近有个项目,需要研究一下Oracle的E-Business Sutie(EBS),对于以前没接触此套件的我来说,简直太痛苦了。在网上找了一堆资料,试着进行Form二次开发,也遇到各类奇葩问题。目前遇到最大的一个问题是,如何在本地 Form Builder中进行窗体构建,并调用后台的JavaBean对窗体进行交互?网上也有不少的解决方案,但是都存在一些差异,试了很多次,终于实现了我预期的效果。

  为了防止以后再遇到类似的问题,先做一个记录,以备后查。

1、环境搭建说明

   服务器:Oracle EBS服务端(包括Oracle数据库)部署在RedHat5

   客户端:XP系统上安装Oracle Development Suite(其中有Form Builder 10g )

2、JavaBean编写和编译

  在Forms Builder中,Item中有个属性叫"Implementation Class",这个用来指定一个Item到底继承自上表的哪个Java类。标准的Item,其Implementation Class都放空,无须我们明确指定,因为Oracle内置了对应关系。但如果要在Forms 中使用非标准的Class,比如我们自行扩展的,则必须明确指出Item的"Implementation Class",并且是带包名的全称,如oracle.forms.fd.JavaHost。一个类要在Forms中使用,其必须符合Oracle Forms的设计规范,简单说,就是要实现oracle.forms.ui.IView接口。Oracle还提供了实现IView接口的VBean类,如果欲创建的类不需要从其他类继承,则可以直接extends VBean,省了实现IView的麻烦。

  1 package oracle.forms.fd;
  2
  3 import java.io.BufferedReader;
  4 import java.io.IOException;
  5 import java.io.InputStreamReader;
  6 import java.util.StringTokenizer;
  7 import oracle.forms.handler.IHandler;
  8 import oracle.forms.ui.VBean;
  9 import oracle.forms.properties.ID;
 10 import oracle.forms.ui.CustomEvent;
 11
 12 //Form整合JavaBean要实现IView接口,
 13 //若创建的类不需要继承其他类,则可以直接extends VBean
 14 public class JavaHost extends VBean
 15 {
 16   private static final ID SetProg     = ID.registerProperty("SET_PROG");
 17   private static final ID MSGSTND     = ID.registerProperty("MSGSTND");
 18   private static final ID MSGERROR    = ID.registerProperty("MSGERROR");
 19   private static final ID MSGTEXT     = ID.registerProperty("MSGTEXT");
 20   private IHandler     m_handler;
 21   Process p = null ;
 22
 23   public JavaHost()
 24   {
 25   }
 26
 27   public void init(IHandler handler)
 28   {
 29     m_handler = handler;
 30     super.init(handler);
 31   }
 32
 33   /*************************
 34    *  Set some properties  *
 35    ************************/
 36   public boolean setProperty(ID property, Object value)
 37   {
 38     /*
 39      *  Start the process  *
 40      */
 41     if (property == SetProg)
 42     {
 43       String s= value.toString(), s2="" ;
 44       String[] sTabParams = null ;
 45       int iNbParams = 0, iPos=-1 ;
 46       iPos = s.indexOf(",") ;
 47       if(iPos > -1)
 48       {
 49         StringTokenizer st = new StringTokenizer(s,",");
 50         // get the total number of parameters
 51         while (st.hasMoreTokens())
 52         {
 53           s2 = st.nextToken() ;
 54           iNbParams++;
 55         }
 56         sTabParams = new String[iNbParams];
 57         st = new StringTokenizer(s,",");
 58         for( int i=0; i<iNbParams; i++ ) sTabParams[i] = st.nextToken() ;
 59       }
 60       // launch the programme
 61       try {
 62         if(iPos > -1) p = Runtime.getRuntime().exec(sTabParams);
 63         else          p = Runtime.getRuntime().exec(s);
 64
 65         new Thread()
 66         {
 67           public void run()
 68           {
 69             try
 70             {
 71               BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
 72               String line = null;
 73               try {
 74                 while((line = br.readLine()) != null)
 75                 {
 76                   // Send standard output to Forms
 77                   SendProperties(MSGSTND,line);
 78                 }
 79             }
 80             finally
 81             {
 82               br.close();
 83             }
 84           }
 85           catch(IOException ioe)
 86           {
 87             ioe.printStackTrace();
 88             SendProperties(MSGERROR,ioe.getMessage());
 89           }
 90          }
 91        }.start();
 92        // Error output
 93        new Thread()
 94        {
 95          public void run()
 96          {
 97            try
 98            {
 99               BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream()));
100               String line = null;
101               try
102               {
103                  while((line = br.readLine()) != null)
104                  {
105                     // Send error output to Forms
106                      SendProperties(MSGERROR,line);
107                  }
108               }
109               finally
110               {
111                 br.close();
112               }
113             }
114             catch(IOException ioe)
115             {
116               ioe.printStackTrace();
117               SendProperties(MSGERROR,ioe.getMessage());
118             }
119           }
120         }.start();
121       }
122       catch(IOException ioe) {  ioe.printStackTrace(); SendProperties(MSGERROR,ioe.getMessage());}
123
124       return true ;
125     }
126     else
127     {
128      return super.setProperty(property, value);
129     }
130   }
131
132   // send standard/error output back to Forms
133   private void SendProperties(ID id, String sMessage)
134   {
135     try{
136       CustomEvent ce = new CustomEvent(m_handler, id);
137       m_handler.setProperty( MSGTEXT, sMessage );
138       dispatchCustomEvent(ce);
139     }
140     catch (Exception e)
141     {
142       e.printStackTrace();
143     }
144   }
145
146 }

JavaHost Code

  用java1.3的版本编译此JavaHost.java,打包成javahost.jar放于客户端xp 系统的C:\DevSuiteHome_1\forms\java位置(我的安装在C盘),其实服务器上也有一个此目录

3、formsweb.cfg配置

  服务器和客户端都存在这样的配置文件,如果在本地进行窗体调试,必须配置本地的formsweb.cfg(网上很多都并未提出是服务器端还是客户端,我折腾了很久)。在C:\DevSuiteHome_1\forms\server文件下打开formsweb.cfg,将javahost.jar追加到archive_jini上,如archive_jini=frmall_jinit.jar,javahost.jar(注意是逗号分隔,不是分号

4、Form创建和配置

  在Form Builder创建JAVA_HOST.fmb的窗体,在Form上添加一个Bean区域控件,它的实施类为oracle.forms.fd.JavaHost。

5、运行窗体(单击运行表单按钮)

输入 cmd /c dir /b c:\*.jpg单据Execute运行命令。

本次测试正确。发布到服务器还需要对服务器相关文件进行配置。客户端的路径问题,可搜索注册表("_PATH") 来查看FORMS_PATH和ORACLE_HOME的路径情况。

6、关于FormBuilder导入pll库和java包的若干说明

有的时候你的窗体需要用到其他的库文件,默认不在FormBuilder的搜索路径中,必须手动进行引入。例如我碰到一个fnd_message.debug未声明的错误,网上说是要导入一个FNDSQF.pll库,但是都没说如何导入。最后摸索出来是这样的,首先需要把服务器forms(包含很多系统和开发的窗体,如果待开发的窗体需要调用这些,必须要拷贝到开发环境下)和resource(FNDSQF.pll库就在此目录下)文件夹拷贝到本地。

导入pll库的方法如下图:

如果需要导入java类,可以首先编辑注册表项目FORMS_BUILDER_CLASSPATH,在此项目后追加待导入库的完整路径,如下图:

然后就可以在FormBuilder看见javahost.jar中的java类:oracle.forms.fd.javahost

另外就是在运行Form时,首先必须确保开启本地Start OC4J Instance,如下图:

另外就是把窗体上传到服务器端后,注意编译的路径和菜单使用的路径(和挂接的模块有关系,不同的模块在不同的文件夹下)是不同的,否则会报无法加载XXX.fmx的情况。

编译命令:frmcmp_batch module=/u01/oracle/VIS/apps/apps_st/appl/ozf/12.0.0/forms/ZHS/FRM_WM_JAVABEAN.fmb userid=apps/[email protected] output_file=/u01/oracle/VIS/apps/apps_st/appl/ozf/12.0.0/forms/ZHS/FRM_WM_JAVABEAN.fmx
服务器:

/u01/oracle/VIS/apps/apps_st/appl/au/12.0.0/resource
/u01/oracle/VIS/apps/apps_st/comn/java/classes
/u01/oracle/VIS/apps/apps_st/appl/ozf/12.0.0/forms/ZHS
/u01/oracle/VIS/apps/tech_st/10.1.2/forms/server
/u01/oracle/VIS/apps/tech_st/10.1.2/forms/java

时间: 2024-10-29 03:16:51

Oracle EBS Form Builder使用Java beans创建窗体的相关文章

Oracle EBS Form个性化开发

Form个性化开发内容不是很多,在国内的项目上客户化界面上基本用不上,相关开发文档有的讲解的很详细,有的讲解太过简练,希望通过这个文档可以给我们这些刚开始做个性化的新手快速完成需求,不要再这方面花费过多的时间,我们都做过Form开发,可以把Form个性化的开发都用类比Form开发去理解就很快能上手. Form启动时,所有与当前Function相关的个性化规则都会被加载到内存,当Form触发特定的Event时候,系统会搜索相应的个性化规则并进行匹配,得到匹配的规则,再按照规则序号从小到大一次执行对

Oracle EBS Form 发布到Server端的注意事项

前段时间在本地XP系统上测试了一些整合javabean的Form例子,想着发布到服务器段去看看能否运行正常,一开始以为会和本地XP系统一样,部署到相关的目录下进行一些配置就可以了,但实际过程却和想象的大相径庭,部署到服务器上可称得上是一波三折.下面将Oracle EBS Form 发布到Server端的若干注意事项阐述如下: 1.确定EBS版本 由于不同版本EBS配置jar文件和发布javabean jar包的位置存在一些差异,所以必须要知道EBS版本,这样遇到问题才好搜索对应的解决方案.可以通

如何启用Oracle EBS Form监控【Z】

前言: 有时候,因某些需要,必须知道Oracle的Form被使用的情况,以方面我们做出决策: 例如,如果某个Form被使用的次数非常多,那么,这个Form的相关SQL代码就应该优先处理,以减少服务器负荷,从而提供系统运行速度. 或者,(特别是)在系统要升级的时候,这些数据就显得非常重要了:决定哪个Form应该留,哪个Form应该拿掉. 当然,这个信息只是做出决策的参考数据而已.1. 在Oracle EBS上进行Form跟踪的技术方法:Oracle EBS的一个Profile 提供此功能: Use

如何启用Oracle EBS Form监控

前言: 有时候,因某些需要,必须知道Oracle的Form被使用的情况,以方面我们做出决策: 例如,如果某个Form被使用的次数非常多,那么,这个Form的相关SQL代码就应该优先处理,以减少服务器负荷,从而提供系统运行速度. 或者,(特别是)在系统要升级的时候,这些数据就显得非常重要了:决定哪个Form应该留,哪个Form应该拿掉. 当然,这个信息只是做出决策的参考数据而已. 1. 在Oracle EBS上进行Form跟踪的技术方法: Oracle EBS的一个Profile 提供此功能: U

Oracle EBS - Form DEV Env

1. 创建文件夹resource与forms, 以便存放pll与forms(主要用到APSTAND.fmb, APPSTAND.fmb, TEMPLATE.fmb)文件; 2. 修改注册表 HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE 数值名称: NLS_LANG 值: AMERICAN_AMERICA.UTF8 HKEY_LOCAL_MACHINE/SOFTWARE/ORACLE 数值名称: FORMS_PATH 值: 修改为以上两个文件夹路径 (注意只能加载文件夹路径

How to set window title name on Oracle EBS Form?

--1. 置換掉原來Winodw Property上的Title String ex. SET_WINDOW_PROPERTY('XXDII_INV_MISC_TXN_V',TITLE,:misc_trx_qf.Q_TYPE_NAME||'['||:misc_trx_qf.Q_MISC_TRX_NUM||']'); --2. 使用EBS Standard Library, 在Window title後加入Organization Name app_window.set_title('XXDII_

Oracle EBS FORM lov

存在一种情况: 一个LOV的值当前有效,因此填入保存.但突然无效后,当查询该界面时就会弹出LOV框使其修改. 解决方案: 1. 非常粗暴,不设置校验,在LOV对应的item强行将校验设置为NO. 2. 因为这个过程在查询后触发,在对应数据块的POST-QUERY 触发器添加代码,将LOV对应字段强制设置成validate.添加代码如下: app_item_property.set_property('block_name.item_name'                           

使用Form Builder创建Form具体步骤

使用Oracle Form Builder创建Form具体步骤 (Data Source为Table) 说明:当Block使用的Data Source为Table时,Form会自动Insert,Update,Delete,Lock.若要显示non-database Item,需在POST-QUERY Trigger 里手动写代码来为non-database Item取值. 步驟一:分析需求设计Table架构 1). Table需指定一Unique ID,可为其创建Unique Index,在Fo

数据仓库(七):Oracle Warehouse Builder(OWB)创建数据仓库

本文简述使用OWB创建数据仓库的一般过程.Oracle的OWB是目前最好的三大ETL产品之一.OWB不但可以可以完成数据的抽取.转换和加 载,还能帮助用户在Oracle数据库中创建ROLAP(Relational Online Analysis Process)和MOLAP(Multidimensional Online Analysis Process)数据仓库对象,数据质量管理,商务智能定义等. 1 环境配置 建议直接安装Oracle 11g(如Oracle 11.2.0.1.0),其安装包