1. 程式人生 > >Oracle Form 觸發器執行順序

Oracle Form 觸發器執行順序

FormTrigger的優先順序是從item,到block,到form級別,如果另外設定Execution Hierarch屬性(override,before,after),則按照設定後的順序執行。如果是override的話,則執行完這個級別的觸發器,就不往上執行了,before就是執行完這個級別的觸發器後,如果上一個級別也有這個觸發器的話,繼續去執行,after就是先去執行上一個級別的觸發器,然後再回來執行。感覺觸發器比較難理解的還是每一種觸發器觸發的時間,和在開發中怎麼使用。目前瞭解的就是pre-…when-new-…-instance,when-…-validate,post-query

和幾個on-…觸發器

觸發器執行順序:


1
.當開啟FORM時:

1PRE-FORM

2PRE-BLOCKBLOCK級)

3WHEN-NEW-FORM-INSTANCE

4WHEN-NEW-BLOCK-INSTANCE

5WHEN-NEW-RECORD-INSTANCE

6WHEN-NEW-ITEM-INSTANCE

2.當填寫一行記錄完成後,游標移動到下一條記錄的時候:

1WHEN-VALIDATE-RECORD 
(
只將填寫的記錄與資料庫中已存在的記錄作唯一性的驗證,如果只是頁面上的資料重複而資料庫中沒有與其重複的值則不會報錯.)

2WHEN-NEW-RECORD-INSTANCE

3WHEN-NEW-ITEM-INSTANCE

3.當點選儲存

1WHEN-VALIDATE-RECORD 
(將頁面上的所有資料提交到資料庫,若頁面上有重複的資料,則提交第一次時成功但只是將資料先寫到資料庫中一類似臨時表的地方,在提交第二條重複記錄的時候報錯,執行事務回滾,原來執行成功的指令也將被撤消)

2PRE-INSERT

3ON-INSERT

4POST-INSERT

5POST-FORMS-COMMIT

6PRE-BLOCKBLOCK級)

7KEY-COMMIT

8WHEN-NEW-ITEM-INSTANCE

4.當游標移動到當前資料塊中已經顯示的行上時:

1WHEN-REMOVE-RECORD

2WHEN-NEW-RECORD-INSTANCE

3WHEN-NEW-ITEM-INSTANCE

當在該行上的不同ITEM移動時:

4WHEN-NEW-ITEM-INSTANCE

5.當要進行修改時(在記錄中的某個項上進行了修改時):

1ON-LOCK

6.在修改完成後進行儲存時:

1WHEN-VALIDATE-RECORD

2PRE-UPDATE

3ON-UPDATE

4POST-FORMS-COMMIT

5PRE-BLOCKBLOCK級)

6KEY-COMMIT

7WHEN-NEW-ITEM-INSTANCE

7.刪除一條記錄時:

1ON-LOCK

2WHEN-REMOVE-RECORD

3KEY-DELREC

4WHEN-NEW-RECORD-INSTANCE

5WHEN-NEW-ITEM-INSTANCE

8F11查詢過程:

1WHEN-CLEAR-BLOCK

2WHEN-NEW-RECORD-INSTANCE

3WHEN-NEW-ITEM-INSTANCE

在輸入查詢條件後點CTRL+F11

4PRE-QUERY

5WHEN-CLEAR-BLOCK

6POST-QUERY

7WHEN-NEW-RECORD-INSTANCE

8WHEN-NEW-ITEM-INSTANCE

9CRRL+F11

1WHEN-CLEAR-BLOCK

2PRE-QUERY

3WHEN-CLEAR-BLOCK

4POST-QUERY(每查一條記錄,觸發一次)

5WHEN-NEW-RECORD-INSTANCE

6WHEN-NEW-ITEM-INSTANCE

10.從查詢狀態(F11)轉為輸入狀態(F4)時:

1WHEN-CLEAR-BLOCK

2KEY-EXIT

3WHEN-NEW-RECORD-INSTANCE

4WHEN-NEW-ITEM-INSTANCE

11.手電筒查詢過程:

1QUERY_FINDBLOCK級)

輸入查詢條件後,點選查詢按鈕:

2WHEN-CLEAR-BLOCK

3PRE-QUERY

4WHEN-CLEAR-BLOCK

5POST-QUERY

6WHEN-NEW-RECORD-INSTANCE

7WHEN-NEW-ITEM-INSTANCE

12.點選“New”時:

1WHEN-NEW-RECORD-INSTANCE

