💻 SAP/ABAP

ABAP - 6일차

DevLevi 2024. 6. 13. 21:12

📜목차

🚩개요

 

1. 내부 테이블

 1.1. INCLUDE STRUCTURE문으로 테이블 복사하기
 1.2. 외래키를 이용하여 여러 테이블 데이터 가져오기
 1.3. 변수에 테이블 담기
 1.4. 조건에 맞는 테이블 필드값 옮겨 담기
 1.5. 반복문으로 작업영역 테이블로 옮겨 담기

 1.6. 출력 후 결과값 보기
 

2. 헤더 라인이 있는 테이블

 2.1. 헤더라인이 있는 테이블 선언

 2.2. 헤더라인 적용하여 테이블 재작성 해보기

 


🚩개요

INCLUDE STRUCTURE 구문과 테이블의 WITH HEADER LINE 유무에 따라 코드의 작성법이 달라집니다.


1. 내부 테이블

 

 1.1.  INCLUDE STRUCTURE문으로 테이블 복사하기

ty_main의 타입을 구조체로 만들어줍니다. 가장 먼저 INCLUDE STURCTURE문을 통해 sflight 테이블의 데이터 구조를 전부 받습니다.

 

 1.2. 외래키를 이용하여 여러 테이블 데이터 가져오기

ty_main의 타입에 sflight 테이블의 구조 외에도 다른 테이블의 scarr-carrname, spfli-countryfr, spfli-countryto 구조를 받아옵니다.

 

 1.3. 변수에 테이블 담기

Java에서는 변수에 하나의 값만 할당하지만, ABAP은 조금 다르다는 것을 알았습니다. it_main 변수는 사실상 ty_main 데이터 타입의 테이블 구조가 할당된 것과 같습니다. ABAP에서는 변수에 테이블 구조를 할당할 수 있습니다. 이를 통해 한 변수에 여러 개의 데이터를 저장할 수 있다는 것을 알 수 있습니다. 이는 자바와 같은 객체지향 언어와는 다른 ABAP만의 특징입니다. 예를 들어, TYPE TABLE OF의 경우 전역 타입이나 사용자가 직접 정의한 구조체 타입을 기반으로 테이블 생성한다는 의미이고, LIKE LINE OF의 경우 이미 존재하는 구조체 변수를 기반으로 새로운 테이블 타입을 사용하겠다는 의미입니다. LIKE의 경우는 단일 필드 타입을 변수에 할당할 때 사용합니다.

 

 1.4. 조건에 맞는 테이블 필드값 옮겨 담기

it_main 테이블에 sflight 테이블의 carrid 필드의 값이 'AA'인 데이터들을 찾아서 옮겨 담습니다. 그리고 carrid 필드의 값이 'AA'인 데이터가 있었다면 it_main에 레코드가 저장이 되었을 겁니다. IS NOT INITIAL을 통해 저장된 값이 있는지 확인합니다. it_main 테이블에 값이 있다면 it_scarr, it_spfli 테이블에도 각각의 조건에 맞는 it_main의 필드 값들을 옮겨 담습니다.

위에 코드는 MySQL의 테이블 조인과 같다고 생각합니다. 테이블을 조인시킨 후에 조건문을 통해 원하는 값을 가져와서 it_spfli 테이블에 옮겨 담습니다.

 

 1.5. 반복문으로 작업영역 테이블로 옮겨 담기

it_main 테이블의 데이터들을 wa_main 테이블로 전부 옮겨담습니다. 그리고 변수로 선언해둔 indxloop에 몇개의 행이 담기는지 기록되는 sy-tabix를 할당합니다. 그리고 wa_scarr에는 carrid = wa_main-carrid, wa_spfli에는 carrid = wa_main-carrid, connid = wa_main-connid 조건에 맞는 데이터를 찾아서 wa_scarr, wa_spfli 테이블 필드에 저장합니다. 이후 저장된 값이 존재하는지 sy-subrc 시스템 필드로 확인합니다. 그리고 값이 있다면 작업 테이블에 있는 필드들을 internal 테이블로 옮겨 줍니다. 마지막으로 MODIFY문을 통해 indxloop에 기록된 저장된 행의 갯수만큼 전부 작업 영역에서 internal 테이블로 옮겨줍니다.

 

 1.6. 출력 후 결과값 보기

internal 테이블에는 그 동안 처리한 모든 값들이 올바르게 저장되어 있습니다. 그러므로 출력을 위해 wa_main 작업 테이블로 모두 옮기고, 작업테이블에 있는 모든 값을 반복하여 출력해냅니다.

 


2. 헤더 라인이 있는 테이블

 2.1. 헤더라인이 있는 테이블 선언

WITH HEADER LINE을 통해 헤더라인을 추가해줍니다. 헤더라인을 추가하면 자동으로 작업 영역도 생성되므로 편리합니다.

 

 2.2. 헤더라인 적용하여 테이블 재작성 해보기

ZABAP05에서 작성했었던 코드를 전부 수정해줬습니다.

ZABAP05에서 처럼 작업 테이블을 별도로 생성하지 않아도 되서 매우 편리합니다. 그러나 호환성 때문에 헤더라인이 없는 작업 영역을 만드는 것을 권장한다고 합니다.

마찬가지로 ZABAP06에서 작성한 코드를 헤더라인이 있는 테이블로 변경하여 소스코드를 더 간결하게 변경했습니다. 이전 코드에서는 작업 영역에 값을 담아두었으므로 wa_scarr IS NOT INITIAL로 조건을 걸 수 있었지만, 지금은 작업 영역은 비어있습니다(SELECT문에서 작업영역에 접근하는 방법은 SELELCT * INTO t_scarr). 그러므로 i_scarr[]라는 interanl 테이블에 접근하여 조건을 확인해야합니다. 그리고 LOOP를 통해 t_scarr 테이블의 모든 행을 순회하면서 write문을 출력하고 프로그램은 종료됩니다.