1. 程式人生 > >EBS資料夾功能(folder)的實現

EBS資料夾功能(folder)的實現

75.1 問題描述
資料夾功能(folder)是EBS中強大的功能,可以實現點選前三列的列標題排序,拖動列,隱藏列,顯示列,拉寬列,拉窄列,儲存查詢以供以後使用等等,但Oracle官方文件沒有多少論述,自己也做過,模模糊糊,如果能有文件記載下來就好了。
75.2 解決方案
1.從$AU_TOP/forms/US下載好TEMPLATE.fmb並開啟並重命名為自己的表單名,我這個例子是HELPSTZD,同時開啟APPSTAND.fmb(該檔案從$AU_TOP/resource 下載),如圖:
2.刪除TEMPLATE.fmb中的示例物件,主要是BLOCKNAME和DETAILBLOCK這兩個資料塊,BLOCKNAME這個畫布,BLOCKNAME這個視窗。
3. 建立表單的主要視窗,我命名為MAIN,並將其Subclass Information值設定為WINDOW,如圖,然後修改MAIN這個視窗的Title屬性為自己想要的名字,比如通知單管理,再修改form級別的觸發器PRE-FORM中的程式碼為類似下面的程式碼:
FND_STANDARD.FORM_INFO('$Revision: 115.12$', 'HELPSTZD', 'HEL',
                       '$Date: 2011/04/27 11:02  $', '$Author: luoyong $');
app_standard.event('PRE-FORM');
app_window.set_window_position('MAIN', 'FIRST_WINDOW');

備註:第一行程式碼的第二個和第三個引數在審計級別設定為表單時十分有用,如果不設定,到時候會追蹤不到。
第三行的第一個引數是主要視窗的名稱。
3.        修改APP_CUSTOM這個包中的程式碼如下,主要是關閉主視窗時退出表單。
  if (wnd = 'MAIN') then
