abap:非主键搜索帮助创建删除重复项的方法

转载自:http://www.cnblogs.com/caizjian/p/3712804.html

SAP提供了预定义函数F4IF_SHLP_EXIT_EXAMPLE,创建搜索帮助。

1.

2.

复制SAP的预定义函数F4IF_SHLP_EXIT_EXAMPLE创建函数ZFVBELN_FIND_EXIT

参数和预定义函数一致,这里我们调用‘SELECT’这个时间点来进行数据的查询输出,自定义的帮助出口函数中的具体代码如下:

FUNCTION zfvbeln_find_exit.
*"----------------------------------------------------------------------
*"*"Local interface:
*"  TABLES
*"      SHLP_TAB TYPE  SHLP_DESCT
*"      RECORD_TAB STRUCTURE  SEAHLPRES
*"  CHANGING
*"     VALUE(SHLP) TYPE  SHLP_DESCR
*"     VALUE(CALLCONTROL) LIKE  DDSHF4CTRL STRUCTURE  DDSHF4CTRL
*"----------------------------------------------------------------------
  DATA:BEGIN OF lt_tab OCCURS 0,
    vbeln TYPE vbeln_vl,
    lfdat TYPE lfdat_v,
    wbstk TYPE wbstk,
    END OF lt_tab.

  DATA:r_vbeln TYPE RANGE OF vbeln_vl WITH HEADER LINE,
        r_lfdat TYPE RANGE OF lfdat_v WITH HEADER LINE,
        r_wbstk TYPE RANGE OF wbstk WITH HEADER LINE,
        ddshselops TYPE ddshselopt.
  IF callcontrol-step = 'SELECT'.
    LOOP AT shlp-selopt INTO ddshselops.
      CASE ddshselops-shlpfield.
        WHEN 'VBELN'.
          MOVE-CORRESPONDING ddshselops TO r_vbeln.
          APPEND r_vbeln.
        WHEN 'LFDAT'.
          MOVE-CORRESPONDING ddshselops TO r_lfdat.
          APPEND r_lfdat.
        WHEN 'WBSTK'.
          MOVE-CORRESPONDING ddshselops TO r_wbstk.
          APPEND r_wbstk.
      ENDCASE.
    ENDLOOP.

*根据输入参数查询数据
    SELECT likp~vbeln likp~lfdat INTO CORRESPONDING FIELDS OF TABLE lt_tab FROM likp
      INNER JOIN vbuk
      ON likp~vbeln = vbuk~vbeln
      WHERE likp~vbeln IN r_vbeln
      AND likp~lfdat IN r_lfdat
      AND vbuk~wbstk IN r_wbstk.

*将查询结果回执到屏幕上来
      CALL FUNCTION 'F4UT_RESULTS_MAP'
*       EXPORTING
*         SOURCE_STRUCTURE         =
*         APPLY_RESTRICTIONS       = ' '
        TABLES
          shlp_tab                 = SHLP_TAB
          record_tab               = RECORD_TAB
          source_tab               = LT_TAB
        changing
          shlp                     = SHLP
          callcontrol              = CALLCONTROL
       EXCEPTIONS
         ILLEGAL_STRUCTURE        = 1
         OTHERS                   = 2
                .
      IF sy-subrc <> 0.
         MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
      ENDIF.
*下一个时间点直接转到DISP,否则无法再屏幕上显示帮助列表
            callcontrol-step = 'DISP'.  ""

  ENDIF.

ENDFUNCTION.

激活函数和搜索帮助,允许测试搜索帮助结果如下:

如果需要过滤掉重复项,对内表LT_TAB 进行排序过滤操作。

——————————————————————————————————————————

参考上述方法,实现重复项过滤

——————————————————————————————————————————

FUNCTION zsd_r011_f4if_zztzd.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  TABLES
*"      SHLP_TAB TYPE  SHLP_DESCT
*"      RECORD_TAB STRUCTURE  SEAHLPRES
*"  CHANGING
*"     VALUE(SHLP) TYPE  SHLP_DESCR
*"     VALUE(CALLCONTROL) LIKE  DDSHF4CTRL STRUCTURE  DDSHF4CTRL
*"----------------------------------------------------------------------
*Copy from fm F4IF_SHLP_EXIT_EXAMPLE
*
**********************************************************************

  RANGES: ra_zztzd FOR ztsd006-zztzd.

  CHECK callcontrol-step = 'SELECT'.

  LOOP AT shlp-selopt INTO DATA(ls_selopt).
    CASE ls_selopt-shlpfield.
      WHEN 'ZZTZD'.
        ra_zztzd = CORRESPONDING #( ls_selopt ).
        APPEND ra_zztzd.
      WHEN OTHERS.
    ENDCASE.
  ENDLOOP.

*根据输入参数查询数据
  SELECT
    zztzd
    INTO TABLE @DATA(lt_ztsd006)
    FROM ztsd006
    WHERE zztzd IN @ra_zztzd.

  SORT lt_ztsd006 BY zztzd.
  DELETE ADJACENT DUPLICATES FROM lt_ztsd006 COMPARING zztzd.

*将查询结果回执到屏幕上来
  CALL FUNCTION 'F4UT_RESULTS_MAP'
    TABLES
      shlp_tab          = shlp_tab
      record_tab        = record_tab
      source_tab        = lt_ztsd006
    CHANGING
      shlp              = shlp
      callcontrol       = callcontrol
    EXCEPTIONS
      illegal_structure = 1
      OTHERS            = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
        WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

*下一个时间点直接转到DISP,否则无法再屏幕上显示帮助列表
  callcontrol-step = 'DISP'.


ENDFUNCTION.

根据效果可以发现,实现了重复项过滤

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值