Form Builder环境配置与编译(FRM18108处理)

1.   安装FormBuilder

·        Form Builder有6i和10g两种主要版本,请与正式环境中实际使用的为准,本文以6i为例。

·        如果只安装了开发版的Form Builder6i,则编译fmb文件时要求本地另提供Oracle本地监听器(Oracle快捷版无此服务)

 

2.   本地(Windows)环境配置

目标:能本地的FormBuilder中正常编译fmb文件。

a.   从服务下载form,resource两个文件夹到本地任意位置

    如:/u01/oracle/prodappl/au/11.5.0/forms/ZHS,/u01/oracle/prodappl/au/11.5.0/resource

b.   把本地这两个文件夹添加到注册表

     在命令行中用regedit打开注册表编辑器,找到以下这个项:

   HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\FORMS60_PATH

    该项原值为:E:\orant\TOOLS\OPEN60\PLSQLLIB

    修改之后为:E:\orant\TOOLS\OPEN60\PLSQLLIB;E:\oracleForm\resource;E:\oracleForm\form

    注:如果FORMS60_PATH项的路径与上述不同,请在Oracle层下搜索一下,不要随便新建

c.   用FormBuilder打开要编辑的fmb文件

      打开文件后使用“文件->连接”连接到Oracle数据库;再通过“文件管理编译文件”即可完成编译,在fmb的同目录下生成fmx文件。

     注:如果打开文件时弹出一堆报错窗口,请放到没有空格及中文的简单路径下再试;

       本地编译的文件直接放到服务器上使用可能会有乱码,正式版建议直接在服务器中编译。

 

3.   服务器(Linux)环境配置

     目标:在服务器中编译fmb文件,生成fmx文件。

a.   上传文件

     用SSH连接Linux服务器,把修改过的文件放到服务器中(建议备份fmb及fmx原文件),本人路径为/u01/oracle/prodappl/cux/11.5.0/forms/ZHS

b.   配置环境

      回到/u01/oracle/****appl/目录,以我所用的环境为例,要依次执行以下两个文件:

     [oraprod@fin02 prodappl]$ .APPSORA.env

     [oraprod@fin02 prodappl]$ .APPSPROD_fin02.env

     注:配置文件间存在相互调用,所以目录中可能不止上述两个env文件。

c.   编译文件(实际应用时注意路径差异)

     命令如下,其中XXX为文件名:

     f60genmodule=/u01/oracle/prodappl/cux/11.5.0/forms/ZHS/******.fmb userid=apps/appsoutput_file=/u01/oracle/prodappl/cux/11.5.0/forms/ZHS/******.fmx

     编译过程中本人碰到如下错误:

     FRM-18108: Failed to load the following objects.

     Source Module:APPSTAND.fmb

   ……

     PL/SQL ERROR 307 at line 40, column 10

     too many declarations of'QUERY_RANGE' match thiscall

     

     经分析,这是重复引用问题,因为服务器中存在不同语言的多个版本的form(分别放在/ZHS/, /US/目录下),所以报错。

     我解决的方法是细化引用位置:

     [oradevp@fintest03 prodappl]$ echo$FORMS60_PATH

     看显示的路径中是否有form目录的配置,如果没有,就在prodappl目录下的env文件中寻找$FORMS60_PATH变量的配置,增加一个“/u01/oracle/prodappl/au/11.5.0/forms/ZHS”,限定范围,即可正常编译。

 

4.   开发需求:关闭窗口时不允许提示保存,只能选择是否放弃所有更改

·        问题描述:EBS系统中的一个自定义功能下,当关闭窗口时,如果窗口内有更改,它会弹出是否保存的提示。但如果此时点“是”,它就会保存本不符合校验规则的数据。

·        在"CLOSE-WINDOS"触发器中发现如下代码:

     APP_CUSTOM.CLOSE_WINDOW(:SYSTEM.EVENT_WINDOW);

·        在该procedure下找到对目标窗口的处理,当前的处理方法是:

     app_window.close_first_window;

·        app_window是直接调用的APPCORE.dll中的公有方法,无法修改,所以改为如下处理:

 fnd_message.set_string('现在关闭窗口将放弃所有操作,确认?');

 if fnd_message.warn then             --表示选择“是”

   close_form('CUXCEXCABMR');    --参数是当前的fmb文件名

 Else   --表示选择“取消”

   return;

 endif;

·        其中的close_form(FORM_NAME)方法就是关闭当前整个from,我还试过clear_form()等方法,没有起到理想效果。

原文地址:https://www.cnblogs.com/ebsblog/p/6141130.html