2WHEN-NEW-ITEM-INSTANCE

13.點選“EditField”時:

1KEY-EDIT

14.點選“WindowHelp”時:

1KEY-HELP

15.點選“ClearRecord”時:

1WHEN-REMOVE-RECORD

2POST-QUERY

3WHEN-NEW-RECORD-INSTANCE

4WHEN-NEW-ITEM-INSTANCE

16.點選F4關閉時:

1KEY-EXIT

2POST-FORM

17.點選“CloseForm”按鈕關閉時:

1KEY-EXIT

2POST-FORM

18.點選“Translations”按鈕時:

1TRANSLATIONS

19.點選小叉號關閉時:

1WHEN-WINDOW-CLOSED

2CLOSE-WINDOW

3KEY-EXIT

4POST-FORM

20.選中LOV列表:

1KEY-LISTVAL

2WHEN-NEW-ITEM-INSTANCE

21.選中記錄前面的小條時:

1WHEN-NEW-RECORD-INSTANCE

2WHEN-NEW-ITEM-INSTANCE(資料項級)

3WHEN-NEW-ITEM-INSTANCE

22.游標上下移動時:

1WHEN-NEW-RECORD-INSTANCE

2WHEN-NEW-ITEM-INSTANCE

開啟,關閉,建立,更新記錄的trigger次序
PRE-……
在進入一個form,或是導航到一個新的block時觸發,PRE-……系列的觸發器一般是在WHEN-NEW-……-INSTANCE系列之前,它們如果失敗了的話,就不能成功導航到下一個物件了,只能留在當前的位置。在這些觸發器裡可以設定一些判斷條件來限制是否可以導航到新的位置。

WHEN-NEW-……-INSTANCE
這一類的trigger都是當滑鼠游標每次落到一個新的block,record,item上時觸發的,而且就算失敗了,也不會發生什麼錯誤。但是when-new-form-instance,只有當form啟動時,游標導航到第一個導航塊的第一個導航item時觸發,如果一個應用有多個form,當游標在各個form之間轉換時,並不會觸發它。


POST-TEXT-ITEM和WHEN-VALIDATE-ITEM
Post-text-item的觸發點:當輸入的游標從一個Text-Item 轉到其它item,可以用它來改變item的值,而when-Validate-item雖然也是在離開前觸發,但是作用不同,Post-Text-Item本身是沒有驗證的,when-Validate-item可以用來補充一些驗證(除了form本身的驗證),但是當form驗證成功以後,會把item標誌為‘valid’,而不會再去驗證了,如果這時我們再去修改它的值,那麼就有可能會把無效的值匯入到資料庫。在建立和更新一條記錄時,先觸發when-Validate-item,再觸發Post-Text-Item,然後是when-Validate-record。
POST-……系列的都是離開當前的block,record,item時觸發的

WHEN-WINDOW-ACTIVATED
做原材料屬性修改平臺時,第一次使用這個觸發器,用來從另一個window返回時,重新整理當前window,程式碼寫在了這個觸發器裡。使用之前用fnd_message.debug試驗了一下,開啟視窗後不停的彈出message。只要這個視窗在活動期間就會不停的執行這個觸發起裡面的程式碼,所以執行的程式碼應該用if條件限制一下。

Form的Trigger的優先順序是從item,到block,到form級別,如果另外設定Execution Hierarch屬性(override,before,after),則按照設定後的順序執行。如果是override的話,則執行完這個級別的觸發器,就不往上執行了,before就是執行完這個級別的觸發器後,如果上一個級別也有這個觸發器的話,繼續去執行,after就是先去執行上一個級別的觸發器,然後再回來執行。感覺觸發器比較難理解的還是每一種觸發器觸發的時間,和在開發中怎麼使用。目前瞭解的就是pre-…,when-new-…-instance,when-…-validate,post-query和幾個on-…觸發器

驗證程式碼寫在WHEN-VALIDATE-RECORD和PRE-INSERT的不同
驗證程式碼寫在WHEN-VALIDATE-RECORD和PRE-INSERT的不同
1、寫在WHEN-VALIDATE-RECORD,可以及時地提示錯誤資訊,如果驗證時要和後臺資料庫關聯的話,那麼要寫在PRE-INSERT,因為PRE-INSERT,ON-INSERT都是一條一條記錄執行的,這樣批量錄入時,每一條記錄的驗證都可以取到最新的資料庫記錄。
2、 批量錄入時,有一條的PRE-INSERT不成功,則所有記錄都不能儲存成功

