1. 程式人生 > >Form開發中元件控制(是否可用,是否可見)的幾個常用方法-----子功能的應用

Form開發中元件控制(是否可用,是否可見)的幾個常用方法-----子功能的應用

在Oracle EBS 的Form二次開發中,經常需要靈活的來控制某些元件是否可用、是否可見;有時希望某些欄位的值自動生成或者手動輸入;有時又希望能夠根據不同的職責、不同的使用者等來設定不同的行為控制。常見的需求:

  1. 只有某些角色的人才能看到銷售訂單中“登記訂單”這個按鈕
  2. 只有某些角色的人才可以切換到某個標籤頁
  3. 實現訂單號碼根據需要自動生成編號或者手工錄入
  4. 快速編碼的值即可以錄入所有應用下的,也可以只能錄入某個應用,更可以只能錄入某個應用下某個型別下的值
  5. 在某些情況下Form需要只能夠查詢
  6. ……

在Oracle EBS環境中有很多方法來實現這些功能,但是使用預置檔案(Profile)子功能(Subfunction)

功能引數(Function Parameter)是最常用最方便有效的3種方式,

一,子功能(Subfunction)

子功能是實際上是一個特殊的功能,利用子功能的方式其實就是使用了Oracle EBS的功能許可權控制來實現安全性的控制,其實質就是某個使用者能夠執行一個被授權的功能,一般情況下會使用子功能來控制某些按鈕是否顯示,進而實現了使用者是否可以操作Form中的某些功能,所以Oracle EBS的開發人員經常使用子功能來通過顯示/隱藏或者有效/失效介面上的元件來實現功能的有效或無效,如上面常見需求中的1,2使用子功能最適合。

如下我希望只有授權的使用者才能看到Book Order這個按鈕,看不到的自然也無法進行這個操作了

book_order_example

實現步驟:

1,為Book Order按鈕元件定義一個子功能

define_subfunction 

2,Form程式碼中根據功能來控制組件

在PRE-FORM觸發器中,來判斷使用者是否有許可權看到這個操作,如果有就顯示否則不顯示

1
2
3
4
5
IF (fnd_function.test('XHUORDER_BOOK_ORDER')) THEN
  app_item_property.set_property('headers.book_order', DISPLAYED, PROPERTY_ON);
ELSE
  app_item_property.set_property('headers.book_order'
, DISPLAYED, PROPERTY_OFF); END IF;

3,將子功能授權給有權的使用者

如果某個使用者需要顯示這個按鈕,只要將子功能XHUORDER_BOOK_ORDER新增使用者擁有的職責對應的選單裡面,把子功能XHUORDER_BOOK_ORDER新增為一個選單項,但是Prompt留空就可以

menu_subfunction_define

定義的時候需要將Prompt欄位留空,這樣在選單顯示的時候就看不到這個選單項,實際關鍵的是最後的Grant列,預設都是勾上的,代表了授權給相關的職責使用者

二、功能引數

功能引數的方法實際上和子功能是一致的控制方法,都是使用功能許可權來進行控制, 它通過針對同一個Form定義多個Function,不同Function引數的值不同來實現控制,Oracle EBS中最典型的應用就是Form中的僅僅查詢功能和快速編碼(Lookup Code)定義介面

在快速編碼定義介面中,可以通過APPL_SHORT_NAME引數來控制只能查詢特點應用的快速編碼;LOOKUP_TYPE引數來控制特點型別的快速編碼。實現了引數值不同介面的行為也不同

lookup_type_demand_class 

實現步驟:

1,在Form設計器中定義引數

像快速編碼定義的Form中,定義瞭如下圖的引數

form_parameter

2,在Form程式程式碼中引用引數的值來控制

根據業務需求和功能設計的要求,通過引數的值來編寫程式碼,如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  if (:parameter.lookup_type is not null) then
    set_block_property('FND_LOOKUP_TYPES', INSERT_ALLOWED,
        PROPERTY_FALSE);
  end if;
 
  if (:parameter.appl_short_name is not null) then
    :parameter.appl_short_name := upper(:parameter.appl_short_name);
    :parameter.appl_id := 
        fnd_utilities.get_application_id(:parameter.appl_short_name);
    :parameter.application := 
        fnd_utilities.get_application_name(:parameter.appl_id);
 
    app_item_property.set_property('FND_LOOKUP_TYPES.APPLICATION_NAME',
        INSERT_ALLOWED, PROPERTY_OFF);
  end if;

parameter的引數值在Form執行的時候會從Function定義中傳入

3,定義Function時設定具體的引數值

如上面顯示的DEMAND_CLASS的快速編碼,引數為:VIEW_APPLICATION=”AU” LOOKUP_TYPE=”DEMAND_CLASS”

lookup_type_demand_class_function

為Function定義了引數,在執行的時候就會到form的parameter中去查詢同名的引數,並將等號(=)後的值傳給引數,多個引數間用空格隔開。因此可以採用功能引數值的不同定義不同的功能,並賦給對應使用者的職責就實現了不同的控制

三、預置檔案(Profile)

預置檔案的控制是這些方法中最靈活最強大的一種方法,通過預置檔案可以實現到站點層、應用層、職責層和使用者層的控制,預置檔案相當於Oracle EBS系統中根據的一個全域性變數,這個全域性變數在不同的上下文可以設定為不同的值,因此在Form的開發中可以使用它來實現業務邏輯的控制,上面列出的常見需求都可以使用預置檔案的方法來實現,只是預置檔案太過靈活,所以有的需求則顯得大材小用,因此只要需要較靈活層次控制並符合站點層、應用層、職責層和使用者層這樣層次控制的時候才採用。

實現步驟:

1,定義預置檔案

在Application Developer職責下定義預置檔案,就像在Oracle EBS系統中定義一個變數的感覺,SQL Validation區域就是預置檔案可以定義的值列表

define_profel 

2,Form中根據預置檔案值進行控制

1
2
3
4
5
6
7
  l_order_num_mode := fnd_profile.value('DEMO_ORDER_NUMBER_MODE');
 
  if :parameter.order_number_mode = 'AUTOMATIC' then
    app_item_property.set_property('HEADERS.ORDER_NUMBER', REQUIRED,  PROPERTY_FALSE);
    app_item_property.set_property('HEADERS.ORDER_NUMBER', ENTERABLE, PROPERTY_FALSE);
    app_item_property.set_property('HEADERS.ORDER_NUMBER', NAVIGABLE, PROPERTY_FALSE);
  end if;

上面的程式碼代表瞭如果預置檔案DEMO_ORDER_NUMBER_MODE的值是AUTOMATIC的話,進行ORDER_NUMBER的控制

3,設定預置檔案的值

Form程式中根據預置檔案值的不同進行了不同的控制,而預置檔案的值則是根據需要進行設定

profile_set_find

profile_set

通過以上預置檔案值設定的不同,Form控制的項就會根據設定的不同表現出不同的行為。

上面描述的3個方法是Oracle EBS Form二次開發中最常用的方法,根據功能需求的不同選擇最適合的方法。