在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 ).
输出结果: