文章目录
前言
ABAP语言是SAP系统中最重要和最常用的编程语言之一,而选择屏幕是ABAP程序中常用的一种交互式屏幕类型。在本文中,我们将介绍基于ABAP的选择屏幕以及相关知识点。
一、选择屏幕的基本概念和用途
选择屏幕是ABAP程序中一种常见的交互式屏幕类型,通过该屏幕可以方便用户进行输入,并获取所需的数据信息。选择屏幕通常由一个或多个参数组成,每个参数都与一个输入域相关联,用户可以在该域中输入需要的值。
选择屏幕通常用于以下场景:
- 需要从用户那里获取输入数据的时候;
- 需要对某些特定条件进行筛选,以获取相关的数据信息;
- 需要对数据进行排序或分组操作。
二、选择屏幕常用语法
1.PARAMETERS 参数说明
| 语法 | 说明 |
|---|---|
| DEFAULT 'A' | 设置初始值 |
| LENGTH N | 定义长度,只适用于C,N,X,P |
| DECIMALS des | 指定小数点位数 |
| MEMORY ID pid | 指定SAP内存参数ID |
| MATCHCODE OBJECT mobj | 设定使用Search Help (SE11定义搜索帮助) |
| MODIF ID | 通过screen-group1为屏幕元素分组 |
| NO-DISPLAY | 不显示在画面上 |
| LOWER CASE | 区分大小写(默认大写) |
| OBLIGATORY | 必须输入 |
| AS CHECKBOX | 以复选框形式 |
| RADIOBUTTON GROUP | 以单选按钮形式 |
| VISIBLE LENGTH vlen | 设置显示长度 |
| AS LISTBOX VISIBLE LENGTH vlen | 作为下拉框显示 |
| VALUE CHECK | 开启系统自动检查 |
2.SELECT-OPTIONS参数说明
| 语法 | 说明 |
|---|---|
| DEFAULT 'A' | 初始值 |
| MEMORY ID pid | 指定SAP内存参数ID |
| MATCHCODE OBJECT mobj | 设定使用的Search Help |
| OBLIGATORY | 设定必输项 |
| VISIBLE LENGTH vlen | 设置显示长度 |
| NO-EXTENSION | 隐藏多值输入按钮 |
| NO INTERVALS | 隐藏HIGH 输入部分 |
| NO-DISPLAY | 不显示在画面上 |
| LOWER CASE | 区分大小写(默认大写) |
| DEFAULT val1 [TO val2] [OPTION opt] [SIGN sgn] | 指定默认值 |
3.SCREEN参数说明
| 字段 | 说明 |
|---|---|
| Name | 字段名称,如果参数是select-options类型参数,则参数名以LOW与HIGH后缀来区分。 |
| Gruop | 选择屏幕元素通过MODIF ID 选项设置GROUP1(对话屏幕通过属性设置),将屏幕元素分为一组,方便屏幕的元素的批量修改 |
| Required | 控制文本框、下拉列表屏幕元素的必输性,使用此属性后会忽略OBLIGATORY选项。取值如下: 0:不必输,框中前面也没有钩 1:必输,框中前面有钩,系统会自动检验是否已输入,相当于OBLIGATORY选项 2:不必输,但框中前面有钩,系统不会检查是否已输入,此时需要手动检验 |
| Input | 控制屏幕元素(包括复选框、单选框、文本框)的可输性 |
| Active | 控制屏幕元素的可见性 |
4.AT SELECTION-SCREEN参数说明
| 参数 | 说明 |
|---|---|
| . ... ON field | 对SELECTION SCREEN具体的字段进行校验,若错误则重新输入,其他字段变灰 |
| ... ON END OF sel | SELECT-OPTION触发的事件,用于整个选择表输入结束后各行的检查 |
| . ... OUTPUT | 设置屏幕上画面布局 |
| . ... ON HELP-REQUEST FOR psel_low_high | 当光标位于某屏幕字段时,选择的帮助(F1) |
| ... ON RADIOBUTTON GROUP radi | 单选按钮事件,必须进行整体输入检查 |
| ... ON BLOCK block | 抑制块内输入值 |
| ... ON VALUE-REQUEST FOR psel_low_high | 当光标位于某屏幕字段时,选择的帮助(F4) |
5.SELECTION-SCREEN用法
| 语法1 | SELECTION-SCREEN BEGIN OF LINE. ....END OF LINE. |
|---|---|
| 说明1 | 这条语句的作用是让Begin of line 与End of line之间的部分位于同一行。 |
| 语法2 | SELECTION-SCREEN POSITION XX. |
| 说明2 | 将该语句后面的第一个Screen element定位在这一行的XX位置,最大值为79。值得注意的是,如果同一行中多个Position语句因为空间不够或Element所占空间重叠,将导致Screen创建时的错误,无法激活。此时并无具体的提示。只能仔细观察代码。 |
| 语法3 | SELECTION-SCREEN COMMENT XX(Y) TEXT-XXX FOR FIELD XXX. |
| 说明3 | 在当前行的指定列位置处输出一段文本,For field则表示文本与某个element 关联,当此语句使用时,可以不必设定屏幕的Text element,系统会自动关联。XX表示位置,Y表示长度,注意,如果长度不足,超常的文字将被截掉。此处似乎还有一个小BUG,当Y小于5时,输出的文字字体会变大一号。不知道为什么。
|
| 语法4 | SELECTION-SCREEN SKIP 1. |
| 说明4 | 跳过一行 |
| 语法5 | SELECTION-SCREEN ULINE /1(50). |
| 说明5 | 屏幕上画横线,第一个参数表示屏幕开始的位置,第二个参数表示长度 |
参考链接:https://blog.csdn.net/feijibin/article/details/11682725
三、选择屏幕常用功能
1.字体加亮
代码如下:
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-t01.
SELECTION-SCREEN COMMENT /2(75) t10 MODIF ID m1.
PARAMETERS:p_werks LIKE t001w-werks.
SELECTION-SCREEN END OF BLOCK b1.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF screen-group1 = 'M1'.
screen-intensified = 1.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
INITIALIZATION.
t10 = '字体加亮测试'.
效果示意图:
2.字体加密
代码如下:
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-t01.
PARAMETERS: p_pass(45) LOWER CASE OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF screen-name = 'P_PASS'.
screen-invisible = '1'.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
INITIALIZATION.
效果示意图:

