用户通过屏幕操作来实现与SAP数据的交互, 而SAP的屏幕开发一般分为两种:
第一种是通过SAP ABAP 语法创建屏幕元素, 称之为选择屏幕.
第二种是通过SAP的屏幕编辑器开发.
1. 屏幕元素创建的语法.
SELECT-OPTIONS: 对象名称 FOR 参考对象.
PARAMETERS: 对象名
TYPE/LIKE 参考对象.
例如:
TABLES: mara.
SELECT-OPTIONS: s_matnr for mara-matnr.
PARAMETERS: s_matnr like
mara-matnr.
PARAMETERS: s_matnr type
matnr.
SELECT-OPTIONS 在程序中生成一个含有四个组件的内表---选择表, 该表具体格式如下:
DATA: BEGIN OF seltab OCCURS 0,
SING(1),
OPTION(2),
LOW LIKE f,
HIGH LIKE F,
ENND OF seltab.
SIGN 是标志位, 允许值为 I 和 E, 其意义为确定储存在字段 OPTION 中的运算符是否需要取反,
I 表示"包含", E 表示"排除", 等于在逻辑表达式中加一个NOT.
OPTION 包含选择运算符. 如果 HIGH 字段为空, 则可以填充 EQ(=),
NE(<>), GT(>),
GE(>=), LT(<), LE(<=),
CP, NP. 其中 CP 和 NP
只有当在输入字段中使用了通配符("*"或"+")时它们才有效.
如果 HIGH 字段不为空, 则可以使用 BT (位于) 和 NB(不位于), 其功能相当于 BETWEEN 和 NOT
BETWEEN.
选择表可以进行多行选择标准的设定.
基本规则是: 如果选择表为空, 则选择所有的数据; 如果选择表有多行, 则将所有的 SIGN 为 "I" 数据选出后,
再排除掉其中所有的满足标志为 "E" 的数据行. 具体规则如下:
- 如果选择表为空, 即用户未输入任何数据, 则条件 f IN seltab 恒为真.
- 如果选择表中只包含 SIGN 为 I 的行 "i1" ... , "in", 则相当于条件( i1 OR ... OR in
) 的组合.
- 如果选择表中只包含 SIGN 为 E 的行 "e1" ... , "em", 则相当于条件( NOT e1 ) AND ...
AND ( NOT em) 的组合.
- 如果选择表中即包含 SIGN 为 I 的行 "i1" ... , "in", 又包含 SIGN 为 E 的行 "e1"
..., "em" ,则相当于条件(i1 OR ... OR in ) AND ( NOT e1 ) AND ... AND (
NOT em) 的组合.
动态定义输入域的参考对象.
DATA: name TYPE string.
SELECT-OPTIONS: s_name for (name).
AT SELECTION-SCREEN OUTPUT.
name = 'MARA-MATNR'.
2. 屏幕输入域显示参数控制.
- OBLIGATORY 必输项控制.
- NO-DISPLAY 显示控制.
- VISIBLE LENGTH vlen 显示长度控制.
- NO-EXTENSION 多行输入控制. 限制 SELECT-OPTIONS 多行输入.
- NO-INTERVALS. 输入范围控制.
- MODIFY ID modid 编辑组控制. 该参数可以将所定义的屏幕对象进行分组,
以方便在程序运行中对分组的对象属性进行统一修改及控制.
- VALUE CHECK 进行值检查. 如果参数字段参照数据字典中的类型定义,
可以使用该选项检查用户输入值是否符合该字段的约束表中的数据或者是否属于数据字典中定义的值列表, 否则系统将给出错误消息.
- MEMORY ID pid.
- AS CHECKBOX. 创建复选框.
- RADIOBUTTON GROUP radi. 创建单选按钮组.
- PARAMETERS <对象名> AS LISTBOX
VISIBLE LENGTH vlen. 创建下拉列表.
SELECT-OPTIONS: p1 FOR mara-matnr MODIF ID g1,
p2 FOR mara-matnr MODIF ID g1,
p3 FOR mara-matnr MODIF ID g2,
p4 FOR mara-matnr MODIF ID g2.
AT SELECTION-SCREEN OUTPUT.
LOOP AT SCREEN.
IF NOT screen-group1 IS INITIAL.
IF screen-group1 = 'G2'.
screen-input = 0.
screen-invisible = 0.
MODIFY SCREEN.
ENDIF.
ENDIF.
ENDLOOP.
******************************************
下拉列表.
PARAMETER: p_lang(20) AS LISTBOX VISIBLE LENGTH 22.
AT SELECTION-SCREEN OUTPUT.
PERFORM setlist.
FORM setlist .
TYPE-POOLS vrm.
DATA values TYPE vrm_values WITH HEADER LINE.
values-key = 'CHINESE'.
values-text = '中国人'.
APPEND values.
values-key = 'AMERICAN'.
values-text = '美国人'.
APPEND values.
CALL FUNCTION 'VRM_SET_VALUES'
EXPORTING
id = 'P_LANG'
values = values[]
EXCEPTIONS
id_illegal_name = 1
OTHERS = 2.
ENDFORM.
3. 输入值的控制.
- 控制输入默认值. SELECT-OPTIONS, Default val1 [TO
val2] [OPTION opt] [SIGN sgn].
- DEFAULT val1. 控制 PARAMETER
对象输入的默认值.
- LOWER CASE 容许输入小写字母. SAP 所有屏幕字段输入后都会将字母默认转换为大写,
加上该参数后允许输入小写字母.
- MATCHCODE OBJECT search_help. 为屏幕对象加上指定的 F4 帮助.
- MEMORY ID pid 定义 SELECT-OPTIONS 内存参数. 可以将屏幕对象输入的值保存到指定的内在参数中,
通过 GET parameter 方法可以直接从内存读取该对象的值.
DATA: s_date TYPE d.
SELECT-OPTIONS: d1 FOR sy-datum MEMORY ID m1 NO INTERVALS.
START-OF-SELECTION.
GET PARAMETER ID 'M1' FIELD s_date.
WRITE s_date.
4. 其它选择屏幕元素.
- SELECTION-SCREEN SKIP [n]. 产生空行.
- SELECTION-SCREEN ULINE [[/]jpos(len)]. 在选择屏幕中给一行或几行中的一部分加下划线.
其中 "/" 用于换行控制.
- SELECTION-SCREEN COMMENT [/]pos(len) comm [ FOR FIELD
f]. 如果使用 FOR FIELD f.
则该注释分配给参数或选择标准f. 如果用户在该元素f的注释上请求帮助(F1), 则系统显示分配给字段f的帮助文本.
SELECTION-SCREEN COMMENT /1(20) text-t01.
- 组合选择屏幕元素. SELECTION-SCREEN BEGIN OF LINE.
..........
SELECTION-SCREEN END OF
LINE.
这些元素将出现在屏幕的同一行中.
SELECTION-SCREEN BEGIN OF BLOCK block [WITH FRAME [TITLE title]]
[NO INTERVALS].
.........
SELECTION-SCREEN END OF BLOCK block.
5. 屏幕对象的F1/F4输入帮助功能.
1). HELP-REQUEST [
FOR LOW|HIGH ]. 字段的 F1 帮助功能.
当在SAP选择屏幕的字段中按下 F1
键时, 可以调用自定义的程序或系统帮助文件. F1 帮助可以通过 ABAP 事件 AT SELECTION-SCREEN 来控制,
在自定义程序中, 可以通过调用系统标准函数 HELP_OBJECT_SHOW 或 HELP_OBJECT_SHOW_FOR_FIELD
来实现.
SELECT-OPTIONS: s_date FOR sy-datum.
AT SELECTION-SCREEN ON HELP-REQUEST FOR s_date-low.
PERFORM show_f1.
FORM show_f1 .
DATA: t_link LIKE STANDARD TABLE OF tline WITH HEADER LINE.
CALL FUNCTION 'HELP_OBJECT_SHOW'
EXPORTING
dokclass = 'DE'
doklangu = sy-langu
dokname = 'SYDATUM'
TABLES
links = t_link .
ENDFORM.
2). VALUE-REQUEST [ FOR LOW|HIGH ].
字段的 F4 键帮助.
在指定的字段按 F4 键时, 可以调用自定义的程序或系统帮助数据. 也是通过 AT
SELECTION-SCREEN 来调用. 与 F1 不同的是, F1 是进行信息提示, 而 F4 是显示填充值的列表. 可以调用
F4IF_FIELD_VALUE_REQUEST 参照某一个具体表字段来维护 F4 帮助.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_date-low.
PERFORM show_f4.
FORM show_f4 .
CALL FUNCTION 'F4IF_FIELD_VALUE_REQUEST'
EXPORTING
tabname = 'SYST'
"参照表
fieldname = 'DATUM'
"参照字段
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'S_DATE'.
"解发事件的屏幕对象名称.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
ENDFORM.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR s_file1.
PERFORM get_file_name USING s_file1 'O'.
FORM get_file_name USING p_path LIKE rlgrap-filename mode TYPE c.
DATA tmp_filename LIKE rlgrap-filename.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
def_path = 'D:\ '
mask = ',*.*,*.*.'
mode = mode
IMPORTING
filename = tmp_filename
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
IF sy-subrc = 0.
p_path = tmp_filename.
ENDIF.
ENDFORM.
6. 在屏幕上输出自定义文本及图标.
TYPE-POOLS: icon.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (12) mytext.
PARAMETER: name LIKE sy-uname.
SELECTION-SCREEN END OF LINE.
INITIALIZATION.
CONCATENATE icon_manager '输入人员编号' INTO mytext.
在文本元素中加入图标.
每个图标都由一个两位长度的代码进行标识, 在字符前面加上 "@"符号表示对该图标进行引用.
可以通过数据字典查看 TYPE Group: ICON, 通过 ICON NAME 寻找对应的 ID 列. 或通过程序
RSTXICON 来查看SAP中所有图标及代码的对应关系列表.
7. 在屏幕中实现按钮效果.
TYPE-POOLS: icon.
TABLES: sscrfields. " 引用屏幕字段属性
" 创建屏幕按钮对象
SELECTION-SCREEN: PUSHBUTTON 2(10) but1 USER-COMMAND cli1,
PUSHBUTTON 20(30) but2 USER-COMMAND cli2 VISIBLE LENGTH 10.
INITIALIZATION.
CONCATENATE icon_message_information '按钮1' INTO but1.
CONCATENATE icon_message_information '按钮2' INTO but2.
AT SELECTION-SCREEN.
CASE sscrfields. " 捕捉按钮功能代码, 也可以用 SY-UCOMM.
WHEN 'CLI1'.
MESSAGE '按钮1事件' TYPE 'I'.
WHEN 'CLI2'.
MESSAGE '按钮2事件' TYPE 'I'.
ENDCASE.
8. 子屏幕的创建.
子屏幕分为两种, 一种为 Include Screen, 可以通过 Report 端程序直接调用;
一种为 SubScreen, 需要通过 Screen Painter 所创建屏幕引用.
Include Screen 相关语法如下:
PARAMETERS: type as CHECKBOX.
CALL SELECTION-SCREEN 123 STARTING AT 10 10 ENDING AT 80 10.
SELECTION-SCREEN BEGIN OF SCREEN 123 as WINDOW TITLE text-t01.
PARAMETERS: matnr LIKE mara-matnr.
PARAMETERS: werks like marc-werks.
SELECTION-SCREEN END OF SCREEN 123.
9. 在工具栏上新增功能按钮.
按钮的定义保存在结构体 SSCRFIELDS 中, n 为一个整数类型的序号, 例如当 n 等于1时,
按钮的描述保存在字段 SSCRFIELDS-FUNCTXT_01 中, 按钮的功能代码将默认赋值为 "FC01", 保存在字段
SSCRFIELDS-UCOMM 中.
TABLES: sscrfields.
PARAMETERS: parm LIKE mara-matnr.
SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN FUNCTION KEY 2.
INITIALIZATION.
MOVE 'BUTTON1' TO sscrfields-functxt_01.
MOVE 'BUTTON2' TO sscrfields-functxt_02.
AT SELECTION-SCREEN.
IF SSCRFIELDS-UCOMM = 'FC01'.
MESSAGE '按钮1事件' TYPE 'I'.
ELSEIF SSCRFIELDS-UCOMM = 'FC02'.
MESSAGE '按钮2事件' TYPE 'I'.
ENDIF.
10. 在屏幕上创建页签.
SELECTION-SCREEN BEGIN OF TABBED BLOCK
<block> FOR n lines.
每个页签都是由一个单独的子屏幕控制, n 代表分页控件的高度, 屏幕载入进必须先通过 INITIALIZATION
事件对其属性初始化.
TABLES: mara.
" 定义子屏幕 100
SELECTION-SCREEN BEGIN OF SCREEN 100 AS SUBSCREEN.
SELECTION-SCREEN BEGIN OF BLOCK bk1 WITH FRAME TITLE text-t01.
SELECT-OPTIONS: mat1 FOR mara-matnr NO INTERVALS.
SELECTION-SCREEN SKIP 1.
PARAMETERS: chk1 AS CHECKBOX DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK bk1.
SELECTION-SCREEN END OF SCREEN 100.
" 定义子屏幕 200
SELECTION-SCREEN BEGIN OF SCREEN 200 AS SUBSCREEN.
PARAMETERS: mat2 LIKE mara-matnr.
SELECTION-SCREEN END OF SCREEN 200.
" 定义一个TAB空间, 取名为MYTAB, 控件高为5, 共有两个页签.
" 两个页签的功能代码分别为 PUSH1, PUSH2.
SELECTION-SCREEN: BEGIN OF TABBED BLOCK mytab FOR 5 LINES,
TAB (20) button1 USER-COMMAND push1,
TAB (20) button2 USER-COMMAND push2,
END OF BLOCK mytab.
" 为TAB控件分配初始化值.
INITIALIZATION.
button1 = text-010.
button2 = text-020.
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'.
ENDCASE.
屏幕元素属性的控制.
屏幕中所有的对象都有独立的属性, 在SAP程序执行中,
可以通过系统变量SCREEN来读取每个屏幕对象的具体属性, SCREEN是一个标准的结构体,
其常用属性及参数如下:
- NAME: 屏幕对象的名称.
- INPUT: 设置屏幕输入域对象不否允许输入值( 0: 不可输入, 1: 可输入), 默认值为 1.
- INVISIBLE: 设置对象在输出到屏幕后时是否可见, ( 0: 可见, 1: 不可见).
PARAMETERS: mat1 like mara-matnr.
INITIALIZATION.
LOOP AT SCREEN.
IF screen-name = 'MAT1'.
screen-input = '0'.
screen-invisible = '0'.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
选择屏幕事件.
选择屏幕的处理也是通过事件驱动的, 这些事件是一些预定义的ABAP代码块.
选择屏幕中不存在任何由程序员设定的流逻辑(普通屏幕的行为由流逻辑进行控制), 取而代之的是在程序中定义一系列相关的事件块,
由运行环境在处理选择屏幕的过程中触发. 选择屏幕中各个事件在程序中出现的位置是任意的, 与其调用顺序无关. 选择屏幕事件将出现在
INITIALIZATION 事件和 START-OF-SELECTION 事件中间; 对于使用 CALL
SELECTION-SCREEN 调用的自定义选择屏幕, 这些选择屏幕将出现在当前处理块中.
所有的选择屏幕事件都使用 AT SELECTION SCREEN 语句引导.
INITIALIZATION 事件.
该事件在屏幕未显示之前执行, 对程序设置值及屏幕元素进行初始化赋值.
TOP-OF-PAGE.
创建新的 Write List 时触发.
TOP-OF-PAGE DURING LINE-SELECTION.
An event block is triggered for the corresponding events
during the creation of details lists.
You have to use system fields like sy-lsind to distinguish
between the individual details lists.
START-OF-SELECTION 事件.
该事件由程序单击执行按钮时触发.
END-OF-SELECTION 事件.
该事件应用于所有数据处理完成,
即START-OF-SELECTION相关事件执行完成,但输出屏幕还未显示之前.在实际开发中主要用于一些执行结果的检验等,
其输出数据叠加于同一输出屏幕中.
AT SELECTION-SCREEN OUTPUT事件.
选择屏幕的PBO事件, 在每次选择屏幕被调用之前触发, 可以在其中进行选择屏幕输出之前的准备工作,
比如在程序中动态地对选择屏幕元素的输出属性进行修改.
AT SELECTION-SCREEN 事件.
是选择屏幕的PAI事件, 在用户输入的所有数据都被传输到程序中之后被触发, 也是选择屏幕中最后被触发的事件.
在选择屏幕中, 用户回车, 选择某GUI按钮,功能键或者菜单键之后, 如果系统检查无误, 将触发该事件.
AT SELECTION-SCREEN ON field 事件.
是针对选择屏幕中某字段输入的PAI事件, 当该字段值被传递给程序时被触发, 可以应用于该字段本身的正确性检查,
如果系统提示错误, 则可以在该字段中重新输入, 此时其它字段元素呈灰色, 不接受输入.
AT SELECTION-SCREEN ON BLOCK block 事件.
是针对选择屏幕某元素区域输入的PAI事件, 当该区域内的所有字段的值被传递给程序时被触发,
可以应用于该区域元素整体的正确性检查.
AT SELECTION-SCREEN ON RADIOBUTTON GROUP rad1.
作为单选按钮, 必须整体进行输入检查, 不能单独使用 ON field选项进行.
AT SELECTION-SCREEN ON seltab.
AT SELECTION-SCREEN ON END OF seltab.
这两个事件只有在使用多行选择对话框时才可能被触发, 其中 ON seltab 用于用户逐行输入后的正确性检查, 而 ON
END OF seltab 用于整个选择表输入结束后各行的检查.
AT SELECTION-SCREEN ON HELP-REQUEST FOR field.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR field.
选择屏幕中的POH和POV事件, 当光标位于某屏幕字段时, 用户按下F1和F4键, 将触发 ON HELP-REQUEST
和
ON VLAUE-REQUEST事件.
AT LINE-SELECTION.
在 Write List 中双击某行触发.
屏幕事件的中止.
EXIT: 中止当前事件模块.
STOP: 强制中止所有事件.
REJECT: 应用于读取逻辑数据库的程序.
|