10.2 Selection screens
Selection screens为特殊dynpros,可以在executable programs, function groups,module pools中定义。
设置Selection screens的GUI Status,使用RS_SET_SELSCREEN_STATUS,特殊情况下,使用RS_EXTERNAL_SELSCREEN_STATUS。
1.creat selection screens
语法:
1. SELECTION-SCREEN BEGIN OF SCREEN dynnr [TITLE title]
[AS WINDOW].
SELECTION-SCREEN END OF SCREEN dynnr.
创建普通屏幕。
语法:
2. SELECTION-SCREEN BEGIN OF SCREEN dynnr AS SUBSCREEN
[NO INTERVALS]
[NESTING LEVEL n].
SELECTION-SCREEN END OF SCREEN dynnr.
创建子屏幕。
SELECTION-SCREEN中可以包含PARAMETER,SELECTION-OPTIONS,SELECTION-SCREEN,但是screen不能嵌套。
定义的SELECTION-SCREEN可以在Dynpro,PBO,PAI调用使用call screen,
call subscreen嵌入子屏幕或Tabstrip。
示例1:
"创建selection screens
"TITLE:指定title
"AS WINDOW:显示为弹窗
SELECTION-SCREEN BEGIN OF SCREEN 500 TITLE title
AS WINDOW.
PARAMETERS name TYPE sy-uname.
SELECTION-SCREEN END OF SCREEN 500.
title = 'Input name'.
"调用屏幕
CALL SELECTION-SCREEN '0500' STARTING AT 10 10.
示例2:
"创建子屏幕
SELECTION-SCREEN BEGIN OF SCREEN 100 AS SUBSCREEN.
PARAMETERS: p1 TYPE c LENGTH 10,
p2 TYPE c LENGTH 10,
p3 TYPE c LENGTH 10.
SELECTION-SCREEN END OF SCREEN 100.
SELECTION-SCREEN BEGIN OF SCREEN 200 AS SUBSCREEN.
PARAMETERS: q1 TYPE c LENGTH 10,
q2 TYPE c LENGTH 10,
q3 TYPE c LENGTH 10.
SELECTION-SCREEN END OF SCREEN 200.
"屏幕500
SELECTION-SCREEN BEGIN OF SCREEN 500 AS WINDOW.
"定义tabstrip
SELECTION-SCREEN:BEGIN OF TABBED BLOCK mytab FOR 10 LINES,
TAB (20) button1 USER-COMMAND push1
DEFAULT SCREEN 100,
TAB (20) button2 USER-COMMAND push2
DEFAULT SCREEN 200,
END OF BLOCK mytab.
SELECTION-SCREEN END OF SCREEN 500.
INITIALIZATION.
button1 = 'Selection Screen 1'.
button2 = 'Selection Screen 2'.
START-OF-SELECTION.
"CALL SCREEN 500.
"当在dynpro的pbo,pai中call screen,
"如果是selection screen,必须使用下面方式
CALL SELECTION-SCREEN 500.
2.selection screens elements
selection screen中有多种组件;selection screen最大宽度83;
SKIP
语法:SELECTION-SCREEN SKIP [n] [ldb_additions].
创建空行,默认1行。
ULINE
语法:
SELECTION-SCREEN ULINE [[/][pos|POS_LOW|POS_HIGH](len)]
[MODIF ID modid]
[ldb_additions].
创建一条线,在线必须有内容。
示例:
"划线,在线必须有内容,不能是空白
SELECTION-SCREEN ULINE /1(60).
COMMENT
语法:
SELECTION-SCREEN COMMENT [/][pos|POS_LOW|POS_HIGH](len)
{text|{[text] FOR FIELD sel}}
[VISIBLE LENGTH vlen]
[MODIF ID modid]
[ldb_additions].
示例:
"文本
"/可省略,指定文本起始位置,长度
"SELECTION-SCREEN COMMENT /5(10) test.
"for field,文本作为element标签,只在line中生效
"visible length,可见长度
"element必须在comment后
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(10) test FOR FIELD P1 VISIBLE LENGTH 5.
PARAMETERS:p1 TYPE sy-datum.
SELECTION-SCREEN END OF LINE.
PUSHBUTTON
语法:
SELECTION-SCREEN PUSHBUTTON [/][pos|POS_LOW|POS_HIGH ](len) button_text
USER-COMMAND fcode
[VISIBLE LENGTH vlen]
[MODIF ID modid]
[ldb_additions].
创建按钮,使用ICON_CREATE创建图标,或者使用text-xxx,text描述。
示例:
"按钮
SELECTION-SCREEN BEGIN OF LINE.
"可以后续赋值描述
SELECTION-SCREEN PUSHBUTTON 5(30) btn1 USER-COMMAND clk1.
"使用text-xxx描述
SELECTION-SCREEN PUSHBUTTON 40(10) text-001 USER-COMMAND clk2.
SELECTION-SCREEN END OF LINE.
创建图标
FORM f_creat_icon.
"按钮长度必须很长,才能显示完全
CALL FUNCTION 'ICON_CREATE'
EXPORTING
name = 'ICON_CHECKED'
text = 'Button1'
info = 'quick info'
add_stdinf = ''
IMPORTING
RESULT = btn1
EXCEPTIONS
OTHERS = 0.
ENDFORM.
LINE
语法:
SELECTION-SCREEN BEGIN OF LINE.
[SELECTION-SCREEN POSITION {pos|POS_LOW|POS_HIGH} [ldb_additions]].
SELECTION-SCREEN END OF LINE.
定义一行,position指定空白位置
line中不能嵌套定义line;
line中elements的text使用comment指定;
line中不能定义block,tabstrips;
BLOCK
语法:
SELECTION-SCREEN BEGIN OF BLOCK block
[WITH FRAME [TITLE title]]
[NO INTERVALS].
SELECTION-SCREEN END OF BLOCK block.
定义块,block名称最大长度20字符;
块最多嵌套5层;
title最大长度8个字符,text-xxx最大长度70个字符;
示例:
"块
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-001.
PARAMETERS bp_1 TYPE sy-datum.
SELECTION-SCREEN BEGIN OF BLOCK blk2 WITH FRAME.
PARAMETERS bp_2 TYPE sy-datum.
SELECTION-SCREEN BEGIN OF BLOCK blk3 WITH FRAME.
PARAMETERS bp_3 TYPE sy-datum.
SELECTION-SCREEN END OF BLOCK blk3.
SELECTION-SCREEN END OF BLOCK blk2.
SELECTION-SCREEN END OF BLOCK blk1.
TABBED BLOCK
语法:
SELECTION-SCREEN BEGIN OF TABBED BLOCK tblock FOR n LINES [NO INTERVALS]. [SELECTION-SCREEN TAB (len) tab USER-COMMAND fcode
[DEFAULT [PROGRAM prog] SCREEN dynnr]
[MODIF ID modid]
[ldb_additions].]
SELECTION-SCREEN END OF BLOCK tblock.
定义Tabstrip,tblock最大字符16。n指定行数,最大197。
(len)最大长度79,tab最大长度8字符。
FUNCTION KEY
语法:
SELECTION-SCREEN FUNCTION KEY n [ldb_additions].
定义application toolbar,包含5个pushbutton,funciton code:FC01~FC05;
定义接口工作区,SSCRFIELDS;
使用SMP_DYNTXT,显示icon;
示例:
定义接口
"function key 接口
TABLES sscrfields.
定义function key
"function key
SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN FUNCTION KEY 2.
设置function key
"设置function key icon
FORM f_func_key_icon.
"使用这个或icon 编码4位
"TYPE-POOLS icon.
"SMP_DYNTXT(菜单制作器:动态文本的程序接口)
DATA:func_icon TYPE smp_dyntxt.
"func_icon-text = 'func1'. "显示文本,没用?
func_icon-icon_id = '@0N@'. "显示icon
func_icon-icon_text = 'func1'."图标文本
func_icon-quickinfo = 'quick info'."提示tip
"function key text显示
sscrfields-functxt_01 = func_icon.
sscrfields-functxt_02 = 'func2'.
ENDFORM.
用户操作响应,在AT SELECTION-SCREEN,处理用户操作。
"function key comm
FORM f_function_key.
"响应function key
CASE sscrfields-ucomm.
WHEN 'FC01'.
MESSAGE 'function 1' TYPE 'I'.
CALL SELECTION-SCREEN 501 STARTING AT 50 50.
WHEN 'FC02'.
MESSAGE 'function 2' TYPE 'I'.
CALL SELECTION-SCREEN 502 STARTING AT 50 50.
WHEN OTHERS.
ENDCASE.
ENDFORM.
MODIF ID
语法:
MODIF ID modid
可以定义Group,根据id对屏幕元素进行MODIFY SCREEN,SCREEN-group1进行判断。
以下Elements可以定义modify id:
SELECTION-SCREEN - COMMENT
SELECTION-SCREEN - PUSHBUTTON
SELECTION-SCREEN - TAB
SELECTION-SCREEN - ULINE
PARAMETERS
SELECT-OPTIONS
INCLUDE
语法:
SELECTION-SCREEN INCLUDE
可以包含同program其他selection-screen定义的elements。
1. SELECTION-SCREEN INCLUDE PARAMETERS para
[OBLIGATORY [OFF]]
[MODIF ID modid]
[ID id].
包含parameter,obligatory重新定义是否必输。
2. SELECTION-SCREEN INCLUDE SELECT-OPTIONS selcrit
[OBLIGATORY [OFF]]
[NO INTERVALS [OFF]]
[MODIF ID modid]
[ID id].
包含select options,更改obligatory,no intervals等。
3. SELECTION-SCREEN INCLUDE COMMENT [/][pos](len) text
[FOR FIELD sel]
[MODIF ID modid]
[ID id].
包含comment,可以指定新的for field。
4. SELECTION-SCREEN INCLUDE PUSHBUTTON [/][pos](len) button_text
[USER-COMMAND ucom]
[MODIF ID modid]
[ID id].
包含pushbutton,可以指定新的user-command。
5. SELECTION-SCREEN INCLUDE BLOCKS block [ID id].
包含block
示例:
"使用include
SELECTION-SCREEN BEGIN OF SCREEN 501 AS WINDOW.
"如果p1已经obligatory,使用off关闭必输
SELECTION-SCREEN INCLUDE PARAMETERS p1 OBLIGATORY OFF.
"可以定义新的user command??有问题
"SELECTION-SCREEN INCLUDE PUSHBUTTON 5(20) btn1 USER-COMMAND blk4.
"包含block
SELECTION-SCREEN INCLUDE BLOCKS blk1.
SELECTION-SCREEN END OF SCREEN 501.
PARAMETERS
语法:
PARAMETERS {para[(len)]}|{para [LENGTH len]}
[type_options]
[screen_options]
[value_options]
[ldb_options].
[type_options]:类型定义
{ TYPE type [DECIMALS dec] }
| { LIKE dobj }
| { LIKE (name) }
[screen_options]:屏幕选项
{ {[OBLIGATORY|NO-DISPLAY] [VISIBLE LENGTH vlen]}
| {AS CHECKBOX [USER-COMMAND fcode]}
| {RADIOBUTTON GROUP group [USER-COMMAND fcode]}
| {AS LISTBOX VISIBLE LENGTH vlen [USER-COMMAND fcode] [OBLIGATORY]}
}
[MODIF ID modid] ... .
[value_options]:值选项
[DEFAULT val]
[LOWER CASE]
[MATCHCODE OBJECT search_help]
[MEMORY ID pid]
[VALUE CHECK]
创建parameter,单个值输入框。
para名字最长8个字符;
type不能是b, s, f, xstring类型;
group名字最长4个字符;
fcode名字最长20个字符;
示例:
"parameters
"动态名,大写才能带出帮助等dict信息
DATA:name TYPE C LENGTH 132 VALUE 'SPFLI-CARRID'.
SELECTION-SCREEN BEGIN OF SCREEN 502 AS WINDOW.
"para最长8个字符
"使用(len)长度,length n指定长度,数据类型为C
PARAMETERS:p01(4).
PARAMETERS:p02 LENGTH 4.
"使用type
PARAMETERS:p03 TYPE C LENGTH 10.
"reference
PARAMETERS:p04 TYPE spfli-carrid.
"like
PARAMETERS:p05 LIKE p04.
"like (name),name最长132
PARAMETERS:p06 LIKE (name).
"是否必输
PARAMETERS:p07 TYPE C LENGTH 10 OBLIGATORY.
"是否显示
PARAMETERS:p08 TYPE C LENGTH 10 NO-DISPLAY.
"显示长度,可输入长度10,可见长度5
PARAMETERS:p09 TYPE C LENGTH 10 VISIBLE LENGTH 5.
"checkbox,sscrfields-ucomm可以处理
PARAMETERS:p_check AS CHECKBOX USER-COMMAND chk1.
"radiobutton,group名最长4位
PARAMETERS:p_rad1 RADIOBUTTON GROUP gp1.
PARAMETERS:p_rad2 RADIOBUTTON GROUP gp1.
"listbox
PARAMETERS:p_listb TYPE spfli-carrid VISIBLE LENGTH 10 AS LISTBOX.
"设置默认值,"设置允许小写,不设置自动转换大写
PARAMETERS:p_10 TYPE C LENGTH 10 DEFAULT 'hello' LOWER CASE.
"设置帮助f4
"MATCHCODE OBJECT S_CARRIER_ID 和 check value不能同时
PARAMETERS:p_11 TYPE C LENGTH 2 MATCHCODE OBJECT S_CARRIER_ID.
"设置值检查,建议必输,值检查同时设置,避免检查空值
PARAMETERS:p_12 TYPE spfli-carrid OBLIGATORY VALUE CHECK.
"memory id
PARAMETERS:p_13 TYPE sy-repid MEMORY ID rid.
SELECTION-SCREEN END OF SCREEN 502.
屏幕输出前,memory id设置初始值:
AT SELECTION-SCREEN OUTPUT.
"设置parameter值
SET PARAMETER ID 'RID' FIELD 'TEST ID'.
SELECT OPTIONS
语法:
SELECT-OPTIONS selcrit FOR {dobj|(name)}
[screen_options]
[value_options]
[NO DATABASE SELECTION]
[ldb_options].
[screen_options]:屏幕选项
[OBLIGATORY|NO-DISPLAY]
[VISIBLE LENGTH vlen]
[NO-EXTENSION]
[NO INTERVALS]
[MODIF ID modid]
[value_options]:值选项
[DEFAULT val1 [TO val2] [OPTION opt] [SIGN sgn]]
[LOWER CASE]
[MATCHCODE OBJECT search_help]
[MEMORY ID pid]
创建select-options,多值范围输入。
selcrit名字最大8个字符;
示例:
"select options
TABLES:spfli.
SELECTION-SCREEN BEGIN OF SCREEN 503 AS WINDOW.
"必须声明table:spfli
SELECT-OPTIONS s_01 FOR spfli-carrid.
"动态定义
SELECT-OPTIONS s_02 FOR (name).
"没有第二个输入框
SELECT-OPTIONS s_03 FOR spfli-carrid NO INTERVALS.
"没有multiple selection
SELECT-OPTIONS s_04 FOR spfli-carrid NO-EXTENSION.
"不显示
SELECT-OPTIONS s_05 FOR spfli-carrid NO-DISPLAY.
"默认值
"option:非范围:eq, ne, ge, gt, le, lt, cp, or np;
"当指定TO范围:bt,nb;
"sign:i or e;大小写都可
SELECT-OPTIONS s_06 FOR spfli-carrid DEFAULT 'AA' TO 'AZ' OPTION bt SIGN i.
SELECTION-SCREEN END OF SCREEN 503.
示例:整体示例
"function key 接口
TABLES sscrfields.
"select seceen elements
SELECTION-SCREEN BEGIN OF SCREEN 500 TITLE text-001.
"两行空行
SELECTION-SCREEN SKIP 2.
"文本
"/可省略,指定文本起始位置,长度
"SELECTION-SCREEN COMMENT /5(10) test.
"for field,文本作为element标签,只在line中生效
"visible length,可见长度
"element必须在comment后
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 5(10) test FOR FIELD P1 VISIBLE LENGTH 5.
PARAMETERS:p1 TYPE sy-datum OBLIGATORY.
SELECTION-SCREEN END OF LINE.
"划线,在线必须有内容,不能是空白
SELECTION-SCREEN ULINE /1(60).
"按钮
SELECTION-SCREEN BEGIN OF LINE.
"可以后续赋值描述
SELECTION-SCREEN PUSHBUTTON 5(30) btn1 USER-COMMAND clk1.
"使用text-xxx描述
SELECTION-SCREEN PUSHBUTTON 40(10) text-001 USER-COMMAND clk2.
SELECTION-SCREEN END OF LINE.
"块
SELECTION-SCREEN BEGIN OF BLOCK blk1 WITH FRAME TITLE text-001.
PARAMETERS bp_1 TYPE sy-datum.
SELECTION-SCREEN BEGIN OF BLOCK blk2 WITH FRAME.
PARAMETERS bp_2 TYPE sy-datum.
SELECTION-SCREEN BEGIN OF BLOCK blk3 WITH FRAME.
PARAMETERS bp_3 TYPE sy-datum.
SELECTION-SCREEN END OF BLOCK blk3.
SELECTION-SCREEN END OF BLOCK blk2.
SELECTION-SCREEN END OF BLOCK blk1.
"function key
SELECTION-SCREEN FUNCTION KEY 1.
SELECTION-SCREEN FUNCTION KEY 2.
SELECTION-SCREEN FUNCTION KEY 3.
SELECTION-SCREEN END OF SCREEN 500.
"使用include
SELECTION-SCREEN BEGIN OF SCREEN 501 AS WINDOW.
"如果p1已经obligatory,使用off关闭必输
SELECTION-SCREEN INCLUDE PARAMETERS p1 OBLIGATORY OFF.
"可以定义新的user command??有问题
"SELECTION-SCREEN INCLUDE PUSHBUTTON 5(20) btn1 USER-COMMAND blk4.
"包含block
SELECTION-SCREEN INCLUDE BLOCKS blk1.
SELECTION-SCREEN END OF SCREEN 501.
"parameters
"动态名,大写才能带出帮助等dict信息
DATA:name TYPE C LENGTH 132 VALUE 'SPFLI-CARRID'.
SELECTION-SCREEN BEGIN OF SCREEN 502 AS WINDOW.
"para最长8个字符
"使用(len)长度,length n指定长度,数据类型为C
PARAMETERS:p01(4).
PARAMETERS:p02 LENGTH 4.
"使用type
PARAMETERS:p03 TYPE C LENGTH 10.
"reference
PARAMETERS:p04 TYPE spfli-carrid.
"like
PARAMETERS:p05 LIKE p04.
"like (name),name最长132
PARAMETERS:p06 LIKE (name).
"是否必输
PARAMETERS:p07 TYPE C LENGTH 10 OBLIGATORY.
"是否显示
PARAMETERS:p08 TYPE C LENGTH 10 NO-DISPLAY.
"显示长度,可输入长度10,可见长度5
PARAMETERS:p09 TYPE C LENGTH 10 VISIBLE LENGTH 5.
"checkbox,sscrfields-ucomm可以处理
PARAMETERS:p_check AS CHECKBOX USER-COMMAND chk1.
"radiobutton,group名最长4位
PARAMETERS:p_rad1 RADIOBUTTON GROUP gp1.
PARAMETERS:p_rad2 RADIOBUTTON GROUP gp1.
"listbox
PARAMETERS:p_listb TYPE spfli-carrid VISIBLE LENGTH 10 AS LISTBOX.
"设置默认值,"设置允许小写,不设置自动转换大写
PARAMETERS:p_10 TYPE C LENGTH 10 DEFAULT 'hello' LOWER CASE.
"设置帮助f4
"MATCHCODE OBJECT S_CARRIER_ID 和 check value不能同时
PARAMETERS:p_11 TYPE C LENGTH 2 MATCHCODE OBJECT S_CARRIER_ID.
"设置值检查,建议必输,值检查同时设置,避免检查空值
PARAMETERS:p_12 TYPE spfli-carrid OBLIGATORY VALUE CHECK.
"memory id
PARAMETERS:p_13 TYPE sy-repid MEMORY ID rid.
SELECTION-SCREEN END OF SCREEN 502.
"select options
TABLES:spfli.
SELECTION-SCREEN BEGIN OF SCREEN 503 AS WINDOW.
"必须声明table:spfli
SELECT-OPTIONS s_01 FOR spfli-carrid.
"动态定义
SELECT-OPTIONS s_02 FOR (name).
"没有第二个输入框
SELECT-OPTIONS s_03 FOR spfli-carrid NO INTERVALS.
"没有multiple selection
SELECT-OPTIONS s_04 FOR spfli-carrid NO-EXTENSION.
"不显示
SELECT-OPTIONS s_05 FOR spfli-carrid NO-DISPLAY.
"默认值
"option:非范围:eq, ne, ge, gt, le, lt, cp, or np;
"当指定TO范围:bt,nb;
"sign:i or e;大小写都可
SELECT-OPTIONS s_06 FOR spfli-carrid DEFAULT 'AA' TO 'AZ' OPTION bt SIGN i.
SELECTION-SCREEN END OF SCREEN 503.
INITIALIZATION.
test = 'test'.
PERFORM f_creat_icon.
PERFORM f_func_key_icon.
AT SELECTION-SCREEN OUTPUT.
"设置parameter值
SET PARAMETER ID 'RID' FIELD 'TEST ID'.
AT SELECTION-SCREEN.
PERFORM f_function_key.
START-OF-SELECTION.
CALL SCREEN 500.
"创建icon
FORM f_creat_icon.
"按钮长度必须很长,才能显示完全
CALL FUNCTION 'ICON_CREATE'
EXPORTING
name = 'ICON_CHECKED'
text = 'Button1'
info = 'quick info'
add_stdinf = ''
IMPORTING
RESULT = btn1
EXCEPTIONS
OTHERS = 0.
ENDFORM. "f_creat_icon
"设置function key icon
FORM f_func_key_icon.
"使用这个或icon 编码4位
"TYPE-POOLS icon.
"SMP_DYNTXT(菜单制作器:动态文本的程序接口)
DATA:func_icon TYPE smp_dyntxt.
"func_icon-text = 'func1'. "显示文本,没用?
func_icon-icon_id = '@0N@'. "显示icon
func_icon-icon_text = 'func1'."图标文本
func_icon-quickinfo = 'quick info'."提示tip
"function key text显示
sscrfields-functxt_01 = func_icon.
sscrfields-functxt_02 = 'func2'.
sscrfields-functxt_03 = 'func3'.
ENDFORM. "f_func_key_icon
"function key comm
FORM f_function_key.
"响应function key
CASE sscrfields-ucomm.
WHEN 'FC01'.
MESSAGE 'function 1' TYPE 'I'.
CALL SELECTION-SCREEN 501 STARTING AT 50 50.
WHEN 'FC02'.
MESSAGE 'function 2' TYPE 'I'.
CALL SELECTION-SCREEN 502 STARTING AT 50 50.
WHEN 'FC03'.
MESSAGE 'function 3' TYPE 'I'.
CALL SELECTION-SCREEN 503 STARTING AT 50 50.
WHEN OTHERS.
ENDCASE.
ENDFORM.
3.calling selection screen
语法:
CALL SELECTION-SCREEN dynnr
[STARTING AT col1 lin1
[ENDING AT col2 lin2]]
[USING SELECTION-SET variant].
注意:selection screen最好不要用call screen调用。
4.selection screen processing
selection screen有自己的屏幕处理逻辑流。
AT SELECTION-SCREEN OUTPUT:相当于screen PBO;
AT SELECTION-SCREEN ...:相当于screen PAI;
语法:
AT SELECTION-SCREEN selscreen_event.
selscreen_event:
{ OUTPUT }
| { ON {para|selcrit} }
| { ON END OF selcrit }
| { ON BLOCK block }
| { ON RADIOBUTTON GROUP group }
| { }
| { ON {HELP-REQUEST|VALUE-REQUEST} FOR {para|selcrit-low|selcrit-high} }
| { ON EXIT-COMMAND }.
Selection screen屏幕事件
OUTPUT:PBO事件;
LOAD-OF-PROGRAM,INITIALIZATION只在程序加载,初始化执行一次。
ON {para|selcrit}:用户输入检查,可以在此Event,当抛出警告or错误信息,会卡住,可以再次输入。
ON END OF selcrit:select options整体检查。
ON BLOCK block:整个block检查,当抛出警告or错误信息,整个block中元素可以再次输入。
ON RADIOBUTTON GROUP group:整体radiobutton group检查,radio button不会触发on para事件。
{}: AT SELECTION-SCREEN,在整个screen输入检查完毕后触发,可以在此事件一次检查所有元素。
ON {HELP-REQUEST|VALUE-REQUEST}:相当于POH,POV事件,F1,F4帮助。帮助不会传输数据到program,使用function: RS_SELECTIONSCREEN_READ, RS_SELECTIONSCREEN_UPDATE传输。
ON EXIT-COMMAND:cancel,exit,back触发
5. Dynamic Selections
动态selection,使用CL_ABAP_DYN_PRG或者escape检查安全风险。
FREE_SELECTIONS_INIT,FREE_SELECTIONS_DIALOG创建动态selection。
示例:
"动态selection screen
CLASS c_dyn_selscreen DEFINITION.
PUBLIC SECTION.
METHODS:constructor IMPORTING iv_tabname TYPE tabname.
METHODS:get_data_show.
PRIVATE SECTION.
DATA:lv_selid TYPE rsdynsel-selid.
DATA:lt_field_tab TYPE TABLE OF rsdsfields.
DATA:lt_table_tab TYPE TABLE OF rsdstabs.
DATA:ls_table_tab LIKE LINE OF lt_table_tab.
DATA:lt_cond_tab TYPE rsds_twhere.
DATA:lo_dref TYPE REF TO data.
"alv
DATA:lo_alv TYPE REF TO cl_salv_table.
"tabname
DATA:lv_tabname TYPE tabname.
METHODS:check_table_exist
IMPORTING iv_tabname TYPE tabname
RETURNING VALUE(check_tabname) TYPE tabname.
ENDCLASS.
CLASS c_dyn_selscreen IMPLEMENTATION.
"构造
METHOD constructor.
"检查table name
me->check_table_exist( iv_tabname ).
"table
ls_table_tab-prim_tab = lv_tabname.
APPEND ls_table_tab TO lt_table_tab.
CALL FUNCTION 'FREE_SELECTIONS_INIT'
EXPORTING
kind = 'T'
IMPORTING
selection_id = lv_selid
TABLES
tables_tab = lt_table_tab
EXCEPTIONS
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE 'Error in initialization' TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
ENDIF.
CALL FUNCTION 'FREE_SELECTIONS_DIALOG'
EXPORTING
selection_id = lv_selid
title = 'Free Selection'
as_window = ' '
IMPORTING
where_clauses = lt_cond_tab
TABLES
fields_tab = lt_field_tab
EXCEPTIONS
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE 'No free selection created' TYPE 'I'.
LEAVE PROGRAM.
ENDIF.
ENDMETHOD.
"获取数据
METHOD get_data_show.
FIELD-SYMBOLS <table> TYPE STANDARD TABLE.
FIELD-SYMBOLS <cond> LIKE LINE OF lt_cond_tab.
READ TABLE lt_cond_tab WITH KEY tablename = lv_tabname ASSIGNING <cond>.
IF sy-subrc <> 0.
MESSAGE 'Error in condition' TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
ENDIF.
CREATE DATA lo_dref TYPE TABLE OF (lv_tabname).
ASSIGN lo_dref->* TO <table>.
TRY.
SELECT * FROM (lv_tabname) INTO TABLE <table>
WHERE (<cond>-where_tab).
CATCH cx_sy_dynamic_osql_error.
MESSAGE 'Error in dynamic Open SQL' TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
ENDTRY.
"show alv
TRY.
cl_salv_table=>factory(
IMPORTING r_salv_table = lo_alv
CHANGING t_table = <table> ).
lo_alv->display( ).
CATCH cx_salv_msg.
MESSAGE 'Error in ALV display' TYPE 'I' DISPLAY LIKE 'E'.
ENDTRY.
ENDMETHOD.
"检查table是否存在
METHOD check_table_exist.
TRY .
lv_tabname = cl_abap_dyn_prg=>check_table_name_str(
val = iv_tabname
packages = 'SAPBC_DATAMODEL' ).
CATCH cx_abap_not_a_table.
MESSAGE 'Database table not found' TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
CATCH cx_abap_not_in_package.
MESSAGE 'Only tables from the flight data model are allowed'
TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
ENDTRY.
ENDMETHOD.
ENDCLASS.