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
아직 댓글이 없습니다.