구조화 데이터 오브젝트 선언

Objective

After completing this lesson, you will be able to 구조화 데이터 오브젝트를 선언합니다.

구조화 데이터 오브젝트

지금까지는 각각에 하나의 정보만 저장할 수 있는 단순 변수를 사용했습니다. 예를 들어, 두 가지 변수가 있습니다. 하나는 출발 공항이고 다른 하나는 도착 공항용입니다.

데이터베이스에서 레코드를 읽을 때는 이 모든 정보를 함께 보관해야 합니다. 예제의 두 변수는 서로 완전히 독립적이므로 서로 다른 정보를 저장하는 데 적합하지 않습니다.

ABAP에서 솔루션은 구조화 변수 또는 구조를 간단히 사용하는 것입니다.

구조는 이름과 구조화 유형이 있는 변수 ABAP 데이터 오브젝트입니다.

이 예에서 데이터 오브젝트 connection_full은 이러한 구조입니다. 8개의 구성요소로 나뉘며, 각 구성 요소에는 이름과 유형이 있습니다. 구조 전체와 개별 컴포넌트를 둘 다 처리할 수 있습니다. 중요한 점은 독립 실행형 단순 변수를 사용하는 것과 정확히 동일한 방식으로 각 컴포넌트를 사용할 수 있다는 점입니다.

다양한 방법으로 구조를 선언할 수 있습니다. 키워드 TYPES 를 사용하여 구조화 유형을 정의하거나 구조 유형의 저장소 오브젝트를 사용할 수 있습니다. 뷰와 데이터베이스 테이블의 정의도 구조화 유형으로 사용할 수 있습니다. 이 예에서는 CDS 뷰 /DMO/I_Connection을 구조화 유형으로 사용합니다.

디버거 관점에서는 구조화된 변수의 구조와 내용을 분석하는 두 가지 방법이 있습니다.

변수 미리보기(마우스 오버)

소스 코드 편집기에 포커스를 설정하고 포인터를 변수 이름에 배치합니다. 잠시 후에 데이터 오브젝트의 구조 및 컨텐트에 대한 세부사항이 있는 다이얼로그 윈도우가 열립니다.

변수 뷰에 표시(더블 클릭)

변수 뷰에 변수를 표시하려면 <변수 입력> 아래에 변수 이름을 입력하거나 소스 코드 편집기에서 변수 이름을 더블 클릭합니다. 구조 이름이 인 노드를 펼쳐서 컴포넌트 리스트를 확인합니다.

디버그 퍼스펙티브를 사용하여 구조화 데이터 오브젝트를 분석하는 방법

구조화 데이터 유형

전역 구조 유형은 시스템 어디에서나 데이터 유형으로 사용할 수 있는 저장소 오브젝트입니다. 이 예에서는 구조화 유형 SYMSG를 사용하여 변수 메시지를 선언합니다.

F2 키를 눌러 이 데이터 유형의 세부사항을 조회하면 7개의 컴포넌트로 구성된 구조 유형을 확인할 수 있습니다. 컴포넌트의 이름, 기술적 유형 및 내역도 볼 수 있습니다.

F3 키를 눌러 유형 정의로 이동하면 전역 구조화 유형을 위한 ADT 편집기가 있는 새로운 뷰가 열립니다.

전역 구조 유형의 정의는 데이터베이스 테이블의 정의와 매우 유사합니다. 정의의 주요 부분은 구조 유형 이름이 있는 DEFINE STRUCTURE 문으로 구성됩니다. 그 뒤에 중괄호( { , } ) 쌍의 구조 컴포넌트 리스트가 표시됩니다. 컴포넌트 유형이 있는 각 컴포넌트입니다. 구성품목 유형은 데이터 요소로 설명되는 경우가 많지만 구조 유형을 컴포넌트 유형으로 사용할 수도 있습니다. 구조화 컴포넌트가 있는 구조를 중첩 구조 라고 합니다.

DEFINE STRUCTURE 문 앞의 추가 코드 라인은 구조 유형의 추가 속성을 지정하고 그 중에서 레이블을 지정합니다.

TYPES 문을 사용하여 ABAP 프로그램에서 구조화 유형을 정의할 수도 있습니다. 구조 정의는 TYPES BEGIN OF <structure type name> 문으로 시작하고 TYPES END OF <structure type name> 문으로 끝납니다. 사이에 각 컴포넌트의 이름을 지정하고 추가 TYPES 문에 해당 유형을 지정합니다.

