🚀 ABAP Mastery: How to Design Dynamic & Interactive Selection Screens

  • Home
  • Sap
  • 🚀 ABAP Mastery: How to Design Dynamic & Interactive Selection Screens

In the world of SAP development, a great Report program starts with an exceptional Selection Screen.

Many developers stop at stacking basic PARAMETERS and SELECT-OPTIONS. However, true enterprise-grade applications demand flexible, intuitive interactions:
✅ Dynamically showing/hiding blocks based on user choices.
✅ Real-time population of dropdowns (Listboxes).
✅ Custom action buttons integrated into the toolbar.
✅ Smart field attribute control (Read-only/Mandatory logic).

Today, I’m sharing a robust ABAP Selection Screen design pattern I’ve developed. This code demonstrates how to leverage MODIF IDAT SELECTION-SCREEN OUTPUT, and the VRM function group to build a highly interactive query interface.

💡 Key Technical Highlights:

1️⃣ Dynamic Block Visibility
By combining RADIOBUTTON GROUP with SCREEN-GROUP1 (MODIF ID), we dynamically toggle visibility of different business sections within the AT SELECTION-SCREEN OUTPUT event.
👉 Use Case: Users see only basic fields for a “General Query,” but additional filters automatically expand when “Advanced Analysis” is selected.

2️⃣ Runtime Listbox Population
Instead of hardcoding domain values, we use the VRM_SET_VALUES function module to populate dropdowns (e.g., Company Codes, Material Types) dynamically during INITIALIZATION or specific events. This makes maintenance effortless.

3️⃣ Custom Interaction Buttons
Beyond standard execution, I’ve added custom PUSHBUTTONs (Preview, Refresh, Reset) directly on the screen and extended functionality to the standard application toolbar using SELECTION-SCREEN FUNCTION KEY. This provides a GUI-like experience within the selection screen.

4️⃣ Smart Validation & Feedback
Using AT SELECTION-SCREEN, we capture user actions instantly. For example, if a “Mandatory” checkbox is ticked but no date is entered, the system triggers an immediate error message, preventing unnecessary database hits and improving UX.


*&---------------------------------------------------------------------*
*& Program Name     : YDEMO_SELECTION_SCREEN
*& Program Purpose  : YDEMO_SELECTION_SCREEN
*& Author           : SUN HUIMING
*& Date Written     : 2014/12/04 (updated demo integration)
*& Note             : ECC 6.0 / ABAP 7.0 compatible
*&---------------------------------------------------------------------*
REPORT YDEMO_SELECTION_SCREEN NO STANDARD PAGE HEADING.

*----------------------------------------------------------------------*
*    Type Pool declarations
*----------------------------------------------------------------------*
TYPE-POOLS: SLIS, SSCR, ICON, VRM.

*----------------------------------------------------------------------*
*    Table definition (demo tables)
*----------------------------------------------------------------------*
TABLES: SFLIGHT, SPFLI,SSCRFIELDS.

*----------------------------------------------------------------------*
*    Type definition
*----------------------------------------------------------------------*
TYPES: BEGIN OF TY_OUT,
         INCLUDE TYPE SFLIGHT,        " 航班主数据
       END OF TY_OUT.

*----------------------------------------------------------------------*
*    Data Description
*----------------------------------------------------------------------*
DATA: GT_OUT TYPE TABLE OF TY_OUT,
      GS_OUT TYPE TY_OUT.


" 选择屏幕辅助
DATA: GS_VARIANT TYPE DISVARIANT.

" Listbox demo(公司代码/物料类型演示值)
DATA: GT_BUKRS_VALUES TYPE VRM_VALUES,
      GT_MTART_VALUES TYPE VRM_VALUES.

*----------------------------------------------------------------------*
*    PARAMETERS & SELECT-OPTIONS
*----------------------------------------------------------------------*
" 顶部功能选择区块(含 RADIOBUTTON + General Query 字段 + CheckBox + 按钮行)
SELECTION-SCREEN BEGIN OF BLOCK BLK_SEL WITH FRAME TITLE TEXT-000.
SELECT-OPTIONS: S_CARRID FOR SFLIGHT-CARRID,
              S_CONNID FOR SFLIGHT-CONNID,
              S_PLANET FOR SFLIGHT-PLANETYPE.