3.增加FUNCTION KEY按钮
代码如下:
TABLES:sscrfields.
SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-t01.
PARAMETERS: p_pass(45) LOWER CASE OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF screen-name = 'P_PASS'.
screen-invisible = '1'.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
AT SELECTION-SCREEN.
IF sscrfields-ucomm = 'FC01'.
MESSAGE '这是一个按钮' TYPE 'I'.
ENDIF.
INITIALIZATION.
CONCATENATE icon_doc_position_proposal: '按钮测试' INTO sscrfields-functxt_01.
效果示意图:


4.设置下拉框
代码如下:
DATA:gt_vrmval TYPE vrm_values.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-t01.
PARAMETERS: p_name TYPE char10 AS LISTBOX VISIBLE LENGTH 15 OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.
INITIALIZATION.
gt_vrmval = VALUE #( ( key = '1' text = '张三' )
( key = '2' text = '李四' )
).
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'P_NAME'
values = gt_vrmval.
效果示意图:

5.控制屏幕字段显示与否
ABAP选择屏幕字段动态显示是一种非常有用的技术,它可以根据用户的输入或其他条件,动态决定选择屏幕上显示的字段列表,从而实现更加灵活和便捷的数据录入和查询。如在在物流系统中,经常需要根据用户输入或其他条件,动态显示订单管理中的各个字段,以便快速地查询、浏览和编辑订单信息;在人力资源管理系统中,通过动态显示员工管理模块中的字段列表,可以快速地浏览、查询和修改员工的个人信息,如岗位、薪资等。
代码如下:
DATA:gt_vrmval TYPE vrm_values.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-t01.
PARAMETERS: p_name TYPE char10 AS LISTBOX VISIBLE LENGTH 15 OBLIGATORY USER-COMMAND usr1.
PARAMETERS: p_text TYPE char50 MODIF ID m1 DEFAULT '选择屏幕控件显示/隐藏测试'.
SELECTION-SCREEN END OF BLOCK b1.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF screen-group1 = 'M1'.
IF p_name = '1'.
screen-active = '1'.
ELSE.
screen-active = '0'.
ENDIF.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
INITIALIZATION.
gt_vrmval = VALUE #( ( key = '1' text = '张三' )
( key = '2' text = '李四' )
).
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'P_NAME'
values = gt_vrmval.
效果示意图:


