zoukankan      html  css  js  c++  java
  • 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_1formsjava位置(我的安装在C盘),其实服务器上也有一个此目录

    3、formsweb.cfg配置

      服务器和客户端都存在这样的配置文件,如果在本地进行窗体调试,必须配置本地的formsweb.cfg(网上很多都并未提出是服务器端还是客户端,我折腾了很久)。在C:DevSuiteHome_1formsserver文件下打开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、运行窗体(单击运行表单按钮)

    单据FormBuilder上的运行表单按钮,稍等一会(其实也挺慢的...),会出现下面的界面:

    在Command文本框中输入 cmd /c dir /b c:*.jpg ,然后单击Execute按钮运行命令。如果调用JavaBean成功的话,会搜索本地C盘下的.jpg文件,并列出到Result中,如下图:

    本次测试正确。发布到服务器还需要对服务器相关文件进行配置。客户端的路径问题,可搜索注册表("_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/apps@VIS 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

  • 相关阅读:
    测试杯子
    如何测试网页的登录页面
    功能性测试之边界值测试
    自动化 sample
    软件架构---敏捷和架构的关系
    软件架构---分布式后端架构应该考虑的一些方面
    软件架构---集群与负载均衡
    软件架构---从需求明确架构设计驱动力
    软件架构---质量属性的实现
    软件架构---质量属性(二)
  • 原文地址:https://www.cnblogs.com/isaboy/p/EBS_FROM.html
Copyright © 2011-2022 走看看