案例:要在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.