FM—ALV——选择屏幕-搜索帮助-下拉框格式

在实际项目中,很多时候如果某字段的参照表不能满足客户要求,需求设计选择屏幕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。等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值