日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使用Custom.pll修改标准Form的LOV

發布時間:2024/4/11 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用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級的觸發器為:

  • ZOOM
  • WHEN-NEW-FORM-INSTANCE
  • WHEN-NEW-BLOCK-INSTANCE
  • WHEN-NEW-RECORD-INSTANCE
  • WHEN-NEW-ITEM-INSTANCE
  • WHEN-VALIDATE-RECORD
  • ?

    在HRMS模塊,還有以下觸發器也調用了custom.pll

  • PRE-DELETE
  • POST-DELETE
  • PRE-UPDATE
  • POST-UPDATE
  • PRE-INSERT
  • POST-INSERT
  • POST-FORMS-COMMIT
  • WHEN-CREATE-RECORD
  • KEY-DELREC
  • ?

    在這些觸發器中,會調用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;??
  • 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;??
  • 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的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。