본문으로 바로가기

누구나 할 수 있는 ABAP - Exercise 17: Data Retrieval and Buffing in an Internal Table




지금 우리가 하고 있는 것들은 ABAP Certi의 시험 범위이기도 하면서 SAP에서 만든 ABAP 공식 교재인 TAW10_1의 EXERCISE부분을 보고 있다.


대부분의 교과서를 보면 설명이 줄줄줄 나와 있고 뒤에 연습문제가 나와 있는데 아밥 공식 교재도 딱 그 형식을 취하고 있다.


내가 봤을 때 공식교재에서 제공하는 연습문제는 ABAP을 배우는데 있어서 상당히 유용하다고 판단 되기 때문에 시리즈로 올리고 있다.



앞전에 올렸던 포스트

2014/01/15 - [SAP/SAP ABAP] - 누구나 할 수 있는 ABAP - Exercise 16: Data Retrieval Using a SELECT Loop

에 이어서 데이터를 검색하는 내용이 나온다.


지난번에는 인터널테이블을 사용하지 않고 select문과 스트럭처를 이용해 바로 데이터를 출력 했지만 이번 장에서는 인터널테이블이라는 테이블 버퍼이면서도 변수인 특별한 오브젝트를 이용해 데이터를 다루어 보도록 하겠다.



Internal Table은 왜 쓰는지에 대한 내용은 지난 포스트

2014/01/14 - [SAP/SAP ABAP] - 누구나 할 수 있는 ABAP - Exercise 15: Working with Internal Tables

에 써놓았으니 참고해도 좋다.




그럼 이번 시간도 힘차게 출발 해보자.


목표

· 데이터베이스 테이블(Database Table)에 있는 데이터를 인터널테이블(Internal Table)로 가져와보자

· 인터널테이블의 데이터를 '정렬'해보자


비즈니스 예제

사용자가 요청한 비행 스케쥴을 출력하는 해당 아밥프로그램에서 출력 결과를 오름차순으로 정렬해서 출력 하자.



작업 1:

데이터를 검색하고 인터널테이블에 넣자

1.이전 Exercise 16에서 만들었던 프로그램 또는 sap에서 제공하는 SAPBC400DDS_SELECT_SFLIGHT 프로그램을 ZBC400_##_SELECT_SFLIGHT_ITAB이라는 이름으로(## 은 원하는 번호 난 주로 01번을 씀) 복사해오자.


2.글로벌 스트럭처 타입인 SBC400FOCC를 기반으로 만든 글로벌 테이블 타입을 이용해 인터널테이블을 선언하자(변수명은 it_flight을 추천한다). 힌트를 주자면 'where-used list' 기능을 이용해 적절한 테이블 타입을 찾아보기 바란다. 이미 있을 것이다.


3.SFLIGHT 테이블에서 조회한 각 열을 곧바로 출력하지 말고 일단 인터널테이블에 넣자(INSERT 구문).



작업 2:

인터널테이블을 정렬하고 출력하자

1.인터널테이블을 이용율을 기준으로 정렬하자(오름차순).

2.인터널테이블의 데이터를 출력하기 위해 루프문을 이용해보자.





작업1부터 하나씩 해보자


1.SAPBC400DDS_SELECT_SFLIGHT 카피하는 것

앞전 포스트에서 자세히 설명 했으니 방법이 생각이 안나면 이전 포스트를 참고하기 바란다.

2014/01/15 - [SAP/SAP ABAP] - 누구나 할 수 있는 ABAP - Exercise 16: Data Retrieval Using a SELECT Loop




/nse38에서 프로그램명 입력하고, 상단 쓰레기통 옆에 복사 아이콘을 누르면 아래와 같이 나온다. 내가 원하는 프로그램명을 아래 필드에 적고 카피를 누른다.



뭐 선택하는 화면이 나오는데 해당되는게 없으므로 아무것도 선택할 필요가 없다. 다음.


패키지 선택하는건데 본인이 만들었던 패키지나 $TMP나 등등 기억이 나지 않거나 없으면 F4를 눌러서 찾는다. 이전 포스트에 찾는법을 써놓았으니 참고. 다음.



