ABAP

MSEG 여전히 직접 SELECT? — I_MaterialDocumentItem으로 바꾸기 #shorts #SAP #ABAP

▶ YouTube에서 보기

MSEG 직접 조회를 멈춰야 하는 순간

SAP S/4HANA 도입 후에도 자재 문서(GR/GI/전송)를 조회할 때 여전히 MSEGMKPFINNER 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 필드설명
MBLNRMaterialDocument자재 문서 번호
MJAHRMaterialDocumentYear회계연도
ZEILEMaterialDocumentItem아이템 번호
BWARTGoodsMovementType이동 유형
MATNRMaterial자재 번호
WERKSPlant플랜트
MENGEQuantityInBaseUnit기본 단위 수량

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

아직 댓글이 없습니다.