ALV는 기본적으로 딕셔너리 기반 F4 헬프를 자동으로 처리하지 않는다.
ALV F4 기능을 활성화하려면 개발자가 명시적으로 해당 필드를 등록해줘야 함.
이걸 해주는 메소드가 REGISTER_F4_FOR_FIELDS 임.
도메인에 서치헬프 연결되어있으면 자동으로 서치헬프 보임.
처음에 정리했었는데 적용안되서 보니까 필드카탈로그 설정하는것을 까먹음;;
내가 원하는 값 리스트를 팝업으로 띄우고 해당 셀에 반영하고 싶을 때F4IF_INT_TABLE_VALUE_REQUEST를 활용하여, ALV 편집 필드에서 F4 팝업을 커스터마이징하는 방법을 단계별로 정리
F4IF_INT_TABLE_VALUE_REQUEST 활용)| 단계 | 설명 | 코드/비고 |
|---|---|---|
| ① 필드카탈로그 설정 | F4 도움말을 적용할 필드에 EDIT와 F4AVAILABLE 속성 설정 | ls_fieldcat-edit = 'X', ls_fieldcat-f4availabl = 'X' |
| ② F4 필드 등록 | REGISTER_F4_FOR_FIELDS 메서드로 F4 필드 수동 등록 | 필드명을 명시적으로 등록해야 ON_F4 이벤트가 호출됨 |
| ③ 이벤트 핸들러 클래스 정의 및 등록 | ON_F4 이벤트용 핸들러 메서드 구현 후 SET HANDLER로 연결 | SET HANDLER lo_handler->on_f4 FOR gr_alv_grid |
| ④ ON_F4 이벤트 처리 | F4 눌렸을 때 F4IF_INT_TABLE_VALUE_REQUEST로 팝업 띄우고 선택값 받아오기 | 내부 테이블 lt_values를 팝업 소스로 사용 |
| ⑤ 표준 F4 동작 막기 | er_event_data->m_event_handled = 'X'로 SAP 기본 F4 팝업 차단 | 생략 시 SAP 기본 F4 팝업이 같이 뜸 |
| ⑥ ALV 내부 테이블에 값 반영 | 선택한 값을 gt_alv_data에 반영 후 refresh_table_display 호출 | MODIFY, READ TABLE, CALL METHOD -> refresh_table_display |
ALV의 VARIANT 필드를 편집 가능하고 F4 도움말이 가능하도록 설정한다.
ls_fieldcat-fieldname = 'VARIANT'.
ls_fieldcat-edit = 'X'.
ls_fieldcat-f4availabl = 'X'.
ls_fieldcat-seltext_m = 'Variant'.
APPEND ls_fieldcat TO lt_fieldcat.
F4 도움말을 적용하고 싶은 필드를 명시적으로 등록해야 ON_F4 이벤트가 작동한다.
DATA: lt_f4 TYPE lvc_t_f4,
ls_f4 TYPE lvc_s_f4.
ls_f4-fieldname = 'VARIANT'.
ls_f4-register = abap_true.
APPEND ls_f4 TO lt_f4.
CALL METHOD gr_alv_grid->register_f4_for_fields
EXPORTING it_f4 = lt_f4.
F4 키가 눌렸을 때 실행될 커스터마이징 로직을 구현한다.
-> Standard Variant list를 보여주고자 하는 경우에는 이 부분에 RS_VARIANT_CATALOG 펑션을 사용해서 값을 받아오면 된다.
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
METHODS: on_f4 FOR EVENT onf4 OF cl_gui_alv_grid
IMPORTING e_fieldname es_row_no er_event_data et_bad_cells.
ENDCLASS.
CLASS lcl_event_handler IMPLEMENTATION.
METHOD on_f4.
DATA: lt_variant_values TYPE TABLE OF ddshretval,
lt_values TYPE TABLE OF string,
lv_variant TYPE string,
ls_row TYPE your_alv_structure.
IF e_fieldname = 'VARIANT'.
" 1. 팝업에 보여줄 내부 테이블 준비
APPEND 'ZVARIANT_01' TO lt_values.
APPEND 'ZVARIANT_02' TO lt_values.
APPEND 'ZVARIANT_03' TO lt_values.
" 2. F4 팝업 호출
CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
EXPORTING
retfield = 'VALUE'
dynpprog = sy-repid
dynpnr = sy-dynnr
dynprofield = 'DUMMY'
value_org = 'S'
TABLES
value_tab = lt_values
return_tab = lt_variant_values.
" 3. 선택값 ALV 내부 테이블에 반영
READ TABLE lt_variant_values INTO DATA(ls_retval) INDEX 1.
IF sy-subrc = 0 AND ls_retval-fieldval IS NOT INITIAL.
READ TABLE gt_alv_data INTO ls_row INDEX es_row_no-row_id.
IF sy-subrc = 0.
ls_row-variant = ls_retval-fieldval.
MODIFY gt_alv_data FROM ls_row INDEX es_row_no-row_id.
CALL METHOD gr_alv_grid->refresh_table_display.
ENDIF.
ENDIF.
" 4. SAP 기본 F4 팝업 차단
er_event_data->m_event_handled = abap_true.
ENDIF.
ENDMETHOD.
ENDCLASS.
DATA: go_event_handler TYPE REF TO lcl_event_handler.
CREATE OBJECT go_event_handler.
SET HANDLER go_event_handler->on_f4 FOR gr_alv_grid.
VARIANT 필드에서 F4 누르면 커스터마이징 팝업이 뜬다value_tab을 구조로 만들고, with_tab_and_label = 'X' 설정하면 된다.return_tab에 들어오며, 첫 번째 항목을 기준으로 반영하면 됨.RS_VARIANT_CATALOG) 대신, 커스터마이징된 값 목록을 제어하고 싶을 때 유용하다.