两种Search Help的合并使用 : Database View + Search Help Exit

案例:要在As03Aseet numberSearch help中加一些自定义的字段进行查找,自定义的字段在ANLU中,可以通过将表ANLAANLU合并做成一个VIEW来实现,但有2个查找字段Actual NBVNBVA)Estimation NBV(NBVE)不存在任何一个表中,是通过表ANLC计算出来的,这里就得要通过Search Help Exit来实现

 

  1. 首先完成ANLA+ANLUVIEW ZANLAU,View不包含字段NBVANBVE

 


 

  1. 建立Search help ZANLU分配View给选择方法及在参数后添加NBVANBVB字段,最后给一个SEARCH HELP EXIT函数

 


 

 

  1. 编写Search help exit程序ZF4IF_SHLP_EXIT_AS03

 

FUNCTION zf4if_shlp_exit_as03.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  TABLES
*"      SHLP_TAB TYPE  SHLP_DESCT
*"      RECORD_TAB STRUCTURE  SEAHLPRES
*"  CHANGING
*"     VALUE(SHLP) TYPE  SHLP_DESCR
*"     VALUE(CALLCONTROL) LIKE  DDSHF4CTRL STRUCTURE  DDSHF4CTRL
*"----------------------------------------------------------------------
 
* EXIT immediately, if you do not want to handle this step
  IF callcontrol-step <> 'SELONE' AND
     callcontrol-step <> 'SELECT' AND
     " AND SO ON
     callcontrol-step <> 'DISP'.
    EXIT.
  ENDIF.
 
*"----------------------------------------------------------------------
* STEP SELONE  (Select one of the elementary searchhelps)
*"----------------------------------------------------------------------
* This step is only called for collective searchhelps. It may be used
* to reduce the amount of elementary searchhelps given in SHLP_TAB.
* The compound searchhelp is given in SHLP.
* If you do not change CALLCONTROL-STEP, the next step is the
* dialog, to select one of the elementary searchhelps.
* If you want to skip this dialog, you have to return the selected
* elementary searchhelp in SHLP and to change CALLCONTROL-STEP to
* either to 'PRESEL' or to 'SELECT'.
  IF callcontrol-step = 'SELONE'.   "聚合search help专用
*   PERFORM SELONE .........
    EXIT.
  ENDIF.
 
*"----------------------------------------------------------------------
* STEP PRESEL  (Enter selection conditions)
*"----------------------------------------------------------------------
* This step allows you, to influence the selection conditions either
* before they are displayed or in order to skip the dialog completely.
* If you want to skip the dialog, you should change CALLCONTROL-STEP
* to 'SELECT'.
* Normaly only SHLP-SELOPT should be changed in this step.
  IF callcontrol-step = 'PRESEL'.    "用于输出选择屏幕前输入数据给选择参数
*   PERFORM PRESEL ..........
    EXIT.
  ENDIF.
*"----------------------------------------------------------------------
* STEP SELECT    (Select values)
*"----------------------------------------------------------------------
* This step may be used to overtake the data selection completely.
* To skip the standard seletion, you should return 'DISP' as following
* step in CALLCONTROL-STEP.
* Normally RECORD_TAB should be filled after this step.
* Standard function module F4UT_RESULTS_MAP may be very helpfull in this
* step.
  IF callcontrol-step = 'SELECT'.     "选择参数输入后数据还没有得到,可以修改或增加选择参数
*   PERFORM STEP_SELECT TABLES RECORD_TAB SHLP_TAB
*                       CHANGING SHLP CALLCONTROL RC.
*   IF RC = 0.
*     CALLCONTROL-STEP = 'DISP'.
*   ELSE.
*     CALLCONTROL-STEP = 'EXIT'.
*   ENDIF.
    EXIT. "Don't process STEP DISP additionally in this call.
  ENDIF.