PARAMETERS: P_CALLD  NO-DISPLAY.

PARAMETERS: RB_BLK1 RADIOBUTTON GROUP RBG DEFAULT 'X' USER-COMMAND RCHG,
            RB_BLK2 RADIOBUTTON GROUP RBG,
            RB_BLK3 RADIOBUTTON GROUP RBG.


SELECTION-SCREEN ULINE /1(79).
SELECTION-SCREEN COMMENT /1(79) TEXT-C00.
PARAMETERS: ALV_DEF LIKE DISVARIANT-VARIANT.


" 高级子块(仅当 p_adv = X 且 rb_blk1 = X 显示)
SELECTION-SCREEN BEGIN OF BLOCK BLK1A WITH FRAME TITLE TEXT-001.
PARAMETERS: P_REFDOC TYPE CHAR20 MODIF ID A1,
            P_REASON TYPE CHAR30 MODIF ID A1.
SELECTION-SCREEN END OF BLOCK BLK1A.

" 功能按钮行(预览/刷新/重置/帮助/导出)
SELECTION-SCREEN ULINE /1(79).
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 5.
SELECTION-SCREEN PUSHBUTTON (12) TEXT-PRV USER-COMMAND PBPR MODIF ID B1.
SELECTION-SCREEN POSITION 20.
SELECTION-SCREEN PUSHBUTTON (12) TEXT-RFH USER-COMMAND PBRF MODIF ID B1.
SELECTION-SCREEN POSITION 35.
SELECTION-SCREEN PUSHBUTTON (12) TEXT-RST USER-COMMAND PBRS MODIF ID B1.
SELECTION-SCREEN POSITION 50.
SELECTION-SCREEN PUSHBUTTON (12) TEXT-HLP USER-COMMAND PBHL MODIF ID B1.
SELECTION-SCREEN POSITION 65.
SELECTION-SCREEN PUSHBUTTON (12) TEXT-EXP USER-COMMAND PBEX MODIF ID B1.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK BLK_SEL.




" 模板中的主查询区块(SFLIGHT filters)
SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-002.

" General Query(演示:公司代码 Listbox / 过账日期(用航班日期代替)/ demo checkbox)
PARAMETERS: P_BUKRS TYPE BUKRS AS LISTBOX VISIBLE LENGTH 15 MODIF ID B2,
            P_RUN   AS CHECKBOX DEFAULT 'X' MODIF ID B2.
SELECT-OPTIONS: S_FLDATE FOR SFLIGHT-FLDATE MODIF ID B2.
SELECTION-SCREEN COMMENT /1(79) TEXT-C01 MODIF ID B2.

SELECTION-SCREEN END OF BLOCK B2.




" 变式(variant)区块(可选)
SELECTION-SCREEN BEGIN OF BLOCK DISP WITH FRAME TITLE TEXT-003.

" CheckBox + PushButton 同行布局(必输开关 + 演示按钮)
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 1.
PARAMETERS P_REQ AS CHECKBOX DEFAULT ' ' USER-COMMAND CHG MODIF ID B3.
SELECTION-SCREEN COMMENT 12(20) TEXT-REQ MODIF ID B3.

SELECTION-SCREEN POSITION 35.
SELECTION-SCREEN PUSHBUTTON (22) TEXT-PBX USER-COMMAND PBX MODIF ID B3.
SELECTION-SCREEN END OF LINE.

" 其他 CheckBox(高级显示/只读控制)
PARAMETERS: P_ADV AS CHECKBOX DEFAULT ' ' USER-COMMAND CHG MODIF ID B3,
            P_RO  AS CHECKBOX DEFAULT ' ' USER-COMMAND CHG MODIF ID B3.
SELECTION-SCREEN END OF BLOCK DISP.

" === 在“执行”旁增加一个工具栏按钮 ===
SELECTION-SCREEN FUNCTION KEY 1.  " 出现在应用工具栏(Run/F8 附近)
SELECTION-SCREEN FUNCTION KEY 2.  " 出现在应用工具栏(Run/F8 附近)
SELECTION-SCREEN FUNCTION KEY 3.  " 出现在应用工具栏(Run/F8 附近)

