[SAP ABAP] 选择屏幕事件

发布于:2024-10-16 ⋅ 阅读:(10) ⋅ 点赞:(0)

在SAP中,选择屏幕事件是指用户与SAP系统进行交互时,系统根据用户在屏幕上所做的选择触发相应的事件,这些事件可以包括用户点击按钮、输入数据、选择菜单项等

为了方便演示选择屏幕事件的效果,封装了以下选择屏幕的代码

REPORT z437_test_2024.

TABLES: mara.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  PARAMETERS: p_werks TYPE marc-werks DEFAULT '1710' OBLIGATORY.     " 工厂
  PARAMETERS: p_werks2 TYPE marc-werks DEFAULT '1710'.               " 工厂
  PARAMETERS: p_spras TYPE makt-spras DEFAULT 'EN' OBLIGATORY.       " 语言代码
  PARAMETERS: p_dis RADIOBUTTON GROUP grp1 USER-COMMAND p_dis_comm,
              p_cha DEFAULT 'X' RADIOBUTTON GROUP grp1.
  SELECT-OPTIONS: s_matnr FOR mara-matnr.                            " 物料编码
SELECTION-SCREEN END OF BLOCK b1.

输出结果:

1.INITIALIZATION

INITIALIZATION事件是程序的初始化事件,用于设定选择屏幕的初始值

REPORT z437_test_2024.

TABLES: mara.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  PARAMETERS: p_werks TYPE marc-werks DEFAULT '1710' OBLIGATORY.     " 工厂
  PARAMETERS: p_werks2 TYPE marc-werks DEFAULT '1710'.               " 工厂
  PARAMETERS: p_spras TYPE makt-spras DEFAULT 'EN' OBLIGATORY.       " 语言代码
  PARAMETERS: p_dis RADIOBUTTON GROUP grp1 USER-COMMAND p_dis_comm,
              p_cha DEFAULT 'X' RADIOBUTTON GROUP grp1.
  SELECT-OPTIONS: s_matnr FOR mara-matnr.                            " 物料编码
SELECTION-SCREEN END OF BLOCK b1.

*----------------------------------------------------------------------*
*  DESC: INITIALIZATION 事件
*----------------------------------------------------------------------*
INITIALIZATION.
  p_werks = '1010'.

  s_matnr-low = 'TG10'.
  s_matnr-high = 'TG20'.
  s_matnr-sign = 'I'.
  s_matnr-option = 'BT'.
  APPEND s_matnr.

输出结果:

2.AT SELECTION-SCREEN

AT SELECTION-SCREEN事件是选择屏幕响应事件,可以对选择屏幕上的参数进行校验

REPORT z437_test_2024.

TABLES: mara.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  PARAMETERS: p_werks TYPE marc-werks DEFAULT '1710' OBLIGATORY.     " 工厂
  PARAMETERS: p_werks2 TYPE marc-werks DEFAULT '1710'.               " 工厂
  PARAMETERS: p_spras TYPE makt-spras DEFAULT 'EN' OBLIGATORY.       " 语言代码
  PARAMETERS: p_dis RADIOBUTTON GROUP grp1 USER-COMMAND p_dis_comm,
              p_cha DEFAULT 'X' RADIOBUTTON GROUP grp1.
  SELECT-OPTIONS: s_matnr FOR mara-matnr.                            " 物料编码
SELECTION-SCREEN END OF BLOCK b1.

*----------------------------------------------------------------------*
*  DESC: AT SELECTION-SCREEN  事件
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
  DATA: lv_werks TYPE marc-werks.

  SELECT SINGLE werks
    INTO lv_werks
    FROM t001w
    WHERE werks = p_werks.

  IF sy-subrc <> 0.
    MESSAGE '工厂号无效' TYPE 'E'.
  ENDIF.

输入不存在的工厂号,按下回车,就会响应选择屏幕事件

补充扩展知识

① AT SELECTION-SCREEN ON <field> 是指定字段响应选择屏幕事件,用于为选择屏幕中的单个字段指定校验

REPORT z437_test_2024.