Post-Query和When-New-Record-Instance關係
Post-Query和When-New-Record-Instance
假定資料庫中有100條記錄,塊設定顯示行數為10,那麼當游標在顯示出來的記錄間移動時,只觸發When-New-Record-Instance,不觸發Post-Query。當游標移到第十一條記錄時,觸發Post-Query


不可見item的when-validate-item使用
問題:如果一個item是不可見的,那麼改變它的值,還會觸發when-validate-item嗎?
結果:會觸發,但不是在改變它的值後觸發,而是在游標移到另一個block時。關閉視窗時也觸發了。
測試:設block1的item1為不可見,在item2的when-validate-item給tem1賦值,執行時,改變item2的值後,在block1的各item間移動游標都沒有觸發item1的when-validate-item,直到游標離開這個block,或關閉視窗時才觸發。

ACCEPT Trigger 講解
ACCEPT  APP_STANDARD.EVENT(‘ACCEPT’); 這個觸發器處理選單或工具條上呼叫Save and Proceed (儲存並繼續)動作。它執行儲存,並移動到指定當作第一個導航塊的塊上。       替換這個觸發器中的程式碼,或建立塊級觸發器並把執行型別指定為‘Override’

FOLDER_RETURN_ACTION
FOLDER_RETURN_ACTION
     這個觸發器允許指定客戶華的資料夾事件
     用需要的處理資料夾動作的程式碼替換


KEY_DUPREC
APP_STANDARD.EVENT(‘KEY-DUPREC’);
    這個觸發器禁用了Oracle 表單預設的重複記錄的功能

KEY-CLRFRM
KEY-CLRFRM
   APP_STANDARD.EVENT(‘KEY-CLRFRM’);
   這個觸發器在試圖清空form前驗證記錄
   在原來的程式碼後新增附加的程式碼,通常你你應新增GO_BLOCK如果form中存在多個的區域,使用GO_BLOCK在呼叫清空from操作後重新填充控制選單

KEY_MENU
KEY_MENU
  APP_STANDARD.EVENT(‘KEY-MENU’);
   這個觸發器禁用了Oracle froms的Block Menu 命令
   為了啟用從特定的塊對替代的塊通過鍵盤操作,那麼編寫塊級KEY_MENU並且設定執行型別為’Override ’這個觸發器會開啟一個與彈出式選單相同的LOV


KEY_LISTVAL
KEY_LISTVAL
  APP_STANDARD.EVENT(‘KEY-LISTVAL’);
  這個觸發器執行彈性域操作或引用LOV
  建立塊或項級觸發器並設定執行型別為‘Override’,可以使用日曆或動態執行彈性域

ON-ERROR
ON-ERROR
  APP_STANDARD.EVENT(‘ON-ERROR’);
這個觸發器處理伺服器或客戶端的所有的錯誤,使用訊息字典呼叫。
為了捕獲處理指定的錯誤,在呼叫APP_STANDARD前檢查指定的錯誤declare

original_mess varchar2(80);

begin

IF MESSAGE_CODE = <your message number> THEN

original_mess := MESSAGE_TYPE||’–’||

to_char(MESSAGE_CODE)||’: ’||MESSAGE_TEXT;

––– your code handling the error goes here

message(original_mess);

ELSE

APP_STANDARD.EVENT(’ON_ERROR’);

END IF

end;


POST-FORM
POST-FORM.
  APP_STANDARD.EVENT(‘POST-FORM’);
這個觸發器是預留為以後使用
新增附加的程式碼在原有程式碼之後。

PRE-FORM
PRE-FORM
FND_STANDARD.FORM_INFO(’$Revision: <Number>$’,
’<Form. Name>’,
’<Application Shortname>’,
’$Date: <YY/MM/DD HH24:MI:SS> $’,
’$Author: <developer name> $’);
APP_STANDARD.EVENT(’PRE–FORM’);
APP_WINDOW.SET_WINDOW_POSITION(’BLOCKNAME’,
’FIRST_WINDOW’);
這個觸發器初始化Oracle 應用的內部值和選單。在這裡輸入的值將在Oracle應用程式選單‘Help About Oracle Applications’中看到。
你必須編輯應用程式的簡稱,應用的簡稱控制當用戶選擇‘help’按鈕後哪個應用的線上幫助文件將被呼叫。如果你將應用的簡稱設定為FND,你的使用者將會看不到任何幫助因為Oracle應用程式將不能建立可用的幫助目標。
Form的名稱是使用者form名稱(form標題)。
Oracle公司使用源控制系統,它可以自動更新以“$”開頭的值,如果你不使用這個源控制系統你可以按你的開發資訊編輯這些值。
你必須編輯APP_WINDOW中的BLOCKNAME為你自己的block.不要編輯FIRST_WINDOW