*"----------------------------------------------------------------------
* STEP DISP     (Display values)
*"----------------------------------------------------------------------
* This step is called, before the selected data is displayed.
* You can e.g. modify or reduce the data in RECORD_TAB
* according to the users authority.
* If you want to get the standard display dialog afterwards, you
* should not change CALLCONTROL-STEP.
* If you want to overtake the dialog on you own, you must return
* the following values in CALLCONTROL-STEP:
* - "RETURN" if one line was selected. The selected line must be
*   the only record left in RECORD_TAB. The corresponding fields of
*   this line are entered into the screen.
* - "EXIT" if the values request should be aborted
* - "PRESEL" if you want to return to the selection dialog
* Standard function modules F4UT_PARAMETER_VALUE_GET and
* F4UT_PARAMETER_RESULTS_PUT may be very helpfull in this step.
  IF callcontrol-step = 'DISP'.             "显示之前数据已经得到在表RECORD_TAB中,可以增改得到
的数据,或增加自定义的选择字段进行筛选,如此例就是用database View得到数据,再用自定义的2个字段(Database View中不存在该两字段,是算出来的数据)来筛选。。。
*   PERFORM AUTHORITY_CHECK TABLES RECORD_TAB SHLP_TAB
*                           CHANGING SHLP CALLCONTROL.
    DATA: g_bukrs TYPE ddshiface-value.
    DATA: BEGIN OF gt_anln1 OCCURS 0,
            anln1 TYPE anla-anln1,
          END OF gt_anln1.
    DATA: gt_anlc TYPE TABLE OF anlc WITH HEADER LINE.
    DATA: BEGIN OF gt_nbv OCCURS 0,
      bukrs TYPE bukrs,
      anln1 TYPE anln1,
      znbva TYPE anep-anbtr,   "Actual
      znbve TYPE anep-anbtr,   "Estimation
    END OF gt_nbv.
    DATA: wa_anlcv TYPE anlcv.
*
*
    CALL FUNCTION 'F4UT_PARAMETER_VALUE_GET'
    EXPORTING
      parameter               = 'BUKRS'
*       OFF_RESULT              = 0
*       LEN_RESULT              = 0
*       FIELDNAME               = ' '
     IMPORTING
       value                   = g_bukrs
    TABLES
      shlp_tab                = shlp_tab
      record_tab              = record_tab
*       SELOPT_TAB              =
*      RESULTS_TAB              = GT_ANLN1[]
    CHANGING
      shlp                    = shlp
      callcontrol             = callcontrol
    EXCEPTIONS
      parameter_unknown       = 1
      OTHERS                  = 2
      .
 
    CALL FUNCTION 'F4UT_PARAMETER_VALUE_GET'
      EXPORTING
        parameter               = 'ANLN1'
*       OFF_RESULT              = 0
*       LEN_RESULT              = 0
*       FIELDNAME               = ' '
*     IMPORTING
*       VALUE                   =
      TABLES
        shlp_tab                = shlp_tab
        record_tab              = record_tab
*       SELOPT_TAB              =
       results_tab              = gt_anln1[]
      CHANGING
        shlp                    = shlp
        callcontrol             = callcontrol
     EXCEPTIONS
       parameter_unknown       = 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.
 
    "Caution: there're some asset don't exist in ANLC, so GT_ANLC may be lack of some asset, should add back.
    SELECT * INTO TABLE gt_anlc
      FROM anlc
      FOR ALL ENTRIES IN gt_anln1
      WHERE bukrs = g_bukrs
        AND anln1 = gt_anln1-anln1.
 