TABLES: mara.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  PARAMETERS: p_werks TYPE marc-werks DEFAULT '1710' OBLIGATORY.     " 工厂
  PARAMETERS: p_werks2 TYPE marc-werks DEFAULT '1710'.               " 工厂
  PARAMETERS: p_spras TYPE makt-spras DEFAULT 'EN' OBLIGATORY.       " 语言代码
  PARAMETERS: p_dis RADIOBUTTON GROUP grp1 USER-COMMAND p_dis_comm,
              p_cha DEFAULT 'X' RADIOBUTTON GROUP grp1.
  SELECT-OPTIONS: s_matnr FOR mara-matnr.                            " 物料编码
SELECTION-SCREEN END OF BLOCK b1.

*----------------------------------------------------------------------*
*  DESC: AT SELECTION-SCREEN ON <field> 事件
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON p_werks2.
  DATA: lv_werks TYPE marc-werks.

  SELECT SINGLE werks
    INTO lv_werks
    FROM t001w
    WHERE werks = p_werks2.

  IF sy-subrc <> 0.
    MESSAGE '工厂号无效' TYPE 'E'.
  ENDIF.

输入不存在的工厂号,按下回车,就会响应该选择屏幕事件

② AT SELECTION-SCREEN ON VALUE-REQUEST FOR [field] 事件用于对指定的field提供值输入帮助

REPORT z437_test_2024.

PARAMETERS: p_path TYPE localfile.

*----------------------------------------------------------------------*
*  DESC: AT SELECTION-SCREEN ON VALUE-REQUEST FOR [field] 事件
*----------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path.
  CALL FUNCTION 'F4_FILENAME'
*   EXPORTING
*     PROGRAM_NAME        = SYST-CPROG
*     DYNPRO_NUMBER       = SYST-DYNNR
*     FIELD_NAME          = ' '
   IMPORTING
     FILE_NAME            = p_path.

输出结果:

点击或者按下F4就会弹出文件选择框

弹出选择框后,就可以选择本地文件上传到sap后台处理

3.AT SELECTION-SCREEN OUTPUT

AT SELECTION-SCREEN OUTPUT事件是屏幕输出响应事件,可动态修改选择屏幕

REPORT z437_test_2024.

TABLES: mara.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  PARAMETERS: p_werks TYPE marc-werks DEFAULT '1710' OBLIGATORY.     " 工厂
  PARAMETERS: p_werks2 TYPE marc-werks DEFAULT '1710'.               " 工厂
  PARAMETERS: p_spras TYPE makt-spras DEFAULT 'EN' OBLIGATORY.       " 语言代码
  PARAMETERS: p_dis RADIOBUTTON GROUP grp1 USER-COMMAND p_dis_comm,
              p_cha DEFAULT 'X' RADIOBUTTON GROUP grp1.
  SELECT-OPTIONS: s_matnr FOR mara-matnr.                            " 物料编码
SELECTION-SCREEN END OF BLOCK b1.

*----------------------------------------------------------------------*
*  DESC: AT SELECTION-SCREEN OUTPUT 事件
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
  IF p_dis = 'X'.
    LOOP AT SCREEN.
      IF screen-name = 'P_SPRAS'.
        screen-input = 0.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ENDIF.

如果参数P_DIS = X,将屏幕上的P_SPRAS参数设置为不可输入

4.START-OF-SELECTION

START-OF-SELECTION事件主程序事件,该事件是在执行按钮后触发的,主要用于从数据库中提取数据

REPORT z437_test_2024.

TABLES: mara.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  PARAMETERS: p_werks TYPE marc-werks DEFAULT '1710' OBLIGATORY.     " 工厂
  PARAMETERS: p_werks2 TYPE marc-werks DEFAULT '1710'.               " 工厂
  PARAMETERS: p_spras TYPE makt-spras DEFAULT 'EN' OBLIGATORY.       " 语言代码
  PARAMETERS: p_dis RADIOBUTTON GROUP grp1 USER-COMMAND p_dis_comm,
              p_cha DEFAULT 'X' RADIOBUTTON GROUP grp1.
  SELECT-OPTIONS: s_matnr FOR mara-matnr.                            " 物料编码
SELECTION-SCREEN END OF BLOCK b1.