QUERY_FIND
QUERY_FIND
APP_STANDARD.EVENT(‘QUERY_FIND’);
這個觸發器將設定顯示字串’Query Find is not available ’
在這個觸發器中替代程式碼,當你建立視窗或Row_LOV在你的form中時建立塊級觸發器並設定執行型別為‘Override’

WHEN-NEW-FORM-INSTANCE
WHEN-NEW-FORM-INSTANCE
FDRCSID(’$Header: ... $’);
APP_STANDARD.EVENT(’WHEN–NEW–FORM–INSTANCE’);
–– app_folder.define_folder_block(’template test’,
’folder_block’, ’prompt_block’, ’stacked_canvas’,
’window’, ’disabled functions’);
--app_folder.event(’VERIFY’);
呼叫 APP_STANDARD.EVENT 是為了在query-only模式下呼叫FND_FUNCTION.EXECUTE,呼叫FNDRCSID是為了Oracle 應用程式的源控制系統(source control system).APP_FOLDER 只為了Oracle應用程式內部呼叫。客戶化form不需要FDRCSID或APP_FOLDER呼叫,但是如果將它們留在觸發器中也沒有影響。
在現有的程式碼前新增附加程式碼。

WHEN-NEW-RECORD-INSTANCE
WHEN-NEW-RECORD-INSTANCE
APP_STANDARD.EVENT(‘WHEN-NEW-RECORD-INSTANCE’);
這個觸發器管理Oracle應用程式選單和工具欄
建立塊級觸發器並設定執行型別為‘Before’

WHEN-NEW-ITEM-INSTANCE
WHEN-NEW-ITEM-INSTANCE
APP_STANDARD.EVENT(‘WHEN-NEW-ITEM-INSTANCE’);
這個觸發器管理Oracle應用程式的選單和工具欄
如果你新增彈性域方法呼叫,你應該新增它在APP_STANDARD.EVENT 呼叫前呼叫,通常,你不應該新增任何程式碼在這個觸發器中,這樣的程式碼將會影響你表單的速度並且影響每一個項

Oracle EBS Form. 中,不能修改的Trigger
Oracle應用程式不支援修改form級的觸發器
CLOSE_THIS_WINDOW
從選單Action->Close 呼叫觸發器APP_CUSTOM.CLOSE_WINDOW 。
CLOSE_WINDOW
APP_CUSTOM.CLOSE_WINDOW(:SYSTEM.EVENT_WINDOW);
這個出發其處理所有關閉視窗的事件。編寫處理關閉視窗的事件必須寫在APP_CUSTOM.CLOSE_WINDOW包中
EXPORT
App_standard.event(‘EXPORT’);
這個觸發器是“Action,Export”選單中的選擇。
FOLDER_ACTION
App_folder.event(:global.folder_action);
KEY-COMMIT
App_standard.event(‘KEY-COMMIT’);
這個觸發器處理正常的提交或form呼叫
KEY-EDIT
App_standard.event(‘KEY-EDIT’);
這個觸發器處理彈性域或日曆,編輯器操作。
KEY-EXIT
App_standard.event(‘KEY-EXIT’);
這個觸發器處理關閉事件和退出enter-query狀態
KEY-HELP
App_standard.event(‘KEY-HELP’);
這個觸發器呼叫視窗的幫助系統。
LASTRECORD
APP_STANDARD.EVENT(‘LASTRECORD’);
這個觸發器處理選單(Go ->LAST RECORD)事件
MENU_TO_APPCORE
App_standard.event(:global.menu_to_appcore);
這個觸發器支援Special選單
STANDARD_ATTACHMENTS
Atchmt_api.invoke;
這個觸發器處理附件選單或工具按鈕的呼叫
WHEN-WINDOW-CLOSE
Execute_trigger(‘CLOSE_WINDOW’);
這個觸發器集中了form的關閉事件
WHEN-FORM-NAVIGATE
你不能修改這個觸發器,它包含了標準的行為,當最小化的表單被導航到的時候正常化這個表單。
ZOOM
Appcore_custom.event(‘ZOOM’);
這個觸發器處理選單或工具條按鈕’Action,Zoom ’事件。