본문 바로가기
ABAP/Function|Class

[Class] CL_SALV_TABLE - SALV 제어

by name_text 2024. 10. 31.

CL_SALV_TABLE

SALV는 기능이 제한적인 대신 사용방법이 간단하여, CBO 프로그램 내에서 간단하게 리스트를 보여주거나 팝업 형태로 보여줄때 간편하게 사용 할 수 있습니다.

 

또한, Full Screen으로 사용할 경우 해당 리포트가 백그라운드 작업을 돌릴 경우 스풀에 화면리 리스트로 남게되어 아주 편리합니다.

 

# 사용 예시

REPORT YSALV_TABLE.
CLASS LCL_HANDLE_EVENTS DEFINITION.
  PUBLIC SECTION.
    METHODS: 
      ON_DOUBLE_CLICK FOR EVENT DOUBLE_CLICK OF CL_SALV_EVENTS_TABLE
        IMPORTING ROW  COLUMN,
      ON_LINK_CLICK   FOR EVENT LINK_CLICK   OF CL_SALV_EVENTS_TABLE
        IMPORTING ROW  COLUMN,
      ON_USER_COMMAND FOR EVENT ADDED_FUNCTION OF CL_SALV_EVENTS
        IMPORTING E_SALV_FUNCTION
        .
ENDCLASS.

CLASS LCL_HANDLE_EVENTS IMPLEMENTATION.
  METHOD ON_DOUBLE_CLICK.
    MESSAGE I000(0K) WITH '더블클릭' ROW COLUMN.
  ENDMETHOD.

  METHOD ON_LINK_CLICK.

  ENDMETHOD.

  METHOD ON_USER_COMMAND.
    PERFORM HANDLE_USER_COMMAND USING E_SALV_FUNCTION.
  ENDMETHOD.
ENDCLASS.

DATA: GO_EVENTS TYPE REF TO LCL_HANDLE_EVENTS.
DATA: GO_SALV   TYPE REF TO CL_SALV_TABLE.

FORM CALL_SALV TABLES FT_ITAB
              USING LO_SALV   TYPE REF TO CL_SALV_TABLE
                    FV_TITLE.
  DATA : LO_FUNCTIONS TYPE REF TO CL_SALV_FUNCTIONS_LIST,
         LO_DISPLAY   TYPE REF TO CL_SALV_DISPLAY_SETTINGS,
         LO_LAYOUT    TYPE REF TO CL_SALV_LAYOUT,
         LS_PROGRAM   TYPE SALV_S_LAYOUT_KEY,
         LO_COLUMNS   TYPE REF TO CL_SALV_COLUMNS_TABLE,
         LO_COLUMN    TYPE REF TO CL_SALV_COLUMN_TABLE,
         LS_COLOR     TYPE LVC_S_COLO,
         LO_SELECTION TYPE REF TO CL_SALV_SELECTIONS,
         LO_SORTS     TYPE REF TO CL_SALV_SORTS,
         LO_AGGR      TYPE REF TO CL_SALV_AGGREGATIONS,
         LO_FILTER    TYPE REF TO CL_SALV_FILTERS,
         LO_EVENT_TAB TYPE REF TO CL_SALV_EVENTS_TABLE.

  DATA: LV_LVC_TITLE TYPE LVC_TITLE.
  MOVE  FV_TITLE TO LV_LVC_TITLE.

  "ALV 생성
  CALL METHOD CL_SALV_TABLE=>FACTORY
    IMPORTING
      R_SALV_TABLE = LO_SALV
    CHANGING
      T_TABLE      = FT_ITAB[].

  "ALV 의 기능키 표시