CTS따는 화면 적절한 CTS를 따준다. 나는 그냥 이지아밥 테스트용 cts에 묶어 주었다. 실무에서는 중요하지만 Exercise이니 아무거나 해줘도 크게 상관은 없다. 다음.


/nse80에 들어가서 내가 사용하는 패키지명을 입력하고 들어오면 'Program'카테고리에 방금 카피한 프로그램이 있을 것이다 더블클릭해서 소스코드를 보자.

이렇게 나와 있다면 잘 한것이다. 


이전 Exercise 16번에서 만들었던거랑 같으니 그걸 복사해도 된다.



작업1-1 완료.



다음꺼 고고씽''~~





작업1-2.글로벌 스트럭처 타입인 SBC400FOCC를 기반으로 만든 글로벌 테이블 타입을 이용해 인터널테이블을 선언하자(변수명은 it_flight을 추천한다). 힌트를 주자면 'where-used list' 기능을 이용해 적절한 테이블 타입을 찾아보기 바란다. 이미 있을 것이다.


처음 ABAP을 시작하는 사람들에게는 너무도 어려운 말이 연타로 나온다. 각개격파를 해나가면 딱히 문제될게 없다.


먼저 '글로벌 스트럭처 타입(Global Structure Type)'이라는 말이 나온다. ㄷㄷ 일단 '타입'이라는 말부터 보자.


'타입'에 대해 처음 듣는 사람들은 아래 포스트를 읽어보길 바라며 아는 사람은 다음으로 넘어가도 된다.

2013/04/23 - [개발/개발 Note] - 쉽게 쓴 Type Casting 이해하기 - 01 Type에 대해서

2013/05/03 - [개발/개발 Note] - 쉽게 쓴 Type Casting 이해하기 - 02 Casting에 대해서


'타입'이 쉽게 말하면 환율 같은건데...


1,000이라고 써있으면 한국 사람들은 기본적으로 '천원'이라고 받아들이고 유럽 사람들은 '천 유로'라고 받아들이는 것 처럼 컴퓨터에게 1,000이라는 값이 숫자인지 아니면 looo 같은 문자인지 알려주기 위한 것이 타입이다.


그러면 '스트럭처 타입'은 컴퓨터에게 st_sflight라는 변수가 스트럭처 타입 이라는 것을 알려주는 것이다.



두번째 '스트럭처'는 무엇일까? 쉽게 말해서 테이블의 1개의 행을 의미한다. '인사 테이블'이라는 테이블이 있으면 해당 테이블은, 이름, 사번, 주소, 전화번호, 입사년도 이런 데이터들이 들어 있을 것이다. 이런 요소들이 각각 떨어져 있으면 그저 '요소'일 뿐이지만 하나로 모아 놓으면 해당 사원에 대한 '정보'가 된다.


이런 한줄 한줄을 스트럭쳐라고 한다.


마지막 '글로벌'이라는 말은 말 그대로 '전역'이라는 뜻이다. '글로벌 기업'이라고 하면 전 세계를 대상으로 세일즈를 하는 기업을 말하는데 '글로벌 타입'이라고 하면 SAP의 모든 곳에서 사용할 수 있는 '타입'을 말한다. '글로벌 타입'은 흔히 'ABAP Dictionary'(아밥 딕셔너리)에 들어있는 것을 말한다.


하다 보면 알게 될 것이니 조마심 내지 말기 바란다.



주저리주저리 써놓았지만 문제에서 이야기 하는 것은 딱 두가지다.


스트럭처 타입, 테이블 타입 이렇게 두가지다. 스트럭처와 테이블의 차이는 스트럭처는 데이터를 한줄만 넣을 수 있고 테이블은 여러줄의 데이터를 넣을 수 있다는 이런 차이 정도라고 보면 조금 이해하기 쉬울 것이다.


글만 많으니까 짤도 한번 넣어봤다. 위에 한줄만 있는게 스트럭쳐고 아래 여러줄 있는게 테이블.



