ABAP

I_MaterialPlant 30초 만에 — MARC 대신 VDM으로 플랜트 조회 #shorts #SAP #ABAP

▶ YouTube에서 보기

I_MaterialPlant CDS View — 자재 플랜트 데이터를 VDM으로 조회하는 방법

1. 개요

SAP S/4HANA에서 자재의 플랜트별 데이터는 전통적으로 MARC 테이블에 저장되어 왔습니다. 그러나 S/4HANA의 VDM(Virtual Data Model) 아키텍처에서는 I_MaterialPlant라는 CDS 인터페이스 뷰를 통해 이 데이터에 접근하는 것을 표준으로 권장합니다.

I_MaterialPlant는 SAP가 API 호환성을 공식 보장하는 VDM 인터페이스 뷰로, MARC 테이블을 기반으로 하면서 DCL(Data Control Language)을 통한 자동 권한 제어, 연관 뷰(Association)를 통한 선언적 조인, 그리고 S/4HANA 버전 업그레이드 시의 안정성을 제공합니다. 본 글에서는 I_MaterialPlant의 구조와 실전 활용법을 단계별로 살펴봅니다.

2. MARC 직접 SELECT vs I_MaterialPlant 비교

기존 ABAP 개발에서는 MARC 테이블을 직접 조회하는 방식이 일반적이었습니다. 하지만 S/4HANA 환경에서는 여러 가지 이유로 인해 I_MaterialPlant 사용이 권장됩니다.

2.1 기존 방식: MARC 직접 SELECT

" 구형 방식 — MARC 직접 조회 (권장하지 않음)
DATA: lt_marc TYPE TABLE OF marc,
      ls_marc TYPE marc.

SELECT matnr werks disgr mmsta plifz eisbe
  FROM marc
  INTO TABLE lt_marc
  WHERE werks = '1000'
    AND mmsta = ''.

" 별도로 AUTHORITY-CHECK 필요
LOOP AT lt_marc INTO ls_marc.
  AUTHORITY-CHECK OBJECT 'M_MATE_WRK'
    ID 'ACTVT' FIELD '03'
    ID 'WERKS' FIELD ls_marc-werks.
  IF sy-subrc <> 0.
    DELETE lt_marc WHERE matnr = ls_marc-matnr.
  ENDIF.
ENDLOOP.

이 방식의 문제점은 다음과 같습니다:

  • MARC 테이블 구조가 S/4HANA 업그레이드 시 변경될 수 있음
  • 권한 체크(AUTHORITY-CHECK)를 수동으로 구현해야 함 — 누락 시 보안 취약점 발생
  • 연관 테이블(MARA, MAKT 등) 조인을 직접 구현해야 하는 번거로움
  • SAP의 공식 API 호환성 보장 대상이 아님

2.2 권장 방식: I_MaterialPlant 활용

" 권장 방식 — I_MaterialPlant CDS View 활용
SELECT material,
       plant,
       mrptype,
       mrpcontroller,
       reorderpoint,
       minimumstocklevel,
       safetystock,
       planneddeliverytime,
       goodsreceiptprocessingtime,
       independentrequiremenentstype
  FROM i_materialplant
  WHERE plant = '1000'
  INTO TABLE @DATA(lt_mat_plant).

" DCL이 자동으로 권한 검증 — AUTHORITY-CHECK 불필요
" 권한 없는 플랜트/자재는 SELECT 결과에서 자동 필터링

I_MaterialPlant를 사용하면 DCL(Data Control Language)이 자동으로 적용되어 M_MATE_WRK 오브젝트에 대한 권한 검증이 SELECT 단계에서 자동으로 이루어집니다. 권한이 없는 플랜트의 데이터는 결과에서 자동 제외되므로, 수동 권한 체크가 필요 없습니다.

3. I_MaterialPlant 핵심 필드

I_MaterialPlant는 MARC 테이블의 주요 필드를 의미있는 이름으로 노출합니다. 아래는 자주 사용되는 핵심 필드들입니다.

3.1 기본 식별 필드

" 기본 키 필드
Material       " MATNR — 자재 번호
Plant          " WERKS — 플랜트 코드

3.2 MRP(자재 소요 계획) 관련 필드

