728x90

'전체 글'에 해당되는 글 55건

  1. 2024.02.16 (ABAP) Internal Table을 동적으로 생성하기 1
728x90

 

> (ABAP) Internal Table을 동적으로 생성하기 <

 

*-- 필드카탈로그테이블 선언.
DATA: GT_FCAT    TYPE LVC_T_FCAT,
      GS_FCAT    TYPE LVC_S_FCAT.

*-- 동적테이블로 사용할 테이블 및 구조선언.
DATA: DYT_LIST TYPE REF TO DATA,
      DYS_LIST TYPE REF TO DATA.

*-- 로직에서 사용할 필드심볼 선언.
FIELD-SYMBOLS: <DT_TABLE> TYPE STANDARD TABLE,
               <DT_WA>,
               <DT_FIELD>.

*-- 필드카탈로그에 필드선언 (타테이블 참조).
GS_FCAT-FIELDNAME = 'BUKRS'.
GS_FCAT-REF_TABLE = 'BKPF'.
GS_FCAT-REF_FIELD = 'BUKRS'.
APPEND GS_FCAT TO GT_FCAT.
CLEAR GS_FCAT.

GS_FCAT-FIELDNAME = 'BELNR'.
GS_FCAT-REF_TABLE = 'BKPF'.
GS_FCAT-REF_FIELD = 'BELNR'.
APPEND GS_FCAT TO GT_FCAT.
CLEAR GS_FCAT.

GS_FCAT-FIELDNAME = 'GJAHR'.
GS_FCAT-REF_TABLE = 'BKPF'.
GS_FCAT-REF_FIELD = 'GJAHR'.
APPEND GS_FCAT TO GT_FCAT.
CLEAR GS_FCAT.

*-- 필드카탈로그에 필드선언 (일반 Char 필드).
GS_FCAT-FIELDNAME = 'STATUS'.
GS_FCAT-DATATYPE  = 'CHAR'.
GS_FCAT-INTTYPE   = 'C'.
GS_FCAT-INTLEN    = '1'.
APPEND GS_FCAT TO GT_FCAT.
CLEAR GS_FCAT.

*-- 동적테이블 생성.
CALL METHOD CL_ALV_TABLE_CREATE=>CREATE_DYNAMIC_TABLE
  EXPORTING
    IT_FIELDCATALOG  = GT_FCAT
    I_LENGTH_IN_BYTE = 'X'
  IMPORTING
    EP_TABLE         = DYT_LIST.

*-- 테이블 및 구조 필드심볼에 Assign.
ASSIGN DYT_LIST->* TO <DT_TABLE>.
CREATE DATA DYS_LIST LIKE LINE OF <DT_TABLE>.
ASSIGN DYS_LIST->* TO <DT_WA>.

*-- 필드에 대한 필드심볼에 Assign.
UNASSIGN <DT_FIELD>.
ASSIGN COMPONENT 'BUKRS' OF STRUCTURE <DT_WA> TO <DT_FIELD>.

*-- 값넣기.
<DT_FIELD> = '1000'.
APPEND <DT_WA> TO <DT_TABLE>.  "- <DT_FIELD>는 <DT_WA>의 필드를 참조하므로 <DT_FIELD>에만 값을 넣으면 <DT_WA>에도 입력됨.
CLEAR <DT_WA>.

*-- 테이블값 변경하기 (TABIX 사용)
<DT_FIELD> = '2000'.
MODIFY <DT_TABLE> FROM <DT_WA> INDEX SY-TABIX.

*-- READ TABLE.
READ TABLE <DT_TABLE> INTO <DT_WA> WITH KEY ('BUKRS') = '1000'
                                            ('GJAHR') = '2024'.

*-- ALV DISPLAY.
CALL METHOD P_GRID->SET_TABLE_FOR_FIRST_DISPLAY
  EXPORTING
    I_DEFAULT            = 'X'
    IS_LAYOUT            = GS_LAYOUT
    IS_VARIANT           = GS_VARIANT
    I_SAVE               = 'A'
    IT_TOOLBAR_EXCLUDING = GT_EXCLUDE
  CHANGING
    IT_OUTTAB            = <DT_TABLE>[]
    IT_FIELDCATALOG      = GT_FCAT[]   "-- 이때의 필드카탈로그는 ALV표시용으로 재구성해야함 (동적테이블 생성시 사용한 필드카탈로그 말고).
    IT_SORT              = GT_SORT.

*----------------------------------------------------------------------*
*   Dynamic Table 관리를 위한 Macro.
*----------------------------------------------------------------------*

*- Dynamic Table에 타 Table의 필드를 참조한 필드 생성.
*- &1:동적테이블필드명 / &2:참조테이블 / &3:참조필드.
DEFINE _SET_REF_FIELD.
  GS_FCAT-FIELDNAME = &1.
  GS_FCAT-REF_TABLE = &2.
  GS_FCAT-REF_FIELD = &3.
  APPEND GS_FCAT TO GT_FCAT.
  CLEAR GS_FCAT.
END-OF-DEFINITION.

*-- 사용예시.
_SET_REF_FIELD : 'BUKRS' 'BKPF' 'BUKRS',
                 'BELNR' 'BKPF' 'BELNR'. 

*- Dynamic Table에 Char Type 필드 생성.
*- &1:동적테이블필드명 / &2:길이.
DEFINE _SET_CHAR_FIELD.
  GS_FCAT-FIELDNAME = &1.
  GS_FCAT-DATATYPE  = 'CHAR'.
  GS_FCAT-INTTYPE   = 'C'.
  GS_FCAT-INTLEN    = &2.
  APPEND GS_FCAT TO GT_FCAT.
  CLEAR GS_FCAT.
END-OF-DEFINITION.

*-- 사용예시.
_SET_CHAR_FIELD : 'RCOLOR' '8',
                  'DGB'    '1',
                  'ZGUBUN' '3',
                  'ZGBNM'  '20'.

*- Field Symbol에 Dynamic Table의 필드 Assign.
*- &1:구조필드심볼 / &2:필드필드심볼 / &3:동적테이블필드명.
DEFINE _ASSIGN_DY.
  UNASSIGN &2.
  ASSIGN COMPONENT &3 OF STRUCTURE &1 TO &2.
END-OF-DEFINITION.

*-- 사용예시.
_ASSIGN_DY : <DT_WA> <DT_FIELD> 'BUKRS'.
LV_BUKRS = <DT_FIELD>.

*- Dynamic Table의 필드 Assign후 값넣기.
*- &1:구조필드심볼 / &2:필드필드심볼 / &3:동적테이블필드명 / &4:값.
DEFINE _SET_FIELD.
  _ASSIGN_DY &1 &2 &3.
  &2 = &4.
END-OF-DEFINITION.

*-- 사용예시.
_SET_FIELD : <DT_WA> <DT_FIELD> 'BUKRS' LV_BUKRS,
             <DT_WA> <DT_FIELD> 'BELNR' LV_BELNR.

끝.



반응형
Posted by Gomtui
,