그러면 왜 그냥 table을 쓰면 되는데 굳이 스트럭처라는 어려운걸 중간에 넣느냐는 질문을 할 수 있다. 당연히... 내 생각에는 스트럭처를 먼저 만들고 그걸로 table을 만드는게 맞지 싶다.


결론적으로 이야기 해보면 해당 '구조'를 테이블에만 사용할게 아니고 여러 곳에 사용할 것이기 때문이라고 할 수 있다.


우리가 단순히 데이터를 출력하는 프로그램만 만들 것이 아니고 이후에 데이터를 가공해서 원하는 형태로 만들어 내는데 있어서 structure를 사용할 일이 많으므로 그렇게 하는 것이다. 또한 열을 하나 추가한다던가 하는 등 추후에 프로그램이나 테이블을 수정할 때에도 스트럭처를 이용한다면 조금 더 쉽게 변경을 할 수 있다.


이러한 이유로 스트럭처를 사용한다.



그러면 '글로벌 스트럭처 타입인 SBC400FOCC를 기반으로 만든 글로벌 테이블 타입'부터 찾아보자.

/nse11로 들어가서 'Data type'에 sbc400focc라고 치고 상단 3번째에 있는 화살표가 세방향으로 나가는 아이콘을 클릭한다. 이게 'where used list'라는 기능이다.



그러면 어떤 오브젝트를 찾고 싶은지 선택하는 창이 나온다. 'SBC400FOCC'를 사용한 프로그램, 클래스, 인터페이스, 웹딘프로 컴포넌트, BSP어플리케이션 등을 찾을 수 있는데 우리는 'Table type'을 찾는것이므로 'Table type'만 체크 하고 실행 한다.



그러면 이렇게 'SBC400FOCC'스트럭처를 기반으로 만든 테이블 타입이 검색 된다. 총 3개나 있네.. ㅎㅎ

맨위에 'SBC400_T_SBC400FOCC'를 더블클릭 해서 내용을 한번 봐보자.



이런 내용들이 나온다. 'Line Type'이 'SBC400FOCC'로 되어있다. 이게 의미하는건 이걸로 만든 테이블은 한 줄이 'SBC400FOCC'타입이라는거다.



'SBC400_T_SBC400FOCC'라는 Table Type을 찾아 보았다. 그러면 이 타입을 가지고 인터널테이블(Internal Table)을 만들어 보자.






PARAMETERS pa_car TYPE s_carr_id. DATA wa_flight TYPE sbc400focc. data it_flight type sbc400_t_sbc400focc. * Select all flights belonging to carrier specified in PA_CAR : SELECT carrid connid fldate seatsmax seatsocc FROM sflight INTO CORRESPONDING FIELDS OF wa_flight WHERE carrid = pa_car. * Calculate occupation of the current flight wa_flight-percentage = 100 * wa_flight-seatsocc / wa_flight-seatsmax. * Create list WRITE: / wa_flight-carrid, wa_flight-connid, wa_flight-fldate, wa_flight-seatsmax, wa_flight-seatsocc, wa_flight-percentage, '%'. ENDSELECT. IF sy-subrc NE 0. WRITE: 'No ', pa_car, 'flights found !'. ENDIF.


아래 한줄을 추가 해주면 internal table변수가 선언 된다.

data it_flight type sbc400_t_sbc400focc.


1-2 끝. 다음걸 해보자.





1-3.SFLIGHT 테이블에서 조회한 각 열을 곧바로 출력하지 말고 일단 인터널테이블에 넣자(INSERT 구문).


간단하다. select문 안에 insert문을 넣어주면 된다. 아래와 같다.
PARAMETERS pa_car TYPE s_carr_id.

DATA wa_flight TYPE sbc400focc.
data it_flight type sbc400_t_sbc400focc.

* Select all flights belonging to carrier specified in PA_CAR :

SELECT carrid connid fldate seatsmax seatsocc
       FROM sflight
       INTO CORRESPONDING FIELDS OF wa_flight
       WHERE carrid = pa_car.

*  Calculate occupation of the current flight
   wa_flight-percentage = 100 * wa_flight-seatsocc / wa_flight-seatsmax.