*  LO_FUNCTIONS = LO_SALV->GET_FUNCTIONS( ).
**  LO_FUNCTIONS->SET_DEFAULT( ).
*  LO_FUNCTIONS->SET_ALL( ).
  LO_SALV->SET_SCREEN_STATUS(
    PFSTATUS      =  'SALV_STATUS'
    REPORT        =  SY-REPID
    SET_FUNCTIONS = LO_SALV->C_FUNCTIONS_ALL ).

  "ALV 선택 모드 설정
  LO_SELECTION = LO_SALV->GET_SELECTIONS( ).
  LO_SELECTION->SET_SELECTION_MODE( IF_SALV_C_SELECTION_MODE=>ROW_COLUMN ).

  "ALV의 레이아웃 셋팅(줄무늬 패턴, 헤더 텍스트 등)
  LO_DISPLAY = LO_SALV->GET_DISPLAY_SETTINGS( ).
  LO_DISPLAY->SET_STRIPED_PATTERN( CL_SALV_DISPLAY_SETTINGS=>TRUE ).
  LO_DISPLAY->SET_LIST_HEADER( LV_LVC_TITLE ).

  "ALV의 레이아웃 저장 기능 활성화
  LO_LAYOUT = LO_SALV->GET_LAYOUT( ).
  LS_PROGRAM-REPORT = SY-REPID.
  LS_PROGRAM-HANDLE = SY-DYNNR.
  LO_LAYOUT->SET_KEY( LS_PROGRAM ).
  LO_LAYOUT->SET_DEFAULT( ABAP_TRUE ).
  LO_LAYOUT->SET_SAVE_RESTRICTION( CL_SALV_LAYOUT=>RESTRICT_NONE ). "기본값 및 사용자 레이아웃 제한 없음

  "ALV 열(필드카타로그) 설정
  LO_COLUMNS = LO_SALV->GET_COLUMNS( ).
  LO_COLUMNS->SET_OPTIMIZE( ABAP_TRUE ).    "열 너비 최적화

  LO_COLUMN ?= LO_COLUMNS->GET_COLUMN( 'WERKS' ).
  LO_COLUMN->SET_VISIBLE( CL_SALV_COLUMN_TABLE=>FALSE ).    "열 숨김 (레이아웃 설정에서는 표시)

  LO_COLUMN ?= LO_COLUMNS->GET_COLUMN( 'MATNR' ).
  LO_COLUMN->SET_TECHNICAL( CL_SALV_COLUMN_TABLE=>TRUE ).   "열 숨김 (레이아웃에서도 숨김)

  LO_COLUMN ?= LO_COLUMNS->GET_COLUMN( 'ZINT4' ).
  LO_COLUMN->SET_LONG_TEXT( '정수' ).                       "열 내역 설정(긴 내역)
  LO_COLUMN->SET_MEDIUM_TEXT( '정수' ).                     "열 내역 설정(중간 내역)
  LO_COLUMN->SET_SHORT_TEXT( '정수' ).                      "열 내역 설정(짧은 내역)

  LO_COLUMN ?= LO_COLUMNS->GET_COLUMN( 'MAKTX' ).
  LS_COLOR = VALUE #( COL = 5 INT = 0 INV = 0 ).LO_COLUMN->SET_COLOR( LS_COLOR ).   "열 색상 설정

  LO_COLUMN ?= LO_COLUMNS->GET_COLUMN( 'DMBTR' ).
  LO_COLUMN->SET_CELL_TYPE( IF_SALV_C_CELL_TYPE=>HOTSPOT ).   "HOT SPOT 설정

  "ALV 정렬
  LO_SORTS = LO_SALV->GET_SORTS( ).
  LO_SORTS->ADD_SORT( 'MAKTX' ).

  "ALV 컬럼의 합계
  LO_AGGR = LO_SALV->GET_AGGREGATIONS( ).
  LO_AGGR->ADD_AGGREGATION( 'MENGE' ).

  "ALV 컬럼 필터
  LO_FILTER = LO_SALV->GET_FILTERS( ).
  LO_FILTER->ADD_FILTER(
    COLUMNNAME = 'MEINS'
    SIGN       = 'I'
    OPTION     = 'EQ'
    LOW        = 'EA'
    ).

  "ALV 이벤트 설정
  LO_EVENT_TAB = LO_SALV->GET_EVENT( ).
  CREATE OBJECT GO_EVENTS.
  SET HANDLER GO_EVENTS->ON_DOUBLE_CLICK FOR LO_EVENT_TAB.
  SET HANDLER GO_EVENTS->ON_USER_COMMAND FOR LO_EVENT_TAB.

  "ALV 를 팝업으로 실행
*  LO_SALV->SET_SCREEN_POPUP(
*    START_COLUMN = 1
*    END_COLUMN   = 100
*    START_LINE   = 1
*    END_LINE     = 20 ).

  "ALV 표시
  LO_SALV->DISPLAY( ).
ENDFORM.

*&---------------------------------------------------------------------*
*& Form HANDLE_USER_COMMAND
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> E_SALV_FUNCTION
*&---------------------------------------------------------------------*
FORM HANDLE_USER_COMMAND  USING  I_UCOMM TYPE SALV_DE_FUNCTION.
  CASE I_UCOMM.
    WHEN 'ADJUST'.
      PERFORM ADJUST_LAST_NUMBER.

  ENDCASE.
ENDFORM.


*&---------------------------------------------------------------------*
*& Form ADJUST_LAST_NUMBER
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM ADJUST_LAST_NUMBER .
  DATA: LO_SELECTIONS TYPE REF TO CL_SALV_SELECTIONS.
  DATA: LT_ROWS   TYPE SALV_T_ROW.
  DATA: LV_NUMBER TYPE NRIV-NRLEVEL.

  LO_SELECTIONS = GO_SALV->GET_SELECTIONS( ).
  LT_ROWS = LO_SELECTIONS->GET_SELECTED_ROWS( ).

  IF LT_ROWS[] IS INITIAL.
    MESSAGE I006(0K).
    EXIT.
  ENDIF.

  LOOP AT LT_ROWS INTO DATA(LS_ROWS).
    "READ TABLE GT_REMOT INTO DATA(LS_REMOT) INDEX LS_ROWS.
    IF SY-SUBRC NE 0.
      CONTINUE.
    ENDIF.

  ENDLOOP.

  GO_SALV->REFRESH( ).

  MESSAGE S018(00).
ENDFORM.

 

# 참고로, LVC_T_FCAT 타입의 필드카탈로그를 SALV에 사용하려면 아래와 같이 하면 됩니다.

CL_SALV_CONTROLLER_METADATA=>SET_LVC_FIELDCATALOG(  T_FIELDCATALOG = IT_FIELDCAT
                                                    R_COLUMNS      = GO_SALV->GET_COLUMNS( )
                                                    R_AGGREGATIONS = GO_SALV->GET_AGGREGATIONS( ) ).

댓글