CS Student’s SAP&Tech Journey✨

[SAP] ALV (4) 시각적 제어 기능 - 신호등, 컬러 강조, FREE 함수 / 코드 리펙토링 본문

SAP/ALV

[SAP] ALV (4) 시각적 제어 기능 - 신호등, 컬러 강조, FREE 함수 / 코드 리펙토링

인포마틱 2025. 3. 28. 15:42

SAP에서 데이터를 더 직관적으로 전달하기 위해 ALV의 다양한 시각적 제어 기능을 활용할 수 있습니다. 이번 포스팅에서는 신호등컬러 강조체크박스 아이콘 출력, 그리고 필드 카탈로그 조작을 통해 ALV를 더 풍부하게 구성하는 방법을 정리해보겠습니다.

 

 


 

✅ ALV 객체 제거 - FREE 함수

ALV와 Container 객체는 화면을 나가기 전 반드시 메모리에서 해제해줘야 합니다. 그렇지 않으면 BACK할 때마다 ALV 객체가 중복 생성됩니다.

 

▶ XXXXXI01 (PAI)  

PATTERN 사용하여 FREE 함수 호출합니다.

ALV
Container

WHEN 'BACK'.
        " 100번 화면에서 생성한 객체 파괴하고 떠나야 합니다.
        " ALV, Container 두개의 객체 파괴해야한다.
        " 파괴 순서 : ALV -> Container

        CALL METHOD go_alv->free. " ALV " 
        CALL METHOD go_con->free. " Container "

        LEAVE TO SCREEN 0.

 

 

✅ ALV Layout 옵션 설정

▶ XXXXXO01(PBO)

GS_LAYOUT-CWIDTH_OPT = 'X'.             " 줄 맞춤
GS_LAYOUT-ZEBRA = 'X'.                  " 얼룩말 패턴
GS_LAYOUT-GRID_TITLE = 'Flight Connections'.
GS_LAYOUT-TOTALS_BEF = 'X'.             " 합계 위에 출력
GS_LAYOUT-SEL_MODE = 'A'.               " 라인 선택 모드 (A, D: 가능)

 

▶  확인

 

 

✅ 신호등 (Threshold) 설정

조건별 색상 시각화 1: 빨간색, 2: 주황색, 3: 초록색으로 설정합니다.

TOP

TYPES: BEGIN OF GTY_CONN.
  INCLUDE TYPE SDYN_CONN.
  TYPES LIGHT TYPE C LENGTH 1.
TYPES: END OF GTY_CONN.

DATA GT_CONN TYPE TABLE OF GTY_CONN. "신호등을 위한 컬럼 1개 추가

인터널 테이블을 정의합니다.

 

LOOP 내 조건 설정

LOOP AT GT_CONN INTO GS_CONN.
  IF GS_CONN-distance > 6000.
    GS_CONN-light = 1.
  ELSEIF GS_CONN-distance > 3000.
    GS_CONN-light = 2.
  ELSE.
    GS_CONN-light = 3.
  ENDIF.
  
  MODIFY GT_CONN FROM GS_CONN TRANSPORTING light.
ENDLOOP.

 

 

XXXXXO01(PBO) : Layout 설정

신규로 추가한 신호등 컬럼 이름을 ALV에게 알려줘야 합니다.

GS_LAYOUT-excp_fname = 'LIGHT'.
GS_LAYOUT-excp_led = 'X'.   " 1구 신호등

 

▶  확인

 

 

✅ 특정 라인 컬러 강조

노란색 강조: 전세기(Charter fit)인 경우 컬러 부여

▶ TOP

TYPES LCOLOR TYPE C LENGTH 4.

 

▶ XXXXXO01(PBO) : Layout 설정

신규로 추가한 라인 컬럼 이름을 ALV에게 알려줘야 합니다. 

GS_LAYOUT-info_fname = 'LCOLOR'.

 

 LOOP 내 조건 설정

LOOP AT gt_conn INTO gs_conn.
    IF gs_conn-distance > 6000.
      gs_conn-light = 1.
    ELSEIF gs_conn-distance > 3000.
      gs_conn-light = 2.
    ELSE.
      gs_conn-light = 3.
    ENDIF.

    " 전세기(Charter Flight)인 경우 노란색으로 출력하기
    IF gs_conn-fltype = 'X'.
      gs_conn-lcolor = 'C300'.
    ENDIF.
    
    MODIFY gt_conn FROM gs_conn
     TRANSPORTING light lcolor. 
    
ENDLOOP.

 

▶  확인

 

 

✅ ALV 기본 버튼 숨기기 (툴바 제어)

▶ TOP

DATA GT_EXCLUDED TYPE ui_functions.

 

▶ XXXXXO01(PBO) : Layout 설정

툴바에서 숨길 버튼 추가해야 합니다. 프린트 버튼을 숨겨보겠습니다.

APPEND CL_GUI_ALV_GRID=>MC_FC_PRINT TO GT_EXCLUDED.

 

  SET_TABLE_FOR_FIRST_DISPLAY 연결