*----------------------------------------------------------------------*
*    INITIALIZATION
*----------------------------------------------------------------------*
INITIALIZATION.
  PERFORM FRM_SET_DEFAULT_VALUE.
  PERFORM FILL_LISTBOX_BUKRS.
  PERFORM FILL_LISTBOX_MTART.

*----------------------------------------------------------------------*
*    AT SELECTION-SCREEN OUTPUT
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
  PERFORM FRM_MODIFY_SCREEN.

*----------------------------------------------------------------------*
*    AT SELECTION-SCREEN
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
  PERFORM FRM_INPUT_CHECK.

  " --- 按钮事件 ---
  IF SY-UCOMM = 'PBX'.
    IF P_REQ = 'X'.
      IF P_REFDOC IS INITIAL AND P_REASON IS INITIAL.
        MESSAGE I001(ZDEMO_MSG).                    " Advanced options enabled...
      ELSE.
        MESSAGE I010(ZDEMO_MSG) WITH P_REFDOC P_REASON.
      ENDIF.
    ELSE.
      MESSAGE S009(ZDEMO_MSG) DISPLAY LIKE 'W'.     " No block is selected.(演示)
    ENDIF.
  ENDIF.

  IF SY-UCOMM = 'PBPR'.   " Preview:提示当前块
    CASE 'X'.
      WHEN RB_BLK1.
        MESSAGE I002(ZDEMO_MSG).                    " General Query: Company Code & Posting Date...
      WHEN RB_BLK2.
        MESSAGE I003(ZDEMO_MSG).                    " Material Query(演示消息)
      WHEN RB_BLK3.
        MESSAGE I004(ZDEMO_MSG).                    " Business Partner(演示消息)
      WHEN OTHERS.
        MESSAGE S009(ZDEMO_MSG) DISPLAY LIKE 'W'.
    ENDCASE.
  ENDIF.

  IF SY-UCOMM = 'PBRF'.   " Refresh:刷新下拉值
    PERFORM FILL_LISTBOX_BUKRS.
    PERFORM FILL_LISTBOX_MTART.
    MESSAGE S011(ZDEMO_MSG) DISPLAY LIKE 'I'.
  ENDIF.

  IF SY-UCOMM = 'PBRS'.   " Reset:重置当前块
    PERFORM RESET_CURRENT_BLOCK.
  ENDIF.

  IF SY-UCOMM = 'PBHL'.   " Help
    MESSAGE I012(ZDEMO_MSG).
  ENDIF.

  IF SY-UCOMM = 'PBEX'.   " Export(示例消息;实际导出可接 CSV/ALV 菜单)
    MESSAGE I013(ZDEMO_MSG).
  ENDIF.

*----------------------------------------------------------------------*
*    START-OF-SELECTION
*----------------------------------------------------------------------*
START-OF-SELECTION.
  PERFORM FRM_INITIALIZE_DATA.
  PERFORM FRM_SELECT_DATA.

*----------------------------------------------------------------------*
*    END-OF-SELECTION
*----------------------------------------------------------------------*
END-OF-SELECTION.
  PERFORM FRM_PROCESS_DATA.
  PERFORM FRM_OUTPUT_DATA.

*----------------------------------------------------------------------*
*    ON VALUE-REQUEST / HELP-REQUEST(可按需实现)
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR ALV_DEF.
  " TODO: 实现变式搜索帮助(如需要)

AT SELECTION-SCREEN ON HELP-REQUEST FOR S_PLANET.
  " TODO: 实现计划机型帮助(如需要)

*-----------------------------------------------------------------------
* FORM: 默认值
*-----------------------------------------------------------------------
FORM FRM_SET_DEFAULT_VALUE.

  " 设置工具栏按钮文字(可加图标码,如 @0S@)
  SSCRFIELDS-FUNCTXT_01 = 'Toolbar Action1'.   " 运行旁边的按钮


  " 设置工具栏按钮文字(可加图标码,如 @0S@)
  SSCRFIELDS-FUNCTXT_02 = 'Toolbar Action2'.   " 运行旁边的按钮

  " 设置工具栏按钮文字(可加图标码,如 @0S@)
  SSCRFIELDS-FUNCTXT_03 = 'Toolbar Action3'.   " 运行旁边的按钮


  " 示例:不强制默认值,保留用户输入
