편집 가능한 ALV 셀에 드롭다운 리스트(콤보박스) 를 띄워 사용자가 미리 정해진 값 중에서 선택하게 만드는 패턴입니다. 항공사 코드(CARRID) 같은 코드값 컬럼에 "AA : American Airlines" 처럼 코드 + 설명을 동시에 보여주는 셀렉터를 만들 때 자주 씁니다.
핵심은 두 단계입니다. (1) 드롭다운 항목 목록을 인터널 테이블에 채우고 SET_DROP_DOWN_TABLE 메소드로 그리드에 등록하고, (2) field catalog 의 DRDN_HNDL(드롭다운 핸들 번호) 을 해당 컬럼에 박아 "이 컬럼은 핸들 1번 드롭다운 사용" 이라고 알려줍니다.
이 글에서는 두 가지 모드(단순 / 별칭) 비교 → 드롭다운 테이블 채우기 → field catalog 매핑 → 편집 모드 활성화까지 정리합니다. 데이터는 SAP 스탠다드 학습 환경 SFLIGHT 의 CARRID 컬럼 기준.
핵심 — 단순 모드 vs 별칭 모드
ALV 드롭다운은 드롭다운 항목 테이블의 타입 에 따라 두 가지 모드로 나뉩니다.
| 모드 | 항목 타입 | 저장값 vs 표시값 |
|---|---|---|
| 단순 모드 | LVC_T_DROP (HANDLE · VALUE) |
VALUE 한 컬럼 — 화면에 보이는 값 = 저장되는 값 |
| 별칭 모드 | LVC_T_DRAL (HANDLE · INT_VALUE · VALUE) |
INT_VALUE = 실제 저장값, VALUE = 화면 표시 — 분리 |
별칭 모드가 실무에서 더 유용합니다. 셀에는 "AA : American Airlines" 처럼 풍부한 텍스트를 보여주면서 ITAB 에는 'AA' 짧은 코드만 저장할 수 있기 때문입니다. 이 글의 메인 예제는 별칭 모드.
흐름 정리:
1) 드롭다운 항목 테이블 채우기
LT_DROPDOWN (LVC_T_DRAL)
HANDLE=1 INT_VALUE='AA' VALUE='AA : American Airlines'
HANDLE=1 INT_VALUE='AZ' VALUE='AZ : Alitalia'
HANDLE=1 INT_VALUE='UA' VALUE='UA : United Airlines'
2) 그리드에 등록
go_grid->SET_DROP_DOWN_TABLE( IT_DROP_DOWN_ALIAS = LT_DROPDOWN ).
3) fcat 의 해당 컬럼에 핸들 매핑
gs_fieldcat-DRDN_HNDL = '1'. " 핸들 1번 사용
gs_fieldcat-DRDN_ALIAS = 'X'. " 별칭 모드 ON
gs_fieldcat-EDIT = 'X'. " 셀 편집 가능
4) SET_TABLE_FOR_FIRST_DISPLAY → CARRID 컬럼이 드롭다운으로 표시
핵심 메소드 + 필드는 다음 표 한 장으로 정리됩니다.
| 요소 | 역할 |
|---|---|
SET_DROP_DOWN_TABLE |
드롭다운 항목 목록을 그리드에 등록 (단순=IT_DROP_DOWN / 별칭=IT_DROP_DOWN_ALIAS) |
fcat-DRDN_HNDL |
컬럼 - 드롭다운 핸들 번호 매핑 (LVC_S_DRAL 의 HANDLE 과 같은 값) |
fcat-DRDN_ALIAS |
'X' = 별칭 모드 (INT_VALUE 저장) / 공백 = 단순 모드 |
fcat-EDIT |
'X' = 셀 편집 가능 (드롭다운 클릭 후 선택 가능) |
1단계 — 드롭다운 항목 테이블 채우기
별칭 모드(LVC_T_DRAL) 로 항목을 쌓습니다. 같은 HANDLE(여기서는 '1') 로 묶인 항목들이 한 드롭다운의 메뉴가 됩니다.
FORM set_dropdown.
DATA : lt_dropdown TYPE lvc_t_dral,
ls_dropdown TYPE lvc_s_dral.
ls_dropdown-handle = '1'.
ls_dropdown-int_value = 'AA'.
ls_dropdown-value = 'AA : American Airlines'.
APPEND ls_dropdown TO lt_dropdown.
ls_dropdown-handle = '1'.
ls_dropdown-int_value = 'AZ'.
ls_dropdown-value = 'AZ : Alitalia'.
APPEND ls_dropdown TO lt_dropdown.
ls_dropdown-handle = '1'.
ls_dropdown-int_value = 'UA'.
ls_dropdown-value = 'UA : United Airlines'.
APPEND ls_dropdown TO lt_dropdown.
* 그리드에 등록
CALL METHOD go_grid->set_drop_down_table
EXPORTING
it_drop_down_alias = lt_dropdown.
ENDFORM.
| 필드 | 의미 |
|---|---|
handle |
드롭다운 식별 번호. 한 그리드에 여러 드롭다운을 쓰려면 1, 2, 3 ... 분리 |
int_value |
실제 ITAB 에 저장될 값 (예: 'AA') — 별칭 모드에서만 사용 |
value |
셀과 드롭다운 메뉴에 보이는 텍스트 (예: 'AA : American Airlines') |
여러 드롭다운을 쓰는 경우(예: CARRID 컬럼 한 드롭다운, CURRENCY 컬럼 다른 드롭다운) handle 만 다른 번호로 박아 같은 테이블에 이어 APPEND 하면 됩니다.
2단계 — Field Catalog 에 드롭다운 매핑
LVC_FIELDCATALOG_MERGE 로 컬럼 카탈로그를 자동 생성한 뒤, LOOP 돌면서 드롭다운을 띄울 컬럼에만 3개 필드를 박습니다.
FORM set_fcat.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'SFLIGHT'
CHANGING
ct_fieldcat = gt_fieldcat.
LOOP AT gt_fieldcat INTO gs_fieldcat.
IF gs_fieldcat-fieldname = 'CARRID'.
* ★ 드롭다운 매핑
gs_fieldcat-drdn_hndl = '1'. " 1단계에서 만든 HANDLE 과 일치
gs_fieldcat-drdn_alias = 'X'. " 별칭 모드 ON
gs_fieldcat-edit = 'X'. " 셀 편집 가능
ENDIF.
MODIFY gt_fieldcat FROM gs_fieldcat.
ENDLOOP.
ENDFORM.
drdn_hndl 의 '1' 이 1단계의 handle = '1' 과 매칭됩니다. 같은 번호의 항목들이 그 컬럼의 드롭다운 메뉴로 표시.
3단계 — 단순 모드 (참고)
저장값 = 표시값으로 충분하다면 더 짧은 단순 모드도 가능. 차이는 작습니다.
* 단순 모드 — LVC_T_DROP (HANDLE + VALUE)
DATA : lt_dropdown TYPE lvc_t_drop,
ls_dropdown TYPE lvc_s_drop.
ls_dropdown-handle = '1'.
ls_dropdown-value = 'AA'.
APPEND ls_dropdown TO lt_dropdown.
ls_dropdown-handle = '1'.
ls_dropdown-value = 'AZ'.
APPEND ls_dropdown TO lt_dropdown.
CALL METHOD go_grid->set_drop_down_table
EXPORTING
it_drop_down = lt_dropdown. " ★ ALIAS 아님
* fcat 매핑
gs_fieldcat-drdn_hndl = '1'.
gs_fieldcat-edit = 'X'.
* drdn_alias 는 박지 않음 (또는 공백)
IT_DROP_DOWN_ALIAS 가 아니라 IT_DROP_DOWN 인자에 단순 테이블을 넘기고, drdn_alias 는 공백으로 둡니다. 코드는 한 컬럼 적지만 셀에 코드값만 보여 가독성이 떨어지므로, 코드값 + 설명을 같이 보여주려면 별칭 모드가 정답.
4단계 — 편집 모드 활성화 + 이벤트 등록
드롭다운 표시가 되려면 그리드 전체가 편집 가능 모드여야 합니다. set_ready_for_input(1) + register_edit_event 를 켜고, 사용자가 선택한 값을 받으려면 DATA_CHANGED 이벤트도 같이.
* SET_TABLE_FOR_FIRST_DISPLAY 호출 이후
go_grid->set_ready_for_input( i_ready_for_input = 1 ).
go_grid->register_edit_event(
i_event_id = cl_gui_alv_grid=>mc_evt_enter ).
go_grid->register_edit_event(
i_event_id = cl_gui_alv_grid=>mc_evt_modified ).
별칭 모드 + DATA_CHANGED 핸들러에서 변경값을 받으면 ITAB 의 셀에는 자동으로 int_value('AA') 가 들어갑니다. 사용자가 본 텍스트('AA : American Airlines') 가 그대로 박히지 않으므로 별칭 모드의 장점이 살아납니다.
자주 빠뜨리는 함정
drdn_hndl 번호 불일치
fcat 의 drdn_hndl 과 LVC_S_DRAL 의 handle 이 같은 번호여야 매칭됩니다. '1' 과 1(스페이스 패딩) 같은 미묘한 차이로 안 잡히는 경우도 있어 문자열 리터럴 통일.
EDIT = 'X' 누락
fcat 에 edit = 'X' 안 박으면 드롭다운 화살표가 보이지 않습니다. 컬럼이 편집 불가 상태라 ALV 가 드롭다운을 그리지 않음. 모든 드롭다운 컬럼에는 edit 필수.
set_ready_for_input 누락
fcat·드롭다운 다 박았는데 셀이 안 열리면 거의 set_ready_for_input(1) 누락. 그리드 전체의 편집 모드 스위치 — 한 번 켜야 모든 편집 컬럼이 동작.
IT_DROP_DOWN vs IT_DROP_DOWN_ALIAS
SET_DROP_DOWN_TABLE 의 두 인자 — 단순 모드는 IT_DROP_DOWN, 별칭 모드는 IT_DROP_DOWN_ALIAS. 잘못 넘기면 컴파일은 되지만 런타임에 무시되어 드롭다운이 안 떠 보이는 형태가 됩니다.
drdn_alias = 'X' 누락 (별칭 모드)
별칭 테이블(LVC_T_DRAL) 를 넘겼는데 fcat 에 drdn_alias = 'X' 안 박으면 ALV 가 단순 모드로 처리해 VALUE 텍스트가 그대로 ITAB 에 저장됩니다. INT_VALUE 가 무시되는 셈.
컬럼 길이가 짧으면 드롭다운 표시 깨짐
fcat 의 outputlen(또는 자동 계산값) 이 VALUE 텍스트보다 짧으면 셀에 잘려 보입니다. "AA : American Airlines" 처럼 긴 텍스트를 쓰려면 gs_fieldcat-outputlen = 30 정도로 명시.
SET_DROP_DOWN_TABLE 호출 순서
SET_TABLE_FOR_FIRST_DISPLAY 호출 전에 SET_DROP_DOWN_TABLE 을 호출해야 합니다. 그리드 첫 표시 시점에 fcat 의 drdn_hndl 과 드롭다운 테이블이 같이 평가되기 때문. display 후 호출하면 다음 refresh 시점까지 반영 안 됨.
전체 코드 — 복사용 통합본
화면(CALL SCREEN) 이 있는 모듈풀 구조라 SAP 스탠다드 INCLUDE 6분할(T / C / SCR / O / I / F). SE51 에서 Screen 100 + Custom Container CON1 + Flow Logic 에 status_0100 · init_con (PBO) · user_command_0100 (PAI).
*&---------------------------------------------------------------------*
*& Report ZRXX_ALV_DROPDOWN (메인)
*&---------------------------------------------------------------------*
REPORT zrxx_alv_dropdown.
INCLUDE zrxx_alv_dropdown_t. " TOP - 전역 선언
INCLUDE zrxx_alv_dropdown_c. " CLASS - 로컬 클래스 (이 글에서는 사용 안 함)
INCLUDE zrxx_alv_dropdown_scr. " SCR - 셀렉션 스크린 (사용 안 함)
INCLUDE zrxx_alv_dropdown_o. " PBO - OUTPUT 모듈
INCLUDE zrxx_alv_dropdown_i. " PAI - INPUT 모듈
INCLUDE zrxx_alv_dropdown_f. " FORM - 서브루틴
START-OF-SELECTION.
SELECT * FROM sflight
INTO TABLE gt_sflight
UP TO 30 ROWS.
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_ALV_DROPDOWN_T (TOP)
*&---------------------------------------------------------------------*
DATA : con1_ref TYPE REF TO cl_gui_custom_container,
go_grid TYPE REF TO cl_gui_alv_grid.
DATA : gs_layout TYPE lvc_s_layo,
gt_fieldcat TYPE lvc_t_fcat,
gs_fieldcat TYPE lvc_s_fcat,
gs_variant TYPE disvariant.
DATA : gs_sflight LIKE sflight,
gt_sflight LIKE TABLE OF gs_sflight.
DATA : ok_code TYPE sy-ucomm.
*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_ALV_DROPDOWN_C (CLASS)
*&---------------------------------------------------------------------*
* (이 글에서는 사용 안 함 — 변경 처리 핸들러가 필요해지면 lcl_event 정의)
*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_ALV_DROPDOWN_SCR (SCR)
*&---------------------------------------------------------------------*
* (이 글에서는 셀렉션 스크린 사용 안 함)
* Screen 100 은 SE51 에서 정의 — Custom Container 이름 'CON1'
*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_ALV_DROPDOWN_O (PBO)
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
SET PF-STATUS 'S100'.
ENDMODULE.
MODULE init_con OUTPUT.
CHECK con1_ref IS INITIAL.
CREATE OBJECT con1_ref
EXPORTING container_name = 'CON1'.
CREATE OBJECT go_grid
EXPORTING i_parent = con1_ref.
gs_variant-report = sy-repid.
gs_variant-username = sy-uname.
PERFORM set_fcat.
PERFORM set_layout.
PERFORM set_dropdown. " ★ display 전에 호출
CALL METHOD go_grid->set_table_for_first_display
EXPORTING
is_layout = gs_layout
CHANGING
it_outtab = gt_sflight
it_fieldcatalog = gt_fieldcat.
* 편집 모드 + 변경 인식 (display 이후)
go_grid->set_ready_for_input( i_ready_for_input = 1 ).
go_grid->register_edit_event(
i_event_id = cl_gui_alv_grid=>mc_evt_enter ).
go_grid->register_edit_event(
i_event_id = cl_gui_alv_grid=>mc_evt_modified ).
ENDMODULE.
*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_ALV_DROPDOWN_I (PAI)
*&---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
CASE ok_code.
WHEN 'BACK' OR 'EXIT' OR 'CANC'.
LEAVE TO SCREEN 0.
ENDCASE.
ENDMODULE.
*&---------------------------------------------------------------------*
*& INCLUDE ZRXX_ALV_DROPDOWN_F (FORM)
*&---------------------------------------------------------------------*
* 1) Field Catalog — CARRID 컬럼만 드롭다운 매핑
FORM set_fcat.
CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
EXPORTING
i_structure_name = 'SFLIGHT'
CHANGING
ct_fieldcat = gt_fieldcat.
LOOP AT gt_fieldcat INTO gs_fieldcat.
IF gs_fieldcat-fieldname = 'CARRID'.
gs_fieldcat-drdn_hndl = '1'. " ★ 핸들 1번 매핑
gs_fieldcat-drdn_alias = 'X'. " ★ 별칭 모드 ON
gs_fieldcat-edit = 'X'.
gs_fieldcat-outputlen = 30. " 긴 텍스트 잘리지 않게
ENDIF.
MODIFY gt_fieldcat FROM gs_fieldcat.
ENDLOOP.
ENDFORM.
* 2) Layout
FORM set_layout.
CLEAR gs_layout.
gs_layout-cwidth_opt = 'X'.
gs_layout-zebra = 'X'.
ENDFORM.
* 3) 드롭다운 항목 + 그리드 등록 (별칭 모드)
FORM set_dropdown.
DATA : lt_dropdown TYPE lvc_t_dral,
ls_dropdown TYPE lvc_s_dral.
ls_dropdown-handle = '1'.
ls_dropdown-int_value = 'AA'.
ls_dropdown-value = 'AA : American Airlines'.
APPEND ls_dropdown TO lt_dropdown.
ls_dropdown-handle = '1'.
ls_dropdown-int_value = 'AZ'.
ls_dropdown-value = 'AZ : Alitalia'.
APPEND ls_dropdown TO lt_dropdown.
ls_dropdown-handle = '1'.
ls_dropdown-int_value = 'UA'.
ls_dropdown-value = 'UA : United Airlines'.
APPEND ls_dropdown TO lt_dropdown.
ls_dropdown-handle = '1'.
ls_dropdown-int_value = 'LH'.
ls_dropdown-value = 'LH : Lufthansa'.
APPEND ls_dropdown TO lt_dropdown.
CALL METHOD go_grid->set_drop_down_table
EXPORTING
it_drop_down_alias = lt_dropdown. " ★ 별칭 모드 인자
ENDFORM.

