12.10. Search help ( F4 )
12.10.1. VALUE CHECK 、 fixed Values 、 Value Table
PARAMETERS p_1 TYPE zmy_dm_200 VALUE CHECK . " 注: SELECT-OPTIONS 沒有此選項
如果選擇屏幕字段參考數據元素所對應的 Domaim 設置了 固定值 ( fixed Values )或 值表 ( Value Table )時,使用 VALUE CHECK 選項后,會驗證輸入值是否在固定值或值表( 若要使值表檢查生效 ,則首先需要將此 Domain 引用到表字段,再對此表字段通過 按鈕進行外鍵分配,並且外鍵一定是來自的值表的主鍵,最后使用 PARAMETERS 定義屏幕參數時要參照此表字段,否則如果只是直接參照所對應的 DataElement 是不起作用, 即 Value Table 一定要經過轉換為 Check Table 后再起作用 )范圍之內
注: 如果要使用 VALUE CHECK 選項,則 Domain 的類型只能是 C 或者 N 類型 , 否則運行會拋異常。另外, 如果未使用該選項,但 F4 Help 還是會出現 (有固定值或檢查表的情況下),但不進行有效性檢查了
12.10.2. 檢查表 Check Table --- Value Table
也可以在 Domain 中指定一個值表( Value Table )作為字段取值范圍的限制,但是與指定 固定值 的方式不同的是:為一個 Domain 簡單地指定一個取值表不會導致用戶的輸入被自動校驗,也不會自動出現 F4 Help 。 只有 通過表外鍵 按鈕將該 Value Table 指定為主表之后,一個值表才能真正成為 Check Table 。所以要想成為真正有效的 Check Table ,必須要做兩個操作:
一是 要為字段對應的 Domain 設置 Value Table (即主表 ,其實這一步不是必須的,在通過 按鈕指定主表時,可以不用指定為字段所參照的元素所對應 Domain 所設置的 Value Table ,而是指定其他的主表也是可以的—— 但最好不要這樣做 , Value Check 時會出其他問題) ,二是 要為表字段通過
為它設置外鍵 。
12.10.3. SE11 檢查表與搜索幫助 關系
當某個表字段有檢查表,並且又有搜索幫助,則 數據一般來自源於檢查表 ,而 F4 的 輸入輸出則由搜索幫助來決定 !
PARAMETERS p_carid TYPE sbook - carrid VALUE CHECK .
PARAMETERS p_cuter TYPE sbook - counter VALUE CHECK .
命中清單中的 ID 列即 CARRID 背景色不是藍色,所以選擇一條時,不會自動填充屏幕字段 P_CARID , 原因是對應的 Search Help 中的 CARRID 參數對應的 EXP 沒有打上鈎:
如果將這個鈎打上,則會相應列背景色會為藍色,且會自動填充, 達到聯動效果 。
一般 當某個外鍵所參照主表的主鍵上如果設置了搜索幫助 (如上面 COUNTER 外鍵所引用的主表主鍵字段 SCOUNTER-COUNTNUM 已分配搜索幫助“ SCOUNTER_CARRIER_AIRPORT ”: ), 則這個主表主鍵上的搜幫助會自動帶到從表中相應外鍵上來 ,請看上面的 SBOOK-COUNTER 外鍵字段的搜索幫助也為“ SCOUNTER_CARRIER_AIRPORT ”,該搜索幫助 決定了整個 F4 Help 處理及顯示過程 (如哪些列將作為聯動查詢條件、哪些列將顯示在 F4 列表中、 F4 列表中的哪些列會輸出到相應屏幕字段中)。另外,雖然主表主鍵上的搜索幫助會帶到相應外鍵上來,但帶過來后還可以修改,比如上面示例中帶過來的搜索幫助中, CARRID 參數所對應的 EXP 沒有鈎上,所以不能使用命中清單中的 ID 列來自動填充示例中的屏幕字段 P_CARID ,所以我們可以新建一個搜索幫助,並將 CARRID 搜索參數所對應的 EXP 鈎上,則可達到自動上屏幕的效果;
另外, 有些外鍵所參照的主表主鍵沒有指定搜索幫助 ,此時參照從表的屏幕字段的 F4 Help 就只有簡單的一列了 (如何讓檢查表 SCURX 中的 CURRDEC 字段也顯示出來,請看后面的 F4 搜索幫助聯動的決定因素 ),如下面 SBOOK-LOCCURKEY 字段:
PARAMETERS p_cur TYPE sbook - LOCCURKEY VALUE CHECK .
12.10.4. F4 搜索幫助聯動的決定因素
上節 SE11 檢查表與搜索幫助關系 中,屏幕字段參考 sbook - LOCCURKEY 時,搜索幫助輸出列表只有簡單一列,如果要讓主表中的 SCURX - CURRDEC 列也顯示出來,則需要為 sbook - LOCCURKEY 字段綁定一個搜索幫助,該搜索幫助數據來源於主表(或檢查表) SCURX ,搜索參數包括 CURRKEY 、 CURRDEC 兩列,並且讓這兩列在 F4 輸出列表中顯示(即在搜索參數“列表”欄位編號):
由於 SBOOK 不能直接修改, ZSBOOK 從 SBOOK 拷貝過來,將搜索幫助 ZSCURX_JZJ 綁定到 ZSBOOK- LOCCURKEY :
PARAMETERS p_cur TYPE zsbook - LOCCURKEY VALUE CHECK .
上面檢查表中的 SCURX-CURRDEC 列(即 F4 中的小數位)已顯示來了,但如何讓其背景色為藍色( 雖然上面已將搜索參數 CURRDEC 的 EXP 打上了鈎,但底色還是白色的 ),即選擇時自動填充到屏幕上去?由於上面在將搜索幫助 ZSCURX_JZJ 綁定到從表字段 zsbook - LOCCURKEY 字段上時,搜索幫助中的搜索參數 CURRDEC (即主表中的字段 SCURX- CURRDEC )在從表 ZSBOOK 找不到相應的外鍵,所以上圖綁定過程中,搜索參數 CURRDEC 為空。但在這里可以手動分配一個,由於在從表 ZSBOOK 中找不到此字段,所以就暫時參照自己 ( 主表 SCURX-CURRDEC) 吧:
如果此時選擇屏幕的代碼還是上面那樣:
PARAMETERS p_cur TYPE zsbook - LOCCURKEY VALUE CHECK .
則 F4 搜索輸出列表中的“小數位”列底色還是白色,但如果 加上 以下屏幕參數,但會變以藍色,並可聯動( 如果搜索幫助的 CURRDEC 參數的 IMP 打上鈎,還可以實現聯動查詢 ):
PARAMETERS p_cur2 TYPE SCURX-CURRDEC VALUE CHECK
此時的下拉框也會只有兩列:
PARAMETERS p_cur3 TYPE zsbook - LOCCURKEY as LISTBOX VISIBLE LENGTH 20 .
所以,聯動的決定性條件是要求選擇屏幕上的字段要參照 SE11 為表字段所綁定搜索幫助過程中 所分配的表字段 ,如下圖中的 zsbook-loccurkey 、 scurx-currdec ,這兩個字段分別與搜索幫助的 CURRKEY 、 CURRDEC 參數綁定了,所以屏幕上參照這兩個表字段時,就會具有聯動效果了:
12.11. 搜索幫助參數說明
2 IMP :輸入參數。表示屏幕上相應字段是否作為搜索幫助的過濾條件(即 報表選擇屏幕上的字段的值是否從報表選擇屏幕上傳遞到搜索幫助中去 )
如果是 F4 字段時,屏幕字段中的值包含“ * ”時,才會將 F4 字段傳遞到 Search Help 中。除開 F4 屏幕字段外,而其他只要是 Link 到了相應的 Search Help 參數的屏幕字段,只要相應屏幕字段中有值,則會傳入到搜索中作為過濾條件(而其他非 F4 屏幕字段所對應的 Help 參數不管是否鈎上 IMP 都會傳遞 ? )
2 EXP :輸出參數,表示 搜索幫助的此列會從搜索幫助中傳遞到報表選擇屏幕 上(表示 F4 選中一條記錄后顯示到屏幕上文本框中的值——背景字段為淺藍色的列的數據會被輸出,輸出的數據可能是多列。注: 只有當 EXP 鈎上且相應字段出現在了屏幕上 ,才會自動填充到相應屏幕字段,如果沒有鈎上——沒鈎上的字段背景色為白色,即使相應參數字段出現在了屏幕上,選擇命中清單時也不會自動填充),且 F4 字段一定要將 EXP 鈎上 (否則選擇后 F4 字段不能上屏) 。
2 LPOS (列表): F4 輸出 命中清單中各列的顯示順序 ,如果為 0 或留空的列則不會顯示
2 SPOS :相應的字段是否在搜索幫助 選擇屏幕上顯示出來 ,在命中清單顯示之前,如果彈出限制對話框,則可以進一步修改那些從選擇屏幕上帶過來的條件值。此數字就是限制搜索幫助選擇條件屏幕字段擺放順序,如果為 0 或留空的列則不會出在限制條件頁中
2 SDis :如果勾選了,則在彈出的限制對話框中對應的字段用戶 不可輸入 ,是只讀的。
12.12. F4IF_SHLP_EXIT_EXAMPLE 幫助出口
12.12.1. 修改數據源
FUNCTION zfvbeln_find_exit .
*"----------------------------------------------------------------------
*"*"Local Interface:
*" TABLES
*" SHLP_TAB TYPE SHLP_DESCT
*" RECORD_TAB STRUCTURE SEAHLPRES
*" CHANGING
*" VALUE(SHLP) TYPE SHLP_DESCR
*" VALUE( CALLCONTROL ) LIKE DDSHF4CTRL STRUCTURE DDSHF4CTRL
*"----------------------------------------------------------------------
" 此內表用於存儲命中清單數據 . 注:字段的名稱一定要與搜索參數名一樣,但順序可以不同,
DATA : BEGIN OF lt_tab OCCURS 0 ,
wbstk TYPE wbstk ,
lfdat TYPE lfdat_v ,
vbeln TYPE vbeln_vl ,
END OF lt_tab .
" 用於存儲從選擇屏幕上傳進的屏幕字段的選擇條件值
DATA : r_vbeln TYPE RANGE OF vbeln_vl WITH HEADER LINE ,
r_lfdat TYPE RANGE OF lfdat_v WITH HEADER LINE ,
r_wbstk TYPE RANGE OF wbstk WITH HEADER LINE ,
wa_selopt LIKE LINE OF shlp - selopt . "
"callcontrol-step 該字段的值是由系統設置,並且你可以在程序中進行修改它。出口函數會在處理的每一步(時間點)都會調用一次
IF callcontrol - step = 'SELECT' . " 如果有彈出限制對話框,則會在彈出限制對話框中點擊確認按鈕后 step 值才為 SELECT
"shlp-selopt 存儲的是經過映射轉換后選擇屏幕上字段的值,而不是直接為
" 選擇屏幕字段名,而是轉映射為 Help 參數名后再存儲到 selopt 內表中,
" 屏幕字段到 Help 參數映射是通過 shlp-interface 來映射的
LOOP AT shlp - selopt INTO wa_selopt .
CASE wa_selopt - shlpfield .
WHEN 'VBELN' . " 由於屏幕字段已映射為了 Help 相應參數,所以這里不是 S_VBELN
MOVE-CORRESPONDING wa_selopt TO r_vbeln .
APPEND r_vbeln .
WHEN 'LFDAT' .
MOVE-CORRESPONDING wa_selopt TO r_lfdat .
APPEND r_lfdat .
WHEN 'WBSTK' .
MOVE-CORRESPONDING wa_selopt TO r_wbstk .
APPEND r_wbstk .
ENDCASE .
ENDLOOP .
" 根據屏幕上傳進的條件查詢數據
SELECT likp ~ vbeln likp ~ lfdat vbuk ~ wbstk INTO CORRESPONDING FIELDS OF TABLE lt_tab
FROM likp INNER JOIN vbuk ON likp ~ vbeln = vbuk ~ vbeln
WHERE likp ~ vbeln IN r_vbeln AND
likp ~ lfdat IN r_lfdat AND
vbuk ~ wbstk IN r_wbstk .
" 該函數的作用是將內表 lt_tab 中的數據轉換成 record_tab ,即將某內表中的數據顯示在命中清單中
CALL FUNCTION 'F4UT_RESULTS_MAP'
TABLES
shlp_tab = shlp_tab
record_tab = record_tab
source_tab = lt_tab
CHANGING
shlp = shlp
callcontrol = callcontrol .
" 注:下一個時間點一定要直接設置為 DISP ,否則命中清單不會有值,也不顯示出來
" 從表面上看, SELECT 時間點下一個就是 DISP 時間點,按理是不需要設置為 DISP ,
" 但如果不設置為 DISP ,出口函數在執行完后,系統會轉入 DISP 時間點執行(即再次調用此出口函數)
" ,但再次進入此出口函數時, record_tab 內表已經被清空了(是否可以通過判斷 callcontrol-step 的值來決定走什么新的邏輯代碼來解決此問題?)。如果這里直接設置為 DISP ,就好比欺騙了系統一樣,告訴系統當前執行的正是 DISP 時間點,而不是 SELECT ,系統就不會再轉到 DISP 時間點了而是直接顯示
callcontrol - step = 'DISP' . "DISP : 在命中清單顯示之前調用 ,表示數據已經查出,下一步就該顯示了。該時間用於控制搜索幫助的輸出結果。例如,在輸出搜索結果時對用戶檢查權限,刪除未授權的數據
ENDIF .
ENDFUNCTION .
12.12.2. 刪除重復
FUNCTION zeh_lxsecond .
IF callcontrol - step = 'DISP' .
SORT RECORD_TAB .
DELETE ADJACENT DUPLICATES FROM RECORD_TAB COMPARING ALL FIELDS . "zsecond.
EXIT .
ENDIF .
ENDFUNCTION .
12.13. 搜索幫助優先級
先 P ROCESS O N V ALUE-REQUEST , AT SELECTION-SCREEN ON VALUE-REQUEST
再 PARAMETERS/ SELECT-OPTIONS MATCHCODE OBJECT
先 檢查表 Check Table ,再 表 (或 結構 ) 字段是否 綁定 了 搜索幫助
先 data element 是否 綁定 了 幫助 ,再 domain 是否存在 fixed values
最后才是 DATS 、 TIMS
Domain 只設置 Value Table 也可以出 F4 ,同時 Data Element 綁定了搜索幫助,則 DataElement 上綁定的搜索幫助優先於 Domain 上的 Value Table????????
12.14. 搜索幫助創建函數
在屏幕的 ON VALUE-REQUEST 事件里可以通過下面幾個函數來創建搜索幫助:
F4IF_ FIELD _VALUE_REQUEST : 函數的作用是在運行時,可以 動態 的為某個屏幕字段 指定 Search Help ,這個被引用的 Help 來自某個表(或結構)字段上綁定的 Help
F4IF_ INT_TABLE _VALUE_REQUEST : 在程序運行時, 將某個內表動態的用作 Search help 的數據來源 ,即使用該函數可以將某個內表轉換為 Search help ,可實現聯動效果
TR_F4_HELP : 簡單實現 Search Help ,數據來源於內表