본문 바로가기
ALV · 화면 · 리포트

[SAP ABAP] ALV 셀에 코드값 셀렉터 — Dropdown (SET_DROP_DOWN_TABLE + LVC_T_DRAL)

by Song.sh 2026. 6. 5.

편집 가능한 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_tableSET_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_GRIDSET_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_FCATDRDN_HNDL·DRDN_ALIAS·EDIT 필드는 NetWeaver 스탠다드 정의(ECC 6.0 / S/4HANA on-premise 기준) 입니다. SFLIGHT 는 SAP 스탠다드 학습 환경(IDES) 테이블이며 실무 적용 시 운영 테이블로 교체하시기 바랍니다. 드롭다운 항목의 한글/영문 라벨은 운영 시스템의 마스터 데이터에서 조회해 동적으로 채우는 게 일반적입니다.