Oracle EBS Form Builder使用Java beans创建窗体
2015-11-14 10:11
1226 查看
最近有个项目,需要研究一下Oracle的E-Business Sutie(EBS),对于以前没接触此套件的我来说,简直太痛苦了。在网上找了一堆资料,试着进行Form二次开发,也遇到各类奇葩问题。目前遇到最大的一个问题是,如何在本地 Form Builder中进行窗体构建,并调用后台的JavaBean和窗体进行交互?网上也有不少的解决方案,但是都存在一些差异,试了很多次,终于实现了我预期的效果。
为了防止以后再遇到类似的问题,先做一个记录,以备后查。
客户端:XP系统上安装Oracle Development Suite(其中有Form Builder 10g )
JavaHost Code
用java1.3的版本编译此JavaHost.java,打包成javahost.jar放于客户端xp 系统的C:\DevSuiteHome_1\forms\java位置(我的安装在C盘),其实服务器上也有一个此目录
在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
为了防止以后再遇到类似的问题,先做一个记录,以备后查。
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的麻烦。package oracle.forms.fd; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; import oracle.forms.handler.IHandler; import oracle.forms.ui.VBean; import oracle.forms.properties.ID; import oracle.forms.ui.CustomEvent; //Form整合JavaBean要实现IView接口, //若创建的类不需要继承其他类,则可以直接extends VBean public class JavaHost extends VBean { private static final ID SetProg = ID.registerProperty("SET_PROG"); private static final ID MSGSTND = ID.registerProperty("MSGSTND"); private static final ID MSGERROR = ID.registerProperty("MSGERROR"); private static final ID MSGTEXT = ID.registerProperty("MSGTEXT"); private IHandler m_handler; Process p = null ; public JavaHost() { } public void init(IHandler handler) { m_handler = handler; super.init(handler); } /************************* * Set some properties * ************************/ public boolean setProperty(ID property, Object value) { /* * Start the process * */ if (property == SetProg) { String s= value.toString(), s2="" ; String[] sTabParams = null ; int iNbParams = 0, iPos=-1 ; iPos = s.indexOf(",") ; if(iPos > -1) { StringTokenizer st = new StringTokenizer(s,","); // get the total number of parameters while (st.hasMoreTokens()) { s2 = st.nextToken() ; iNbParams++; } sTabParams = new String[iNbParams]; st = new StringTokenizer(s,","); for( int i=0; i<iNbParams; i++ ) sTabParams[i] = st.nextToken() ; } // launch the programme try { if(iPos > -1) p = Runtime.getRuntime().exec(sTabParams); else p = Runtime.getRuntime().exec(s); new Thread() { public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); String line = null; try { while((line = br.readLine()) != null) { // Send standard output to Forms SendProperties(MSGSTND,line); } } finally { br.close(); } } catch(IOException ioe) { ioe.printStackTrace(); SendProperties(MSGERROR,ioe.getMessage()); } } }.start(); // Error output new Thread() { public void run() { try { BufferedReader br = new BufferedReader(new InputStreamReader(p.getErrorStream())); String line = null; try { while((line = br.readLine()) != null) { // Send error output to Forms SendProperties(MSGERROR,line); } } finally { br.close(); } } catch(IOException ioe) { ioe.printStackTrace(); SendProperties(MSGERROR,ioe.getMessage()); } } }.start(); } catch(IOException ioe) { ioe.printStackTrace(); SendProperties(MSGERROR,ioe.getMessage());} return true ; } else { return super.setProperty(property, value); } } // send standard/error output back to Forms private void SendProperties(ID id, String sMessage) { try{ CustomEvent ce = new CustomEvent(m_handler, id); m_handler.setProperty( MSGTEXT, sMessage ); dispatchCustomEvent(ce); } catch (Exception e) { e.printStackTrace(); } } }
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、运行窗体(单击运行表单按钮)
单据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
相关文章推荐
- java下实现调用oracle的存储过程和函数
- Oracle 11g R2通过透明网关连接DB2 详细步骤
- MySQL、SqlServer、Oracle三大主流数据库分页查询
- Oracle常见的几种等待事件
- oracle scn和headroom
- oracle 9i windows 客户端连接报ora-12535问题小结
- oracle 11.2.0.3 rac hanganalyze 案例
- oracle sql与调优
- oracle不用tsname文件的时候着怎么办
- Oracle使用触发器实例
- oracle 拆分输出dbms_output.put_line longValue解决
- ORACLE修改表空间方法
- 记录一次rolling mode给oracle打补丁
- 自己动手 CentOS-6.5 安装Oracle11g R2
- ORACLE 多表连接与子查询
- Oracle 工作语句记录
- Oracle安装配置—64位Win7安装配置64位Oracle
- 查看oracle 分区表
- Oracle 中count(1) 和count(*) 的区别
- oracle分析函数