*   data: gt_anlc_01 type table of anlc WITH HEADER LINE. "Actual
*   data: gt_anlc_02 type table of anlc WITH HEADER LINE. "Estimation
    DATA: gf_anlc_exist TYPE c .
    DATA: gf_01_exist   TYPE c.
    DELETE gt_anlc[] WHERE afabe EQ '03'.
    SORT gt_anlc BY bukrs anln1 gjahr DESCENDING afabe.
 
    LOOP AT gt_anln1.
      CLEAR gt_nbv.
      gt_nbv-bukrs = g_bukrs.
      MOVE-CORRESPONDING gt_anln1 TO gt_nbv.
      CLEAR gf_anlc_exist.
      CLEAR gf_01_exist.
 
      LOOP AT gt_anlc WHERE bukrs = g_bukrs
                        AND anln1 = gt_anln1-anln1.
        gf_anlc_exist = 'X'.
 
        IF gt_anlc-afabe EQ '01'.
          IF gf_01_exist EQ 'X'.
            APPEND gt_nbv.
            EXIT.
          ENDIF.
          gf_01_exist = 'X'.
 
          CLEAR wa_anlcv.
          CALL FUNCTION 'FI_AA_VALUES_CALCULATE'
            EXPORTING
              i_anlc  = gt_anlc
            IMPORTING
              e_anlcv = wa_anlcv.
 
          gt_nbv-znbva = wa_anlcv-lfd_bchwrt.
 
        ELSEIF gt_anlc-afabe EQ '02'.
          CLEAR wa_anlcv.
          CALL FUNCTION 'FI_AA_VALUES_CALCULATE'
            EXPORTING
              i_anlc  = gt_anlc
            IMPORTING
              e_anlcv = wa_anlcv.
 
          gt_nbv-znbve = wa_anlcv-lfd_bchwrt.
 
          APPEND gt_nbv.
          EXIT.
        ENDIF.
      ENDLOOP.
 
      IF gf_anlc_exist EQ ''.
        APPEND gt_nbv.
        CLEAR gt_nbv.
      ENDIF.
 
    ENDLOOP.
 
*    " add back the asset that don't exist in table ANLC
*    DATA: l_tabix TYPE i.
*    LOOP AT gt_anln1.
*      l_tabix = sy-tabix.
*      READ TABLE gt_nbv WITH KEY  bukrs = gt_anln1-bukrs
*                                  anln1 = gt_anln1-anln1.
*      IF sy-subrc NE 0.
*        MOVE-CORRESPONDING gt_anln1 TO gt_nbv.
*        INSERT  gt_nbv INDEX l_tabix.
*      ENDIF.
*    ENDLOOP.
 
 
    "get the NBV select condition
    DATA: gr_nbva TYPE RANGE OF znbva WITH HEADER LINE .
    DATA: gr_nbve TYPE RANGE OF znbve WITH HEADER LINE .
    DATA: wa_selopt LIKE LINE OF shlp-selopt.
    LOOP AT shlp-selopt INTO wa_selopt.
      CASE wa_selopt-shlpfield.
        WHEN 'ZNBVA'.
          MOVE-CORRESPONDING wa_selopt TO gr_nbva.
          APPEND gr_nbva.
        WHEN 'ZNBVE'.
          MOVE-CORRESPONDING wa_selopt TO gr_nbve.
          APPEND gr_nbve.
      ENDCASE.
    ENDLOOP.
 
    LOOP AT gt_nbv.
      IF gt_nbv-znbva NOT IN gr_nbva OR gt_nbv-znbve NOT IN gr_nbve.
        DELETE record_tab INDEX sy-tabix.
        DELETE gt_nbv     INDEX sy-tabix.
        CONTINUE.
      ENDIF.
    ENDLOOP.
 
 
    CALL FUNCTION 'F4UT_PARAMETER_RESULTS_PUT'
      EXPORTING
        parameter               = 'ZNBVA'
*       OFF_SOURCE              = 0
*       LEN_SOURCE              = 0
*       VALUE                   =
       fieldname               = 'ZNBVA'
      TABLES
        shlp_tab                = shlp_tab
        record_tab              = record_tab
       source_tab               = gt_nbv
      CHANGING
        shlp                    = shlp
        callcontrol             = callcontrol
*     EXCEPTIONS
*       PARAMETER_UNKNOWN       = 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.
 
 
    CALL FUNCTION 'F4UT_PARAMETER_RESULTS_PUT'
    EXPORTING
      parameter               = 'ZNBVE'
*       OFF_SOURCE              = 0
*       LEN_SOURCE              = 0
*       VALUE                   =
      fieldname               = 'ZNBVE'
    TABLES
      shlp_tab                = shlp_tab
      record_tab              = record_tab
      source_tab               = gt_nbv
    CHANGING
      shlp                    = shlp
      callcontrol             = callcontrol
*     EXCEPTIONS
*       PARAMETER_UNKNOWN       = 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.
 
 
    EXIT.
  ENDIF.
ENDFUNCTION.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值