1. 程式人生 > >Form技巧:如果在輸入Item之後,可以自動執行GO_BLOCK等內建函式

Form技巧:如果在輸入Item之後,可以自動執行GO_BLOCK等內建函式

很多時候,我們想實現這樣子的操作效果:

當向一個特定的Item輸入資料之後,自動觸發一系列的動作,例如GO_BLOCK,然後Loop這個Block,向這個Block維護一定的值(或者檢查值)。這樣子可以很大程度方便User操作(因為是自動操作的)

但是,眾所周知,如果在WHEN-VALIDATE-ITEM等觸發器用GO_BLOCK等導航的內建函式,會報錯:FRM-40737存在非法的受限過程。因為驗證的觸發器是不可以導航到別的記錄的(大部分觸發器都不可以)

這裡發現一個觸發器可以達到這個效果:KEY-NEXT-ITEM

這個觸發器KEY-NEXT-ITEM是當用戶向對應的Item輸入資料,然後點Tab

按鍵或者Enter按鍵(當然,畫面沒有Enter就直接呼叫的按鈕)的時候,會觸發這個觸發器。而這個觸發器是可以隨意做一些我們想做的動作。例如跳到別的Item,別的Block等等。

但是,用這個觸發器的程式猿會發現,如果使用者錄入資料的導航方式不是:向特定的Item輸入值之後,用鍵盤Tab(或者Enter)導航到下一個Item;而是用滑鼠直接點選,那是觸發不了KEY-NEXT-ITEM事件,從而導致程式有隱含的bug

怎麼辦?這裡給出一個解決方案,雖然不是最好的,但是卻是可以用的:對於這個Item,禁用滑鼠導航的操作方式!

如何禁用?其原理:利用當用戶點Tab按鍵的時候,觸發器的順序是:先觸發KEY-NEXT-ITEM

;再觸發WHEN-VALIDATE-ITEM。當用戶直接用滑鼠導航的時候,只是觸發WHEN-VALIDATE-ITEM。所以在WHEN-VALIDATE-ITEM下手即可,用RAISE FORM_TRIGGER_FAILURE;禁用。

實現步驟:

1 增加一個引數::PARAMETER.CURRENT_KEY_MODE。目的是為了區分使用者的錄入之後,導航的方式。

2 WHEN-VALIDATE-ITEM觸發器直接寫下面的程式碼:

Begin

---當有變更,而且CURRENT_KEY_MODE(輸入之後的導航型別)不是KEY-NEXT-ITEM的時候,必須用tab按鍵或者enter導航!

       FND_MESSAGE.DEBUG('WHEN-VALIDATE-ITEM1');

IF :MDS_CONTROL.SCHEDULE_DATE IS NOT NULL AND NVL(:PARAMETER.CURRENT_KEY_MODE,'WHEN-VALIDATE-ITEM') <> 'KEY-NEXT-ITEM' THEN

FND_MESSAGE.SET_STRING('請注意:該欄位輸入之後,請按Tab按鍵或者Enter按鍵導航!');

FND_MESSAGE.HINT;

RAISE FORM_TRIGGER_FAILURE;---禁止使用者用滑鼠點選導航!

  END IF;

       FND_MESSAGE.DEBUG('WHEN-VALIDATE-ITEM2');

End;

3 然後在KEY-NEXT-ITEM增加程式碼:

Declare

       l_cur_record Number;

Begin

       FND_MESSAGE.DEBUG('KEY-NEXT-ITEM1');

If :MDS_CONTROL.SCHEDULE_DATE Is Not Null Then

       :PARAMETER.CURRENT_KEY_MODE := 'KEY-NEXT-ITEM';

              Go_Block('XYG_MANUFACTURE_NEED');

              l_cur_record := :SYSTEM.cursor_record;

              First_Record;

              Loop

                     If Nvl(:XYG_MANUFACTURE_NEED.CHK,'N')='Y' AND NVL(:XYG_MANUFACTURE_NEED.SCHEDULE_DATE,SYSDATE) <> :MDS_CONTROL.SCHEDULE_DATE

                            AND NVL(:XYG_MANUFACTURE_NEED.PROCESS_STATUS,'N') = 'Y'  ---沒稽核的不可以預排

                              Then

                             :XYG_MANUFACTURE_NEED.SCHEDULE_DATE := :MDS_CONTROL.SCHEDULE_DATE;

                             ---2011-10-19 samt add

                             :XYG_MANUFACTURE_NEED.SCHEDULE_USER_ID := FND_GLOBAL.USER_ID;

                      :XYG_MANUFACTURE_NEED.SCHEDULE_USER :=SUBSTRB( XYG_PUB_COMMON_PKG.GET_FND_FULL_NAME(FND_GLOBAL.USER_ID,SYSDATE,0),1,240) ;--FND_GLOBAL.USER_NAME;

                     End If;

                     Exit When :SYSTEM.LAST_RECORD='TRUE';              

                     Next_Record;               

              End Loop;

               --:MDS_CONTROL.SCHEDULE_DATE  := NULL; ---清空

              Go_record(l_cur_record);

       :PARAMETER.CURRENT_KEY_MODE := 'WHEN-VALIDATE-ITEM';

