2017-08-07 94 views
1

我有以下程序。如果使用了TABBED BLOCK,則必須忽略必須的字段檢查

REPORT zz_tab_strip_obligatory. 

SELECTION-SCREEN BEGIN OF TABBED BLOCK tab FOR 20 LINES. 
SELECTION-SCREEN TAB (54) tab1 USER-COMMAND tab1 DEFAULT SCREEN 100. 
SELECTION-SCREEN TAB (54) tab2 USER-COMMAND tab2 DEFAULT SCREEN 200. 
SELECTION-SCREEN END OF BLOCK tab. 

SELECTION-SCREEN BEGIN OF SCREEN 100 AS SUBSCREEN. 
PARAMETERS: 
    p1 TYPE i. 
SELECTION-SCREEN END OF SCREEN 100. 

SELECTION-SCREEN BEGIN OF SCREEN 200 AS SUBSCREEN. 
PARAMETERS: 
    p2 TYPE i OBLIGATORY. 
SELECTION-SCREEN END OF SCREEN 200. 

INITIALIZATION. 
    tab1 = 'Tab1'. 
    tab2 = 'Tab2'. 

第一個選項卡沒有必填字段。第二個是另一方面。

我遇到的問題是如果用戶沒有進入第二個選項卡,而是立即用F8啓動程序,那麼根本不會執行參數p2的強制性檢查。它看起來像AT SELECTION-SCREEN這樣的所有事件僅對當前顯示的子屏幕的選項卡執行。

有什麼辦法可以解決它嗎?我目前的解決方案現在很遺憾地擺脫OBLIGATORY關鍵字並在START-OF-SELECTION(我的真實程序有很多選項卡)之後進行檢查。

回答

1

我不認爲有一個直接的解決方案,選擇屏幕的義務問題。 Here是一個類似的話題。但是,您可以將所有強制參數存儲在內部表中。在開始選擇時,通過它們循環並檢查它們。

DATA: BEGIN OF gt_obl_fields OCCURS 0, 
    fname TYPE char10, 
    ftext type char50, 
END OF gt_obl_fields. 

INITIALIZATION. 
tab1 = 'Tab1'. 
tab2 = 'Tab2'. 

gt_obl_fields-fname = 'P2'. 
gt_obl_fields-ftext = text-001. 
APPEND gt_obl_fields. 
"... 
START-OF-SELECTION. 
    LOOP AT gt_obl_fields . 
    ASSIGN (gt_obl_fields-fname) TO FIELD-SYMBOL(<fs_field>). 
    IF <fs_field> IS ASSIGNED AND <fs_field> IS INITIAL.. 
     CONCATENATE gt_obl_fields-ftext 'field must be filled!' INTO data(lv_message). 
     MESSAGE lv_message TYPE 'E'. 
    ENDIF. 
    ENDLOOP. 
+2

感謝您的答案,但這是我實際上正在做的解決方法。很難相信,如果沒有擺脫'OBLIGATORY'標記,就無法以其他更好的方式處理這個問題。 – Jagger