MODULE init_control OUTPUT.

    CALL METHOD go_alv->set_table_for_first_display
      EXPORTING
        i_structure_name = 'SDYN_CONN'
        is_variant       = GS_VARIANT
        i_save           = GV_SAVE
        is_layout        = GS_LAYOUT
        it_toolbar_excluding          = GT_EXCLUDED " 추가 "
      CHANGING
        it_outtab = gt_conn.

ENDMODULE.

 

▶  프린트 버튼 보이지 않는 것 확인

 

📌 Perform 사용하여 코드 리펙토링 하기

✔️ 기존 코드

▶ XXXXXO01(PBO) 

MODULE init_control OUTPUT.
  IF GO_CON IS INITIAL.
    " Layout 설정
    GS_LAYOUT-CWIDTH_OPT ='X'. " 줄 맞춤
    GS_LAYOUT-ZEBRA = 'X'. " 얼룩말 레이아웃 지원
    GS_LAYOUT-GRID_TITLE = 'Flight Connections'. "AVL 타이틀
    GS_LAYOUT-TOTALS_BEF = 'X'.
    GS_LAYOUT-SEL_MODE = 'A'.
    GS_LAYOUT-info_fname = 'LCOLOR'.

    GS_VARIANT-report = SY-CPROG. " 'ZALV_BASIC_07'
    GS_VARIANT-variant = PA_LAY. " 화면에서 입력받은 값
    GV_SAVE = 'A'. "일단 A로 고정

    GS_LAYOUT-excp_fname = 'LIGHT'.
    GS_LAYOUT-excp_led = 'X'.   " 1구 신호등

    APPEND CL_GUI_ALV_GRID=>MC_FC_PRINT TO GT_EXCLUDED.


    " 기존 init_control 모듈 "
    CREATE OBJECT go_con
      EXPORTING
        container_name = 'MY_CON'.

    CREATE OBJECT go_alv
    EXPORTING
      i_parent = go_con.

    " display_control 모듈 "
    GS_LAYOUT-CWIDTH_OPT ='X'.
    CALL METHOD go_alv->set_table_for_first_display
      EXPORTING
        i_structure_name = 'SDYN_CONN'
        is_variant       = GS_VARIANT
        i_save           = GV_SAVE
        is_layout        = GS_LAYOUT
        it_toolbar_excluding          = GT_EXCLUDED
      CHANGING
        it_outtab = gt_conn.



  ENDIF. " 추가 "
ENDMODULE.

 

✔️ 코드 리펙토링

▶ XXXXXO01(PBO) 

MODULE init_control OUTPUT.
  IF GO_CON IS INITIAL.

  " 1. 객체 2개 생성한다.
    PERFORM INIT_CONTROL.
  " 2. ALV 제어한다.
    PERFORM SET_ALV.
  " 3. ALV 출력한다.
    PERFORM DISPLAY_ALV.
    
  ENDIF.
ENDMODULE.

 

▶ FORM init_control : 객체 ALV, Container 생성 역할

FORM init_control .
  CREATE OBJECT go_con
    EXPORTING
      container_name = 'MY_CON'.

  CREATE OBJECT go_alv
  EXPORTING
    i_parent = go_con.
ENDFORM.

 

▶ FORM set_alv : ALV 제어 역할

FORM set_alv .
  GS_LAYOUT-CWIDTH_OPT ='X'.
  GS_LAYOUT-ZEBRA = 'X'. " 얼룩말 레이아웃 지원
  GS_LAYOUT-GRID_TITLE = 'Flight Connections'. "AVL 타이틀
  GS_LAYOUT-TOTALS_BEF = 'X'.
  GS_LAYOUT-SEL_MODE = 'A'.

  GS_VARIANT-report = SY-CPROG. " 'ZALV_BASIC_07'
  GS_VARIANT-variant = PA_LAY. " 화면에서 입력받은 값

  GV_SAVE = 'A'. "일단 A로 고정


  " 신규로 추가한 신호등 컬럼 이름을 ALV에게 알려주기
  GS_LAYOUT-excp_fname = 'LIGHT'.
  GS_LAYOUT-excp_led = 'X'. "1구 신호등으로 변경.


  " 신규로 추가한 라인 컬럼 이름을 ALV에게 알려주기
  GS_LAYOUT-info_fname = 'LCOLOR'.

  " 툴바에서 숨길 버튼 추가하기.
  APPEND CL_GUI_ALV_GRID=>MC_FC_PRINT TO GT_EXCLUDED.

ENDFORM.

 

▶ FORM display_alv : ALV 출력 역할

FORM display_alv .
    GS_LAYOUT-CWIDTH_OPT ='X'.
    CALL METHOD go_alv->set_table_for_first_display
      EXPORTING
        i_structure_name = 'SDYN_CONN'
        is_variant       = GS_VARIANT
        i_save           = GV_SAVE
        is_layout        = GS_LAYOUT
        it_toolbar_excluding          = GT_EXCLUDED
      CHANGING
        it_outtab = gt_conn.
ENDFORM.