最近有个项目,需要研究一下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的麻烦。

 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

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

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

    前段时间在本地XP系统上测试了一些整合javabean的Form例子,想着发布到服务器段去看看能否运行正常,一开始以为会和本地XP系统一样,部署到相关的目录下进行一些配置就可以了,但实际过程却和想象的 ...

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

    前言: 有时候,因某些需要,必须知道Oracle的Form被使用的情况,以方面我们做出决策: 例如,如果某个Form被使用的次数非常多,那么,这个Form的相关SQL代码就应该优先处理,以减少服务器负 ...

  3. 如何启用Oracle EBS Form监控

    前言: 有时候,因某些需要,必须知道Oracle的Form被使用的情况,以方面我们做出决策: 例如,如果某个Form被使用的次数非常多,那么,这个Form的相关SQL代码就应该优先处理,以减少服务器负 ...

  4. Oracle EBS - Form DEV Env

    1. 创建文件夹resource与forms, 以便存放pll与forms(主要用到APSTAND.fmb, APPSTAND.fmb, TEMPLATE.fmb)文件; 2. 修改注册表 HKEY_ ...

  5. oracle ebs form开发总结

    item的布局千万不要去乱动,只要调好长宽和y轴的坐标就好了.form内部集成了很多代码对布局进行动态的调整,而且有一些代码的长宽什么的还是写死了的,我们一动,form可能就识别不了了,然后就显示出来 ...

  6. Oracle EBS FORM 更改记录状态

    get到一个新的思路. 因为validate触发器是无法做go_block或者loop操作的,因此可以尝试修改数据块属性,将状态更新为改动的,触发 ON-UPDATE 触发器,将循环或者跳转语句加入到 ...

  7. 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_t ...

  8. ORACLE EBS FORM 二次开发常用小技巧

    1.锁住当前行 Set_Item_Instance_Property('main.import_flag', CURRENT_RECORD, UPDATE_ALLOWED, PROPERTY_OFF) ...

  9. Oracle EBS FORM lov

    存在一种情况: 一个LOV的值当前有效,因此填入保存.但突然无效后,当查询该界面时就会弹出LOV框使其修改. 解决方案: 1. 非常粗暴,不设置校验,在LOV对应的item强行将校验设置为NO. 2. ...

随机推荐

  1. 如何查看某个查询用了多少TempDB空间

        最近帮助客户调优的过程中,发现客户的TempDB存在非常大的压力,经过排查是发现某些语句对TempDB的巨量使用所导致.     在SQL Server中,TempDB主要负责供下述三类情况使 ...

  2. OpenCascade Ray Tracing Rendering

    OpenCascade Ray Tracing Rendering eryar@163.com 摘要Abstract:OpenCascade6.7.0中引入了光线跟踪算法的实现.使用光线跟踪算法可实现 ...

  3. Huge Page 是否是拯救性能的万能良药?

    本文将分析是否Huge Page在任何条件下(特别是NUMA架构下)都能带来性能提升. 本博客已经迁移至: http://cenalulu.github.io/ 为了更好的体验,请通过此链接阅读: h ...

  4. 增强学习(五)----- 时间差分学习(Q learning, Sarsa learning)

    接下来我们回顾一下动态规划算法(DP)和蒙特卡罗方法(MC)的特点,对于动态规划算法有如下特性: 需要环境模型,即状态转移概率\(P_{sa}\) 状态值函数的估计是自举的(bootstrapping ...

  5. 漫谈可视化Prefuse(二)---一分钟学会Prefuse

    前篇<漫谈可视化Prefuse(一)---从SQL Server数据库读取数据>主要介绍了prefuse如何连接数据库sql server并读取数据进行可视化展现. 回头想想还是应该好好捋 ...

  6. 【Android】Android ObjectAnimator动画初识、模仿

    ObjectAnimator: ObjectAnimator的概念这里就不解释了,直接从代码中说明,以下是模仿Persicope的加载动画,简单的几行代码即可实现,当然我也是模仿的,更好的实现思路还请 ...

  7. 使用Python将HTML转成PDF

    主要使用的是wkhtmltopdf的Python封装--pdfkit 安装 1. Install python-pdfkit: $ pip install pdfkit 2. Install wkht ...

  8. SQ--模糊查询

    Between..And --between...and...在数据库内部是做作特殊优化的,执行效率比> and<等这种方式快:--between a and b 相当于:字段>=a ...

  9. vue-resource 拦截器使用

    在vue项目使用vue-resource的过程中,临时增加了一个需求,需要在任何一个页面任何一次http请求,增加对token过期的判断,如果token已过期,需要跳转至登录页面.如果要在每个页面中的 ...

  10. LINUX总结

    LINUX总结 crazyacking 2016-02-26 主要对socket编程,多线程,定时器,条件变量总结 多线程篇 概念: 多线程就是允许一个进程内存存在多个控制权,实现多个线程并发执行. ...