使用Custom.pll修改标准Form的LOV
在開發過程中,經常碰到需要修改標準Form中LOV的需求,一般來說都是做一些條件限制。在不修改標準Form的fmb文件的前提下,可以通過Custom.pll來實現。
?
一、Custom.pll的工作機制
?
在EBS中大部分Form都是在TEMPLATE.fmb的基礎上創建的,另外還有一些HR模塊的Form是在HRTEMPLT.fmb的基礎上創建的,這些模板Form在form級的觸發器中會去調用custom.pll
這些Form級的觸發器為:
?
在HRMS模塊,還有以下觸發器也調用了custom.pll
?
在這些觸發器中,會調用APP_STANDARD.EVENT過程中的call_all_libraries(event_name),call_all_libraries過程會調用custom.event(event_name)。
?
二、使用custom.pll修改標準form的LOV
?
從服務器下載custom.pll文件,使用form builder打開。點擊PL/SQL Libraries,點擊新建按鈕,另存為pll文件,例如XXPOXPOEPO.pll,新建Package XXPOXPOEPO
?
?
新建procedure set_po_vendor_lov:
?
代碼為:
?
[c-sharp] view plaincopyprint?PROCEDURE set_po_vendor_lov IS l_query_string VARCHAR2(2000); l_customer_group_id recordgroup; l_temp_id NUMBER; l_customer_lov lov; BEGIN IF name_in('system.cursor_item') = 'PO_HEADERS.VENDOR_NAME' THEN l_query_string := 'SELECT DISTINCT pov.vendor_name, pov.segment1 FROM po_vendors pov WHERE pov.enabled_flag = "Y"'; IF not id_null(find_group('CUX_SUPPLIER_NAME')) THEN delete_group(‘CUX_SUPPLIER_NAME’); END IF; l_customer_group_id := create_group_from_query('CUX_SUPPLIER_NAME', l_query_string); set_lov_property('SUPPLIER_NAME', GROUP_NAME, 'CUX_SUPPLIER_NAME'); END IF; END set_po_vendor_lov;
?
?
首先,使用create_group_from_query來創建一個lov record group,
然后, 將我們需要修改的LOV的group置換為我們創建的group。由于這個過程是在when-new-item-instance中調用的,為了防止其他非使用該Lov的Item也執行改過程,所以在程序的開始進行了name_in(‘system.cursor_item’) = ‘PO_HEADERS.VENDOR_NAME’條件的判斷,
另外,由于record group創建一次在第二次如果再次創建就會報錯,所以使用了
??????? if not id_null(find_group(‘CUX_SUPPLIER_NAME’)) then
????????? delete_group(‘CUX_SUPPLIER_NAME’);
??????? end if;
?
刪除group再創建(delete_group只能刪除由程序創建的record group)。之所以用這種邏輯而不在創建的時候判斷是否已經存在該group是因為這個query_string是動態的,所以在每次都創建才能保證每次LOV的結果是正確的。
接下來,就要把我們的pll添加到custom里面去,點擊custom的Attached Libraries,點擊添加按鈕,選擇XXPOXPOEPO。雙擊打開custom.pll中的custom package,
?
將procedure event過程修改為如下:
?
[c-sharp] view plaincopyprint?PROCEDURE event(event_name VARCHAR2) IS form_name VARCHAR2(30) := name_in('system.current_form'); block_name VARCHAR2(30) := name_in('system.cursor_block'); item_name VARCHAR2(30) := name_in('system.cursor_item'); BEGIN IF event_name = 'WHEN-NEW-ITEM-INSTANCE' THEN IF form_name = 'POXPOEPO' AND block_name = 'PO_HEADERS' AND item_name = 'PO_HEADERS.VENDOR_NAME' THEN XXPOXPOEPO.set_po_vendor_lov; END IF; END IF; END event;
?
?
在開始的時候,我是在custom過程中去判斷當前Item是否等于VENDOR_NAME(紅顏色的代碼),結果發現添加了改條件之后,某一些Form會出現no data found的錯誤(例如應用開發員的功能form),這是因為該Form在打開的時候system.cursor_item為空,所以要把item的判斷寫進了自己客戶化的pll中。
最后,把custom.pll和xxpoxpoepo.pll上傳到服務器$AU_TOP/resource目錄下,使用下面的命令編譯pll,退出EBS再重新登陸,LOV就生效了
轉載于:https://www.cnblogs.com/liuweicong39/archive/2012/11/15/2771165.html
總結
以上是生活随笔為你收集整理的使用Custom.pll修改标准Form的LOV的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 优秀员工与普通员工
- 下一篇: Python 数据库备份脚本(邮件通知+