End If;

       FND_MESSAGE.DEBUG('KEY-NEXT-ITEM2');

End;

----2014.9.26更新:

有個問題:

 form header block中的一個item值發生變化,自動刪除 line block中的值,這個你一般怎麼做的?
一個辦法是: 先增加一個對應要核對頭Item是否發生變化的判斷Item,可以叫ITEM_COPY之類的,非資料塊的。
在Key-commit的時候,再判斷這個頭的ITEM_COPY是否<>ITEM,如果是,則自動刪除行的內容。
因為KEY-COMMIT是可以實現GO_BLOCK,清除BLOCK等動作。
 另外,在使用者試圖進入到行BLOCK的時候,如果頭的ITEM_COPY是否<>ITEM,則提醒使用者:這個ITEM的值發生變化了,請儲存。
就可以實現這個效果了。 另外一個辦法:  還是增加一個ITEM_COPY(比對是否有做修改嘛,這個是必須的),然後在被修改的ITEM的WHEN-VALIDATE-ITEM觸發器裡面,判斷是否值被修改(ITEM_COPY<>ITEM),如果是,則自動在資料庫DELETE記錄,並且標識一個有自動做了DELETE記錄的標識(可以用PARAMETER做,要考慮多個頭的資料行的切換的問題。)
然後當用戶點到行Block的時候,系統判斷上面的(是否有自動做了DELETE記錄的標識),如果是=Y,則自動重新整理行的BLOCK即可。
這樣子的話,就可以完全防呆了,反正有做了修改,DB資料庫一定會刪除記錄。只不過對於使用者來說重新整理動作晚了一點而已。  其實可以給個提示  當刪掉行資料之後,直接提示:
您已經修改了這個值,系統已經在後臺將行記錄清空。請滑鼠點到行塊以確認資料。 
最後的辦法: 這個辦法是我這個帖子說的辦法,但是不是很建議,因為這個辦法閹割了使用者用滑鼠操作畫面的操作模式。

相關推薦

Form技巧如果輸入Item之後可以自動執行GO_BLOCK函式

很多時候,我們想實現這樣子的操作效果: 當向一個特定的Item輸入資料之後,自動觸發一系列的動作,例如GO_BLOCK,然後Loop這個Block,向這個Block維護一定的值(或者檢查值)。這樣子可以很大程度方便User操作(因為是自動操作的)。 但是,眾所周知,如果在W

Julia: “.juliarc.jl” 的妙用設定IDE啟動時自動執行某檔案或某行命令

    此文先感謝JuliaLangQQ群一個朋友的幫助!     比如在用Juno時,需要匯入一些檔案的路徑,作為工作目錄。這些檔案其實,不需要在Juno啟動時,進行人工啟動,完全可以設定為自動模式。也即順帶在啟動julia.exe後,也自動執行一下某些命令或一些檔案,這

從命令列輸入5個整數放入一整型陣列然後列印輸出。要求 如果輸入資料不為整數要捕獲輸入不匹配異常顯示“請輸入整數”;如果輸入資料多餘5個捕獲陣列越界異常顯示“請輸入5個整數”。 無論是否發

從命令列輸入5個整數,放入一整型陣列,然後列印輸出。要求: 如果輸入資料不為整數,要捕獲輸入不匹配異常,顯示“請輸入整數”;如果輸入資料多餘5個,捕獲陣列越界異常,顯示“請輸入5個整數”。無論是否發生異常,都輸出“感謝使用本程式!” import java.util.*;

異常安裝完Hadoop之後命令列輸入hadoop卻找不到命令的解決方法

大多數原因是沒有配置環境變數解決方法 1. vim /etc/profile 2. 把這三條加到proflie檔案的最後export JAVA_HOME=XXXX(在安裝了jdk的前提下,echo $JAVA_HOME可以檢視得到)export HADOOP_HOME=XXX

給一個不多於5位的正整數要求一、求它是幾位數二、逆序打印出各位數字。 【注意 如果輸入的大於了5位數要求使用者重新輸入

給一個不多於5位的正整數,要求:一、求它是幾位數,二、逆序打印出各位數字。【注意: 如果輸入的大於了5位數要求使用者重新輸入】def weishu(num): n=1 while True: num//=10 if(num==0

闌夕-王堅說服馬雲之後還要說服人類