TYPES:BEGIN OF ty_item,
  matnr TYPE marc-matnr,
  werks TYPE marc-werks,
  meins TYPE mara-meins,
  maktx TYPE makt-maktx,
END OF ty_item.

DATA: ls_info TYPE ty_item,
      lt_info TYPE STANDARD TABLE OF ty_item.

*----------------------------------------------------------------------*
*  DESC: START-OF-SELECTION 事件
*----------------------------------------------------------------------*
START-OF-SELECTION.
  " 提取数据
  SELECT marc~matnr  " 物料号
         marc~werks  " 工厂号
         mara~meins  " 单位
         makt~maktx  " 物料描述
    INTO CORRESPONDING FIELDS OF TABLE lt_info
    FROM marc
    INNER JOIN mara
    ON marc~matnr = mara~matnr
    INNER JOIN makt
    ON marc~matnr = makt~matnr
    AND spras = p_spras
    UP TO 5 ROWS   " 限制条数
    WHERE werks = p_werks
    AND marc~matnr IN s_matnr
    ORDER BY maktx DESCENDING.

 " 对内表数据进行排序
  SORT lt_info BY maktx.

 " 删除物料描述等于空的数据
  DELETE lt_info WHERE maktx = ''.


* 循环内表lt_info插入到工作区ls_info
LOOP AT lt_info INTO ls_info.
  WRITE: /2(34)  ls_info-matnr COLOR 5 INVERSE,  " 物料号
          36(24) ls_info-werks HOTSPOT,          " 工厂号
          60(28) ls_info-meins,                  " 单位
          88(50) ls_info-maktx.                  " 物料描述
ENDLOOP.

输出结果:

5.END-OF-SELECTION

END-OF-SELECTION事件用于START-OF-SELECTION事件执行完成后,但输出屏幕还未显示之前,一般用于执行结果校验或者ALV显示等

REPORT z437_test_2024.

TABLES: mara.

SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
  PARAMETERS: p_werks TYPE marc-werks DEFAULT '1710' OBLIGATORY.     " 工厂
  PARAMETERS: p_werks2 TYPE marc-werks DEFAULT '1710'.               " 工厂
  PARAMETERS: p_spras TYPE makt-spras DEFAULT 'EN' OBLIGATORY.       " 语言代码
  PARAMETERS: p_dis RADIOBUTTON GROUP grp1 USER-COMMAND p_dis_comm,
              p_cha DEFAULT 'X' RADIOBUTTON GROUP grp1.
  SELECT-OPTIONS: s_matnr FOR mara-matnr.                            " 物料编码
SELECTION-SCREEN END OF BLOCK b1.

TYPES:BEGIN OF ty_item,
  matnr TYPE marc-matnr,
  werks TYPE marc-werks,
  meins TYPE mara-meins,
  maktx TYPE makt-maktx,
END OF ty_item.

DATA: ls_info TYPE ty_item,
      lt_info TYPE STANDARD TABLE OF ty_item.

*----------------------------------------------------------------------*
*  DESC: START-OF-SELECTION 事件
*----------------------------------------------------------------------*
START-OF-SELECTION.
  " 提取数据
  SELECT marc~matnr  " 物料号
         marc~werks  " 工厂号
         mara~meins  " 单位
         makt~maktx  " 物料描述
    INTO CORRESPONDING FIELDS OF TABLE lt_info
    FROM marc
    INNER JOIN mara
    ON marc~matnr = mara~matnr
    INNER JOIN makt
    ON marc~matnr = makt~matnr
    AND spras = p_spras
    UP TO 5 ROWS   " 限制条数
    WHERE werks = p_werks
    AND marc~matnr IN s_matnr
    ORDER BY maktx DESCENDING.

 " 对内表数据进行排序
  SORT lt_info BY maktx.

 " 删除物料描述等于空的数据
  DELETE lt_info WHERE maktx = ''.


*---------------------------------------------------------------------*
* END-OF-SELECTION 事件
*---------------------------------------------------------------------*
END-OF-SELECTION.
  " 呈现数据
  cl_demo_output=>display( lt_info ).

输出结果: