文章转自 http://blog.csdn.net/wangjolly/article/details/10716015
SAP-ABAP SELECT-SCREEN 的几个用法
实例1:
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 1.
PARAMETER P_FLEX RADIOBUTTON GROUP ways TYPE c.
SELECTION-SCREEN COMMENT 3(20) text-s30 for field P_FLEX.
SELECTION-SCREEN COMMENT 25(10) text-s31 for field P_PAYM_B.
SELECTION-SCREEN POSITION 38.
PARAMETER P_PAYM_B LIKE PA0015-PABRP MODIF ID wty.
parameters P_PAYY_B LIKE PA0015-pabrj MODIF ID wty.
SELECTION-SCREEN POSITION 57.
SELECTION-SCREEN COMMENT 57(5) text-s32 for field P_PAYM_E.
parameters P_PAYM_E LIKE PA0015-pabrp MODIF ID wty.
parameters P_PAYY_E LIKE PA0015-pabrj MODIF ID wty.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION 25.
SELECTION-SCREEN COMMENT 25(9) text-s18 for field S_LGART.
SELECT-OPTIONS S_LGART FOR p0014-LGART MODIF ID wty.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN SKIP 1.
本程序中涉及到几个SELECTION-SCREEN的用法:
1 SELECTION-SCREEN BEGIN OF LINE. ....END OF LINE.
这条语句的作用是让Begin of line 与End of line之间的部分位于同一行。
2 SELECTION-SCREEN POSITION XX.
这条语句的作用是将该语句后面的第一个Screen element定位在这一行的XX位置,最大值为79。值得注意的是,如果同一行中多个Position语句因为空间不够或Element所占空间重叠,将导致Screen创建时的错误,无法激活。此时并无具体的提示。只能仔细观察代码。
3 SELECTION-SCREEN COMMENT XX(Y) TEXT-XXX FOR FIELD XXX.
这条语句的作用是在当前行的指定列位置处输出一段文本,For field则表示文本与某个element 关联,当此语句使用时,可以不必设定屏幕的Text element,系统会自动关联。XX表示位置,Y表示长度,注意,如果长度不足,超常的文字将被截掉。此处似乎还有一个小BUG,当Y小于5时,输出的文字字体会变大一号。不知道为什么。
SELECTION-SCREEN COMMENT /10(30) comm1.
INITIALIZATION.
4 SELECTION-SCREEN SKIP 1.
跳过一行。类似于用WRITE写Report时的SKIP 1.也可以跳过多行。
以下是 屏幕上画横线
5.内存记忆 留有上次输入过的记录
parameters test(16) type c memory id rid.
6.检查输入值 如果不在表中 不用做代码检查了
PARAMETERS p_carr TYPE spfli-carrid OBLIGATORY VALUE CHECK.
7.复选框
PARAMETERS: a AS CHECKBOX,
8.单选框
PARAMETERS: r1 RADIOBUTTON GROUP rad1,
9.屏幕动作变化 引起屏幕变化: modif id 起作用
举例:
report a.
SELECTION-SCREEN BEGIN OF BLOCK BL1 WITH FRAME title TEXT-003.
PARAMETERS:
SELECTION-SCREEN END OF BLOCK BL1.
SELECTION-SCREEN BEGIN OF BLOCK BL2 WITH FRAME
SELECTION-SCREEN: BEGIN OF LINE,
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN SKIP 2.
SELECTION-SCREEN: BEGIN OF LINE,
SELECTION-SCREEN END OF BLOCK BL2.
"在AT SELECTION-SCREEN中循环SCREEN系统变量,把需要修改的画面元素的属性进行相应的修改
*----------------------------------------------------------------------*
*AT SELECTION-SCREEN
*----------------------------------------------------------------------*
AT SELECTION-SCREEN OUTPUT.
10.ranges 使用方法
ranges s_carrid1 for spfli-carrid.
s_carrid1-sign
s_carrid1-option = 'EQ'.
s_carrid1-low
append s_carrid1.
11. options限制 输入
SELECT-OPTIONS airline FOR wa_spfli-carrid NO INTERVALS
12. 一行中的若干元素
DATA wa_spfli TYPE spfli.
SELECT-OPTIONS airline FOR wa_spfli-carrid.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN POSITION pos_high.
PARAMETERS field(5) TYPE c.
SELECTION-SCREEN END OF LINE.
13 屏幕元素事件 按钮
TABLES sscrfields.
DATA flag(1) TYPE c.
SELECTION-SCREEN:
AT SELECTION-SCREEN.
START-OF-SELECTION.
14
REPORT demo_sel_screen_function_key.
TABLES sscrfields.
PARAMETERS: p_carrid TYPE s_carr_id,
SELECTION-SCREEN: FUNCTION KEY 1,
INITIALIZATION.
AT SELECTION-SCREEN.
START-OF-SELECTION.
15.关于修改 标准status (有待研究)
REPORT demo_sel_screen_status .
DATA itab TYPE TABLE OF sy-ucomm.
PARAMETERS test(10) TYPE c.
AT SELECTION-SCREEN OUTPUT.
16.选择屏幕 事件何时触发(有待研究)实例2
REPORT demo_selection_screen_events MESSAGE-ID sabapdocu.
DATA field1(10) TYPE c.
SELECT-OPTIONS sel_opt1 FOR field1.
SELECTION-SCREEN BEGIN OF BLOCK block1.
PARAMETERS:
SELECTION-SCREEN END OF BLOCK block1.
PARAMETERS: r1 RADIOBUTTON GROUP rad1 DEFAULT 'X',
AT SELECTION-SCREEN.
AT SELECTION-SCREEN OUTPUT.
AT SELECTION-SCREEN ON sel_opt1.
AT SELECTION-SCREEN ON test1.
AT SELECTION-SCREEN ON test2.
AT SELECTION-SCREEN ON END OF sel_opt1.
AT SELECTION-SCREEN ON HELP-REQUEST FOR sel_opt1-low.
AT SELECTION-SCREEN ON HELP-REQUEST FOR sel_opt1-high.
AT SELECTION-SCREEN ON HELP-REQUEST FOR test1.
AT SELECTION-SCREEN ON HELP-REQUEST FOR test2.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR sel_opt1-low.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR sel_opt1-high.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR test1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR test2.
AT SELECTION-SCREEN ON BLOCK block1.
AT SELECTION-SCREEN ON RADIOBUTTON GROUP rad1.
选择屏幕的开发知识无非就是围绕这3个点:PARAMETERS SELECT-OPTIONS SELECTION-SCREEN
(一)PARAMETERS:为变量定义输入字段
1、PARAMETERS的全部用法:
P_BUDAT LIKE BKPF-BUDAT OBLIGATORY,
P_CX AS CHECKBOX DEFAULT 'X',
P_BUDAT LIKE BKPF-BUDAT NO DISPLAY,
P_CX AS CHECKBOX,
R1 RADIOBUTTON GROUP RAD1
R2 RADIOBUTTON GROUP RAD1 DEFAULT 'X'
R3 RADIOBUTTON GROUP RAD2
R4 RADIOBUTTON GROUP RAD2
P1 MODIF ID SC1
P2 MODIF ID SC1
P3 MODIF ID SC2
P4 MODIF ID SC2
每种用法的解释:
OBLIGATORY 设定该项伟必输项
CHECKBOX 设为打钩的(复选框),如果没有设定default的值,那么当这个被勾上的时候才为X,有default的话,即默认为勾上的。
NO DISPLAY 设定该项为不显示状态。
RADIOBUTTON 设定单选,有default的,默认这个是选上的,同一个RAD1和RAD2,每个RAD只能选一个值,选中则变量变为X,如果没有设定default,每个组的第一个参数将被激活并分配‘X’。
MODIF ID 将参数分配给修改组,通过在SELECTION-SCREEN OUTPUT事件中进行处理:
AT SELECTION-SCREEN OUTPUT. 结合上面的定义,P1和P2放在一组,P3和P4放在一组,然后P1和P2的INTENSIFIED字段被设为1,效果是高亮度,
LOOP AT SCREEN. 这个可以这样使用。
IF SCREEN-GROUP1 = 'SC1'
SCREEN-INTENSIFIED = '1'.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
还有一些不常用的例如: LOWER CASE,有这个lower case,系统就不会把输入值更改为大写。(还没有使用过)
MEMORY-ID 允许你从全局SAP内存使用缺省值。
MATCHCODE OBJECT 匹配代码对象,obj的名称必须是4字符的变量名
(二)SELECT-OPTIONS:选择表
1、SELECT-OPTIONS的全部用法:
S_EBLEN FOR VBRK-EBLEN DEFAULT
S_EBLEN FOR VBRK-EBLEN DEFAULT A TO B
S_EBLEN FOR VBRK-EBLEN OBLIGATORY
S_EBLEN FOR VBRK-EBLEN NO DISPLAY
S_EBLEN FOR VBRK-EBLEN NO-EXTENSION
S_EBLEN FOR VBRK-EBLEN NO-INTERVALS
DEFAULT OBLIGATORY NO-DISPLAY的功能和之前的PARAMETERS的一样。
DEFAULT A TO B 设置里面的LOW 和HIGH字段,例如我要设置默认公司代码从0001到0020。
选择表的里面的字段有:SIGN OPTION LOW HIGH
SIGN 可以是I 和 E I是包括, E是排除的意思
OPTION 可以是:EQ NE GT LE LT CP NP 这个可以查看我的帖子(select-option作为select的条件使用)
NO-EXTENSION,把选择表限制在一行
NO INTERVALS ,把选择表限制伟单值选择
(三)SELECTION-SCREEN: 格式化选择屏幕
1、SELECTION-SCREEN 的全部使用方法:
SELECTION-SCREEN SKIP <N> 该语句产生N个空行,如果只产生一个,可以省略<N>。
SELECTION-SCREEN ULINE <POS(LEN)> 该语句创建下划线,入过没有POS(LEN),则在当前下面创建新行。如果有POS(LEN),则从POS处开始,连续<LEN>个字符。
SELECTION-SCREEN COMMENT 用该选项是必须定义格式(还没有使用过,后续有用到再更新)
SELECTION-SCREEN BEGIN OF LINE 把选择屏幕的几个元素放在一行上。
SELECTION-SCREEN END OF LINE
SELECTION-SCREEN POSITION <POS> 定位元素
SELECTION-SCREEN BEGIN OF BLOCK <block> 创建元素块,里面放选择屏幕语句,block的名字可以在initialization里面维护。
SELECTION-SCREEN END OF BLOCK <blokc>
SELECTION-SCREEN FUNCTION KEY <I> 在选择屏幕的应用工具栏创建按钮,I为1-5,最多只有5个按钮。具体要怎么实现,可以参考另一篇文章(给选择屏幕添加按钮)
SELECTION-SCREEN PUSHBUTTON <pos(len)> <name> USER-COMAND <ucom> [MODIF ID <keyt>] 在选择屏幕上创建按钮,其中<name >是按钮的文本, <ucom>为输入词典字段SSCRFIELDS-UCOMM,必须使用TABLES语句声明表SSCRFIELDS。(后续有用到把具体例子贴上来)
(四) INITIALIZATION : 用于屏幕初始化,例如屏幕的block的名字,屏幕默认字段的一些初始值的填充,工具栏按钮的一些字段的值的填充等等。
(五) AT SELECTION-SCREEN OUTPUT 这个就相当于PBO的功能,可以对选择屏幕字段进行修改(前面也有说到一些功能要放到这里使用的),在选择运行程序的时候,选择屏幕出来之前就先运行这段。例如可以判断用户名,然后选择性的输入一些选择屏幕字段:
at selection-screen output.
if sy-uname ne 'LIUJC_CN'.
loop at screen.
if screen-name+0(7) eq 'S_AUFNR' or
screen-name+2(7) eq 'S_AUFNR'.
screen-invisible = '1'.
screen-active = '0'.
modify screen.
endif.
endloop.
endif.
(六) AT SELECTION-SCREEN ON VALUE-REQUEST FOR <NAME> 这个最常见的就是对upload文件的文件名进行检查的使用:
AT SELECTION-SCREEN ON VALUE-REQUEST FOR filename.
CALL FUNCTION 'KD_GET_FILENAME_ON_F4'
EXPORTING
field_name = 'C:\'
mask = ',Excel Files,*.xls,*.XLS,'
* STATIC = 'X'
CHANGING
file_name = filename
EXCEPTIONS
mask_too_long = 1
OTHERS = 2.
(七) AT SELECTION-SCREEN 这个比较常用的是在工具栏里面添加了按钮,然后对这个按钮进行操作。
AT SELECTION-SCREEN.
CASE SSCRFIELDS-UCOMM.
WHEN 'FC01'.
PERFORM FRM_DOWNLOAD_DATA.
ENDCASE.