ENDFORM.                    "frm_set_default_value

*-----------------------------------------------------------------------
* FORM: 动态屏幕属性(显示/隐藏/只读)
*-----------------------------------------------------------------------
FORM FRM_MODIFY_SCREEN.
  PERFORM TOGGLE_BLOCKS.
  PERFORM APPLY_CHECKBOX_EFFECTS.
ENDFORM.                    "frm_modify_screen

*-----------------------------------------------------------------------
* FORM: 选择屏幕校验
*-----------------------------------------------------------------------
FORM FRM_INPUT_CHECK.
  " 必输:当 p_req = X 时,航班日期必须输入
  IF P_REQ = 'X'.
    IF S_FLDATE[] IS INITIAL.
      MESSAGE E007(ZDEMO_MSG).    " Posting date(航班日期)必输
    ENDIF.
  ENDIF.
ENDFORM.                    "frm_input_check

*-----------------------------------------------------------------------
* FORM: 初始化数据
*-----------------------------------------------------------------------
FORM FRM_INITIALIZE_DATA.
  REFRESH GT_OUT.
ENDFORM.                    "frm_initialize_data

*-----------------------------------------------------------------------
* FORM: 读取数据
*-----------------------------------------------------------------------
FORM FRM_SELECT_DATA.
  SELECT * FROM SFLIGHT
    INTO TABLE GT_OUT
    WHERE CARRID IN S_CARRID
      AND CONNID IN S_CONNID
      AND PLANETYPE IN S_PLANET
      AND FLDATE IN S_FLDATE.
  IF SY-SUBRC <> 0.
    MESSAGE S009(ZDEMO_MSG) DISPLAY LIKE 'W'.  " No block is selected(或无数据)
  ENDIF.
ENDFORM.                    "frm_select_data

*-----------------------------------------------------------------------
* FORM: 处理数据(如需要:联表、计算、转换)
*-----------------------------------------------------------------------
FORM FRM_PROCESS_DATA.
  " DEMO:此处不做复杂处理
ENDFORM.                    "frm_process_data

*-----------------------------------------------------------------------
* FORM: 输出(ALV - SALV)
*-----------------------------------------------------------------------
FORM FRM_OUTPUT_DATA.




ENDFORM.                    "frm_output_data

*-----------------------------------------------------------------------
* FORM: 根据 RADIOBUTTON 切换区块可见性/高级子块
*-----------------------------------------------------------------------
FORM TOGGLE_BLOCKS.
  LOOP AT SCREEN.
    " 功能块 1(MODIF ID B1)
    IF SCREEN-GROUP1 = 'B1'.
      IF RB_BLK1 = 'X'.
        SCREEN-ACTIVE = 1.
      ELSE.
        SCREEN-ACTIVE = 0.
      ENDIF.
    ENDIF.

    " 功能块 2(MODIF ID B2)—演示
    IF SCREEN-GROUP1 = 'B2'.
      IF RB_BLK2 = 'X'.
        SCREEN-ACTIVE = 1.
      ELSE.
        SCREEN-ACTIVE = 0.
      ENDIF.
    ENDIF.

    " 功能块 3(MODIF ID B3)—演示
    IF SCREEN-GROUP1 = 'B3'.
      IF RB_BLK3 = 'X'.
        SCREEN-ACTIVE = 1.
      ELSE.
        SCREEN-ACTIVE = 0.
      ENDIF.
    ENDIF.

    " 高级子块(MODIF ID A1)
    IF SCREEN-GROUP1 = 'A1'.
      IF RB_BLK1 = 'X' AND P_ADV = 'X'.
        SCREEN-ACTIVE = 1.
      ELSE.
        SCREEN-ACTIVE = 0.
      ENDIF.
    ENDIF.

    MODIFY SCREEN.
  ENDLOOP.
ENDFORM.                    "toggle_blocks

