12.16. 動態修改屏幕
選擇屏幕、對話屏幕都有對應的SCREEN內表,下面是幾個重要屬性:
NAME:Name of the screen field。如果參數是select-options類型參數,則參數名以LOW與HIGH后綴來區分。
GROUP1:選擇屏幕元素通過MODIF ID選項設置GROUP1(對話屏幕通過屬性設置),將屏幕元素分為一組,方便屏幕的元素的批量修改
REQUIRED:控制文本框、下拉列表屏幕元素的必輸性,使用此屬性后會忽略OBLIGATORY選項。取值如下:
0:不必輸,框中前面也沒有鈎
1:必輸,框中前面有鈎,系統會自動檢驗是否已輸入,相當於OBLIGATORY選項
2:不必輸,但框中前面有鈎,系統不會檢查是否已輸入,此時需要手動檢驗
INPUT:控制屏幕元素(包括復選框、單選框、文本框)的可輸性
ACTIVE:控制屏幕元素的可見性
REQUIRED選項的應用:該選項可以解決這個問題:在點擊某個單選框(p_rd1)后顯示某個必輸字段(p_lclfil),但當這個必輸框顯示出來后,如果點擊p_rd2想隱藏它時,此時輸入框中必須有值,否則系統會自動檢驗要求重新輸入。現要求輸入框沒有輸入值的情況下,也可在點擊p_rd2時隱藏它,則解決的辦法是:將輸入框的這個屬性設置為2(顯示必須的鈎,但系統不會自動進行必輸驗證),去掉OBLIGATORY選項(不去掉也會被忽略),並在AT SELECTION-SCREEN ON field事件里時手動進行為空驗證
"一定要設置 USER-COMMAND ,否則點擊之后,不會觸發屏幕PAI事件,PAI事件不觸發則會導致
"屏幕的AT SELECTION-SCREEN OUTPUT也就不會被觸發(非執行按鈕的FunCode觸發時都會刷新
"屏幕,所以再次顯示屏幕時再次執行PBO)
PARAMETERS p_rd1 RADIOBUTTON GROUP gp1 USER-COMMAND mxx."用來隱藏 p_lclfil
PARAMETERS p_rd2 RADIOBUTTON GROUP gp1 DEFAULT 'X'."用來顯示 p_lclfil
"當通過程序動態修改屏幕元素屬性 required 后,會忽略掉這里的 OBLIGATORY 選項
*PARAMETERS p_lclfil(128) AS LISTBOX VISIBLE LENGTH 20 MODIF ID mxy OBLIGATORY .
PARAMETERS p_lclfil(128) MODIF ID mxy OBLIGATORY .
PARAMETERS: c AS CHECKBOX."沒什么作用,用來測試 CHECKBOX 的可輸入性
"當 C2 被鈎選時,屏幕上的其他輸入元素均不可輸入
PARAMETERS: c2 AS CHECKBOX USER-COMMAND ddd DEFAULT 'X'.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN .
"當 C2 沒有鈎選時,其他元素都設置為可輸入
IF screen-name <> 'C2' AND c2 IS INITIAL .
screen-input = 1.
MODIFY SCREEN.
ELSEIF screen-name <> 'C2' AND c2 IS NOT INITIAL .
screen-input = 0."C2鈎選時,所以屏幕輸入元素禁止輸入
MODIFY SCREEN.
ENDIF.
"控制下拉列表(文本框也是一樣)的必輸性:外觀上打鈎,但不自動校驗
IF p_rd2 = 'X' AND screen-group1 = 'MXY'.
"顯示
screen-active = '1'.
* screen-input = '1'."顯示前設為可輸入
screen-required = '2'."外觀上打鈎,但不自動校驗
MODIFY SCREEN.
ELSEIF screen-group1 = 'MXY'. "
"隱藏
screen-active = '0'.
screen-required = '2'.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
AT SELECTION-SCREEN ON p_lclfil.
IF p_rd2 IS NOT INITIAL"手動檢驗:但當點擊單選按鈕與復選框 C2 時,不校驗
AND sy-ucomm <> 'MXX' AND sy-ucomm <> 'DDD' AND p_lclfil IS INITIAL.
MESSAGE e055(00).
ENDIF.