★ SAP 이야기/ABAP

[ABAP] 동적 인터널테이블 생성하기, ALV 컬럼 동적으로 출력하기

조피볼락 2024. 2. 13. 02:34

셀렉션스크린에 입력 된 값에 따라서 또는 어떤 조건에 따라서 등등의 이유로 출력되는 컬럼이 달라져야 하는 경우가 있다.

이 때 필드심볼을 사용하면 된다.

아래는 셀렉션스크린에서 입력 된 월(month) 값에 따라서 필드카탈로그 인터널테이블의 컬럼을 동적으로 구성하고, ALV를 동적으로 출력 하는 경우이다.

 

<예>

** '01월' 입력 시 -> 컬럼 01월만 출력.

 

** '07 ~ 12월' 입력 시 -> 컬럼 07월, 08월, 09월, 10월, 11월, 12월 출력.

 

 

<소스코드>

 

*"동적 필드카탈로그 구성

  CLEARGT_FIELDCAT.
  CLEAR: S_MONTH.

  READ TABLE S_MONTH INDEX 1.

  IF S_MONTH-LOW IS NOT INITIAL AND S_MONTH-HIGH IS NOT INITIAL.

   LV_TIMES = S_MONTH-HIGH - S_MONTH-LOW + 1.  

   LV_MONTH = S_MONTH-LOW.

   DO LV_TIMES TIMES.

    CLEAR LS_FCAT.
    LS_FCAT-COLTEXT = |{ LV_MONTH }월| "컬럼텍스트
    LS_FCAT-FIELDNAME = |M{ LV_MONTH }|.  "컬럼명(임의)
    LS_FCAT-COL_POS = SY-INDEX.
    APPEND LS_FCAT TO GT_FIELDCAT.

    LV_MONTH = LV_MONTH + 1.

   ENDDO.

  ELSEIF S_MONTH-LOW IS NOT INITIAL AND S_MONTH-HIGH IS INITIAL.

    CLEAR LS_FCAT.
    LS_FCAT-COLTEXT = |{ S_MONTH-LOW }월| "컬럼텍스트
    LS_FCAT-FIELDNAME = |M{ S_MONTH-LOW }|.  "컬럼명(임의)
    LS_FCAT-COL_POS = 1.
    APPEND LS_FCAT TO GT_FIELDCAT.

  ENDIF.


*"동적 인터널테이블 생성

  CLEAR: L_DREF.
  CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
    EXPORTING
      I_STYLE_TABLE             ' '
      IT_FIELDCATALOG           GT_FIELDCAT
    IMPORTING
      EP_TABLE                  L_DREF
    EXCEPTIONS
      GENERATE_SUBPOOL_DIR_FULL 1
      OTHERS                    2.

  IF SY-SUBRC 0.
    ASSIGN L_DREF->TO <GT_DISP>.
    CREATE DATA L_DREF LIKE LINE OF <GT_DISP>. "동적 인터널테이블
    ASSIGN L_DREF->TO <GS_DISP>.
  ENDIF.

 

이후 ALV 출력 시 위의 변수를 사용한다.

  CALL METHOD GO_GRID->SET_TABLE_FOR_FIRST_DISPLAY
    EXPORTING
      I_BUFFER_ACTIVE               = 'X'
      I_BYPASSING_BUFFER            'X'
      I_SAVE                        'A'
      I_DEFAULT                     'X'
      IS_LAYOUT                     GS_LAYOUT
      IS_VARIANT                    GS_VARIANT
      IT_TOOLBAR_EXCLUDING          GT_TOOLBAR_EXCLUDE
    CHANGING

      IT_OUTTAB                  =  <GT_DISP>

      IT_FIELDCATALOG      =  GT_FIELDCAT
      IT_SORT                       GT_SORT
    EXCEPTIONS
      INVALID_PARAMETER_COMBINATION 1
      PROGRAM_ERROR                 2
      OTHERS                        3.


추가로, 동적 인터널테이블에 데이터를 담기 위해서는
ASSIGN COMPONENT <컬럼명> OF STRUCTURE <GS_DISP>  TO <담을 값>. 구문을 이용하면 된다.

 

<끝>

728x90