-
AMDP OPTIONS CDS SESSION CLIENT CURRENT - MANDT 처리 정리SAP 2026. 6. 23. 21:43amdp_mandt_client_options.html0.03MBamdp_mandt_client_options.pdf0.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 선언으로 클라이언트 처리 위임.'SAP' 카테고리의 다른 글
대용량 itab 처리와 바이너리 직렬화/압축 정리 (0) 2026.07.08 AMDP 예외 처리 정리: SIGNAL, EXIT HANDLER, CX_AMDP_EXECUTION_ERROR (0) 2026.07.02 HANA Sequence & NEXTVAL — Oracle → AMDP 변환 정리 (0) 2026.06.18 AMDP 동적 JSON 파라미터 (0) 2026.06.17 ABAP 타입풀 상수명 추출 (0) 2026.06.12