구조화 데이터 오브젝트 사용

Objectives

After completing this lesson, you will be able to:
  • 구조화 데이터 오브젝트 사용
  • ABAP SQL에서 구조화 데이터 오브젝트 사용

구조화 데이터 오브젝트

구조의 컴포넌트에 액세스하려면 구조 이름과 컴포넌트 이름 사이에 소문자 기호(-)를 배치해야 합니다.

노트

컴포넌트 선택 전후에 공백을 사용할 수 없습니다.

구조 구성요소에 액세스하는 경우 동일한 유형의 변수를 사용할 수 있는 피연산자 위치에서 사용할 수 있습니다. 위의 예에서 구조 연결의 airport_from_id 컴포넌트는 /DMO/AIRPORT_FROM_ID 유형입니다. 따라서 이 컴포넌트는 /DMO/AIRPORT_FROM_ID 유형의 단순 변수를 사용할 수 있는 피연산자 위치에서 사용할 수 있습니다. 예에서와 같이 값 지정의 왼쪽뿐만 아니라 오른쪽에서 메소드 호출의 매개변수 전달, SELECT 문의 INTO 절 또는 WHERE 절 등에서 사용할 수 있습니다.

구조의 컴포넌트 자체가 구조이면 주요 컴포넌트의 이름 뒤에 있는 컴포넌트 선택자를 다시 사용하여 하위 컴포넌트에 액세스합니다. 예제의 첫 번째 값 지정은 MESSAGE의 MSGTY 구성요소에 액세스합니다. MESSAGE는 그 자체가 중첩 구조 CONNECTION_NESTED의 구성요소입니다.

힌트

코드 자동 완성을 사용하여 구조 컴포넌트에 대한 액세스를 구현할 수 있습니다. 구조 컴포넌트 선택 바로 뒤에 커서를 놓고 CTRL + SPACE 를 눌러 사용 가능한 모든 구조 컴포넌트 리스트를 확인합니다.

VALUE #( ) 표현식은 구조화 데이터 오브젝트에 값을 지정할 수 있는 우아한 방법입니다.

전체 구조를 채우려는 경우 이전 예시와 같이 각 컴포넌트를 개별적으로 처리할 수 있습니다.

그러나 VALUE #( ) 표현식을 사용하여 구조를 채울 수도 있습니다. 이 표현식은 구조를 구성하고, 값을 채우고, 채워진 구조를 변수에 지정합니다(이 경우 connection). 파운드 기호(#)는 ABAP 런타임 환경에 대상 변수 connection 와 같은 유형의 구조를 구성하도록 지시한다. 괄호에는 입력할 구조의 컴포넌트를 나열하고(모든 구성품목일 필요는 없음) 여기에 값을 지정합니다.

이러한 방식으로 구조를 채울 경우 런타임 시스템에서 구조의 기존 값을 모두 삭제한 후에 표현식의 값으로 구조를 다시 채웁니다.

노트

괄호 사이에 공백만 있는 connection = VALUE #( ) 형식의 지정은 구조의 모든 구성요소를 유형별 초기 값으로 채웁니다. 이는 명령문 CLEAR connection 와 동일한 영향을 미칩니다.

ABAP에서는 두 구조 유형이 호환되는 경우에만 <target structure> = <source structure> 표기법을 사용하여 한 구조의 내용을 다른 구조로 직접 복사할 수 있다. 이렇게 하려면 일반적으로 두 구조의 유형이 동일해야 합니다. 구조의 유형이 서로 다르면 두 가지 상황이 발생할 수 있습니다.

  • 구조 중 하나가 다른 구조에 문자형 구성요소가 있는 위치에 문자형이 아닌 구성요소가 있는 경우 직접 지정으로 인해 구문 오류가 발생합니다.
  • 두 구조가 모두 문자형(char-like), 즉 두 구조가 모두 문자형(char-like) 구성요소로 구성된 경우 기술적으로 직접 지정이 가능합니다. 그러나 일반적으로 결과는 잘못될 것입니다.

