I_MaterialValuation — MBEW 직접 조회 대신 CDS View로 이동 평균가·표준 가격 접근하기
1. 개요
SAP S/4HANA에서 자재 평가(Material Valuation) 데이터는 전통적으로 MBEW 테이블에 저장됩니다. MBEW에는 이동 평균가(Moving Average Price, MAP), 표준 가격(Standard Price), 재고 수량, 재고 금액 등 회계 처리의 핵심 필드가 집약되어 있습니다. 그러나 MBEW를 직접 SELECT하는 방식은 여러 위험을 내포합니다.
SAP는 이런 문제를 해결하기 위해 I_MaterialValuation이라는 Released CDS View (C1 Contract)를 제공합니다.
이 뷰는 MBEW를 포함한 관련 테이블을 캡슐화하고, 이동 평균가·표준 가격·통화 정보를 일관된 필드명으로 노출합니다.
2. 왜 MBEW를 직접 조회하면 안 되는가?
2.1 내부 테이블 구조 변경 위험
SAP S/4HANA 업그레이드 시 MBEW의 내부 필드명·데이터 타입이 변경될 수 있습니다.
MBEW에 의존하는 커스텀 코드는 즉시 오류를 발생시킵니다.
반면 I_MaterialValuation은 C1 계약(Released for Customer Use)으로 SAP가 하위 호환성을 보장합니다.
2.2 통화 변환 누락 오류
MBEW의 VERPR(이동 평균가)와 STPRS(표준 가격)는 원자재 통화로 저장됩니다.
MBEW를 직접 조회하면 통화 코드(BWKEY, PEINH 등)를 별도로 JOIN해야 하고,
실수로 통화 변환을 빠뜨리는 경우가 빈번합니다.
I_MaterialValuation은 Currency, PriceUnitQuantity 등 관련 필드를 함께 노출합니다.
2.3 권한 검사 우회 문제
MBEW 직접 조회는 SAP 권한 오브젝트(M_MATE_WRK 등)를 자동으로 거치지 않습니다. CDS View 기반 접근은 AccessControl(DCL)을 통해 권한 검사가 뷰 레이어에서 자동 위임됩니다.
2.4 필드 의미 모호성
MBEW의 VERPR는 가격 제어 방식(VPRSV)에 따라 이동 평균가 또는 표준 가격을 의미합니다.
이를 잘못 해석하면 원가 계산 오류로 이어집니다.
I_MaterialValuation은 MovingAveragePrice, StandardPrice를 명시적으로 분리해 노출합니다.
2.5 기존 방식 vs 권장 방식 비교
" [금지] 구형 방식 — MBEW 직접 조회
SELECT matnr bwkey bwtar vprsv verpr stprs waers peinh
lbkum salk3
FROM mbew
INTO TABLE lt_mbew
WHERE bwkey = '1010'.
" 문제점:
" - VERPR: 가격 제어 방식(VPRSV)에 따라 MAP 또는 SP
" - 통화(WAERS)·단위(PEINH) 별도 처리 필요
" - 권한 체크(AUTHORITY-CHECK) 수동 구현 필수
" - 업그레이드 시 필드명 변경 위험
" [권장] 현대적 방식 — I_MaterialValuation CDS View
SELECT material,
valuationarea,
pricecontrol,
movingaverageprice,
standardprice,
currency,
priceunitquantity,
totalstock,
totalstockvalue
FROM i_materialvaluation
WHERE valuationarea = '1010'
INTO TABLE @DATA(lt_valuation).
" 장점:
" - MovingAveragePrice / StandardPrice 명확히 분리
" - Currency 기본 포함 — 통화 누락 원천 방지
" - DCL로 권한 자동 검사
" - C1 계약 — 업그레이드 안전성 보장
3. I_MaterialValuation 주요 필드
I_MaterialValuation은 MBEW 테이블의 주요 필드를 의미있는 이름으로 노출합니다.
아래는 자주 사용되는 핵심 필드들입니다.
3.1 기본 식별 및 평가 필드
" 기본 키 필드
Material " MATNR — 자재 번호
ValuationArea " BWKEY — 평가 영역 (플랜트 또는 회사코드)
ValuationType " BWTAR — 평가 유형 (분할 평가 시 사용)
" 평가 설정 필드
ValuationClass " BKLAS — 평가 클래스 (G/L 계정 결정)
PriceControl " VPRSV — 가격 제어: V=이동평균, S=표준
3.2 가격 및 재고 금액 필드
" 가격 관련 필드
MovingAveragePrice " VERPR — 이동 평균가 (PriceControl='V'일 때 유효)
StandardPrice " STPRS — 표준 가격 (PriceControl='S'일 때 유효)
Currency " WAERS — 통화 코드
PriceUnitQuantity " PEINH — 가격 단위 수량 (예: 1, 100)
" 재고 수량·금액 필드
TotalStock " LBKUM — 평가 재고 수량 합계
TotalStockValue " SALK3 — 평가 재고 금액 합계
" 미래 원가 견적 필드
FutureStandardPrice " ZKPRS — 미래 표준 가격
FuturePriceValidityStartDate " ZKDAT — 미래 표준 가격 유효 시작일
4. ABAP에서 I_MaterialValuation 활용하기
STEP 1 — 이동 평균가 기반 자재 조회
가격 제어 방식이 V(이동 평균가)인 자재의 현재 가격을 조회합니다.
WHERE ValuationArea = '1010'처럼 평가 영역을 명시하면
MBEW의 기본키 인덱스(MANDT+MATNR+BWKEY+BWTAR)를 효율적으로 활용합니다.
" STEP 1: 이동 평균가(V) 방식 자재 조회
SELECT material,
valuationarea,
movingaverageprice,
currency,
priceunitquantity,
totalstock,
totalstockvalue
FROM i_materialvaluation
WHERE valuationarea = '1010'
AND pricecontrol = 'V'
AND movingaverageprice > 0
INTO TABLE @DATA(lt_map_materials)
UP TO 100 ROWS.
" 단가 계산: 이동 평균가 / 가격 단위
LOOP AT lt_map_materials INTO DATA(ls_mat).
DATA(lv_unit_price) = ls_mat-movingaverageprice
/ ls_mat-priceunitquantity.
" lv_unit_price: 수량 1개당 이동 평균가
WRITE: / ls_mat-material, lv_unit_price, ls_mat-currency.
ENDLOOP.
핵심 포인트:
PriceControl = 'V'필터로 이동 평균가 방식 자재만 선별PriceUnitQuantity로 나누어야 실제 단가를 얻을 수 있음 (PEINH=100이면 100개 기준 가격)- 통화(
Currency)를 항상 함께 조회해 다통화 환경에서 오류 방지
STEP 2 — 표준 가격과 이동 평균가 비교 분석
S/4HANA 원가 관리에서는 표준 가격(S)과 이동 평균가(V)를 혼합 운영하는 경우가 많습니다. 두 가격의 괴리를 분석하면 가격 차이(Price Difference) 포스팅 빈도와 원가 정확도를 점검할 수 있습니다.
" STEP 2: 표준 가격 vs 이동 평균가 괴리율 분석
SELECT material,
valuationarea,
pricecontrol,
standardprice,
movingaverageprice,
currency,
priceunitquantity,
totalstock,
totalstockvalue
FROM i_materialvaluation
WHERE valuationarea = @iv_valuation_area
AND totalstock > 0
INTO TABLE @DATA(lt_valuation).
LOOP AT lt_valuation INTO DATA(ls_val).
" 표준 가격 제어 자재: 가격 차이 비율 계산
IF ls_val-pricecontrol = 'S'
AND ls_val-standardprice > 0
AND ls_val-movingaverageprice > 0.
DATA(lv_price_diff_pct) =
ABS( ls_val-standardprice - ls_val-movingaverageprice )
/ ls_val-standardprice * 100.
" 5% 초과 시 경고 로그
IF lv_price_diff_pct > 5.
" Application Log에 가격 차이 경보 기록
WRITE: / '가격 차이 경보:', ls_val-material,
lv_price_diff_pct, '%'.
ENDIF.
ENDIF.
ENDLOOP.
핵심 포인트:
PriceControl = 'S'(표준 가격) 자재도MovingAveragePrice필드에 이동 평균가가 참조값으로 저장될 수 있음- 가격 차이가 5% 이상이면 표준 원가 재설정(Standard Cost Estimate) 검토 필요
- MBEW를 직접 쓰면
VERPR/STPRS의 의미를VPRSV와 교차 확인해야 하지만, CDS View는 필드명이 명확히 분리되어 있음
STEP 3 — 통화 변환 + Association 활용
다통화 환경(Multi-Currency)에서는 모든 평가 금액을 회사 통화(Company Code Currency)로 변환해야 합니다.
I_MaterialValuation의 Association을 활용하면 추가 JOIN 없이 관련 데이터를 조합할 수 있습니다.
" STEP 3: Consumption View — 통화 변환 + Association 조합
define view entity ZC_MaterialValuationReport
as select from I_MaterialValuation as MV
association [0..1] to I_Material as _Material
on _Material.Material = MV.Material
association [0..1] to I_CompanyCode as _Company
on _Company.CompanyCode = MV.ValuationArea
{
key MV.Material,
key MV.ValuationArea,
key MV.ValuationType,
" 자재 설명 (Association 활용, 추가 JOIN 불필요)
_Material.MaterialName,
_Material.BaseUnit,
MV.PriceControl,
MV.StandardPrice,
MV.MovingAveragePrice,
MV.Currency,
MV.PriceUnitQuantity,
MV.TotalStock,
MV.TotalStockValue,
" 회사 통화 (Association으로 자동 조합)
_Company.CompanyCodeCurrency,
" 계산 필드: 재고 평균 단가
@Semantics.amount.currencyCode: 'Currency'
division( MV.TotalStockValue,
nullif( MV.TotalStock, 0 ),
2 ) as CalculatedUnitValue,
" Future Price 정보
MV.FutureStandardPrice,
MV.FuturePriceValidityStartDate,
" Association 노출 (호출자가 추가 확장 가능)
_Material,
_Company
}
핵심 포인트:
@Semantics.amount.currencyCode어노테이션으로 Fiori/Analytics 레이어에서 자동 통화 포맷팅division(..., nullif(..., 0), ...)으로 재고 0인 경우 Divide by Zero 방지FutureStandardPrice와FuturePriceValidityStartDate로 차기 원가 견적 일정 파악 가능- Association을 외부로 노출(
_Material,_Company)하면 상위 Consumption View에서 추가 확장 가능
5. 분할 평가(Split Valuation) 환경에서의 주의사항
MBEW는 MATNR + BWKEY + BWTAR 기본키를 사용합니다. 분할 평가가 활성화된 경우 동일 자재에 대해 여러 행이 존재합니다.
I_MaterialValuation에서 ValuationType이 빈 값('')인 행은 통합 평가 레코드(Aggregated Record)이고,
값이 있는 행은 각 분할 유형별 레코드입니다.
" 분할 평가 레코드만 조회
SELECT material,
valuationarea,
valuationtype,
pricecontrol,
movingaverageprice,
standardprice,
currency,
totalstock,
totalstockvalue
FROM i_materialvaluation
WHERE valuationarea = '1010'
AND valuationtype <> '' " 분할 평가 유형만
INTO TABLE @DATA(lt_split_val).
" 또는 통합 레코드만
SELECT material, valuationarea,
movingaverageprice, standardprice,
currency, totalstock, totalstockvalue
FROM i_materialvaluation
WHERE valuationarea = '1010'
AND valuationtype = '' " 통합 레코드만
INTO TABLE @DATA(lt_total_val).
6. MBEW 직접 조회 vs I_MaterialValuation 비교
| 항목 | MBEW 직접 SELECT | I_MaterialValuation CDS View |
|---|---|---|
| 업그레이드 안전성 | 필드 변경 시 오류 위험 | C1 계약으로 하위 호환 보장 |
| 가격 필드 명확성 | VERPR/STPRS 혼재 — VPRSV 교차 확인 필요 | MovingAveragePrice / StandardPrice 명확 분리 |
| 통화 정보 | 별도 JOIN 필요 | Currency 필드 기본 포함 |
| 권한 검사 | AUTHORITY-CHECK 수동 처리 필요 | DCL AccessControl 자동 위임 |
| Association 활용 | 모두 직접 JOIN 구현 필요 | _Material, _Plant 등 사전 정의된 Association 활용 |
| 코드 유지보수성 | 업그레이드 시 전체 코드 수정 필요 | CDS 인터페이스 변경 시 자동 반영 |
7. 성능 최적화 팁
7.1 인덱스 활용 조건 순서
MBEW의 기본키는 MANDT + MATNR + BWKEY + BWTAR 순서입니다.
I_MaterialValuation 조회 시 아래 순서로 WHERE 조건을 작성해야 HANA 인덱스 효율이 극대화됩니다.
" [권장] 평가 영역(ValuationArea) 선행 조건
SELECT material, movingaverageprice, currency
FROM i_materialvaluation
WHERE valuationarea = '1010' " BWKEY 인덱스 우선
AND material = @lv_material " MATNR 추가 필터
AND valuationtype = '' " BWTAR 필터
INTO TABLE @DATA(lt_result).
" [비권장] 가격 조건만으로 Full Scan
SELECT material, movingaverageprice
FROM i_materialvaluation
WHERE movingaverageprice > 100 " 인덱스 미활용
INTO TABLE @DATA(lt_bad_result).
7.2 필요한 필드만 SELECT
MBEW는 약 60개 이상의 필드를 가지고 있습니다.
SELECT *는 네트워크 전송량을 불필요하게 늘립니다.
실제로 필요한 필드만 명시적으로 선택하는 것이 HANA Column Store의 특성에 부합합니다.
" 필요한 필드만 명시적으로 선택 (SELECT * 금지)
SELECT material,
valuationarea,
movingaverageprice,
standardprice,
currency,
priceunitquantity
FROM i_materialvaluation
WHERE valuationarea = '1010'
INTO TABLE @DATA(lt_minimal).
8. 실전 적용 체크리스트
- MBEW 직접 SELECT 코드가 있다면
I_MaterialValuation으로 교체 계획 수립 PriceControl필드로 이동 평균가/표준 가격 분기 처리 명확화Currency와PriceUnitQuantity를 항상 함께 조회- 다통화 환경이면
@Semantics.amount.currencyCode어노테이션 적용 - 분할 평가 환경이면
ValuationType필터 조건 명시 - Consumption View 생성 시
_Material,_PlantAssociation 노출 - AccessControl(DCL)로
ValuationArea기반 권한 제어 적용
9. 정리
MBEW를 직접 SELECT하는 방식은 단기적으로는 동작하지만, SAP 업그레이드·다통화·권한 관리·유지보수 측면에서
지속적인 위험을 내포합니다. I_MaterialValuation CDS View는 이동 평균가(MovingAveragePrice)와
표준 가격(StandardPrice)을 명확히 분리하고, 통화 정보와 Association을 기본 제공하여 이러한 위험을 원천 차단합니다.
자재 원가·재고 금액 관련 ABAP 개발 시에는 반드시 I_MaterialValuation을 사용하세요.
실전 전체 예제는 btpstacks.com에서 확인할 수 있습니다.
댓글 0
아직 댓글이 없습니다.