业务需求:
在SAP项目中,会经常碰到如下需求:
:: ALV的选择屏幕界面中,需要添加选择字段的F4搜索帮助。
: F4搜索帮助:
实现步骤:
一、为选择屏幕字段S_VKBUR添加选择屏幕事件
二、实现事件对应的FORM(FRM_F4_VKBUR):
主要功能:
1:PAI事件前,获取选择屏幕S_BUKRS公司代码的值。
2:根据公司代码获取F4搜索帮助表。
3:设置搜索帮助显示字段(包含客户化的描述)。
4:显示F4搜索帮助对话框;获取选择数值,赋值给屏幕字段。
实现代码:
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_VKBUR-LOW.
**搜索帮助-部门
PERFORM FRM_F4_VKBUR USING 'LOW'.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR S_VKBUR-HIGH.
**搜索帮助-部门
PERFORM FRM_F4_VKBUR USING 'HIGH'.
*&---------------------------------------------------------------------*
*& Form FRM_F4_VKBUR
*&---------------------------------------------------------------------*
* F4部门
*----------------------------------------------------------------------*
* -->P_0017 text
*----------------------------------------------------------------------*
FORM FRM_F4_VKBUR USING P_NAME.
DATA: LT_RETURN_TAB TYPE STANDARD TABLE OF DDSHRETVAL,
LS_RETURN_TAB TYPE DDSHRETVAL,
LT_DFIES TYPE TABLE OF DFIES,
LS_DFIES TYPE DFIES,
LV_OFFSET TYPE I,
LR_TABDESCR TYPE REF TO CL_ABAP_STRUCTDESCR,
LT_DYNP TYPE TABLE OF DYNPREAD.
RANGES: LR_BUKRS FOR T001-BUKRS.
**获取:屏幕的公司代码
LT_DYNP = VALUE #( ( FIELDNAME = 'S_BUKRS-LOW' ) ).
CALL FUNCTION 'DYNP_VALUES_READ'
EXPORTING
DYNAME = SY-REPID
DYNUMB = SY-DYNNR
TABLES
DYNPFIELDS = LT_DYNP.
DATA(L_BUKRS) = LT_DYNP[ FIELDNAME = 'S_BUKRS-LOW' ]-FIELDVALUE.
IF L_BUKRS IS NOT INITIAL.
LR_BUKRS[] = VALUE #( ( SIGN = 'I' OPTION = 'EQ' LOW = L_BUKRS ) ).
ENDIF.
**获取:搜索帮助表
SELECT DISTINCT
ZTZFFI_0024_02~BUKRS, "公司代码
ZTZFFI_0024_02~VKBUR, "部门
TVKBT~BEZEI "部门描述
INTO TABLE @DATA(LT_F4_HELP)
FROM ZTZFFI_0024_02
LEFT JOIN TVKBT
ON ZTZFFI_0024_02~VKBUR = TVKBT~VKBUR
AND TVKBT~SPRAS = 1
WHERE BUKRS IN @LR_BUKRS.
SORT LT_F4_HELP BY BUKRS VKBUR.
**设置:搜索帮助显示字段
DATA: LS_F4_HELP LIKE LINE OF LT_F4_HELP.
LR_TABDESCR ?= CL_ABAP_STRUCTDESCR=>DESCRIBE_BY_DATA( LS_F4_HELP ).
LT_DFIES = CL_SALV_DATA_DESCR=>READ_STRUCTDESCR( LR_TABDESCR ).
LOOP AT LT_DFIES INTO LS_DFIES.
LS_DFIES-LFIELDNAME = LS_DFIES-FIELDNAME.
LS_DFIES-OFFSET = LV_OFFSET.
CASE LS_DFIES-FIELDNAME.
WHEN 'BUKRS'.
LS_DFIES-SCRTEXT_L = LS_DFIES-SCRTEXT_M = LS_DFIES-SCRTEXT_S = LS_DFIES-REPTEXT = '公司代码'.
WHEN 'VKBUR'.
LS_DFIES-SCRTEXT_L = LS_DFIES-SCRTEXT_M = LS_DFIES-SCRTEXT_S = LS_DFIES-REPTEXT = '部门编码'.
WHEN 'BEZEI'.
LS_DFIES-SCRTEXT_L = LS_DFIES-SCRTEXT_M = LS_DFIES-SCRTEXT_S = LS_DFIES-REPTEXT = '部门名称'.
WHEN OTHERS.
ENDCASE.
LV_OFFSET = LV_OFFSET + LS_DFIES-INTLEN.
MODIFY LT_DFIES FROM LS_DFIES.
ENDLOOP.
**功能:调用函数显示搜索帮助界面
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
RETFIELD = 'VKBUR' "搜索帮助表:GT_F4_HELP 里的字段
DYNPPROG = SY-REPID " 当前程序
DYNPNR = SY-DYNNR "当前屏幕号
VALUE_ORG = 'S' "默认为C但是此处不用S不行
CALLBACK_PROGRAM = SY-REPID "回诘程序,也为当前程序
TABLES
VALUE_TAB = LT_F4_HELP " F4 搜索帮助表 (说明:函数对这个表参照类型并未做规定,但返回表的类型是定死的为:DDSHRETVAL
FIELD_TAB = LT_DFIES
RETURN_TAB = LT_RETURN_TAB "选择后,返回表值:已经选的值。准备用来回写到ALV表对应字段上
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS = 3.
IF SY-SUBRC = 0.
READ TABLE LT_RETURN_TAB INTO LS_RETURN_TAB INDEX 1.
IF LS_RETURN_TAB-FIELDVAL IS NOT INITIAL.
IF P_NAME = 'LOW'.
S_VKBUR-LOW = LS_RETURN_TAB-FIELDVAL.
ELSE.
S_VKBUR-HIGH = LS_RETURN_TAB-FIELDVAL.
ENDIF.
ENDIF.
ENDIF.
ENDFORM.