app_window.close_first_window;
4.        首先建立一個主要的內容畫布,我這裡命名為MAIN,將其Canvas Type設定為Content,其Subclass Information值設定為CANVAS,設定好大小,如圖。建立要應用資料夾功能的資料塊,我這裡是塊 NOTICE_MAIN ,然後為該塊新增一個專案,名稱為CURRENT_RECORD_INDICATOR,其屬性Subclass Information的屬性值也設定為CURRENT_RECORD_INDICATOR,放在內容畫布MAIN上面,也就是設定該項的Canvas屬性為MAIN,一般其X Position屬性設定為0.177,Y Position 屬性設定為.5。一般來說,還應該將該塊設定為該表單的首次導航塊,設定方法:點選表單,然後按F4鍵調出屬性面板,將屬性First Navigation Data Block設定為剛才的資料塊NOTICE_MAIN。當然還要將幾個專案暫時放到內容畫布上(為啥說暫時?因為後面會將其放到堆疊畫布上),然後上傳到EBS測試環境,確保能編譯通過,且執行沒有問題。
5.        從FTP上的au/11.5.0/resource/ 目錄下載APPFLDR.pll到自己電腦上的某個位置,然後載入該pll,操作方法:選中表單的Attached Libraries節點,然後點選左側的加號工具,也就是Create按鈕,會彈出對話方塊,選擇剛才下載的APPFLDR.pll,然後點選Attach按鈕,在彈出的警告對話方塊中選擇Yes,新增成功後就會出現APPFLDR。
6. 將原來已經開啟的APPSTAND.fmb中的三個以FOLDER開頭的三個視窗選中,按住ctrl鍵,然後移動到自己建的表單HELPSTZD的Windows節點,在彈出的對話方塊中選擇Subclass。然後利用同樣的方法將APPSTAND.fmb中的三個以FOLDER開頭的畫布Subclass到自己的表單中,還要用同樣的方法將APPSTAND.fmb中的兩個以FOLDER開頭的資料塊Subclass到自己的表單中。還要用還要用同樣的方法將APPSTAND.fmb中的名稱為STANDARD_FOLDER的Object Groups 通過Subclass的方式移植到自己的表單中。
7. 新增堆疊畫布,我這裡將堆疊畫布命名為NOTICE_MAIN_STACKED,其屬性Canvas Type設定為Stacked,屬性Subclass Information設定為CANVAS_STACKED,屬性Show Horizontal Scroll Bar設定為Yes,屬性Window設定為主要視窗MAIN,Viewport X Position屬性設定為0.5,Viewport Y Position屬性設定為0.25,還有一個值得注意的地方就是其在Canvas節點的順序要放到先前建立的內容畫布MAIN的下面,如圖。
8.為資料夾塊NOTICE_MAIN的所有要顯示給使用者看的項設定相應的屬性,所有的項都應該設定Subclass Information屬性(一般設定為TEXT_ITEM或者TEXT_ITEM_DISPLAY_ONLY),設定其Canvas屬性為建立的堆疊畫布NOTICE_MAIN_STANCKED,X Position屬性為0,Y Position屬性設定為0.25。同時為該資料夾塊增加一個項,名稱為SWITCHER,Item Type屬性值為Text Item,Subclass Information屬性值設定為SWITCHER,屬性CANVAS要設定為內容畫布MAIN,還有就是該專案要是該塊的第一個專案,也就是放到專案CURRENT_RECORD_INDICATOR的上面。還要設定該資料夾塊的Show Scroll Bar屬性值為Yes,Scroll Bar Orientation屬性值為Vertical,Scroll Bar Canvas為內容畫布MAIN,屬性Scroll Bar Y Position屬性設定為0.5,Scroll Bar Length屬性設定為行數*0.25,比如我的設定為10行,所以該屬性值就是2.5。
9. 為資料夾塊建立列標題塊,塊一般命名為資料夾塊名稱後加上_PROMPT,我這裡的名稱是NOTICE_MAIN_PROMPT,為資料夾塊所有要顯示的專案增加一個對應的專案,專案名稱同文件夾塊對應專案的名稱,疊放順序將會是列顯示的順序,其Width屬性將會是列顯示的寬度,專案的Canvas要設定為堆疊畫布NOTICE_MAIN_STACKED,屬性Initial Value就是列標題,Item Type屬性設定為Display Item,Subclass Information屬性設定為FOLDER_PROMPT_MULTIROW,Height屬性設定為0.25。還要為該塊增加幾個特殊的專案,分別是FOLDER_OPEN (該專案的Item Type為Push Button,Subclass Information屬性設定為FOLDER_OPEN,CANVAS屬性設定為內容畫布MAIN),FOLDER_TITLE (該專案的Item Type為Text Item,Subclass Information屬性設定為DYNAMIC_TITLE, CANVAS屬性設定為內容畫布MAIN,X Position屬性設定為0.4,Width屬性設定為4),FOLDER_DUMMY  (該專案的Item Type為Text Item,Subclass Information屬性設定為FOLDER_DUMMY,CANVAS屬性設定為TOOLBAR),ORDER_BY1,ORDER_BY2,ORDER_BY3 (這3個ORDER_BY專案的Item Type為Push Button,Subclass Information屬性設定為FOLDER_ORDERBY,Y Position屬性要設定為0.5 加上 0.25 乘以資料夾塊顯示行數(比如是10)的值,我這裡設定為0.5+0.25*10=3,CANVAS屬性要設定為內容畫布MAIN)。
10.編寫觸發器程式碼。
?        資料夾塊NOTICE_MAIN中的專案SWITCHER 增加WHEN-NEW-ITEM-INSTANCE觸發器,Execution Hierarchy屬性為Override,程式碼為app_folder_move_cursor('1');
?        資料夾塊NOTICE_MAIN中的專案CURRENT_RECORD_INDICATOR 增加WHEN-NEW-ITEM-INSTANCE觸發器,Execution Hierarchy屬性為Override,程式碼為app_folder_move_cursor('1');
?        資料夾塊NOTICE_MAIN增加觸發器WHEN-NEW-BLOCK-INSTANCE,Execution Hierarchy屬性為Before,程式碼為app_folder.event('WHEN-NEW-BLOCK-INSTANCE');
?        資料夾塊NOTICE_MAIN增加觸發器KEY-NEXT-ITEM,Fire in Enter-Query Mode屬性為Yes,程式碼為app_folder.event('KEY-NEXT-ITEM');
?        資料夾塊NOTICE_MAIN增加觸發器KEY-PREV-ITEM,Fire in Enter-Query Mode屬性為Yes,程式碼為app_folder.event('KEY-PREV-ITEM');
?        資料夾塊NOTICE_MAIN增加觸發器PRE-BLOCK,Execution Hierarchy屬性為Before,程式碼為app_folder.event('PRE-BLOCK');
?        資料夾塊NOTICE_MAIN增加觸發器POST-BLOCK,Execution Hierarchy屬性為Before,程式碼為app_folder.event('POST-BLOCK');
?        資料夾塊NOTICE_MAIN增加觸發器PRE-QUERY,Execution Hierarchy屬性為Before,程式碼為app_folder.event('PRE-QUERY');
?        資料夾塊NOTICE_MAIN增加觸發器KEY-EXEQRY,Execution Hierarchy屬性為Before,Fire in Enter-Query Mode屬性為Yes,程式碼為app_folder.event('KEY-EXEQRY');
?        資料夾塊NOTICE_MAIN增加觸發器POST-QUERY,Execution Hierarchy屬性為Before,程式碼為app_folder.event('POST-QUERY');
?        建立或修改表單級觸發器WHEN-WINDOW-RESIZED增加程式碼
IF :system.event_window IN ('MAIN') THEN
IF (get_window_property(:system.event_window,
                            width) < 5.7) THEN
      set_window_property(:system.event_window,
                          width,
                          5.7);
    ELSE
      app_folder.event('WHEN-WINDOW-RESIZED');
    END IF;
  END IF;
?        建立或修改表單級觸發器KEY-CLRFRM增加程式碼app_folder.event('KEY-CLRFRM');
建立或修改表單級觸發器WHEN-NEW-FORM-INSTANCE增加程式碼app_folder.define_folder_block('HELPSTZD',
                               'NOTICE_MAIN',
                               'NOTICE_MAIN_PROMPT',
                               'NOTICE_MAIN_STACKED',
                               'MAIN');
app_folder.event('INSTANTIATE');

過程app_folder.define_folder_block的說明:
app_folder.define_folder_block('<OBJECT NAME>',
'<FOLDER BLOCK NAME>',
'<PROMPT BLOCK NAME>',
'<FOLDER STACKED CANVAS NAME>',
'<FOLDER WINDOW NAME>',
['<DISABLED FUNCTIONS>']);
引數解釋
其中OBJECT NAME 為表單的名稱。
FOLDER BLOCK NAME 為資料夾塊的名稱
PROMPT BLOCK NAME 為資料夾塊對應的列標題塊的名稱
FOLDER STACKED CANVAS NAME 為堆疊畫布的名稱
FOLDER WINDOW NAME 為表單主視窗的名稱
DISABLED FUNCTIONS 用來禁用某些功能。。。
?        修改表單級觸發器FOLDER_ACTION,程式碼為app_folder.event(:global.folder_action);
?        修改表單級觸發器FOLDER_RETURN_ACTION的程式碼為null;