컴팩트 서식에서는 키워드 TYPES를 한 번만 사용하고 그 뒤에 콜론( : )을 사용합니다. BEGIN OF 추가 요소, END OF 추가 요소 및 그 사이에 있는 구성요소 정의는 쉼표로 구분됩니다.

이를 체인 문(chain statement)이라고 합니다.

노트

과거에는 ABAP에서 체인 문이 많이 사용되었습니다. 현재는 서로 밀접하게 연관된 명령문만 결합하는 것이 좋습니다.

이 예에서는 chain statement TYPES: 를 사용하여 3개의 컴포넌트 airport_from_id, airport_to_id 및 carrier_name 으로 구성된 로컬 구조화 유형 st_connection 을 정의합니다. 각 컴포넌트는 /dmo/로 시작하는 데이터 요소로 유형이 지정됩니다.

그런 다음 DATA 문에서 로컬 구조화 유형 st_connection을 사용하여 구조화 변수 연결을 입력합니다.

이 예에서 변수 connection 에는 중첩된 구조화 유형이 있습니다. 유형 st_nested은(는) 4개의 컴포넌트를 정의합니다. 3개의 유형이 데이터 요소로 지정되므로 단순 컴포넌트입니다. 그러나 컴포넌트 message 구조화 유형의 유형이 지정되어 있습니다. 따라서 구조화된 컴포넌트입니다. 이로 인해 변수는 중첩 구조를 connection.

ABAP에서는 구조화 변수뿐만 아니라 구조화 상수도 지원합니다. 구조화된 상수를 정의하려면 CONSTANTS 문의 일부로 BEGIN OF 및 END OF 를 사용합니다. 이 예에서는 전역 클래스 CL_ABAP_BEHV의 공용 섹션에 정의된 구조화된 상수를 보여줍니다. 5개의 컴포넌트 모두 데이터 요소 SECKEYNAME으로 유형이 지정됩니다. 상수를 정의할 때는 추가 요소 VALUE가 필수입니다.

사용해 보기: 구조화된 데이터 유형

  1. 이 과정의 첫 번째 연습문제와 마찬가지로 인터페이스 IF_OO_ADT_CLASSRUN을 구현하는 신규 전역 클래스를 생성합니다.
  2. 다음 코드 스니핏을 if_oo_adt_classrun~main( ) 메소드의 구현 부분에 복사합니다.
    Code Snippet
    1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
    * Example 1 : Motivation for Structured Variables ********************************************************************** DATA connection_full TYPE /DMO/I_Connection. SELECT SINGLE FROM /dmo/I_Connection FIELDS AirlineID, ConnectionID, DepartureAirport, DestinationAirport, DepartureTime, ArrivalTime, Distance, DistanceUnit WHERE AirlineId = 'LH' AND ConnectionId = '0400' INTO @connection_full. out->write( `--------------------------------------` ). out->write( `Example 1: CDS View as Structured Type` ). out->write( connection_full ). * Example 2: Global Structured Type ********************************************************************** DATA message TYPE symsg. out->write( `---------------------------------` ). out->write( `Example 2: Global Structured Type` ). out->write( message ). * Example 3 : Local Structured Type ********************************************************************** TYPES: BEGIN OF st_connection, airport_from_id TYPE /dmo/airport_from_id, airport_to_id TYPE /dmo/airport_to_id, carrier_name TYPE /dmo/carrier_name, END OF st_connection. DATA connection TYPE st_connection. SELECT SINGLE FROM /DMO/I_Connection FIELDS DepartureAirport, DestinationAirport, \_Airline-Name WHERE AirlineID = 'LH' AND ConnectionID = '0400' INTO @connection. out->write( `---------------------------------------` ). out->write( `Example 3: Local Structured Type` ). out->write( connection ). * Example 4 : Nested Structured Type ********************************************************************** TYPES: BEGIN OF st_nested, airport_from_id TYPE /dmo/airport_from_id, airport_to_id TYPE /dmo/airport_to_id, message TYPE symsg, carrier_name TYPE /dmo/carrier_name, END OF st_nested. DATA connection_nested TYPE st_nested. out->write( `---------------------------------` ). out->write( `Example 4: Nested Structured Type` ). out->write( connection_nested ).
  3. CTRL + F3 을 눌러 클래스를 활성화하고 F9 를 눌러 콘솔 앱을 실행합니다.
  4. 콘솔 출력을 분석합니다. 프로그램을 디버그하고 소스 코드를 사용하여 개념을 숙지합니다.