两种Search Help的合拢使用 : Database View + Search Help Exit
两种Search Help的合并使用 : Database View + Search Help Exit
案例:要在As03的Aseet number的Search help中加一些自定义的字段进行查找,自定义的字段在A表NLU中,可以通过将表ANLA和ANLU合并做成一个VIEW来实现,但有2个查找字段Actual NBV(NBVA)和Estimation NBV(NBVE)不存在任何一个表中,是通过表ANLC计算出来的,这里就得要通过Search Help Exit来实现
- 首先完成ANLA+ANLU的VIEW ZANLAU,该View不包含字段NBVA和NBVE,
- 建立Search help ZANLU分配View给选择方法及在参数后添加NBVA和NBVB字段,最后给一个SEARCH HELP EXIT函数
- 编写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.