> (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.
끝.