ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AMDP OPTIONS CDS SESSION CLIENT CURRENT - MANDT 처리 정리
    SAP 2026. 6. 23. 21:43

    amdp_mandt_client_options.html
    0.03MB
    amdp_mandt_client_options.pdf
    0.12MB

     

     

    AMDP OPTIONS CDS SESSION CLIENT CURRENT - MANDT 처리 완전 정리

    AMDP OPTIONS CDS SESSION CLIENT CURRENT
    MANDT 처리 완전 정리

    DB 테이블 / CDS View 구분에 따른 MANDT 처리 방법 & SELECT · INSERT · UPDATE · DELETE · MERGE 샘플

    1. ABAP vs AMDP — 클라이언트 자동 적용 여부

    ABAP 오픈 SQL은 현재 로그온 클라이언트를 자동으로 적용하지만, AMDP(SQLScript)는 HANA DB 레이어에서 직접 실행되므로 MANDT를 명시하지 않으면 전체 클라이언트 데이터가 조회된다.

    구분 클라이언트 자동 적용 비고
    ABAP SELECT 자동 현재 sy-mandt 자동 필터
    AMDP SELECT
    (DB 테이블)
    직접 필수 USING 선언, OPTIONS 유무 무관하게 전체 클라이언트 조회됨
    AMDP SELECT
    (CDS View)
    자동 OPTIONS CDS SESSION CLIENT CURRENT 선언 시 클라이언트 처리 보장
    흔한 오해 : USING 절에 테이블을 선언하거나 OPTIONS를 지정하면 DB 테이블 SELECT 시 MANDT가 자동 필터될 것으로 기대하는 경우가 있다.
    AMDP에서 DB 테이블 조회 시 MANDT는 항상 직접 명시해야 한다.

    2. OPTIONS CDS SESSION CLIENT CURRENT 란?

    AMDP에서 CDS View를 USING으로 사용할 때 클라이언트 처리를 보장하기 위한 선언이다. CDS View는 MANDT 컬럼을 노출하지 않고 CDS 레이어에서 클라이언트를 처리하는데, AMDP에서 이 처리를 올바르게 연동하려면 해당 옵션이 필요하다.

    USING 대상 OPTIONS CDS SESSION CLIENT CURRENT MANDT 처리
    DB 테이블
    (Client-Dependent)
    불필요 WHERE mandt = session_context('CLIENT') 직접 명시
    CDS View
    (MANDT 컬럼 없음)
    필요 OPTIONS 선언으로 클라이언트 처리 위임
    DB 테이블
    (Client-Independent)
    불필요 MANDT 컬럼 자체가 없음
    💡 MANDT 값 참조 함수 : session_context('CLIENT')
    session_context('CDS_CLIENT'), session_context('SAP_CLIENT') 등은 잘못된 키다. 반드시 'CLIENT' 를 사용할 것.

    3. OPTIONS 선언 위치 — 정의부 vs 구현부

    구현부 OPTIONS에서는 CDS SESSION CLIENT CURRENT 사용 불가
    구현부 OPTIONS 절에는 READ-ONLY 또는 DETERMINISTIC만 허용된다.
    CDS SESSION CLIENT CURRENT는 반드시 정의부 AMDP OPTIONS에 선언해야 한다.
    ✅ 정의부 — AMDP OPTIONS (올바른 방식)
    CLASS zcl_amdp_sample DEFINITION
      PUBLIC FINAL CREATE PUBLIC.
    
      PUBLIC SECTION.
        INTERFACES if_amdp_marker_hdb.
    
        " CDS SESSION CLIENT CURRENT →
        " 정의부 AMDP OPTIONS에만 선언 가능
        CLASS-METHODS get_cds_data
          AMDP OPTIONS CDS SESSION CLIENT CURRENT
          IMPORTING VALUE(iv_bukrs) TYPE bukrs
          RAISING   cx_amdp_error.
    
    ENDCLASS.
    
    CLASS zcl_amdp_sample IMPLEMENTATION.
    
      " 구현부에서는 OPTIONS 생략
      METHOD get_cds_data
        BY DATABASE PROCEDURE
        FOR HDB
        LANGUAGE SQLSCRIPT
        USING zi_fi_document.   " CDS View
    
        lt_result = SELECT bukrs, belnr, dmbtr
                      FROM zi_fi_document
                     WHERE bukrs = :iv_bukrs;
    
      END METHOD.
    
    ENDCLASS.
    ❌ 구현부 OPTIONS — 오류 발생
    CLASS zcl_amdp_sample IMPLEMENTATION.
    
      " 구현부 OPTIONS에 CDS SESSION 선언 시
      " "READ-ONLY or DETERMINISTIC
      "  expected after OPTIONS" 오류 발생
      METHOD get_cds_data
        BY DATABASE PROCEDURE
        FOR HDB
        LANGUAGE SQLSCRIPT
        OPTIONS CDS SESSION CLIENT CURRENT  " ❌ 오류
        USING zi_fi_document.
    
        ...
    
      END METHOD.
    
    ENDCLASS.

    구현부 OPTIONS에서 사용 가능한 키워드

    키워드 정의부 AMDP OPTIONS 구현부 OPTIONS 용도
    CDS SESSION CLIENT CURRENT ✅ 가능 ❌ 불가 CDS View 사용 시 클라이언트 처리 보장
    READ-ONLY ✅ 가능 ✅ 가능 SELECT 전용, DML 불가
    DETERMINISTIC ✅ 가능 ✅ 가능 동일 입력 시 동일 결과 보장

    4. DML별 MANDT 처리 요약표

    DB 테이블과 CDS View를 구분하여 정리한다.

    DB 테이블 사용 시 (Client-Dependent)

    DML MANDT 처리 비고
    SELECT 직접 필수 WHERE mandt = session_context('CLIENT')
    INSERT 직접 필수 VALUES (session_context('CLIENT'), ...)
    UPDATE 직접 필수 WHERE mandt = session_context('CLIENT')
    DELETE 직접 필수 WHERE mandt = session_context('CLIENT')
    MERGE
    ON / MATCHED
    직접 필수 ON 절에 tgt.mandt = session_context('CLIENT') 포함
    MERGE
    NOT MATCHED
    직접 필수 INSERT VALUES에 session_context('CLIENT') 삽입

    CDS View 사용 시 (OPTIONS CDS SESSION CLIENT CURRENT 선언)

    DML MANDT 처리 비고
    SELECT 자동 CDS View에 MANDT 컬럼 없음. OPTIONS가 클라이언트 처리 보장.
    INSERT / UPDATE
    DELETE / MERGE
    해당없음 CDS View는 일반적으로 읽기 전용. DML 대상은 DB 테이블 사용.
    ⚠️ DB 테이블과 CDS View를 혼용하는 경우, DB 테이블에는 session_context('CLIENT') 직접 명시하고 CDS View에는 OPTIONS 선언으로 처리한다.

    5. SELECT 샘플

    DB 테이블 — MANDT 직접 명시 필수

    ❌ 잘못된 방식 — 전체 클라이언트 조회됨
    -- MANDT 조건 없으면 모든 클라이언트 데이터 조회
    lt_data = SELECT * FROM ztable_src
               WHERE bukrs = :iv_bukrs;
    ✅ 올바른 방식 — MANDT 직접 명시
    -- MANDT 조건 반드시 포함
    lt_data = SELECT * FROM ztable_src
               WHERE mandt = session_context('CLIENT')
                 AND bukrs = :iv_bukrs;

    CDS View — OPTIONS 선언으로 자동 처리

    " 정의부에 AMDP OPTIONS 선언
    CLASS-METHODS get_fi_data
      AMDP OPTIONS CDS SESSION CLIENT CURRENT
      IMPORTING VALUE(iv_bukrs) TYPE bukrs
      RAISING   cx_amdp_error.
    -- CDS View: MANDT 컬럼 없음, OPTIONS가 클라이언트 자동 처리
    lt_data = SELECT bukrs, belnr, gjahr, dmbtr
                FROM zi_fi_document          -- CDS View
               WHERE bukrs = :iv_bukrs;

    6. INSERT 샘플 (DB 테이블)

    💡 OPTIONS 유무, DB 테이블 / CDS View 구분 무관하게 INSERT 시에는 항상 session_context('CLIENT')를 직접 삽입해야 한다.
    -- VALUES 방식
    INSERT INTO ztable_tgt
      (mandt, bukrs, belnr, gjahr, dmbtr)
    VALUES
      ( session_context('CLIENT'),   -- ⚠️ 필수
        '1000', '0000001', '2024', 100.00 );
    
    -- SELECT 결과로 INSERT
    INSERT INTO ztable_tgt
      (mandt, bukrs, belnr, gjahr, dmbtr)
    SELECT session_context('CLIENT'),  -- ⚠️ 필수
           bukrs, belnr, gjahr, dmbtr
      FROM :lt_src;

    7. UPDATE 샘플 (DB 테이블)

    UPDATE ztable_tgt
       SET dmbtr = :iv_dmbtr,
           waers = :iv_waers
     WHERE mandt  = session_context('CLIENT')   -- ⚠️ 필수
       AND bukrs  = '1000'
       AND belnr  = '0000001'
       AND gjahr  = '2024';

    8. DELETE 샘플 (DB 테이블)

    DELETE FROM ztable_tgt
     WHERE mandt = session_context('CLIENT')    -- ⚠️ 필수
       AND bukrs = '1000'
       AND belnr = '0000001'
       AND gjahr = '2024';

    9. MERGE 샘플 (DB 테이블)

    MERGE INTO ztable_tgt AS tgt
    USING (
      -- SOURCE: MANDT 조건 직접 포함
      SELECT bukrs, belnr, gjahr, dmbtr, waers
        FROM ztable_src
       WHERE mandt = session_context('CLIENT')    -- ⚠️ 필수
         AND bukrs = :iv_bukrs
    ) AS src
    ON (
      -- ON 조건: MANDT 직접 포함
      tgt.mandt = session_context('CLIENT')       -- ⚠️ 필수
      AND tgt.bukrs = src.bukrs
      AND tgt.belnr = src.belnr
      AND tgt.gjahr = src.gjahr
    )
    WHEN MATCHED THEN
      UPDATE SET
        tgt.dmbtr = src.dmbtr,
        tgt.waers = src.waers
    WHEN NOT MATCHED THEN
      INSERT (mandt, bukrs, belnr, gjahr, dmbtr, waers)
      VALUES (
        session_context('CLIENT'),                -- ⚠️ 필수
        src.bukrs, src.belnr, src.gjahr,
        src.dmbtr, src.waers
      );

    10. 완성 AMDP 예제

    DB 테이블 사용 — MANDT 전체 직접 명시

    CLASS zcl_amdp_dbtab_sample DEFINITION
      PUBLIC FINAL CREATE PUBLIC.
    
      PUBLIC SECTION.
        INTERFACES if_amdp_marker_hdb.
    
        " DB 테이블 사용 → AMDP OPTIONS 불필요
        CLASS-METHODS upsert_data
          IMPORTING VALUE(iv_bukrs) TYPE bukrs
          RAISING   cx_amdp_error.
    
    ENDCLASS.
    
    CLASS zcl_amdp_dbtab_sample IMPLEMENTATION.
    
      METHOD upsert_data
        BY DATABASE PROCEDURE
        FOR HDB
        LANGUAGE SQLSCRIPT
        USING ztable_src
              ztable_tgt.
    
        DECLARE lv_client NVARCHAR(3);
        lv_client := session_context('CLIENT');
    
        -- SELECT: MANDT 직접 명시 필수
        lt_src = SELECT bukrs, belnr, gjahr, dmbtr, waers
                   FROM ztable_src
                  WHERE mandt = :lv_client        -- ⚠️ 필수
                    AND bukrs = :iv_bukrs;
    
        -- MERGE: ON절 + NOT MATCHED INSERT 모두 MANDT 직접
        MERGE INTO ztable_tgt AS tgt
        USING :lt_src AS src
        ON (
          tgt.mandt = :lv_client                 -- ⚠️ 필수
          AND tgt.bukrs = src.bukrs
          AND tgt.belnr = src.belnr
          AND tgt.gjahr = src.gjahr
        )
        WHEN MATCHED THEN
          UPDATE SET
            tgt.dmbtr = src.dmbtr,
            tgt.waers = src.waers
        WHEN NOT MATCHED THEN
          INSERT (mandt, bukrs, belnr, gjahr, dmbtr, waers)
          VALUES (
            :lv_client,                          -- ⚠️ 필수
            src.bukrs, src.belnr, src.gjahr,
            src.dmbtr, src.waers
          );
    
        -- DELETE: MANDT 직접 명시 필수
        DELETE FROM ztable_tgt
         WHERE mandt = :lv_client               -- ⚠️ 필수
           AND gjahr < '2020'
           AND bukrs = :iv_bukrs;
    
      END METHOD.
    
    ENDCLASS.

    CDS View 사용 — 정의부 AMDP OPTIONS 선언

    CLASS zcl_amdp_cds_sample DEFINITION
      PUBLIC FINAL CREATE PUBLIC.
    
      PUBLIC SECTION.
        INTERFACES if_amdp_marker_hdb.
    
        " CDS View 사용 → 정의부에 AMDP OPTIONS 선언
        CLASS-METHODS get_fi_data
          AMDP OPTIONS CDS SESSION CLIENT CURRENT
          IMPORTING VALUE(iv_bukrs) TYPE bukrs
          RAISING   cx_amdp_error.
    
    ENDCLASS.
    
    CLASS zcl_amdp_cds_sample IMPLEMENTATION.
    
      " 구현부에는 OPTIONS 생략
      METHOD get_fi_data
        BY DATABASE PROCEDURE
        FOR HDB
        LANGUAGE SQLSCRIPT
        USING zi_fi_document.    " CDS View
    
        -- CDS View: MANDT 컬럼 없음, OPTIONS가 클라이언트 자동 처리
        lt_result = SELECT bukrs, belnr, gjahr, dmbtr
                      FROM zi_fi_document
                     WHERE bukrs = :iv_bukrs;
    
      END METHOD.
    
    ENDCLASS.

    11. READ-ONLY 와 함께 선언

    " READ-ONLY는 구현부 OPTIONS에 선언 가능
    METHOD get_data_readonly
      BY DATABASE PROCEDURE
      FOR HDB
      LANGUAGE SQLSCRIPT
      OPTIONS READ-ONLY          " ✅ 구현부 OPTIONS 가능
      USING ztable_src.
    
      -- SELECT만 가능, DML 불가
      lt_result = SELECT bukrs, belnr, dmbtr
                    FROM ztable_src
                   WHERE mandt = session_context('CLIENT')
                     AND bukrs = :iv_bukrs;
    
    END METHOD.
    OPTIONS 조합선언 위치가능 여부
    AMDP OPTIONS CDS SESSION CLIENT CURRENT 정의부
    OPTIONS READ-ONLY 구현부
    OPTIONS DETERMINISTIC 구현부
    OPTIONS CDS SESSION CLIENT CURRENT 구현부 ❌ 오류

    12. 주의사항 체크리스트

    항목설명
    DB 테이블 SELECT MANDT 필수 AMDP에서 DB 테이블 조회 시 MANDT 없으면 전체 클라이언트 데이터 조회됨
    MANDT 함수 키 확인 session_context('CLIENT') 만 사용. 'CDS_CLIENT', 'SAP_CLIENT' 는 잘못된 키
    CDS View vs DB 테이블 구분 CDS View → AMDP OPTIONS 정의부 선언. DB 테이블 → session_context('CLIENT') 직접 명시
    OPTIONS 선언 위치 CDS SESSION CLIENT CURRENT는 반드시 정의부 AMDP OPTIONS에 선언. 구현부 OPTIONS에 선언 시 오류
    INSERT MANDT 필수 DB 테이블 INSERT 시 항상 session_context('CLIENT') 직접 삽입
    MERGE ON절 MANDT 포함 DB 테이블 MERGE 시 ON절에 tgt.mandt = session_context('CLIENT') 반드시 포함
    lv_client 변수 활용 lv_client := session_context('CLIENT') 변수에 담아 반복 사용 권장
    ⚠️ 한 줄 요약
    AMDP에서 DB 테이블은 모든 DML에 MANDT 직접 명시.
    CDS View는 정의부 AMDP OPTIONS CDS SESSION CLIENT CURRENT 선언으로 클라이언트 처리 위임.
    #AMDP #SQLScript #MANDT #session_context #CDS_VIEW #OPTIONS_CDS_SESSION_CLIENT #READ_ONLY #MERGE #S4HANA #ABAP
Designed by Tistory.