인터널테이블의 정보 채우기 / SY-SUBRC

홍예림·2023년 7월 11일
0

SAP ABAP(개편중...)

목록 보기
25/55

인터널테이블이 2개

  • 인터널테이블A 로부터 인터널테이블B 에 정보를 가져온다.

인터널 테이블1&2 선언하기

  1. 인터널 테이블 생성
    • 데이터를 넣을 주 인터널 테이블A (빈 열이 있는 상태)
    • 데이터를 가져올 인터널 테이블B
    • 스트럭처 생성 - 인터널테이블 생성 - CLEAR & REFRESH
  2. SELECT문 작성
    • A 인터널테이블 : 빈 열 제외하고 조회
    • B 인터널테이블 : A인터널테이블과 매핑할 수 있는 공통 필드 + 빈 필드
  3. 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

구문이 성공적으로 작동한 경우

048그외
성공실패(찾을 수 없음)실패(조건부적합)지정 가능
  • 코드의 성공여부를 표현
    • 성공했을 시 다음 구문을 실행하는 장치로 활용한다.
    • 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.

강사님 코드

  • 연습을 위해 타입 선언함
profile
SYNC 5반 2023.07 - 2023.12

0개의 댓글