엔티티 조작 언어 사용

Objective

After completing this lesson, you will be able to eML 문을 구현합니다.

엔티티 조작 언어(EML)

EML은 비즈니스 오브젝트의 데이터를 조작하는 데 사용할 수 있는 명령문으로 구성됩니다. READ ENTITIES 문을 사용하여 데이터를 읽습니다. 그 밖의 모든 연산에서는 UPDATE, CREATE 또는 DELETE 추가 요소와 함께 MODIFY ENTITIES 문을 사용합니다.

노트

비즈니스 오브젝트 인터페이스의 동작 정의에 해당 use create, use update 또는 use delete 지시가 포함된 경우에만 CREATE, UPDATE, DELETE 작업을 사용할 수 있습니다. 금지된 작업을 사용하려고 하면 구문 오류가 발생합니다.

비즈니스 오브젝트에서 데이터를 읽으려면 READ ENTITIES 문을 사용합니다. 명령문에는 두 가지 중요한 매개변수가 있습니다. 하나는 읽으려는 데이터 키가 포함된 내부 테이블이고 다른 하나는 쿼리 결과를 포함하고 있습니다.

이러한 내부 테이블에는 파생 동작 정의 유형이라고 하는 특수한 데이터 유형이 있습니다. 개발자가 동작 정의를 생성하고 비즈니스 오브젝트의 일부 또는 모든 필드와 함께 시스템에서 특정 요청을 처리하는 방법을 제어하는 추가 필드가 포함되면 시스템에서 자동으로 이를 생성합니다. DATA 문에서 새로운 추가 요소 TYPE TABLE FOR <operation>을(를) 사용하여 내부 테이블을 선언한다.

유형 TABLE FOR READ IMPORT에는 비즈니스 오브젝트의 키 필드 또는 필드가 포함되어 있다. %control 구조는 현재 작업에서 실제로 사용되는 비즈니스 오브젝트의 필드를 나타내는 생성된 구조입니다. 이 예에서는 구조가 자동으로 입력되므로 걱정할 필요가 없습니다.

유형TABLE FOR READ RESULT에는 비즈니스 오브젝트의 모든 필드가 포함됩니다. 이 테이블에는 Read 문이 실행된 후 결과 세트가 포함됩니다.

읽기 임포트 테이블에는 비즈니스 오브젝트의 각 키 필드(이 경우 agencyID)에 대한 열이 포함되어 있습니다. 특정 대행업체를 읽으려면 해당 키가 포함된 내부 테이블에 행을 추가합니다. 키 필드 또는 필드 외에 테이블에 %is_draft 열과 %control 열이 포함되어 있습니다. %is_draft를 사용하여 드래프트 데이터를 읽을지 아니면 활성 데이터를 읽을지 지정할 수 있습니다. %control 구조는 읽을 필드를 지정하는 데 사용됩니다.

노트

예시에서는 활성 데이터만 읽고 추가 요소 FIELDS 뒤의 필드 리스트를 기반으로 프레임워크에서 %control 구조를 채웁니다.

비즈니스 오브젝트를 처리할 때는 먼저 READ ENTITIES OF 또는 MODIFY ENTITIES OF 문을 사용하여 동작 정의의 이름을 지정해야 합니다. 이어서 키워드 ENTITY와 작업하려는 엔티티의 이름이 옵니다. 엔티티에 별칭 이름이 있는 경우 여기에서 사용해야 합니다.

노트

추가 요소 OF 뒤에 별칭 이름을 사용할 수 없습니다. 이는 기술적으로는 엔티티의 이름이 아니라 이 시점에 동작 정의 이름을 지정하기 때문입니다.

READ ENTITIES 문은 WITH 추가 요소에서 전달하는 키에 따라 비즈니스 오브젝트 데이터를 읽습니다. RESULT 추가 요소의 내부 테이블에 결과를 반환합니다. 명령문에서 필요한 비즈니스 오브젝트의 필드를 지정할 수도 있습니다. 이 예에서는 모든 필드를 반환하기 위해 ALL FIELDS 추가 요소를 사용했습니다. 그러나 필드의 하위 세트만 필요한 경우 FIELDS(field1field2 … ) 변형을 사용하여 읽는 데이터의 양을 제한할 수 있습니다.