" MRP 관련 주요 필드
MRPType                       " DISMM — MRP 유형 (PD, VB, VM 등)
MRPController                 " DISPO — MRP 담당자
ReorderPoint                  " MINBE — 재주문점
SafetyStock                   " EISBE — 안전 재고량
MinimumStockLevel             " MTVFP — 최소 재고 수준
PlannedDeliveryTime           " PLIFZ — 조달 리드타임 (일)
GoodsReceiptProcessingTime    " WEBAZ — 입고 처리 시간 (일)

3.3 생산/구매 관련 필드

" 생산 및 구매 관련 필드
ProcurementType               " BESKZ — 조달 유형 (E: 자체 생산, F: 외부 구매)
SpecialProcurementType        " SOBSL — 특수 조달 유형
ProductionSchedulingProfile   " FEVOR — 생산 일정 프로파일
ProductionSupervisor          " FERTH — 생산 감독자
PlantSpecificMaterialStatus   " MMSTA — 플랜트별 자재 상태

3.4 재고 및 창고 관련 필드

" 재고 및 창고 관련 필드
StorageLocation               " LGORT — 저장 위치
WarehouseNumber               " LGNUM — 창고 번호
MaximumStockLevel             " MABST — 최대 재고 수준
LotSize                       " BSTME — 로트 크기 단위
FixedLotSize                  " BSTFE — 고정 로트 크기

4. ABAP에서 I_MaterialPlant 활용하기

4.1 기본 조회 — 플랜트별 자재 MRP 데이터

" 플랜트 1000의 MRP 유형이 'PD'인 자재 조회
SELECT material,
       plant,
       mrptype,
       mrpcontroller,
       reorderpoint,
       safetystock,
       planneddeliverytime
  FROM i_materialplant
  WHERE plant         = '1000'
    AND mrptype       = 'PD'
    AND plantspecificmaterialstatus = ''
  ORDER BY material
  INTO TABLE @DATA(lt_mrp_data).

IF sy-subrc = 0.
  LOOP AT lt_mrp_data INTO DATA(ls_mrp).
    WRITE: / ls_mrp-material, ls_mrp-plant,
             ls_mrp-mrptype, ls_mrp-safetystock.
  ENDLOOP.
ENDIF.

4.2 ABAP CDS에서 I_MaterialPlant 활용

커스텀 CDS 뷰에서 I_MaterialPlant를 데이터 소스로 활용하는 예시입니다.

@AbapCatalog.sqlViewName: 'ZMAT_PLANT_V'
@AbapCatalog.compiler.compareFilter: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '자재 플랜트 MRP 데이터 조회'

define view ZI_MaterialPlantMRP
  as select from I_MaterialPlant as mp

  " 자재 기본정보 Association 연결
  association [1] to I_Material as _Material
    on $projection.Material = _Material.Material

  " 플랜트 정보 Association 연결
  association [1] to I_Plant as _Plant
    on $projection.Plant = _Plant.Plant

{
  key mp.Material,
  key mp.Plant,
      mp.MRPType,
      mp.MRPController,
      mp.ReorderPoint,
      mp.SafetyStock,
      mp.PlannedDeliveryTime,
      mp.GoodsReceiptProcessingTime,
      mp.ProcurementType,
      mp.PlantSpecificMaterialStatus,

      " Association 노출
      _Material,
      _Plant
}

4.3 복합 조건 조회 — 안전 재고 부족 자재 파악

" 안전재고가 설정되었으나 재주문점이 없는 자재 파악
SELECT mp~material,
       mp~plant,
       mp~safetystock,
       mp~reorderpoint,
       mp~mrptype,
       mp~planneddeliverytime
  FROM i_materialplant AS mp
  WHERE mp~plant            = '1000'
    AND mp~safetystock      > 0
    AND mp~reorderpoint     = 0
    AND mp~mrptype          = 'VB'    " 재주문점 MRP
  INTO TABLE @DATA(lt_risk_materials).

" 결과 출력
IF lt_risk_materials IS NOT INITIAL.
  WRITE: / '재주문점 미설정 안전재고 자재:'.
  LOOP AT lt_risk_materials INTO DATA(ls_risk).
    WRITE: / ls_risk-material, '|',
             ls_risk-safetystock, '|',
             ls_risk-planneddeliverytime.
  ENDLOOP.