6.选择屏幕搜索帮助
参考链接:ABAP选择屏幕搜索帮助
7.选择屏幕做窗口被调用
ABAP选择屏幕作为窗口被调用可以实现将一个屏幕作为子屏幕嵌入到另一个屏幕中,从而在视觉上形成一个弹出式的界面。这种方法提供了一个非常方便的方式来修改或增加选择屏幕的布局,同时也提高了程序的用户体验。
代码如下:
*选择屏幕窗口定义
SELECTION-SCREEN BEGIN OF SCREEN 7000 AS WINDOW TITLE TEXT-t01.
PARAMETERS: p_text TYPE char50 MODIF ID m1.
SELECTION-SCREEN END OF SCREEN 7000.
*屏幕窗口调用
CALL SELECTION-SCREEN 7000 STARTING AT 20 5.
IF sy-subrc <> 0.
LEAVE SCREEN.
ENDIF.
效果示意图:

注:此种调用方式当存在选择屏幕时,会和选择屏幕的标准变式按钮等相互影响。
针对这个问题,我们可以采取以下解决方案:
-
使用独立的功能按钮:我们可以在选择屏幕窗口中添加一个独立的功能按钮,用于触发窗口的关闭或其他操作。这样就能够避免和主界面的变式按钮冲突。
-
修改变式按钮的代码:我们可以修改主程序中与变式按钮相关的代码,使其在选择屏幕窗口弹出时隐藏或者禁用,待窗口关闭后再显示或启用。
8.选择屏幕假必输
在实际开发过程中,使用选择屏幕假必输的主要目的是为了防止用户漏输入一些必需的参数或信息,从而导致程序出现错误。因此,将某些字段标记为必输字段可以帮助开发人员更好地控制用户输入,并保证程序的正确性和稳定性。
同时,假必输的功能也可以提升用户体验,使用户更加清楚地知道哪些参数是必须输入的,哪些参数是可选的,从而提高界面的友好性和易用性。
假必输和真必输的区别在于,用户是否真正需要输入该字段。
假必输是指设置某个字段为“必输”状态,但实际上该字段并不是用户必须输入的。开发人员可以通过编码逻辑或者其他手段来避免空值或其他异常情况的出现,从而确保程序正常运行。在这种情况下,开发人员更加关注用户对该字段的输入进行了哪些限制,而并非要求必须有数据输入。
真必输则表示该字段必须由用户输入数据,否则不能继续执行下去。当用户没有输入数据或者数据输入不符合规定,系统会提示并阻止用户进一步操作。通常,真必输用于确保程序执行的正确性和完整性,并避免可能导致系统崩溃或错误的用户输入。
总之,在选择屏幕中,假必输更多用于提升用户友好交互体验,真必输用于确保系统稳定性和程序的正常执行。
代码如下:
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-t01.
PARAMETERS: p_werks TYPE werks_d MODIF ID m1.
SELECTION-SCREEN END OF BLOCK b1.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF screen-group1 = 'M1'.
screen-required = '2'.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
START-OF-SELECTION.
IF p_werks IS INITIAL.
MESSAGE '工厂必输!' TYPE 'S' DISPLAY LIKE 'E'.
STOP.
ENDIF.
效果示意图:

