MSEG 직접 조회를 멈춰야 하는 순간
SAP S/4HANA 도입 후에도 자재 문서(GR/GI/전송)를 조회할 때 여전히 MSEG와 MKPF를 INNER JOIN으로 엮는 코드를 자주 만납니다. 이 방식은 ECC 시절에는 표준이었지만, ABAP Cloud 환경에서는 릴리스 미보장·권한 누락·이관성 저하라는 3가지 리스크를 안고 있습니다. 이번 튜토리얼에서는 I_MaterialDocumentItem CDS 뷰로 MSEG를 대체하고, Association·DCL·커스텀 뷰까지 실무에서 즉시 쓸 수 있는 패턴을 정리합니다.
- MSEG 직접 SELECT의 3가지 리스크 이해
- I_MaterialDocumentItem 핵심 필드 매핑
- _MaterialDocument Association으로 MKPF JOIN 제거
- DCL로 플랜트 권한 자동 상속
핵심 개념: MSEG vs I_MaterialDocumentItem
MSEG는 자재 문서 아이템 원시 테이블입니다. ABAP Cloud에서는 C1 릴리스가 되어 있지 않아 직접 SELECT 시 컴파일 오류가 발생합니다. I_MaterialDocumentItem은 SAP이 C1 계약으로 관리하는 표준 인터페이스 뷰로, 플랜트 기반 DCL 권한이 내장되어 있습니다.
| MSEG 필드 | I_MaterialDocumentItem 필드 | 설명 |
|---|---|---|
| MBLNR | MaterialDocument | 자재 문서 번호 |
| MJAHR | MaterialDocumentYear | 회계연도 |
| ZEILE | MaterialDocumentItem | 아이템 번호 |
| BWART | GoodsMovementType | 이동 유형 |
| MATNR | Material | 자재 번호 |
| WERKS | Plant | 플랜트 |
| MENGE | QuantityInBaseUnit | 기본 단위 수량 |
1단계 — 기본 조회 전환
" [Before] MSEG 직접 조회
SELECT mblnr, zeile, bwart, matnr, werks, menge
FROM mseg INTO TABLE @DATA(lt_mseg)
WHERE werks = @iv_plant.
" [After] I_MaterialDocumentItem 사용
SELECT MaterialDocument, MaterialDocumentItem,
GoodsMovementType, Material, Plant,
QuantityInBaseUnit, BaseUnit
FROM I_MaterialDocumentItem
INTO TABLE @DATA(lt_items)
WHERE Plant = @iv_plant
AND PostingDate IN @s_budat.2단계 — Association으로 MKPF JOIN 제거
_MaterialDocument Association이 내장되어 헤더 필드(PostingDate, ReferenceDocument)를 점표기로 바로 참조합니다.
SELECT mat~MaterialDocument, mat~MaterialDocumentItem,
mat~Plant, mat~Material, mat~QuantityInBaseUnit,
mat~GoodsMovementType,
hdr~PostingDate, hdr~ReferenceDocument
FROM I_MaterialDocumentItem AS mat
INNER JOIN I_MaterialDocumentHeader AS hdr
ON mat~MaterialDocument = hdr~MaterialDocument
AND mat~MaterialDocumentYear = hdr~MaterialDocumentYear
WHERE mat~Plant = @iv_plant
AND mat~GoodsMovementType = '101'
INTO TABLE @DATA(lt_gr).3단계 — 커스텀 CDS 뷰와 DCL 작성
@AccessControl.authorizationCheck: #CHECK
@VDM.viewType: #BASIC
define view entity ZI_GoodsReceipt
as select from I_MaterialDocumentItem as item
association [1] to I_MaterialDocumentHeader as _Header
on item.MaterialDocument = _Header.MaterialDocument
and item.MaterialDocumentYear = _Header.MaterialDocumentYear
{ key item.MaterialDocument,
key item.MaterialDocumentYear,
key item.MaterialDocumentItem,
item.GoodsMovementType, item.Plant, item.Material,
item.QuantityInBaseUnit, item.BaseUnit,
item._MaterialDocument.PostingDate,
_Header }
where item.GoodsMovementType in ( '101', '103', '105' )@MappingRole: true
define role ZI_GoodsReceipt_Role {
grant select on ZI_GoodsReceipt
where ( Plant ) = aspect pfcg_auth(
M_MMIM_WRK, WERKS, ACTVT = '03' );
}흔한 실수와 트러블슈팅
- 릴리스 오류: ADT Released Objects에서 C1 계약 여부 확인
- GoodsMovementType 비교: 문자열 '101'로 비교 (숫자 101 아님)
- 수량 불일치: QuantityInEntryUnit(입력) vs QuantityInBaseUnit(기본 단위) 구분
- 배치 권한 없음: 배치 사용자에 플랜트 권한 부여 또는 #NOT_REQUIRED 별도 뷰 사용
댓글 0
아직 댓글이 없습니다.