노트

SELECT 문과 달리 필드 리스트는 쉼표로 구분되지 않습니다.

결과 테이블에는 제어 필드 %is_draft 와 함께 비즈니스 오브젝트의 모든 필드가 포함됩니다. READ ENTITIES 문에 ALL FIELDS 변형이 있으면 모든 필드의 값이 제공됩니다. FIELDS( f1fn ) 변형을 사용하면 요청한 필드만 채워집니다.

노트

키 필드는 FIELDS( f1fn ) 변형에 지정되지 않은 경우에도 항상 입력됩니다.

데이터를 업데이트하려면 TYPE TABLE FOR UPDATE을 사용하여 내부 테이블을 선언한다. 여기에는 비즈니스 오브젝트의 모든 필드와 %control 구조가 포함됩니다. MODIFY ENTITIES 문의 변형에서는 %control 구조가 자동으로 입력됩니다.

MODIFY ENTITIES 문은 트랜잭션 버퍼의 데이터를 업데이트합니다. FIELDS 추가 요소에서 변경할 필드를 지정합니다. WITH 추가 요소에서 업데이트할 데이터가 포함된 내부 테이블을 전달합니다.

비즈니스 오브젝트 외부에서 EML을 사용하는 경우 COMMIT ENTITIES 문을 사용하여 저장 순서를 트리거하고 데이터베이스에 데이터를 유지해야 합니다.

노트

이 과정의 후반부에서는 비즈니스 오브젝트의 동작 구현에서 EML을 사용합니다. 동작 구현 내에서는 COMMIT ENTITIES로 커밋을 트리거할 필요가 없으며 트리거할 수도 없습니다.

EML 문 구현 방법

EML을 사용하여 데이터 수정

이 연습문제에서는 EML을 사용하여 비즈니스 오브젝트 /DMO/R_AGENCYTP의 루트 엔티티에 대한 표준 작업 업데이트를 수행합니다. 이후의 불일치를 방지하기 위해 비즈니스 오브젝트에 직접 액세스하지 않고 릴리스된 안정적인 인터페이스 /DMO/I_AGENCYTP를 통해 액세스합니다.

템플릿:

  • 없음

솔루션:

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

태스크 1: 현재 데이터 분석

데이터 미리보기 툴을 사용하여 ID가 "0700##" 인 여행사의 현재 이름을 확인합니다. 여기서 ##은 그룹 번호입니다.

