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()等方法,沒有起到理想效果。