一、以下拉菜单方式实现
1、效果截图如下
2、实现
1)、在fieldcat里设置F4的DRDN_HNDL值,该值类似索引号
2)、设置下拉值列表:通过类CL_GUI_ALV_GRID调用方法SET_DROP_DOWN_TABLE,该方法中参数IT_DROP_DOWN里有HANDLE列,该列的值对应1)设置的
DRDN_HNDL值
3、代码
1)、设置fieldcat属性
CASE PS_FIELDCAT-FIELDNAME.
WHEN 'RQCAT_DESC'.
PS_FIELDCAT-DRDN_HNDL = '1'.
WHEN 'RQTYP_DESC'.
PS_FIELDCAT-DRDN_HNDL = '2'.
WHEN 'AMTYP_DESC'.
PS_FIELDCAT-DRDN_HNDL = '3'.
WHEN 'FREPY_DESC'.
PS_FIELDCAT-DRDN_HNDL = '4'.
WHEN 'COTYP_DESC'.
PS_FIELDCAT-DRDN_HNDL = '5'.
WHEN 'STATU_DESC'.
PS_FIELDCAT-DRDN_HNDL = '6'.
2)、设置下拉列表值
FORM F_SET_DROP_DOWN_LIST USING PO_ALV_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA: LT_VALUES TYPE LVC_T_DROP.
PERFORM F_SET_VALUES TABLES LT_VALUES USING 'Z_MMP_RQCAT' 1.
PERFORM F_SET_VALUES TABLES LT_VALUES USING 'Z_APP_TYPE_2' 2.
PERFORM F_SET_VALUES TABLES LT_VALUES USING 'Z_COL_SEQ_AMEND' 3.
PERFORM F_SET_VALUES TABLES LT_VALUES USING 'Z_FRE_PAY' 4.
PERFORM F_SET_VALUES TABLES LT_VALUES USING 'Z_CARR_O_TYPE' 5.
PERFORM F_SET_VALUES TABLES LT_VALUES USING 'ZWF_WFSTATUS' 6.
CALL METHOD PO_ALV_GRID->SET_DROP_DOWN_TABLE
EXPORTING
IT_DROP_DOWN = LT_VALUES.
ENDFORM. " F_SET_DROP_DOWN_LIST
FORM F_SET_VALUES TABLES PT_VALUES STRUCTURE LVC_S_DROP
USING PV_DOMAIN
PV_HANDEL.
DATA: LT_VALUES TYPE TABLE OF DD07V WITH HEADER LINE.
DATA: LS_ALV_VALUES TYPE LVC_S_DROP.
DATA: LV_DOMAIN TYPE DOMNAME.
CLEAR:LS_ALV_VALUES,LV_DOMAIN,LT_VALUES[],LT_VALUES.
LV_DOMAIN = PV_DOMAIN.
CALL FUNCTION 'DD_DOMVALUES_GET' "获取DOMAIN的值列表
EXPORTING
DOMNAME = LV_DOMAIN
TEXT = GC_X
TABLES
DD07V_TAB = LT_VALUES[]
EXCEPTIONS
WRONG_TEXTFLAG = 1
OTHERS = 2.
LOOP AT LT_VALUES.
LS_ALV_VALUES-HANDLE = PV_HANDEL.
LS_ALV_VALUES-VALUE = LT_VALUES-DDTEXT.
APPEND LS_ALV_VALUES TO PT_VALUES.
CLEAR: LT_VALUES,LS_ALV_VALUES.
ENDLOOP.
FREE:LT_VALUES.
ENDFORM. " F_SET_VALUES
二、以单击右边按钮的方式实现
1、效果截图如下
2、实现
有两种方式:
1)、给fieldcat里的REF_FIELD与REF_TABLE设置相应的值,即该字段所参照的哪个表的哪个字段
2)、注册F4事件
a)、调用类CL_GUI_ALV_GRID的方法注册事件
*&---------------------------------------------------------------------*
*& Form F_EVENT_HANDLER_PROC
*&---------------------------------------------------------------------*
* Edit Event 및 Event Handler 등록
*----------------------------------------------------------------------*
* <--PO_EVENT Event Handler
* <--PO_ALV_GRID 현재 사용중인 GRID 이름
*----------------------------------------------------------------------*
FORM F_EVENT_HANDLER_PROC
CHANGING PO_EVENT TYPE REF TO LCL_EVENT_RECEIVER
PO_ALV_GRID TYPE REF TO LCL_ALV_GRID.
* set editable cells to ready for input
CALL METHOD PO_ALV_GRID->SET_READY_FOR_INPUT
EXPORTING
I_READY_FOR_INPUT = 1.
*>> Edit event 설정
*-- CELL 입력후 ENTER 발생한 경우 CATCH
CALL METHOD PO_ALV_GRID->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_ENTER.
*-- CELL 입력후 값이 변경 또는 입력되는 순간 CATCH
*설명: check 할 때는 좋으나 값변경하고 바로 데이터를 타기 때문에
* 화면에 데이터가 많을 경우 깜박꺼림이 심한 경우가 발생한다..
CALL METHOD PO_ALV_GRID->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED.
CREATE OBJECT PO_EVENT.
**>> Double-click control
SET HANDLER PO_EVENT->HANDLE_F4_HELP FOR PO_ALV_GRID.
*>> CELL BUTTON 을 눌렀을 경우의 처리
SET HANDLER PO_EVENT->HANDLE_BUTTON_CLICK FOR PO_ALV_GRID.
*>> HOPSPOT 을 눌렀을 경우의 처리
SET HANDLER PO_EVENT->HANDLE_HOTSPOT_CLICK FOR PO_ALV_GRID.
*>> User command 처리를 한다.
SET HANDLER PO_EVENT->HANDLE_USER_COMMAND FOR PO_ALV_GRID.
*>> TOOLBAR 처리를 한다.
SET HANDLER PO_EVENT->HANDLE_TOOLBAR FOR PO_ALV_GRID.
*>> DATA_CHANGED 처리를 한다.
SET HANDLER PO_EVENT->HANDLE_DATA_CHANGED FOR PO_ALV_GRID.
SET HANDLER PO_EVENT->HANDLE_DATA_CHANGED_FINISHED FOR PO_ALV_GRID.
ENDFORM. " F_EVENT_HANDLER_PROC
b)、注册F4事件(该事件类自己写)
CLASS LCL_EVENT_RECEIVER DEFINITION.
PUBLIC SECTION.
METHODS :
*-- HANDLE_F4_HELP 처리를 한다.
HANDLE_F4_HELP
FOR EVENT ONF4 OF CL_GUI_ALV_GRID
IMPORTING E_FIELDNAME
ES_ROW_NO
ER_EVENT_DATA
ET_BAD_CELLS
E_DISPLAY.
ENDCLASS . "LCL_EVENT_RECEIVER DEFINITION
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.
METHOD HANDLE_F4_HELP.
PERFORM F_F4_HELP USING E_FIELDNAME
ES_ROW_NO
ER_EVENT_DATA.
ENDMETHOD. "HANDLE_F4_HELP
ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION
FORM F_F4_HELP USING PV_FIELDNAME TYPE LVC_FNAME
PS_ROW_NO TYPE LVC_S_ROID
PO_EVENT_DATA TYPE REF TO CL_ALV_EVENT_DATA.
DATA: LT_RETURN TYPE TABLE OF DDSHRETVAL WITH HEADER LINE.
DATA LS_MODI TYPE LVC_S_MODI.
FIELD-SYMBOLS : <LT_F4TAB> TYPE LVC_T_MODI.
RANGES:
LR_PSPID FOR ZTP2QMB00590-PSPID OCCURS 0.
DATA: BEGIN OF LT_CLS OCCURS 0,
AVALUE TYPE ZTA0PSA00910-AVALUE,
END OF LT_CLS.
CASE PV_FIELDNAME.
WHEN 'CLS'. "Storage Location
READ TABLE GT_RM_INFO INDEX PS_ROW_NO-ROW_ID.
SELECT AVALUE INTO CORRESPONDING FIELDS OF TABLE LT_CLS
FROM ZTA0PSA00910
WHERE PSPID IN LR_PSPID
AND ACODE = 'H0033'.
SORT LT_CLS ASCENDING BY AVALUE.
DELETE ADJACENT DUPLICATES FROM LT_CLS COMPARING ALL FIELDS.
LOOP AT LT_CLS.
IF LT_CLS IS INITIAL.
DELETE LT_CLS.
ENDIF.
ENDLOOP.
IF LT_CLS[] IS NOT INITIAL.
* Set F4 help
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
RETFIELD = 'CLS'
VALUE_ORG = GC_S
TABLES
VALUE_TAB = LT_CLS[]
RETURN_TAB = LT_RETURN[]
EXCEPTIONS
PARAMETER_ERROR = 1
NO_VALUES_FOUND = 2
OTHERS = 3.
READ TABLE LT_RETURN INDEX 1.
* Update
IF LT_RETURN-FIELDVAL IS NOT INITIAL.
ASSIGN PO_EVENT_DATA->M_DATA->* TO <LT_F4TAB>.
LS_MODI-ROW_ID = PS_ROW_NO-ROW_ID.
LS_MODI-FIELDNAME = 'CLS'.
LS_MODI-VALUE = LT_RETURN-FIELDVAL.
APPEND LS_MODI TO <LT_F4TAB>.
ENDIF.
PO_EVENT_DATA->M_EVENT_HANDLED = 'X'.
ENDIF.
WHEN OTHERS.
ENDCASE.
ENDFORM. " F_F4_HELP
c)、设置需要注册F4事件的字段
FORM F_SET_F4 .
DATA: LT_F4 TYPE LVC_T_F4,
LS_F4 TYPE LVC_S_F4.
LS_F4-FIELDNAME = 'CLS'.
LS_F4-REGISTER = GC_X.
INSERT LS_F4 INTO TABLE LT_F4.
CALL METHOD GO_ALV_GRID1->REGISTER_F4_FOR_FIELDS
EXPORTING
IT_F4 = LT_F4.
ENDFORM. " F_SET_F4
d)、设置Fieldcat里的F4标识字段值
WHEN 'CLS'. "Order Type
PERFORM F_SET_FIELDCAT USING TEXT-R08 GC_L 8
CHANGING PS_FIELDCAT.
PS_FIELDCAT-F4AVAILABL = GC_X.
FORM F_SET_FIELDCAT USING PV_TEXT TYPE ANY
PV_JUST TYPE ANY
PV_NO TYPE ANY
CHANGING PS_FIELDCAT TYPE LVC_S_FCAT.
PS_FIELDCAT-SCRTEXT_M = PS_FIELDCAT-SCRTEXT_L
= PS_FIELDCAT-SCRTEXT_S
= PS_FIELDCAT-REPTEXT = PV_TEXT.
PS_FIELDCAT-COL_POS = PV_NO.
PS_FIELDCAT-JUST = PV_JUST.
ENDFORM. " F_SET_FIELDCAT