位置 新經濟 國家 工程 吸塵 經濟 李彥宏 無線 信任 據說質問CTO不會寫代碼,最早出自2012年馬雲發在阿裏內網的一張任命王堅為集團CTO的公告貼底下,那是阿裏史上最具爭議的一次人事動作,回帖裏的「不會寫代碼」、「項目一敗塗地」、「當時我就震驚了」排成隊列,齊刷刷的送

draft.js內容清空之後游標的位置會錯亂

如果編輯器在沒有失焦的情況下(比如, 使用快捷鍵), 清空編輯框內容 , 替換一個空的editorState, 這時候再輸入內容,游標會出現跑到文字前面去, 以及各種游標錯亂的情況 解決問題的關鍵在於 切換內容的時候,讓編輯器失去焦點 切換完成後,再重新focus

練習十五要求獲取輸入的內容並利用條件運算付的巢狀方式完成該題目

題目:學習成績>=90分的同學用A表示,60-89分之間的用B表示,60分以下的用C表示 1 inputscort = input("學生的成績:") 2 if inputscort.isdigit(): 3 inputscort = int(inputscort) 4

Nodejsnpm run build之後dist\index.html頁面在火狐中可以正常顯示登入頁面並登入成功在Chrome中可以正常顯示登入頁面登入失敗

問題描述:Nodejs:npm run build之後,dist\index.html頁面在火狐中可以正常顯示登入頁面並登入成功,在Chrome中可以正常顯示登入頁面,登入失敗   解決方法:將打包後的dist\index.html放到http伺服器上執行就可以登入了。   總結:

Nodejsnpm run build之後distindex.html頁面在火狐中可以正常顯示登錄頁面並登錄成功在Chrome中可以正常顯示登錄頁面登錄失敗

服務 index set npm 解決方法 本地 流程 html csdn 問題描述:Nodejs:npm run build之後,dist\index.html頁面在火狐中可以正常顯示登錄頁面並登錄成功,在Chrome中可以正常顯示登錄頁面,登錄失敗 解決方法:將打包

Excel辦公技巧Excel表格許可權設定這方法厲害

excel中如何做到只能輸入,不能修改。根據小編理解應該是有條件的不能修改,萬一第1次就輸入錯了呢?下面小編就給同學們做一個“稽核”後就無法再修改的示例。 一、效果演示 1、你在表格中輸入了銷售記錄 2、負責“稽核”的同事開啟你的表格,檢查無誤後在E列選擇了“已稽核”。 3、你還可以再新增

實現功能點選選項之後篩選出對應的產品

實現功能:點選選項之後,篩選出對應的產品 1.注意替換後臺提供的url 2.beforeSend: function(){       $("#xunhuan2").html("");    }, 實現在傳送前,清空內容 3.html

python字典使用者輸入keys值對應輸出相應的values值

莫斯文電碼 A .- B … C -.-. D -… E . F …-. G --. H … I … J .— K -.- L .-… M – N -. O — P .–. Q --.- R .-. S … T - U …- V …- W .– X -…- Y

c語言根據輸入的分數判斷其所在的等級使用switch語句

#include<stdio.h> int main() { int score; char grade; printf("請輸入分數:"); scanf("%d",&score); int i; i=score/10; while(sco

技巧cin輸入字串的總結

cin輸入字串的總結: 遇空字元(包括空格、回車、TAB)表示一個輸入的結束,連續的空字元會被忽略。 1、測試空格作為結束 程式程式碼如下: #include "iostream" using namespace std; int main(){ char str

Pycharm技巧一鍵加引號快速加引號批量加引號

Pycharm 一鍵加引號,快速加引號,批量加引號,自定義加引號 最近因為工作需要寫了點指令碼,有時候在爬取的時候需要將瀏覽器中的Hearders 複製到Pycharm中使用, 但是複製過來的格式不是需要的鍵值格式,挨個手動敲鍵盤太累,畢竟咱們寫指令碼就是為了解放雙手(手動滑稽): 解決方式

Qt實用技巧Qt併發伺服器通訊受同一時刻最大執行緒數限制(筆者本本同一時刻600多)

需求        預言專案需要寫個qt伺服器,終端與qt伺服器完成socket通訊,因存在多個裝置,單個傳輸檔案大小比較大,所以做多執行緒併發。實現原理        客戶端:固定client的執行緒數量,單個執行緒按照設定的間隔不斷髮送資料給伺服器,並接收伺服器的執行緒指

給定一個字串要求輸入英文語句輸出英文語句中每個單詞在字串中出現的次數。

def geshu(src): n=0; str1 = src.split(); len1=len(str1); for s in str1: n = 0; for i in range(len1):

Python爬蟲模擬登入(三)手動輸入驗證碼登入

拿到了引數password,還差一個驗證碼;imgurl表示驗證碼圖片地址;接收圖片並顯示;等待輸入驗證碼後提交post;    imgbuf = s.get(imgurl).content #