>itab1
>KEY | 항목 | 항목값 |
>____________________________
>A | a1 | b1 |
>A | a2 | b2 |
>A | a3 | b3 |
> B : :
>____________________________ 형태를 key 값이 같은 항목과 항목값을
>
>===>
>
>itab2
> | a1 | a2 | a3 |
> ---------------------------------------
>A | b1 | b2 | b3 | 가로 형태로 채워야합니다.
>
>B
>
>둘다 인터널 테이블입니다.
>
>필드심볼로 루프돌려서 이래저래하는데 잘 안되네요
>
>
좀 어려우실 수도 있는데요.
아래에 예제를 만들어보았습니다.
key 값을 변경하여 테스트 해보시면 됩니다.(붉은 색 부분)
RTTS(Runtime Type Services) 를 사용해보았구요.
dynamic 구조입니다.
key 값이 선택되어 진다는 가정하에 구현한 것입니다.
그렇지 않고 전체 데이터중에서 항목수가 제일 많은 것을 기준으로 하신다면
제일 항목수가 많은 키값을 선택하여 지정하시면 될 거구요.
데이터는 index 나 항목값에 대한 위치를 지정하는 로직을 따로 만드시면 될 거예요.
키별로 값이 얼마나 들어올지 모르기 때문에 dynamic 구조로 만드는 것이 유리하겠지만
그렇지 않다면 적정가능한 최대크기의 순서대로 입력하시면 될 거예요.
예제를 2개로 만들어 보았습니다.
도움이 되시길...
1. dynamic 예
DATA : BEGIN OF itab OCCURS 0,
key(2),
item(3),
value(10),
END OF itab.
DATA components TYPE TABLE OF rstrucinfo WITH HEADER LINE.
DATA key(2) VALUE 'D'.
DEFINE app_itab.
clear itab.
itab-key = &1.
itab-item = &2.
itab-value = &3.
append itab.
END-OF-DEFINITION.
app_itab : 'A' 'A1' 'AA',
'A' 'A2' 'AB',
'A' 'A3' 'AC',
'B' 'B1' 'BA',
'B' 'B2' 'BB',
'B' 'B3' 'BC',
'B' 'B4' 'BD',
'C' 'C1' 'CA',
'C' 'C2' 'CB',
'C' 'C3' 'CC',
'D' 'D1' 'DA'.
LOOP AT itab.
WRITE / itab.
ENDLOOP.
* Restructure itab by key
* Key 선택 ===>> Key = 'B'
* 구조 생성 : RTTS 사용
DATA: struct_type TYPE REF TO cl_abap_structdescr,
table_type TYPE REF TO cl_abap_tabledescr,
comp_tab TYPE cl_abap_structdescr=>component_table,
comp LIKE LINE OF comp_tab,
my_table TYPE REF TO data,
my_row TYPE REF TO data,
my_fname TYPE lvc_fname.
FIELD-SYMBOLS : <fs_row> TYPE ANY,
<fs_table> TYPE ANY TABLE,
<fs_data> TYPE ANY.
* itab 의 속성정보
CALL FUNCTION 'GET_COMPONENT_LIST'
EXPORTING
program = sy-repid
fieldname = 'ITAB'
TABLES
components = components.
* 키필드
comp-name = 'KEY'.
comp-type ?= cl_abap_datadescr=>describe_by_data( 'CHAR1' ).
APPEND comp TO comp_tab.
* 데이터 필드( item으로 필드이름을 value 로 필드 속성을 지정함)
LOOP AT itab WHERE key = key.
* 필드이름
comp-name = itab-item.
* 필드속성
READ TABLE components WITH KEY compname = 'VALUE'.
IF sy-subrc IS INITIAL.
CASE components-type.
WHEN 'C'.
CONCATENATE 'CHAR' components-olen+1(2) INTO my_fname.
WHEN OTHERS.
ENDCASE.
ELSE.
CONTINUE.
ENDIF.
comp-type ?= cl_abap_datadescr=>describe_by_data( my_fname ).
* 필드 추가
APPEND comp TO comp_tab.
ENDLOOP.
* 구조생성
struct_type = cl_abap_structdescr=>create( comp_tab ).
* 내부테이블 생성
table_type = cl_abap_tabledescr=>create( p_line_type = struct_type ).
* 핸들러 지정
CREATE DATA my_row TYPE HANDLE struct_type.
CREATE DATA my_table TYPE HANDLE table_type.
* Assign
ASSIGN : my_row->* TO <fs_row>,
my_table->* TO <fs_table>.
SKIP 2.
WRITE /(4) 'Key'.
* 생성된 구조에 데이터 생성
LOOP AT itab WHERE key = key.
ASSIGN COMPONENT 'KEY' OF STRUCTURE <fs_row> TO <fs_data>.
<fs_data> = itab-key.
ASSIGN COMPONENT itab-item OF STRUCTURE <fs_row> TO <fs_data>.
IF sy-subrc IS INITIAL.
<fs_data> = itab-value.
ENDIF.
WRITE (5) itab-item.
ENDLOOP.
ULINE.
INSERT <fs_row> INTO TABLE <fs_table>.
LOOP AT <fs_table> ASSIGNING <fs_data>.
WRITE / <fs_data>.
ENDLOOP.
2. 최대크기 구조생성 후 데이터 생성 예.
DATA : BEGIN OF itab OCCURS 0,
key(2),
item(3),
value(10),
END OF itab.
DATA : BEGIN OF itab2 OCCURS 0,
key(2),
f1(10),
f2(10),
f3(10),
f4(10),
f5(10),
END OF itab2.
DATA index TYPE i.
FIELD-SYMBOLS : <fs_target>.
DEFINE app_itab.
clear itab.
itab-key = &1.
itab-item = &2.
itab-value = &3.
append itab.
END-OF-DEFINITION.
app_itab : 'A' 'A1' 'AA',
'A' 'A2' 'AB',
'A' 'A3' 'AC',
'B' 'B1' 'BA',
'B' 'B2' 'BB',
'B' 'B3' 'BC',
'B' 'B4' 'BD',
'C' 'C1' 'CA',
'C' 'C2' 'CB',
'C' 'C3' 'CC',
'D' 'D1' 'DA'.
CLEAR index.
LOOP AT itab.
AT NEW key.
ADD 1 TO index.
itab2-key = itab-key.
ENDAT.
ADD 1 TO index.
ASSIGN COMPONENT index OF STRUCTURE itab2 TO <fs_target>.
<fs_target> = itab-value.
AT END OF key.
APPEND itab2.
CLEAR: itab2, index.
ENDAT.
ENDLOOP.
comp-type ?= cl_abap_datadescr=>describe_by_data( my_fname ).를
comp-type ?= cl_abap_datadescr=>describe_by_name( my_fname ). 로
변경 바랍니다. 수정후에 지정이 잘못 되었네요. ^^;