ENDIF.

5. Association 활용하기

I_MaterialPlant는 다양한 Association을 통해 관련 데이터에 선언적으로 접근할 수 있습니다. 이를 통해 복잡한 조인 로직을 단순하게 표현할 수 있습니다.

5.1 주요 Association 목록

" I_MaterialPlant의 주요 Association
_Material               " I_Material — 자재 기본 정보 (MARA)
_Plant                  " I_Plant — 플랜트 정보
_MaterialPlantMRPArea   " MRP 영역별 자재 데이터
_PurchasingInfo         " 구매 정보 레코드
_StorageLocation        " 저장 위치 정보

5.2 Association을 활용한 다중 테이블 조회

" Association을 통해 자재명, 플랜트명을 함께 조회
SELECT mp~material,
       mp~plant,
       mp~mrptype,
       mp~safetystock,
       mp~reorderpoint,
       mat~materialtype,
       mat~baseunit,
       mat~materialgroup,
       mattext~materialdescription,
       plt~plantname
  FROM i_materialplant AS mp
  " _Material Association 활용 — 자동 조인
  INNER JOIN i_material AS mat
    ON mp~material = mat~material
  " I_MaterialText — 자재 설명 텍스트
  LEFT OUTER JOIN i_materialtext AS mattext
    ON  mp~material   = mattext~material
    AND mattext~language = @sy-langu
  " I_Plant — 플랜트 이름
  LEFT OUTER JOIN i_plant AS plt
    ON mp~plant = plt~plant
  WHERE mp~plant    = '1000'
    AND mp~mrptype  <> ''
  ORDER BY mp~material
  INTO TABLE @DATA(lt_full_data).

LOOP AT lt_full_data INTO DATA(ls).
  WRITE: / ls-material, ls-materialdescription,
           ls-plant, ls-plantname,
           ls-mrptype, ls-safetystock.
ENDLOOP.

5.3 CDS 뷰에서 Association Path 활용

@AbapCatalog.sqlViewName: 'ZMAT_PLANT_EXT'
@EndUserText.label: '자재 플랜트 확장 뷰 (Association 활용)'
@AccessControl.authorizationCheck: #CHECK

define view ZI_MaterialPlantExtended
  as select from I_MaterialPlant as mp

{
  key mp.Material,
  key mp.Plant,

  " Association Path를 통한 자재 기본정보 접근
  mp._Material.MaterialType,
  mp._Material.BaseUnit,
  mp._Material.MaterialGroup,
  mp._Material.NetWeight,
  mp._Material.WeightUnit,

  " MRP 핵심 필드
  mp.MRPType,
  mp.MRPController,
  mp.ReorderPoint,
  mp.SafetyStock,
  mp.PlannedDeliveryTime,
  mp.GoodsReceiptProcessingTime,
  mp.ProcurementType,
  mp.SpecialProcurementType
}

6. 소비 뷰(Consumption View) 작성

프로젝트 표준에 따라 I_MaterialPlant를 직접 사용하는 대신, 커스텀 소비 뷰(ZC_ 접두사)로 래핑하는 것이 권장됩니다. 이렇게 하면 SAP 표준 변경에 따른 영향을 소비 뷰 내부에서 흡수할 수 있습니다.

6.1 소비 뷰 예시 — OData 서비스용

@AbapCatalog.sqlViewName: 'ZC_MATPLANT'
@VDM.viewType: #CONSUMPTION
@OData.publish: true
@EndUserText.label: '자재 플랜트 데이터 소비 뷰'

" 검색 도움말 설정
@Search.searchable: true

define view ZC_MaterialPlantData
  as select from I_MaterialPlant as mp

  association [1] to I_Material as _Material
    on $projection.Material = _Material.Material

  association [1..1] to I_Plant as _Plant
    on $projection.Plant = _Plant.Plant