이 예에서 소스 구조와 대상 구조는 문자형입니다. 따라서 직접 지정은 기술적으로 가능합니다. 그러나 호환되지 않기 때문에 결과가 잘못되었습니다. 컴포넌트 carrier_name의 컨텐트가 대상 구조의 컴포넌트 message에 복사됩니다.

구문 오류가 없기 때문에 호환되지 않는 문자형 구조로 작업할 때는 각별한 주의가 필요합니다.

구조 간에 데이터를 복사할 때 일반적으로 하나의 필드에서 대상 구조의 해당 필드(airport_from_id - airport_from_id, airport_to_id - airport_to_id 등으로 정보를 복사하려고 합니다. ABAP에서 이 작업을 수행하려면 CORRESPONDING 식을 사용합니다. 이렇게 하면 <source_structure>의 값이 해당 컴포넌트(즉, <target_structure>의 동일한 이름 있는 컴포넌트)에 지정됩니다. 다음 사항을 유념하십시오.

  • 필드 이름이 동일해야 합니다.
  • 두 구조에서 컴포넌트의 위치 또는 순서가 반드시 같을 필요는 없습니다.
  • 필드의 유형이 다르면 ABAP에서는 사전 정의된 규칙 세트에 따라 유형 변환을 시도합니다.

예제의 CORRESPONDING 식은 st_connection_nested 유형의 구조를 생성합니다. connection 구조에서 이름이 같은 컴포넌트의 ​​값이 이 구조에 지정됩니다. 다른 모든 컴포넌트는 초기 상태로 유지됩니다. 이렇게 구성된 구조는 connection_nested 구조에 지정됩니다. 이렇게 하면 message 구성요소에 initial​초기 값이 지정됩니다.

사용해 보기: 구조화 데이터 오브젝트에 액세스

  1. 이 과정의 첫 번째 연습문제와 마찬가지로 인터페이스 IF_OO_ADT_CLASSRUN을 구현하는 신규 전역 클래스를 생성합니다.
  2. 다음 코드 스니핏을 if_oo_adt_classrun~main( ) 메소드의 구현 부분에 복사합니다.
    Code Snippet
    12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
    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. TYPES: BEGIN OF st_connection_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_connection_nested. DATA connection TYPE st_connection. DATA connection_nested TYPE st_Connection_nested. * Example 1: Access to structure components ********************************************************************** connection-airport_from_id = 'ABC'. connection-airport_to_id = 'XYZ'. connection-carrier_name = 'My Airline'. "Access to sub-components of nested structure connection_nested-message-msgty = 'E'. connection_nested-message-msgid = 'ABC'. connection_nested-message-msgno = '123'. * Example 2: Filling a structure with VALUE #( ). ********************************************************************** CLEAR connection. connection = VALUE #( airport_from_id = 'ABC' airport_to_id = 'XYZ' carrier_name = 'My Airline' ). " Nested VALUE to fill nested structure connection_nested = VALUE #( airport_from_id = 'ABC' airport_to_id = 'XYZ' message = VALUE #( msgty = 'E' msgid = 'ABC' msgno = '123' ) carrier_name = 'My Airline' ). * Example 3: Wrong result after direct assignment ********************************************************************** connection_nested = connection. out->write( `-------------------------------------------------------------` ). out->write( `Example 3: Wrong Result after direct assignment` ). out->write( data = connection name = `Source Structure:`). out->write( |Component connection_nested-message-msgid: { connection_nested-message-msgid }| ). out->write( |Component connection_nested-carrier_name : { connection_nested-carrier_name }| ). * Example 4: Assigning Structures using CORRESPONDING #( ) ********************************************************************** CLEAR connection_nested. connection_nested = CORRESPONDING #( connection ). " out->write( `-------------------------------------------------------------` ). out->write( `Example 4: Correct Result after assignment with CORRESPONDING` ). out->write( data = connection name = `Source Structure:`). out->write( |Component connection_nested-message-msgid: { connection_nested-message-msgid }| ). out->write( |Component connection_nested-carrier_name : { connection_nested-carrier_name }| ).
  3. CTRL + F3 을 눌러 클래스를 활성화하고 F9 를 눌러 콘솔 앱을 실행합니다.
  4. 콘솔 출력을 분석합니다. 프로그램을 디버그하고 소스 코드를 사용하여 개념을 숙지합니다.

ABAP SQL의 구조화 데이터 오브젝트

SELECT 문의 INTO 절은 구조의 컴포넌트 수와 유형이 FIELDS 절에 지정된 열의 수 및 유형과 일치하는 경우에만 올바르게 작동합니다. 위의 예에서 명령문은 대상 구조 연결에 FIELDS 절에 나열된 DepartureAirport, DestinationAirport, \_Airline-Name 열과 유형과 길이가 같은 세 개의 컴포넌트가 있는 경우에만 작동합니다. 이 경우 이름이 동일하지 않아도 됩니다. 대상 구조가 왼쪽에서 오른쪽으로 채워집니다.

FIELDS 절의 필드 리스트가 INTO 절의 구조 또는 테이블 라인 유형과 일치하지 않으면 런타임 오류가 발생합니다.

이 예에서는 대상 구조가 필드 선택과 일치하는지 확인하는 간단한 기법을 보여 줍니다.

  • 대상 구조는 FROM 절의 데이터 소스인 CDS 뷰 /DMO/I_Connection 으로 유형이 지정됩니다.
  • 키워드 FIELDS 뒤의 별표 기호(*)는 뷰의 모든 필드가 필드 선택의 일부인지 확인하기 위한 짧은 표기법입니다. 노출된 연관 관계는 무시됩니다.

노트

데이터베이스 테이블에서 직접 읽을 때도 이 기법을 사용할 수 있습니다. CDS 뷰 정의와 마찬가지로 데이터베이스 테이블 정의도 ABAP에서 전역 구조 유형으로 사용할 수 있습니다.

이 기법의 가장 큰 장점은 사용자 또는 다른 사용자가 CDS 뷰 또는 데이터베이스 테이블을 변경하더라도 SELECT 문이 구문을 그대로 유지한다는 것입니다. 가장 중요한 단점은 실제로 필요하든 필요 없든 데이터베이스의 모든 필드를 항상 읽는다는 것입니다.

노트

필드가 적은 뷰와 테이블에 대해서만 그리고 실제로 모든 필드가 필요한 경우에만 이 기법을 사용합니다. 불필요한 데이터베이스 데이터 읽기는 성능 문제의 주요 원인입니다.

구문 오류를 방지하는 또 다른 방법은 변형 INTO CORRESPONDING FIELDS입니다. 이 변형은 이전에 학습한 CORRESPONDING #( ) 연산자와 동일한 효과가 있습니다. 이름이 동일한 컴포넌트 간에 데이터가 복사되도록 합니다. 필요에 따라 구조 유형을 정의하여 필요한 데이터만 읽도록 할 수 있습니다.

이 경우에도 이름만 동일하면 됩니다. 그러나 문제를 방지하려면 동일한 이름의 컴포넌트에 호환 가능한 유형이 있는지 확인해야 합니다. 그렇지 않으면 시스템에서 소스 필드의 내용을 대상 필드의 유형으로 변환하려고 시도합니다. 이로 인해 데이터 손실 또는 (캐치 가능) 런타임 오류가 발생할 수 있습니다.

데이터 소스의 필드 이름과 대상 구조의 컴포넌트 이름이 일치하지 않으면 FIELDS * 및 INTO CORRESPONDING FIELDS OF의 조합이 작동하지 않습니다.

변형 INTO CORRESPONDING FIELDS OF를 유지하려면 필드 리스트에서 선택한 필드의 별칭 이름을 정의할 수 있습니다. 이를 위해 필드 이름 뒤에 추가 요소 AS를 추가하고 그 뒤에 별칭 이름을 추가합니다. 이 예에서 뷰 필드 DepartureAirport 의 별칭 이름은 airport_from_id 이고 경로 표현식 \_Airline-Name 의 별칭 이름은 carrier_name 입니다. 이 별칭 이름에 따라 INTO CORRESPONDING FIELDS OF는 검색된 데이터를 저장할 구조 컴포넌트를 정확하게 식별합니다.

필드 선택과 대상 구조 간의 충돌을 방지하는 가장 간단한 기법은 INTO 절의 인라인 선언입니다. 인라인 선언 구조의 시퀀스, 유형 및 이름은 FIELDS 절에서 파생됩니다. 따라서 대상 구조는 항상 필드 선택에 적합합니다.

노트

인라인 선언은 INTO 이후에만 지원됩니다. INTO CORRESPONDING FIELDS OF 뒤에는 인라인 선언을 사용할 수 없습니다.

이 예에서는 필드 DepartureAirport 에 대한 별칭이 없습니다. 필드 이름은 구조 connection_inline에서 컴포넌트 이름으로 사용됩니다. DestinationAirport 필드뿐만 아니라 경로식\_Airline-Name에도 선택적 별칭 이름(ArrivalAirportAirlineName)이 있습니다. 여기서 별칭 이름이 컴포넌트 이름으로 사용됩니다.

관계형 데이터베이스를 사용할 때는 서로 다른 데이터베이스 테이블에서 관련 데이터를 읽어야 하는 문제가 자주 발생합니다. CDS 뷰의 연관 관계가 이 태스크를 수행하는 우아한 방법임을 이미 배웠습니다.

적절한 연관 관계가 있는 CDS 뷰가 없으면 대신 SQL 조인을 구현할 수 있습니다. 위의 예는 조인 원칙을 보여줍니다.

우리는 항공편 연결과 그들이 서로 연결하는 공항에 관심이 있습니다. 공항의 3자리 ID는 데이터베이스 테이블 /DMO/CONNECTION에서 찾을 수 있습니다. 공항의 전체 이름은 데이터베이스 테이블 /DMO/AIRPORT에 저장됩니다.

출발 공항 이름과의 연결을 검색하려면 하나의 SELECT 문에서 DB 테이블 /DMO/CONNECTION의 연결 데이터를 읽고 DB 테이블 /DMO/AIRPORT와 결합합니다.

조인은 다음과 같은 빌딩 블록으로 구성됩니다.

데이터 소스
서로 조인할 데이터베이스 테이블 및 뷰 단일 조인은 항상 왼쪽 데이터 소스를 오른쪽 데이터 소스와 결합합니다. 위의 예에서 /DMO/CONNECTION 테이블은 왼쪽 데이터 소스이고 /DMO/AIRPORT 테이블은 오른쪽 데이터 소스입니다. ABAP SQL은 조인(중첩 조인)의 조인도 지원합니다.
조인 조건
조인 조건은 오른쪽 데이터 소스의 레코드가 왼쪽 데이터 소스의 레코드에 속하는지 지정합니다. 위의 예에서 관련 출발 공항은 CLIENT 및 AIRPORT_ID 열의 값으로 식별됩니다. 조인 조건의 내용은 다음과 같습니다.
/DMO/CONNECTION~CLIENT = /DMO/AIRPORT~CLIENT
AND
/DMO/CONNECTION~AIRPORT_FROM_ID = /DMO/AIRPORT~AIRPORT_ID
조인 유형
데이터 소스 중 하나에 일치하는 레코드가 없는 경우 조인 유형이 결과에 영향을 미칩니다. ABAP SQL은 현재 INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, CROSS JOIN을 지원합니다. 가장 일반적인 조인 유형은 LEFT OUTER JOIN입니다.

이 그림에는 조인에 사용되는 ABAP SQL 구문이 나와 있습니다. FROM 절에서 조인 유형은 왼쪽 데이터 소스 /dmo/connection과 오른쪽 데이터 소스 /dmo/airport 사이의 키워드 LEFT OUTER JOIN에 의해 지정됩니다. 구문은 데이터 소스에 별칭 이름 c 와 f 를 도입합니다. 데이터 소스가 조인에 두 번 이상 나타나지 않는 한 데이터 소스의 별칭 이름은 선택사항입니다.

조인 조건은 키워드 ON을 따릅니다. 데이터 소스 또는 별칭과 필드 사이의 구분 기호는 물결표(~)입니다.

노트

ABAP SQL에서는 클라이언트 필드를 언급할 필요가 없습니다. 명령문이 데이터베이스로 전송되기 전에 데이터베이스 인터페이스에 의해 조인 조건에 추가됩니다. FROM 절에 조인이 정의되어 있으면 FIELDS 절과 WHERE 절의 두 데이터 소스 모두에서 필드를 사용할 수 있습니다.

이 예에서 SELECT 문은 출발 공항 이름뿐만 아니라 도착 공항 이름도 읽습니다. 이를 위해 FROM 절은 중첩 조인을 정의합니다.

첫 번째 조인은 테이블 /dmo/connection 및 /dmo/airport의 왼쪽 외부 조인이며 오른쪽 데이터 소스에 별칭 "f"(예: "from")를 도입합니다. 이 첫 번째 조인은 테이블 /dmo/airport가 오른쪽 데이터 소스로 있는 두 번째 왼쪽 외부 조인의 왼쪽 데이터 소스로 사용됩니다. 이 경우 별칭 "t"("to"의 경우)는 테이블 /dmo/airport의 이 모양을 이전 것과 구별하는 데 중요합니다.

FIELDS 절에는 두 데이터 소스의 공항 이름이 나열되며, 서로 구별하기 위해 airport_from_name 과 airport_to_name 이라는 별칭을 사용합니다.

힌트

첫 번째 조인 주변의 괄호는 선택사항입니다. 이 필드를 생략하면 FROM 절의 조인이 왼쪽에서 오른쪽으로 평가됩니다.

사용해 보기: ABAP SQL의 구조화 데이터 오브젝트

  1. 이 과정의 첫 번째 연습문제와 마찬가지로 인터페이스 IF_OO_ADT_CLASSRUN을 구현하는 신규 전역 클래스를 생성합니다.
  2. 다음 코드 스니핏을 if_oo_adt_classrun~main( ) 메소드의 구현 부분에 복사합니다.
    Code Snippet
    123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
    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. TYPES: BEGIN OF st_connection_short, DepartureAirport TYPE /dmo/airport_from_id, DestinationAirport TYPE /dmo/airport_to_id, END OF st_connection_short. DATA connection TYPE st_connection. DATA connection_short TYPE st_connection_short. DATA connection_full TYPE /DMO/I_Connection. * Example 1: Correspondence between FIELDS and INTO ********************************************************************** SELECT SINGLE FROM /DMO/I_Connection FIELDS DepartureAirport, DestinationAirport, \_Airline-Name WHERE AirlineID = 'LH' AND ConnectionID = '0400' INTO @connection. out->write( `------------------------------` ). out->write( `Example 1: Field List and INTO` ). out->write( connection ). * Example 2: FIELDS * ********************************************************************** SELECT SINGLE FROM /DMO/I_Connection FIELDS * WHERE AirlineID = 'LH' AND ConnectionID = '0400' INTO @connection_full. out->write( `----------------------------` ). out->write( `Example 2: FIELDS * and INTO` ). out->write( connection_full ). * Example 3: INTO CORRESPONDING FIELDS ********************************************************************** SELECT SINGLE FROM /DMO/I_Connection FIELDS * WHERE AirlineID = 'LH' AND ConnectionID = '0400' INTO CORRESPONDING FIELDS OF @connection_short. out->write( `----------------------------------------------------` ). out->write( `Example 3: FIELDS * and INTO CORRESPONDING FIELDS OF` ). out->write( connection_short ). * Example 4: Alias Names for Fields ********************************************************************** CLEAR connection. SELECT SINGLE FROM /DMO/I_Connection FIELDS DepartureAirport AS airport_from_id, \_Airline-Name AS carrier_name WHERE AirlineID = 'LH' AND ConnectionID = '0400' INTO CORRESPONDING FIELDS OF @connection. out->write( `---------------------------------------------------` ). out->write( `Example 4: Aliases and INTO CORRESPONDING FIELDS OF` ). out->write( connection ). * Example 5: Inline Declaration ********************************************************************** SELECT SINGLE FROM /DMO/I_Connection FIELDS DepartureAirport, DestinationAirport AS ArrivalAirport, \_Airline-Name AS carrier_name WHERE AirlineID = 'LH' AND ConnectionID = '0400' INTO @DATA(connection_inline). out->write( `-----------------------------------------` ). out->write( `Example 5: Aliases and Inline Declaration` ). out->write( connection_inline ). * Example 6: Joins ********************************************************************** SELECT SINGLE FROM ( /dmo/connection AS c LEFT OUTER JOIN /dmo/airport AS f ON c~airport_from_id = f~airport_id ) LEFT OUTER JOIN /dmo/airport AS t ON c~airport_to_id = t~airport_id FIELDS c~airport_from_id, c~airport_to_id, f~name AS airport_from_name, t~name AS airport_to_name WHERE c~carrier_id = 'LH' AND c~connection_id = '0400' INTO @DATA(connection_join). out->write( `------------------------------------------` ). out->write( `Example 6: Join of Connection and Airports` ). out->write( connection_join ).
  3. CTRL + F3 을 눌러 클래스를 활성화하고 F9 를 눌러 콘솔 앱을 실행합니다.
  4. 콘솔 출력을 분석합니다. 프로그램을 디버그하고 소스 코드를 사용하여 개념을 숙지합니다.

구조화 데이터 오브젝트 사용

이번 연습문제에서는 구조화된 특성을 선언하고 SELECT 문을 사용하여 특성을 채운 다음 구조 컴포넌트에 액세스합니다.

템플릿:

  • /LRN/CL_S4D400_DBS_CDS(전역 클래스)

솔루션:

  • /LRN/CL_S4D400_STS_STRUCTURE(전역 클래스)

태스크 1: 템플릿 복사

템플릿 클래스를 복사합니다. 또는 이전 연습문제의 솔루션을 복사합니다.

단계

  1. 클래스 /LRN/CL_S4D400_DBS_CDS 를 사용자의 패키지에 포함된 클래스에 복사합니다(제안 이름: ZCL_##_STRUCTURE, ##은 그룹 번호).

    1. 전역 클래스 /LRN/CL_S4D400_DBS_CDS의 소스 코드를 엽니다.

    2. 프로젝트 탐색기 뷰를 편집기와 연결합니다.

    3. 프로젝트 탐색기 뷰에서 클래스 /LRN/CL_S4D400_DBS_CDS 를 마우스 오른쪽 버튼으로 클릭하여 단축 메뉴를 엽니다.

    4. 단축 메뉴에서 Duplicate .... 를 선택합니다.

    5. 패키지 필드에 패키지 이름을 입력합니다. 이름 필드에 이름 ZCL_##_STRUCTURE 를 입력합니다. 여기서 ##은 그룹 번호입니다.

    6. 내역을 조정하고 다음 을 선택합니다.

    7. 전송 요청을 확인하고 Finish를 선택합니다.

태스크 2: 구조화 데이터 오브젝트 선언

로컬 클래스에서 구조화된 특성 세부사항을 선언하여 스칼라 특성 airport_from_id, airport_to_idcarrier_name 을 대체합니다. 먼저 로컬 클래스 안에 private 구조 유형 st_details 를 정의합니다.

단계

  1. 로컬 클래스 lcl_connection 으로 전환합니다.

    1. 전역 클래스에서 로컬 유형 을 선택합니다.

  2. 다음 컴포넌트를 사용하여 private 구조 유형 st_details 를 정의합니다.

    구조 유형 st_details의 컴포넌트:

    컴포넌트 이름데이터 유형
    출발 공항/dmo/airport_from_id
    도착 공항/dmo/airport_to_id
    AirlineName/dmo/carrier_name
    1. 라인 PRIVATE SECTION. 뒤에 다음 코드를 추가합니다.

      Code Snippet
      12345678
      TYPES: BEGIN OF st_details, DepartureAirport TYPE /dmo/airport_from_id, DestinationAirport TYPE /dmo/airport_to_id, AirlineName TYPE /dmo/carrier_name, END OF st_details.
  3. 특성 airport_from_id,airport_to_idcarrier_name 의 선언을 주석하거나 제거합니다.

    1. 3개의 DATA 문이 있는 라인을 선택합니다.

    2. Ctrl + < 를 눌러 선택한 각 라인 앞에 별표 기호(*)를 추가합니다.

  4. 신규 개인 인스턴스 특성 세부사항을 선언하고 구조 유형 st_details 로 유형을 지정합니다.

    1. 코드를 다음과 같이 조정합니다.

      Code Snippet
      123456789
      * DATA airport_from_id TYPE /dmo/airport_from_id. * DATA airport_to_id TYPE /dmo/airport_to_id. * * DATA carrier_name TYPE /dmo/carrier_name. DATA details TYPE st_details.

태스크 3: 액세스 구조 컴포넌트

메소드 get_output 에서 구조화 특성 세부사항의 컴포넌트를 사용합니다.

단계

  1. get_output 메소드의 구현을 조정합니다. 특성 airport_from_id, airport_to_id, carrier_name 에 대한 모든 액세스를 특성 세부사항의 해당 컴포넌트로 바꿉니다.

    힌트

    컴포넌트 이름을 수동으로 입력하지 마십시오. 구조 컴포넌트 선택(-)을 입력한 후 Ctrl + Space 를 누르면 모든 컴포넌트의 리스트가 표시됩니다.
    1. get_output 메소드의 구현으로 이동합니다.

    2. APPEND 문을 다음과 같이 조정합니다.

      Code Snippet
      12345678910111213
      * APPEND |--------------------------------| TO r_output. * APPEND |Carrier: { carrier_id } { carrier_name }| TO r_output. * APPEND |Connection: { connection_id }| TO r_output. * APPEND |Departure: { airport_from_id }| TO r_output. * APPEND |Destination: { airport_to_id }| TO r_output. APPEND |--------------------------------| TO r_output. APPEND |Carrier: { carrier_id } { details-airlinename }| TO r_output. APPEND |Connection: { connection_id }| TO r_output. APPEND |Departure: { details-departureairport }| TO r_output. APPEND |Destination: { details-destinationairport }| TO r_output.

태스크 4: SELECT 문에 구조화된 특성 입력

생성자 메소드에서 구조화 특성을 SELECT 문의 대상으로 사용합니다.

단계

  1. 생성자 메소드 구현에서 SELECT 문을 조정합니다. INTO 절의 데이터 오브젝트 리스트를 구조화된 특성 세부사항으로 바꿉니다.

    1. 메소드 생성자 구현으로 이동합니다.

    2. SELECT 문을 다음과 같이 조정합니다.

      Code Snippet
      123456789
      SELECT SINGLE FROM /DMO/I_Connection FIELDS DepartureAirport, DestinationAirport, \_Airline-Name WHERE AirlineID = @i_carrier_id AND ConnectionID = @i_connection_id * INTO ( @airport_from_id, @airport_to_id, @carrier_name ). INTO @details.
  2. 선택사항: 구문 변형 INTO CORRESPONDING FIELDS OF @details. 사용합니다.

    1. SELECT 문에서 INTO @details.를 다음 코드로 바꿉니다.

      Code Snippet
      123
        INTO CORRESPONDING FIELDS OF @details.
    2. 경로식에 별칭 이름 AirlineName 을 추가합니다.

    3. 이제 SELECT 문은 다음과 같아야 합니다.

      Code Snippet
      12345678
      SELECT SINGLE FROM /DMO/I_Connection FIELDS DepartureAirport, DestinationAirport, \_Airline-Name as AirlineName WHERE AirlineID = @i_carrier_id AND ConnectionID = @i_connection_id INTO CORRESPONDING FIELDS OF @details.
  3. 클래스를 활성화합니다. 이를 실행하고 콘솔 출력을 분석합니다. 출력에 모든 특성에 대한 데이터가 표시되는지 확인합니다.

    1. Ctrl + F3 을 눌러 클래스를 활성화합니다.

    2. F9 를 눌러 클래스를 실행합니다.