ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AMDP Table Function에서 MANDT는 꼭 필요한가? (Made by Claude.)
    SAP 2026. 5. 10. 22:03
    AMDP Table Function에서 MANDT는 꼭 필요한가?

    AMDP Table Function에서 MANDT는 꼭 필요한가?

    ABAP이 자동으로 처리해주던 클라이언트 필터,
    SQLScript에서는 개발자가 직접 챙겨야 합니다.


    📌 결론 먼저: S/4HANA On-Premise에서는 사실상 필수입니다.
    다만 이유를 이해하면 상황에 따라 생략 가능한 케이스도 있습니다.

    ① 왜 MANDT 필터가 필요한가?

    AMDP의 BY DATABASE FUNCTIONABAP 레이어를 완전히 우회하여 HANA에 직접 SQL을 실행합니다.

    일반 ABAP SELECT문은 런타임이 자동으로 MANDT = sy-mandt 조건을 추가해주지만, SQLScript에는 그런 자동 필터가 없습니다. 따라서 MANDT 컬럼이 있는 투명 테이블을 조회할 때 필터를 생략하면 전체 클라이언트의 데이터가 모두 반환됩니다.

    SQLScript — 올바른 예 vs 잘못된 예
    -- ✅ 올바른 방법: SESSION_CONTEXT('CLIENT') 로 클라이언트 고정
    WHERE mandt = SESSION_CONTEXT('CLIENT')
    
    -- ❌ 위험: MANDT 조건 없이 다른 필드만 필터
    WHERE bukrs = :iv_bukrs   -- 모든 client 데이터 혼합 반환됨
    핵심: ABAP이 대신 해주던 클라이언트 격리를 SQLScript에서는 개발자가 직접 명시해야 합니다.

    ② 예외적으로 생략 가능한 경우

    상황 MANDT 생략
    MANDT 컬럼이 없는 테이블 (Cluster Table, 일부 CDS View 등) ✓ 가능
    CTE 내부에서 이미 MANDT 필터된 결과를 재사용하는 경우 ✓ 중복 생략 가능
    단일 클라이언트만 운영하는 시스템 ⚠ 가능하나 비권장
    다중 클라이언트 운영 시스템 (대부분 On-Premise) ✗ 반드시 필요

    ③ JOIN 시 권장 패턴

    모든 테이블마다 MANDT 조건을 반복하기보다, 주 테이블 WHERE에 한 번 + JOIN ON 조건에 MANDT 포함하는 패턴이 깔끔합니다.

    SQLScript — 권장 JOIN 패턴
    FROM vbak AS h
    INNER JOIN vbap AS i
      ON  h.mandt = i.mandt    -- JOIN 조건에 MANDT 포함
      AND h.vbeln = i.vbeln
    WHERE h.mandt = SESSION_CONTEXT('CLIENT')  -- 주 테이블에 한 번만
      AND h.vkorg = :iv_vkorg

    CTE(WITH 절) 활용 시

    CTE를 사용하면 각 서브쿼리에서 한 번씩 필터하고, 이후 조합 단계에서는 생략 가능합니다.

    SQLScript — CTE + MANDT 패턴
    RETURN
      WITH
      base_orders AS (
        SELECT vbeln, kunnr, erdat, auart
          FROM vbak
          WHERE mandt = SESSION_CONTEXT('CLIENT')
            AND vkorg = :iv_vkorg
      ),
      order_items AS (
        SELECT vbeln, SUM(kwmeng) AS total_qty
          FROM vbap
          WHERE mandt = SESSION_CONTEXT('CLIENT')
          GROUP BY vbeln
      )
      SELECT o.vbeln, o.kunnr, i.total_qty
      FROM base_orders AS o
      INNER JOIN order_items AS i
        ON o.vbeln = i.vbeln;   -- 이미 필터된 CTE라 MANDT 불필요

    ④ Table Function 전체 예시

    ABAP — AMDP Table Function 전체 코드
    CLASS zcl_amdp_sales DEFINITION
      PUBLIC FINAL CREATE PUBLIC.
    
      PUBLIC SECTION.
        INTERFACES if_amdp_marker_hdb.
        CLASS-METHODS get_orders
          IMPORTING VALUE(iv_vkorg) TYPE vkorg
          RETURNING VALUE(rt_result) TYPE TABLE OF zst_order_result
          RAISING cx_amdp_error.
    ENDCLASS.
    
    CLASS zcl_amdp_sales IMPLEMENTATION.
      METHOD get_orders
        BY DATABASE FUNCTION FOR HDB
        LANGUAGE SQLSCRIPT
        OPTIONS READ-ONLY
        USING vbak vbap.
    
        RETURN
          SELECT
            h.vbeln, h.kunnr,
            SUM(i.kwmeng) AS total_qty
          FROM vbak AS h
          INNER JOIN vbap AS i
            ON  h.mandt = i.mandt
            AND h.vbeln = i.vbeln
          WHERE h.mandt = SESSION_CONTEXT('CLIENT')   -- 필수!
            AND h.vkorg = :iv_vkorg
          GROUP BY h.vbeln, h.kunnr;
    
      ENDMETHOD.
    ENDCLASS.
    📋 핵심 정리
    • AMDP Table Function은 ABAP 레이어를 우회하므로 MANDT 자동 필터가 없다
    • MANDT 컬럼이 있는 투명 테이블 조회 시 SESSION_CONTEXT('CLIENT') 필터는 필수
    • JOIN 시 주 테이블 WHERE에 한 번 + ON 조건에 MANDT 매핑 패턴 권장
    • CTE를 사용하면 각 서브쿼리에서 한 번씩 필터하고 이후 단계에서는 생략 가능
    • MANDT 컬럼이 없는 테이블이나 단일 클라이언트 환경에서는 생략 가능
Designed by Tistory.