* insert
  insert wa_flight into table it_flight.

ENDSELECT.


IF sy-subrc NE 0.
  WRITE: 'No ', pa_car, 'flights found !'.
ENDIF.



1-3 끝. 이제 작업2를 해보자.


작업 2는 그냥 넘어가려고 했는데 작업2까지 해야 internal table에서 데이터를 출력할 수 있다.


작업 2:

인터널테이블을 정렬하고 출력하자

1.인터널테이블을 이용율을 기준으로 정렬하자(오름차순).

2.인터널테이블의 데이터를 출력하기 위해 루프문을 이용해보자.



위와 같은 일들을 하면 된다.


1번부터 해보자.



현 시점에서 select문을 실행하고 insert문을 통해 internal table 'it_flight'에 data를 넣었다. 해당 인터널 테이블을 정렬 해보자. 이것도 한줄이면 된다.

PARAMETERS pa_car TYPE s_carr_id.

DATA wa_flight TYPE sbc400focc.
data it_flight type sbc400_t_sbc400focc.

* Select all flights belonging to carrier specified in PA_CAR :

SELECT carrid connid fldate seatsmax seatsocc
       FROM sflight
       INTO CORRESPONDING FIELDS OF wa_flight
       WHERE carrid = pa_car.

*  Calculate occupation of the current flight
   wa_flight-percentage = 100 * wa_flight-seatsocc / wa_flight-seatsmax.


* insert
  insert wa_flight into table it_flight.

ENDSELECT.


* 2-1 sort internal table using percentage.
sort it_flight by percentage.


IF sy-subrc NE 0.
  WRITE: 'No ', pa_car, 'flights found !'.
ENDIF.


select문 뒤에 아래 명령어를 추가하면 된다.
sort it_flight by percentage.


2-1 끝. 2-2를 해보자.


2-2.인터널테이블의 데이터를 출력하기 위해 루프문을 이용해보자. 


여태까지 데이터를 select해서 internal table에 넣는것까지 해봤다. select문의 꽃은 출력이라고 할 수 있는데 그 출력하는 부분이 여태까지 없다.


internal table은 보통 loop문을 이용해서 출력한다. 한번 해보자. 이것도 별로 어려운건 아니다. 그냥 루프문 써주면 된다.


PARAMETERS pa_car TYPE s_carr_id.

DATA wa_flight TYPE sbc400focc.
data it_flight type sbc400_t_sbc400focc.

* Select all flights belonging to carrier specified in PA_CAR :

SELECT carrid connid fldate seatsmax seatsocc
       FROM sflight
       INTO CORRESPONDING FIELDS OF wa_flight
       WHERE carrid = pa_car.

*  Calculate occupation of the current flight
   wa_flight-percentage = 100 * wa_flight-seatsocc / wa_flight-seatsmax.


* insert
  insert wa_flight into table it_flight.

ENDSELECT.


* 2-1 sort internal table using percentage.
sort it_flight by percentage.

* 2-2 loop
loop at it_flight into wa_flight.
*  Create list
   WRITE: / wa_flight-carrid,
            wa_flight-connid,
            wa_flight-fldate,
            wa_flight-seatsmax,
            wa_flight-seatsocc,
            wa_flight-percentage, '%'.
ENDLOOP.


IF sy-subrc NE 0.
  WRITE: 'No ', pa_car, 'flights found !'.
ENDIF.


위와 같이 sort문 다음에 loop문을 넣어주고 출력해주면 된다.


그럼 이제 다 만들었으니까 제대로 데이터가 나오는지, 정렬은 되서 나오는지 한번 테스트 해보자.


Ctrl + F3을 눌러서 컴파일 하고 F8눌러서 실행 해보자.


화면이 나오면 항공사 'lh'를 넣고 F8 눌러서 조회 해보자.



짜잔! internal table을 loop로 출력해도 결과 값이 제대로 잘 나온다.


그리고 맨 오른쪽 필드를 보면 오름차순으로 정렬까지 된 것을 볼 수 있다.



할일1, 할일2 모두 success.




end.










댓글을 달아 주세요