在实际项目中,很多时候如果某字段的参照表不能满足客户要求,需求设计选择屏幕PARAMETERS为下拉框模式,供客户选择,那如何实现呢?
1.首先:定义选择屏幕,哪个字段为下拉框模式。这里字符可见的长度为20
PARAMETERS:
p_lgort LIKE mseg-lgort AS LISTBOX VISIBLE LENGTH 20 DEFAULT 'z09' OBLIGATORY.
2.设计搜索帮助事件AT SELECTION-SCREEN ON VALUE-REQUEST
INITIALIZATION.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_lgort.
PERFORM frm_set_selection.
START-OF-SELECTION.
3.给下拉菜单填充内容
FORM frm_set_selection .
* FM ALV 设置下拉菜单的方法
TYPES :BEGIN OF ty,
col1 TYPE char3,
col2 TYPE char20,
END OF ty.
DATA itab TYPE TABLE OF ty.
itab = VALUE #(
( col1 = 'Z09' col2 = '成本中心领用')
( col1 = 'Z11' col2 = '线边退料')
( col1 = 'Z13' col2 = '成品工废、料废订单消耗领用')
( col1 = 'Z15' col2 = '成品返工领用')
( col1 = 'Z16' col2 = '项目领用')
( col1 = 'Z18' col2 = '废品消耗领用' )
( col1 = 'S61' col2 = '备件消耗领用' ) ).
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
* DDIC_STRUCTURE = ' '
retfield = 'COL1'
* PVALKEY = ' '
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'COL1'
* STEPL = 0
window_title = 'WINDOW--TITLE'
* VALUE = ''
value_org = 'S' "C表示cell,S表示structure
* MULTIPLE_CHOICE = 'X'"多项选择,用于SELECT-OPTIONS
* DISPLAY = 'F'"C则只能显示,不能选择
callback_program = sy-repid
* CALLBACK_FORM = ' '
* MARK_TAB =
* IMPORTING
* USER_RESET =
TABLES
value_tab = itab
* FIELD_TAB = FIELD_TAB
* RETURN_TAB =
* DYNPFLD_MAPPING =
EXCEPTIONS
parameter_error = 1
no_values_found = 2
OTHERS = 3.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDFORM.
小贴士: 如果在取数时候要用选择屏幕筛选,那没如果下拉框不选择的话,按照常规是应该全查的,可是下拉框就是默认的PARAMETERS形式,就会按照空值去查,那如何避免这种情况呢?
解决办法:把下拉框的值(PARAMETERS)赋给range(SELECT-OPTIONS)
在top里定义**全局变量**(若将下面定义放在AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_lgort下,就是局部变量了,在查询关联时候会报错不存在)
DATA :lr_lgort type range of mseg-lgort,
ls_lgort like line of lr_lgort.
在src里写下拉赋值
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_lgort .
IF p_lgort = ''.
(排除为空时候赋值进去)
ELSE.
CLEAR:ls_lgort,lr_lgort.
REFRESH lr_lgort.
ls_lgort-sign = 'I'.
ls_lgort-option = 'EQ'.
ls_lgort-low = p_lgort.
APPEND ls_lgort to lr_lgort.
ENDIF.
*
这样lr_lgort就是以SELECT-OPTIONS形式存在了
在select里这样写:
selelct* into table form db。。。
where mseg-lgort in lr_lgort.
当然啦,也有其他的办法解决,比如判断下拉框p_lgort是否为空,为空就不加筛选条件,不为空就 = 下拉框值p_lgort。等