*-----------------------------------------------------------------------
* FORM: CheckBox 驱动的字段属性(只读)
*-----------------------------------------------------------------------
FORM APPLY_CHECKBOX_EFFECTS.
  LOOP AT SCREEN.
    IF SCREEN-NAME = 'P_BUKRS'.
      IF P_RO = 'X'.
        SCREEN-INPUT = 0.   " 只读
      ELSE.
        SCREEN-INPUT = 1.
      ENDIF.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.
ENDFORM.                    "apply_checkbox_effects

*-----------------------------------------------------------------------
* FORM: 重置当前块
*-----------------------------------------------------------------------
FORM RESET_CURRENT_BLOCK.
  IF RB_BLK1 = 'X'.
    CLEAR P_BUKRS.
    CLEAR P_RUN.
    REFRESH S_FLDATE.
    CLEAR P_REQ.
    CLEAR P_ADV.
    CLEAR P_RO.
    CLEAR P_REFDOC.
    CLEAR P_REASON.
    " 同时清空主查询块字段
    REFRESH S_CARRID.
    REFRESH S_CONNID.
    REFRESH S_PLANET.
    MESSAGE S014(ZDEMO_MSG) WITH 'General Query' DISPLAY LIKE 'I'.
  ELSEIF RB_BLK2 = 'X'.
    " 演示:无具体字段,提示即可
    MESSAGE S014(ZDEMO_MSG) WITH 'Block 2' DISPLAY LIKE 'I'.
  ELSEIF RB_BLK3 = 'X'.
    MESSAGE S014(ZDEMO_MSG) WITH 'Block 3' DISPLAY LIKE 'I'.
  ELSE.
    MESSAGE S009(ZDEMO_MSG) DISPLAY LIKE 'W'.
  ENDIF.
ENDFORM.                    "reset_current_block

*-----------------------------------------------------------------------
* FORM: 填充公司代码 Listbox(演示值;可替换为 T001)
*-----------------------------------------------------------------------
FORM FILL_LISTBOX_BUKRS.
  DATA: LS_VALUE TYPE VRM_VALUE.

  CLEAR GT_BUKRS_VALUES.
  CLEAR LS_VALUE.

  LS_VALUE-KEY  = '1000'. LS_VALUE-TEXT = '1000 - Head Office'.            APPEND LS_VALUE TO GT_BUKRS_VALUES.
  LS_VALUE-KEY  = '2000'. LS_VALUE-TEXT = '2000 - North China Subsidiary'. APPEND LS_VALUE TO GT_BUKRS_VALUES.
  LS_VALUE-KEY  = '3000'. LS_VALUE-TEXT = '3000 - East China Subsidiary'.  APPEND LS_VALUE TO GT_BUKRS_VALUES.

  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      ID           = 'P_BUKRS'
      VALUES       = GT_BUKRS_VALUES
    EXCEPTIONS
      ID_NOT_FOUND = 1
      OTHERS       = 2.
ENDFORM.                    "fill_listbox_bukrs

*-----------------------------------------------------------------------
* FORM: 填充物料类型 Listbox(演示值;可替换为 T134)
*-----------------------------------------------------------------------
FORM FILL_LISTBOX_MTART.
  DATA: LS_VALUE TYPE VRM_VALUE.

  CLEAR GT_MTART_VALUES.
  CLEAR LS_VALUE.

  LS_VALUE-KEY  = 'FERT'. LS_VALUE-TEXT = 'FERT - Finished Product'.       APPEND LS_VALUE TO GT_MTART_VALUES.
  LS_VALUE-KEY  = 'HALB'. LS_VALUE-TEXT = 'HALB - Semi-finished'.          APPEND LS_VALUE TO GT_MTART_VALUES.
  LS_VALUE-KEY  = 'ROH'.  LS_VALUE-TEXT = 'ROH  - Raw Material'.           APPEND LS_VALUE TO GT_MTART_VALUES.

  CALL FUNCTION 'VRM_SET_VALUES'
    EXPORTING
      ID           = 'P_MTART'    " 若选择屏幕未定义该参数,此调用可删除
      VALUES       = GT_MTART_VALUES
    EXCEPTIONS
      ID_NOT_FOUND = 1
      OTHERS       = 2.
ENDFORM.                    "fill_listbox_mtart

Leave A Comment

Your email address will not be published. Required fields are marked *