![]()
9.选择屏幕同一行显示复选框或单选按钮
代码如下:
SELECTION-SCREEN BEGIN OF BLOCK pd1 WITH FRAME TITLE TEXT-001 .
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS: p_cb1 RADIOBUTTON GROUP rab1 USER-COMMAND usr1 DEFAULT 'X'.
SELECTION-SCREEN COMMENT (30) t01.
PARAMETERS: p_cb2 RADIOBUTTON GROUP rab1.
SELECTION-SCREEN COMMENT (30) t02.
PARAMETERS: p_cb3 RADIOBUTTON GROUP rab1.
SELECTION-SCREEN COMMENT (30) t03.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK pd1 .
INITIALIZATION.
t01 = '按钮1'.
t02 = '按钮2'.
t03 = '按钮3'.
效果示意图:

10.选择屏幕多页签
代码如下:
TABLES: mara,marc.
"定义子屏幕 100
SELECTION-SCREEN BEGIN OF SCREEN 100 AS SUBSCREEN.
SELECT-OPTIONS: s_matnr FOR mara-matnr.
SELECTION-SCREEN END OF SCREEN 100.
SELECTION-SCREEN BEGIN OF SCREEN 200 AS SUBSCREEN.
SELECT-OPTIONS: s_werks FOR marc-werks.
SELECTION-SCREEN END OF SCREEN 200.
SELECTION-SCREEN BEGIN OF SCREEN 300 AS SUBSCREEN.
SELECT-OPTIONS: s_matkl FOR mara-matnr.
SELECTION-SCREEN END OF SCREEN 300.
"定义一个TAB空间, 取名为MYTAB, 控件高2行, 共分为三个页签.
"三个页签的功能代码分别为push1, push2, push3.
SELECTION-SCREEN: BEGIN OF TABBED BLOCK mytab FOR 2 LINES,
TAB (25) button1 USER-COMMAND push1,
TAB (25) button2 USER-COMMAND push2,
TAB (25) button3 USER-COMMAND push3,
END OF BLOCK mytab.
"为TAB控件分配初始化值
INITIALIZATION.
button1 = '页签1'.
button2 = '页签2'.
button3 = '页签3'.
mytab-prog = sy-repid.
mytab-dynnr = 100.
"为控件页签单击事件, 选择不同页签显示不同子屏幕.
AT SELECTION-SCREEN.
CASE sy-ucomm.
WHEN 'PUSH1'.
mytab-dynnr = 100.
mytab-activetab = 'BUTTON1'.
WHEN 'PUSH2'.
mytab-dynnr = 200.
mytab-activetab = 'BUTTON2'.
WHEN 'PUSH3'.
mytab-dynnr = 300.
mytab-activetab = 'BUTTON3'.
ENDCASE.
"处理各个屏幕的触发
START-OF-SELECTION.
IF mytab-dynnr = 100.
ELSEIF mytab-dynnr = 200.
ELSEIF mytab-dynnr = 300.
ENDIF.
效果示意图:



11.选择屏幕写入备注
参考链接https://blog.csdn.net/fengxin_/article/details/107121465
12.选择屏幕做子屏幕嵌入
代码如下:
SELECTION-SCREEN BEGIN OF SCREEN 100 AS SUBSCREEN.
PARAMETERS:p_werks TYPE mard-werks OBLIGATORY.
SELECT-OPTIONS: s_matnr FOR mard-matnr.
SELECTION-SCREEN END OF SCREEN 100.


效果示意图:

本文详细介绍了ABAP编程中的选择屏幕,包括基本概念、常用语法如PARAMETERS、SELECT-OPTIONS等,以及字体加亮、字体加密、函数键、下拉框等实用功能,旨在帮助开发者更好地理解和应用选择屏幕进行交互设计。

1587

被折叠的 条评论
为什么被折叠?