요약
| 단계 | 위치 | 핵심 |
|---|---|---|
| 1 | 항목 테이블 | LVC_T_DRAL (handle · int_value · value) APPEND |
| 2 | 그리드 등록 | go_grid->set_drop_down_table( it_drop_down_alias = lt_dropdown ) |
| 3 | fcat 매핑 | drdn_hndl='1' · drdn_alias='X' · edit='X' (CARRID 컬럼) |
| 4 | 호출 순서 | set_drop_down_table → SET_TABLE_FOR_FIRST_DISPLAY |
| 5 | 편집 활성 | set_ready_for_input(1) + register_edit_event |
ALV Dropdown 의 본질은 "드롭다운 항목 테이블 + fcat 의 drdn_hndl 번호로 매칭". 별칭 모드(LVC_T_DRAL) 로 코드 + 설명을 같이 보여주고 ITAB 에는 코드만 저장하는 게 실무 패턴. 같은 그리드 안에서 컬럼마다 다른 드롭다운을 쓰려면 handle 번호만 1·2·3 으로 분리해 같은 테이블에 이어 APPEND. 셀에 편집 가능 + 그리드 ready_for_input 까지 챙기면 깔끔한 코드값 셀렉터가 완성됩니다.
Disclaimer — 이 포스트는 실무 정리 노트를 바탕으로 AI 보조로 정리되었습니다.
CL_GUI_ALV_GRID 의 SET_DROP_DOWN_TABLE·SET_READY_FOR_INPUT·REGISTER_EDIT_EVENT 메소드와 SLIS 패키지의 LVC_T_DROP·LVC_S_DROP(단순 모드) · LVC_T_DRAL·LVC_S_DRAL(별칭 모드) 타입과 LVC_S_FCAT 의 DRDN_HNDL·DRDN_ALIAS·EDIT 필드는 NetWeaver 스탠다드 정의(ECC 6.0 / S/4HANA on-premise 기준) 입니다. SFLIGHT 는 SAP 스탠다드 학습 환경(IDES) 테이블이며 실무 적용 시 운영 테이블로 교체하시기 바랍니다. 드롭다운 항목의 한글/영문 라벨은 운영 시스템의 마스터 데이터에서 조회해 동적으로 채우는 게 일반적입니다.