인터널테이블이 2개
- 인터널테이블
A
로부터 인터널테이블B
에 정보를 가져온다.
인터널 테이블1&2 선언하기
- 인터널 테이블 생성
- 데이터를 넣을 주 인터널 테이블
A
(빈 열이 있는 상태)
- 데이터를 가져올 인터널 테이블
B
- 스트럭처 생성 - 인터널테이블 생성 - CLEAR & REFRESH
- SELECT문 작성
A
인터널테이블 : 빈 열 제외하고 조회
B
인터널테이블 : A인터널테이블과 매핑할 수 있는 공통 필드 + 빈 필드
LOOP
문을 이용해 주 인터널 테이블의 모든 레이블을 반복 조회 및 수정
SY-TABIX
를 LOOP문 밖에 선언 후 변수에 할당해, 해당 번 루프에서 사용된 인덱스 수를 고정
READ
문으로 참조인터널테이블에서 공통 필드를 기준으로 주인터널테이블과 매핑
IF
문을 이용해 위 READ문이 성공했는지 확인 sy-subrc EQ 0
- A인터널테이블의 빈 필드에 B인터널테이블의 데이터 할당
MODIFY
문으로 데이터를 수정저장하며, TRANSPORTING
으로 수정저장될 데이터 필드를 제한해준다.
데이터 넣기
LOOP와 SY-TABIX
READ TABLE
의 영향으로 SY-TAVIX
가 이동하므로, INDEX에 잘못된 값이 들어가게 된다.
- 따라서, 변수를 선언해서 타빅스를 할당 후 사용한다.
- 타빅스 할당문은
READ TABLE
앞에 위치해야 한다.
SY-SUBRC
구문이 성공적으로 작동한 경우
0 | 4 | 8 | 그외 |
---|
성공 | 실패(찾을 수 없음) | 실패(조건부적합) | 지정 가능 |
- 코드의 성공여부를 표현
- 성공했을 시 다음 구문을 실행하는 장치로 활용한다.
SY-SUBRC EQ 0
빈 테이블인 경우
- 성공을 판단할 데이터 자체가 없으므로, 항상 0이 아님
SY-SUBRC <> 0
실습 문제
1)
문제
풀이
*1)
DATA : BEGIN OF gs_fli,
carrid TYPE sflight-carrid,
connid TYPE sflight-connid,
fldate TYPE sflight-fldate,
price TYPE sflight-price,
currency TYPE sflight-currency,
planetype TYPE sflight-planetype,
fltime TYPE spfli-fltime,
deptime TYPE spfli-deptime,
arrtime TYPE spfli-arrtime,
END OF gs_fli,
*2)
gt_fli LIKE TABLE OF gs_fli,
gs_spfli TYPE spfli,
gt_spfli TYPE TABLE OF spfli,
gv_tabix TYPE sy-tabix.
CLEAR : gs_fli, gs_spfli.
REFRESH : gt_fli, gt_spfli.
*3)
SELECT carrid connid fldate price currency planetype
INTO CORRESPONDING FIELDS OF TABLE gt_fli
FROM sflight
WHERE carrid IN ('AA', 'AZ', 'DL', 'LH' ).
*4)
SELECT carrid connid fltime arrtime
INTO CORRESPONDING FIELDS OF TABLE gt_spfli
FROM spfli.
LOOP AT gt_fli INTO gs_fli.
gv_tabix = sy-tabix.
READ TABLE gt_fli INTO gs_fli WITH KEY carrid = gs_fli-carrid
connid = gs_fli-connid.
IF sy-subrc EQ 0.
gs_fli-fltime = gs_spfli-fltime.
gs_fli-deptime = gs_spfli-deptime.
gs_fli-arrtime = gs_spfli-arrtime.
MODIFY gt_fli FROM gs_fli INDEX gv_tabix
TRANSPORTING fltime deptime arrtime.
ENDIF.
ENDLOOP.
BREAK-POINT.
2)
문제
풀이
* 실습 문제 0711-2
*1)
DATA : BEGIN OF gs_mat,
matnr TYPE mara-matnr,
maktx TYPE makt-maktx, "내역
meins TYPE mara-meins,
vpsta TYPE mara-vpsta,
werks TYPE marc-werks,
name1 TYPE t001w-name1, "내역
mbrsh TYPE mara-mbrsh,
mbbez TYPE t137t-mbbez, "내역
ekgrp TYPE marc-ekgrp,
eknam TYPE t024-eknam,
END OF gs_mat,
gt_mat LIKE TABLE OF gs_mat.
CLEAR : gs_mat.
REFRESH : gt_mat.
*2) MARA-MARC 조인
SELECT a~matnr a~meins a~vpsta a~mbrsh
b~werks b~ekgrp
INTO CORRESPONDING FIELDS OF TABLE gt_mat
FROM mara AS a
INNER
JOIN marc AS b
ON a~matnr = b~matnr
WHERE b~werks = '1010'.
* 3) 인터널테이블 필드 채우기
* 3-1) 텍스트테이블을 ITAB에 넣기
DATA : gs_mara TYPE mara,
gt_mara TYPE TABLE OF mara,
gs_makt TYPE makt,
gt_makt TYPE TABLE OF makt,
gs_marc TYPE marc,
gt_marc TYPE TABLE OF marc,
gs_t001w TYPE t001w,
gt_t001w TYPE TABLE OF t001w,
gs_t137t TYPE t137t,
gt_t137t TYPE TABLE OF t137t,
gs_t024 TYPE t024,
gt_t024 TYPE TABLE OF t024,
gv_tabix TYPE sy-tabix.
CLEAR : gs_mara, gs_marc, gs_t001w, gs_t137t.
REFRESH : gt_mara, gt_marc, gt_t001w, gt_t137t.
SELECT matnr maktx
INTO CORRESPONDING FIELDS OF TABLE gt_makt
FROM makt.
SELECT werks name1
INTO CORRESPONDING FIELDS OF TABLE gt_t001w
FROM t001w.
SELECT mbrsh mbbez
INTO CORRESPONDING FIELDS OF TABLE gt_t137t
FROM t137t.
SELECT ekgrp eknam
INTO CORRESPONDING FIELDS OF TABLE gt_t024
FROM t024.
* 3-2) gt_mat 채우기
LOOP AT gt_mat INTO gs_mat.
gv_tabix = sy-tabix.
READ TABLE gt_makt INTO gs_makt WITH KEY matnr = gs_mat-matnr.
IF sy-subrc EQ 0.
gs_mat-maktx = gs_makt-maktx.
MODIFY gt_mat FROM gs_mat INDEX gv_tabix
TRANSPORTING maktx.
ENDIF.
READ TABLE gt_t001w INTO gs_t001w WITH KEY werks = gs_mat-werks.
IF sy-subrc EQ 0.
gs_mat-name1 = gs_t001w-name1.
MODIFY gt_mat FROM gs_mat INDEX gv_tabix
TRANSPORTING name1.
ENDIF.
READ TABLE gt_t137t INTO gs_t137t WITH KEY mbrsh = gs_mat-mbrsh.
IF sy-subrc EQ 0.
gs_mat-mbbez = gs_t137t-mbbez.
MODIFY gt_mat FROM gs_mat INDEX gv_tabix
TRANSPORTING mbrsh.
ENDIF.
READ TABLE gt_t024 INTO gs_t024 WITH KEY ekgrp = gs_mat-ekgrp.
IF sy-subrc EQ 0.
gs_mat-eknam = gs_t024-eknam.
MODIFY gt_mat FROM gs_mat INDEX gv_tabix
TRANSPORTING ekgrp.
ENDIF.
ENDLOOP.
BREAK-POINT.
3)
문제
풀이
* 실습 0711-3
DATA : BEGIN OF gs_mara,
matnr TYPE mara-matnr,
maktx TYPE makt-maktx,
mtart TYPE mara-mtart,
mtbez TYPE t134t-mtbez,
matkl TYPE mara-matkl,
wgbez TYPE t023t-wgbez,
END OF gs_mara,
gs_makt TYPE makt,
gs_t134t TYPE t134t,
gs_t023t TYPE t023t,
gt_mara LIKE TABLE OF gs_mara,
gt_makt TYPE TABLE OF makt,
gt_t134t TYPE TABLE OF t134t,
gt_t023t TYPE TABLE OF t023t,
gv_tabix TYPE sy-tabix.
CLEAR : gs_mara, gs_makt, gs_t134t, gs_t023t.
REFRESH : gt_mara, gt_makt, gt_t134t, gt_t023t.
SELECT matnr mtart matkl
INTO CORRESPONDING FIELDS OF TABLE gt_mara
FROM mara.
SELECT matnr maktx spras
INTO CORRESPONDING FIELDS OF TABLE gt_makt
FROM makt
WHERE spras = sy-langu.
SELECT mtart mtbez spras
INTO CORRESPONDING FIELDS OF TABLE gt_t134t
FROM t134t
WHERE spras = sy-langu.
SELECT matkl wgbez spras
INTO CORRESPONDING FIELDS OF TABLE gt_t023t
FROM t023t
WHERE spras = sy-langu.
LOOP AT gt_mara INTO gs_mara.
gv_tabix = sy-tabix.
READ TABLE gt_makt INTO gs_makt WITH KEY matnr = gs_mara-matnr.
IF sy-subrc EQ 0.
gs_mara-maktx = gs_makt-maktx.
MODIFY gt_mara FROM gs_mara INDEX gv_tabix
TRANSPORTING maktx.
ENDIF.
READ TABLE gt_t134t INTO gs_t134t WITH KEY mtart = gs_mara-mtart.
IF sy-subrc EQ 0.
gs_mara-mtbez = gs_t134t-mtbez.
MODIFY gt_mara FROM gs_mara INDEX gv_tabix
TRANSPORTING mtbez.
ENDIF.
READ TABLE gt_t023t INTO gs_t023t WITH KEY matkl = gs_mara-matkl.
IF sy-subrc EQ 0.
gs_mara-wgbez = gs_t023t-wgbez.
MODIFY gt_mara FROM gs_mara INDEX gv_tabix
TRANSPORTING wgbez.
ENDIF.
ENDLOOP.
BREAK-POINT.
강사님 코드