단계

  1. CDS 뷰 엔티티 /DMO/I_AgencyTP의 정의를 엽니다.

    1. 이전 연습문제에서 데이터 정의 /DMO/I_AGENCYTP가 여전히 열려 있는 경우 해당 탭으로 전환합니다. 그렇지 않은 경우 Ctrl + Shift + A 를 눌러 ABAP 개발 오브젝트를 엽니다.

  2. 데이터 미리보기 툴을 엽니다.

    1. 소스 코드의 아무 곳이나 마우스 오른쪽 버튼으로 클릭하여 단축 메뉴를 엽니다.

    2. 단축 메뉴에서 Open WithData Preview 를 선택합니다.

  3. ID가 "0700##" 인 여행사의 현재 이름을 확인합니다(## = 그룹 번호).

    1. 아래로 스크롤하여 AgencyID 열에서 값이 "0700##" 인 엔트리로 이동한 후 이름 열의 값을 기록합니다.

태스크 2: 전역 클래스 생성

패키지에 신규 ABAP 클래스를 생성합니다.

단계

  1. ZCL_##_EML 이라는 신규 ABAP 클래스를 생성합니다. 여기서 ##은 그룹 번호입니다. 클래스가 IF_OO_ADT_CLASSRUN 인터페이스를 구현하는지 확인합니다.

    1. 파일신규ABAP 클래스 를 선택합니다.

    2. 패키지 필드에 패키지 이름을 입력합니다. 이름 필드에 이름 ZCL_##_EML 을 입력합니다. 여기서 ## 은 그룹 번호입니다. 내역을 입력하십시오.

    3. 인터페이스 그룹 상자에서 추가 를 선택합니다.

    4. IF_OO_ADT_CLASSRUN 을 입력합니다. 인터페이스가 적중 리스트에 표시되면 더블 클릭하여 클래스 정의에 추가합니다.

    5. 다음을 선택합니다.

    6. 전송 요청을 선택하고 Finish 를 선택합니다.

태스크 3: 데이터 업데이트

EML 문을 구현하여 ID가 "0700##"(## = 그룹 번호)인 여행사 이름을 변경합니다.

단계

  1. IF_OO_ADT_CLASSRUN~MAIN 메소드에서 엔티티 /DMO/I_AgencyTP의 EML 업데이트에 대해 올바른 파생 유형(제안 이름: agencies_upd)을 사용하여 내부 테이블을 선언합니다.

    1. 다음 코드를 추가합니다.

      Code Snippet
      123
      DATA agencies_upd TYPE TABLE FOR UPDATE /DMO/I_AgencyTP.
  2. AGENCYID 열(##은 그룹 번호)의 값으로 "0700##"이 포함된 단일 라인과 NAME 열의 신규 값을 내부 테이블에 입력합니다.

    1. 데이터 선언 후에 다음 코드와 유사한 몇 가지 코드를 추가합니다.

      Code Snippet
      123
      agencies_upd = VALUE #( ( agencyid = '0700##' name = 'Some fancy new name' ) ).
  3. 비즈니스 오브젝트 인터페이스 /DMO/I_AgencyTP 에 대해 EML 문 MODIFY ENTITIES 를 구현합니다. 필드 NAME만 변경되도록 루트 엔티티의 데이터를 업데이트합니다.

    힌트

    인터페이스 동작은 루트 엔티티 /DMO/I_AgencyTP의 별칭 이름 /DMO/Agency 를 정의합니다.
    1. 메소드 끝에 다음 코드를 추가합니다.

      Code Snippet
      123456
      MODIFY ENTITIES OF /dmo/i_agencytp ENTITY /dmo/agency UPDATE FIELDS ( name ) WITH agencies_upd.
  4. 어플리케이션에서 볼 수 있는 결과를 얻으려면 out->write 메소드를 사용하여 콘솔에 텍스트 리터럴을 작성합니다.

    1. MODIFY ENTITIES 문 뒤에 다음 코드를 추가합니다.

      Code Snippet
      123
      out->write( `Method execution finished!` ).
  5. 클래스를 활성화하고 테스트합니다.

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

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

  6. 신규 이름이 데이터베이스에 기록되었는지 확인합니다.

    1. CDS 뷰 엔티티 /DMO/I_AgencyTP의 데이터 미리보기로 돌아갑니다.

    2. 데이터 미리보기 탭의 툴바에서 새로 고침 을 선택합니다.

  7. COMMIT ENTITIES 문을 코드에 추가하여 변경사항을 커밋합니다.

    1. 전역 클래스 ZCL_##_EML의IF_OO_ADT_CLASSRUN~MAIN 메소드로 돌아갑니다.

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

      Code Snippet
      123456789101112131415161718
      METHOD if_oo_adt_classrun~main. DATA agencies_upd TYPE TABLE FOR UPDATE /dmo/i_agencytp. agencies_upd = VALUE #( ( agencyid = '0700##' name = 'Some fancy new name' ) ). MODIFY ENTITIES OF /dmo/i_agencytp ENTITY /dmo/agency UPDATE FIELDS ( name ) WITH agencies_upd. COMMIT ENTITIES. out->write( `Method execution finished!` ). ENDMETHOD.
  8. 클래스를 다시 활성화하고 테스트합니다. 이제 변경사항이 데이터베이스에 있는지 확인합니다.

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

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

    3. CDS 뷰 엔티티 /DMO/I_AgencyTP의 데이터 미리보기로 돌아갑니다.

    4. 데이터 미리보기 탭의 툴바에서 새로 고침 을 선택합니다.