{
      @Search.defaultSearchElement: true
  key mp.Material,

      @Search.defaultSearchElement: true
  key mp.Plant,

      @Semantics.quantity.unitOfMeasure: 'BaseUnit'
      mp.ReorderPoint,

      @Semantics.quantity.unitOfMeasure: 'BaseUnit'
      mp.SafetyStock,

      @Semantics.quantity.unitOfMeasure: 'BaseUnit'
      mp.MinimumStockLevel,

      mp.MRPType,
      mp.MRPController,
      mp.PlannedDeliveryTime,
      mp.GoodsReceiptProcessingTime,
      mp.ProcurementType,
      mp.SpecialProcurementType,
      mp.PlantSpecificMaterialStatus,

      " 자재 기본정보 (Association Path)
      mp._Material.MaterialType,
      mp._Material.BaseUnit,
      mp._Material.MaterialGroup,

      " Association 노출 (드릴다운 지원)
      _Material,
      _Plant
}
where mp.PlantSpecificMaterialStatus <> 'Z1'  " 삭제 플래그 제외

6.2 소비 뷰 기반 ABAP 프로그램

" 소비 뷰를 통한 데이터 조회 (권장 패턴)
SELECT material,
       plant,
       materialtype,
       baseunit,
       mrptype,
       mrpcontroller,
       reorderpoint,
       safetystock,
       planneddeliverytime
  FROM zc_materialplantdata    " 소비 뷰 활용
  WHERE plant = '1000'
    AND mrptype IN ('PD', 'VB', 'VM')
  INTO TABLE @DATA(lt_result).

" 결과 처리
DATA(lv_count) = lines( lt_result ).
MESSAGE |플랜트 1000: { lv_count }개 자재 조회 완료| TYPE 'I'.

" 안전재고 체크 리포트
LOOP AT lt_result INTO DATA(ls_result)
  WHERE safetystock = 0 AND mrptype = 'VB'.
  WRITE: / '경고 - 안전재고 미설정:',
           ls_result-material,
           ls_result-mrptype.
ENDLOOP.

7. 자주 발생하는 문제와 해결 방법

7.1 권한 오류 처리

I_MaterialPlant의 DCL이 적용되면 권한 없는 데이터는 조회 결과에서 자동 제외됩니다. 결과가 예상보다 적은 경우 권한 설정을 확인하세요.

" 권한 체크 테스트 (트랜잭션 SU53으로도 확인 가능)
AUTHORITY-CHECK OBJECT 'M_MATE_WRK'
  ID 'ACTVT' FIELD '03'
  ID 'WERKS' FIELD '1000'.
IF sy-subrc <> 0.
  MESSAGE 'M_MATE_WRK 권한 없음 — 플랜트 데이터 접근 불가' TYPE 'E'.
ENDIF.

7.2 성능 최적화 — 필요한 필드만 SELECT

" 성능 최적화: 필요한 필드만 선택적으로 조회
" I_MaterialPlant는 많은 필드를 포함하므로 SELECT * 사용 금지
SELECT material,
       plant,
       safetystock,
       reorderpoint
  FROM i_materialplant
  WHERE plant = '1000'
  INTO TABLE @DATA(lt_min).  " 필요한 필드만 지정

8. 정리

I_MaterialPlant는 SAP S/4HANA에서 자재의 플랜트별 데이터에 접근하는 표준 방식입니다. MARC 테이블을 직접 SELECT하는 구형 방식 대비 다음과 같은 핵심 장점을 제공합니다.

  • 권한 자동 적용: DCL을 통해 M_MATE_WRK 권한이 SELECT 시 자동 검증됩니다. 수동 AUTHORITY-CHECK 구현이 불필요합니다.
  • API 호환성 보장: SAP가 공식적으로 I_ 뷰의 인터페이스 안정성을 보장하므로 S/4HANA 버전 업그레이드 시에도 코드 변경이 최소화됩니다.
  • Association 활용: _Material, _Plant 등의 Association을 통해 선언적인 방식으로 연관 데이터에 접근할 수 있어 복잡한 조인 로직을 단순화합니다.
  • 유지보수성: 커스텀 소비 뷰(ZC_)로 래핑하면 비즈니스 로직의 변경 영향을 최소화하고, 소비 뷰 레이어에서 변경을 흡수할 수 있습니다.

새로운 S/4HANA 개발에서는 반드시 I_MaterialPlant와 같은 VDM 인터페이스 뷰를 활용하고, 기존 MARC 직접 접근 코드는 점진적으로 VDM 방식으로 전환하는 것을 권장합니다.

댓글 0

아직 댓글이 없습니다.