ABAP

I_MRPArea vs MDLV — CDS로 MRP 영역 읽기 #shorts #SAP #ABAP

▶ YouTube에서 보기

MRP 영역(MRP Area)이란 무엇인가

MRP(Material Requirements Planning, 자재 소요량 계획)는 SAP S/4HANA의 핵심 공급망 기능 중 하나로, 생산·구매·재고를 통합적으로 계획하는 엔진입니다. 전통적으로 MRP는 플랜트(Plant) 단위로 수행되었지만, 글로벌 제조 환경에서는 동일 플랜트 내에서도 저장 위치별, 하청업체별, 고객 위탁 재고별로 계획을 분리해야 하는 경우가 많습니다. 이때 등장하는 개념이 MRP 영역(MRP Area)입니다.

MRP Area는 플랜트보다 한 단계 세분화된 계획 단위로, 동일한 자재라도 MRP Area마다 별도의 안전재고, 조달 유형, 계획 전략을 가질 수 있습니다. 예를 들어 자동차 부품 제조사가 단일 플랜트에서 자체 생산 라인과 외주 가공업체에 보내는 동일 부품을 별도로 관리해야 한다면, "내부 라인용 MRP Area"와 "외주 가공용 MRP Area"를 분리해 운영합니다.

S/4HANA에서는 이러한 MRP Area 마스터 데이터를 I_MRPArea라는 표준 CDS 뷰로 노출합니다. 이 글에서는 I_MRPArea의 구조, 유형별 차이, 그리고 이를 활용해 계획 재고와 입고 예정 데이터를 읽는 실전 패턴을 다룹니다.

I_MRPArea CDS 뷰의 구조와 핵심 필드

I_MRPArea는 S/4HANA의 가상 데이터 모델(VDM, Virtual Data Model) 계층에서 Basic View에 해당합니다. 기반 테이블은 일반적으로 MDLV(MRP Areas) 및 T001L(저장 위치)과 연관되며, 마스터 데이터 성격의 뷰이므로 트랜잭션 데이터를 직접 포함하지는 않습니다.

주요 필드는 다음과 같이 분류됩니다.

  • MRPArea — MRP 영역 코드(10자리 문자열). 플랜트 코드와 동일하거나, 사용자가 별도로 정의한 식별자
  • Plant — 해당 MRP Area가 속한 플랜트
  • MRPAreaCategory — 영역 유형 (01: 플랜트, 02: 저장 위치, 03: 하청업체)
  • MRPAreaText — MRP Area 설명 텍스트
  • Supplier — 하청업체 유형일 때 채워지는 공급업체 코드
  • StorageLocation — 저장 위치 유형일 때의 저장 위치 코드

버전 측면에서 이 글은 SAP S/4HANA Cloud Public Edition 2402 이상 및 S/4HANA 2023 On-Premise 환경을 기준으로 합니다. 일부 필드는 릴리스에 따라 명칭 또는 노출 여부가 다를 수 있으므로, 실제 시스템에서 SE11 또는 ADT(ABAP Development Tools)의 Data Preview로 확인하는 것을 권장합니다.

MRP Area 유형별 차이: 플랜트 MRP vs 저장 위치 vs 하청업체

MRP Area 유형은 MRPAreaCategory 필드로 구분되며, 실무에서는 다음과 같은 시나리오로 활용됩니다.

  • 유형 01 (Plant MRP Area): 플랜트 자체가 MRP Area인 기본 케이스. 별도 설정이 없는 모든 플랜트는 이 유형으로 자동 생성됩니다.
  • 유형 02 (Storage Location MRP Area): 동일 플랜트 내 특정 저장 위치를 별도 계획 단위로 분리. 예를 들어 완제품 창고와 반제품 창고를 따로 계획해야 할 때 사용합니다.
  • 유형 03 (Subcontractor MRP Area): 하청업체에 제공한 위탁 부품을 해당 업체별로 별도 계획. 자동차/전자 산업의 외주 가공 시나리오에서 일반적으로 사용됩니다.

비유하자면, 플랜트가 "공장 전체"라는 큰 책장이라면 MRP Area는 "층별 칸막이"입니다. 같은 책(자재)이라도 어느 칸에 있느냐에 따라 재고 수치와 발주 시점이 달라집니다.

I_MRPArea를 활용한 계획 재고 조회 실전 예제

다음은 특정 플랜트에 정의된 모든 MRP Area를 조회하는 가장 기본적인 형태의 CDS 컨슈머 뷰 예제입니다. 시나리오는 "서울 본사 제조법인(플랜트 1710)의 MRP Area 현황을 조회하는 분석 화면"입니다.

@AbapCatalog.sqlViewName: 'ZCV_MRPAREA01'
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '플랜트별 MRP Area 현황 조회'
@VDM.viewType: #CONSUMPTION

define view ZC_PlantMrpAreaOverview
  as select from I_MRPArea as area
{
  key area.MRPArea                as PlanningAreaCode,
      area.Plant                  as ManufacturingPlant,
      area.MRPAreaCategory        as AreaTypeCode,
      area.MRPAreaText            as PlanningAreaDescription,
      area.Supplier               as SubcontractingPartner,
      area.StorageLocation        as WarehouseLocation
}
where area.Plant = '1710'

위 컨슈머 뷰는 ADT에서 Data Preview(F8)로 즉시 결과를 확인할 수 있으며, OData 서비스로 노출하면 Fiori Elements 리스트 리포트로도 활용 가능합니다.

입고 예정(Planned Receipts) 데이터 읽기

I_MRPArea 자체는 마스터 데이터 뷰이므로 입고 예정 수량을 직접 가지고 있지 않습니다. 입고 예정 정보는 I_MaterialPlantPeriodicMrpData, I_MaterialStockTimeSeries 또는 MRP 결과를 담는 I_MRPMaterial 계열 뷰와 조인해야 얻을 수 있습니다.

다음은 MRP Area별로 향후 30일간의 예상 입고량을 집계하는 시나리오입니다. 구매팀이 "외주 가공처별 입고 일정을 한 화면에서 보고 싶다"는 요구사항에 대응하는 형태입니다.

@AbapCatalog.sqlViewName: 'ZCV_MRPRECV02'
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'MRP Area별 입고 예정 집계'
@VDM.viewType: #COMPOSITE

define view ZC_PlannedReceiptsByMrpArea
  as select from I_MRPArea as area
  inner join I_MRPMaterial as mrpMat
    on  area.MRPArea = mrpMat.MRPArea
    and area.Plant   = mrpMat.Plant
{
  key area.MRPArea                                 as PlanningAreaCode,
      area.MRPAreaText                             as PlanningAreaDescription,
      area.MRPAreaCategory                         as AreaTypeCode,
      mrpMat.Material                              as ComponentNumber,
      @Semantics.quantity.unitOfMeasure: 'BaseUnitCode'
      sum(mrpMat.PlannedReceiptQuantity)           as TotalIncomingQuantity,
      mrpMat.BaseUnit                              as BaseUnitCode
}
where mrpMat.MRPDate between $session.system_date
                         and dats_add_days($session.system_date, 30, 'NULL')
group by area.MRPArea,
         area.MRPAreaText,
         area.MRPAreaCategory,
         mrpMat.Material,
         mrpMat.BaseUnit

실 시스템에서는 I_MRPMaterial 대신 릴리스/패치에 따라 I_MaterialPlantPeriodicMrpData가 더 적합할 수 있습니다. 환경에 따라 노출되는 필드명이 다르므로 데이터 미리보기로 사전 확인을 권장합니다.

필터 조건 최적화: 성능을 고려한 CDS 쿼리 작성

MRP Area 데이터는 마스터 데이터 성격이지만, 입고 예정/계획 재고와 조인하는 순간 수백만 건의 트랜잭션 레코드를 스캔할 수 있습니다. HANA 옵티마이저가 효율적으로 동작하도록 다음 원칙을 권장합니다.

  • SELECTION 어노테이션 활용: @Consumption.filter를 사용해 사용자가 반드시 입력해야 하는 필터를 명시
  • 조인 순서 최적화: 작은 마스터 뷰(I_MRPArea)를 inner join의 왼쪽에 배치
  • 날짜 범위 제한: 입고 예정 조회 시 반드시 기간 필터 적용
  • 인증 체크: @AccessControl.authorizationCheck: #CHECK 명시로 DCL 권한 적용
@AbapCatalog.sqlViewName: 'ZCV_MRPOPT03'
@AccessControl.authorizationCheck: #CHECK
@Consumption.filter: [
  { fieldName: 'ManufacturingPlant', mandatory: true,  selectionType: #SINGLE },
  { fieldName: 'AreaTypeCode',       mandatory: false, selectionType: #SINGLE },
  { fieldName: 'PlanningHorizonStart', mandatory: true, selectionType: #SINGLE }
]
define view ZC_OptimizedMrpAreaQuery
  with parameters
    p_horizon_days : abap.int2
  as select from I_MRPArea as area
  inner join I_MRPMaterial as mat
    on  area.MRPArea = mat.MRPArea
    and area.Plant   = mat.Plant
{
  key area.Plant            as ManufacturingPlant,
  key area.MRPArea          as PlanningAreaCode,
  key area.MRPAreaCategory  as AreaTypeCode,
      mat.Material          as ComponentNumber,
      mat.MRPDate           as PlanningHorizonStart,
      mat.PlannedReceiptQuantity as IncomingQuantity
}
where mat.MRPDate <= dats_add_days($session.system_date, :p_horizon_days, 'NULL')

ABAP 프로그램에서 I_MRPArea 통합 예제

마지막으로, CDS 뷰를 ABAP 클래스에서 호출해 비즈니스 로직에 통합하는 프로덕션 수준의 예제입니다. 시나리오는 "야간 배치로 MRP Area별 입고 예정 부족분을 감지해 구매 담당자에게 알림을 발송"하는 작업입니다.

CLASS zcl_mrp_area_monitor DEFINITION
  PUBLIC FINAL CREATE PUBLIC.

  PUBLIC SECTION.
    TYPES:
      BEGIN OF ty_shortage,
        planning_area   TYPE i_mrparea-mrparea,
        component       TYPE matnr,
        expected_qty    TYPE p LENGTH 13 DECIMALS 3,
        safety_stock    TYPE p LENGTH 13 DECIMALS 3,
        shortage_qty    TYPE p LENGTH 13 DECIMALS 3,
      END OF ty_shortage,
      tt_shortage TYPE STANDARD TABLE OF ty_shortage WITH EMPTY KEY.

    METHODS detect_shortages
      IMPORTING iv_plant         TYPE werks_d
                iv_horizon_days  TYPE i DEFAULT 14
      RETURNING VALUE(rt_result) TYPE tt_shortage
      RAISING   cx_sy_open_sql_db.
ENDCLASS.

CLASS zcl_mrp_area_monitor IMPLEMENTATION.

  METHOD detect_shortages.
    DATA(lv_horizon_end) = cl_abap_context_info=>get_system_date(
                             ) + iv_horizon_days.

    TRY.
        SELECT area~mrparea            AS planning_area,
               mat~material            AS component,
               SUM( mat~plannedreceiptquantity ) AS expected_qty,
               MAX( mat~safetystockquantity )    AS safety_stock,
               ( MAX( mat~safetystockquantity )
                 - SUM( mat~plannedreceiptquantity ) ) AS shortage_qty
          FROM i_mrparea AS area
          INNER JOIN i_mrpmaterial AS mat
            ON  area~mrparea = mat~mrparea
            AND area~plant   = mat~plant
          WHERE area~plant = @iv_plant
            AND mat~mrpdate BETWEEN @sy-datum AND @lv_horizon_end
          GROUP BY area~mrparea, mat~material
          HAVING SUM( mat~plannedreceiptquantity )
                 < MAX( mat~safetystockquantity )
          INTO TABLE @rt_result.

      CATCH cx_sy_open_sql_db INTO DATA(lx_db).
        cl_bali_log_logger=>get_instance(
          )->add_message( iv_text = lx_db->get_text( ) ).
        RAISE EXCEPTION lx_db.
    ENDTRY.
  ENDMETHOD.

ENDCLASS.

실 환경에 적용할 때는 다음을 추가로 고려합니다.

  • 단위 테스트: CL_OSQL_TEST_ENVIRONMENT로 CDS 뷰 더블을 생성해 격리된 테스트 수행
  • 권한 체크: AUTHORITY-CHECK OBJECT 'M_MATE_WRK'로 플랜트별 권한 검증
  • 대용량 처리: PACKAGE SIZE를 활용한 패키지 단위 페치로 메모리 보호

흔한 실수와 트러블슈팅

Q1. MRP Area 코드와 Plant 코드가 동일한데 왜 별도 레코드가 보이나요?
A. 기본 플랜트 MRP Area는 플랜트 코드와 동일한 이름으로 자동 생성됩니다. MRPAreaCategory = '01' 필터로 구분할 수 있습니다.

Q2. I_MRPMaterial이 시스템에 보이지 않습니다.
A. 일부 릴리스에서는 I_MaterialPlantPeriodicMrpData 또는 I_MRPMaterialFullPlanningResult로 명칭이 다를 수 있습니다. ADT에서 "Search ABAP Repository"로 *MRP*Material* 패턴 검색을 권장합니다.

Q3. CDS 조인 시 데이터가 중복으로 보입니다.
A. 입고 예정 뷰는 MRP 요소(MRP Element)별로 여러 라인을 가질 수 있습니다. GROUP BY + SUM으로 집계하거나, 키 필드를 명확히 지정해야 합니다.

IBP·RAP 연계로 확장하기

이 글에서 다룬 I_MRPArea 패턴은 MRP Live(MD01N), pMRP(Predictive MRP), 그리고 SAP IBP(Integrated Business Planning) 연동의 기초가 됩니다. 다음으로는 MRP 요소별 시계열 분석을 위한 I_MaterialStockTimeSeries, 구매 요청 자동 생성을 위한 BAPI/RAP 연계, Fiori Elements 기반 MRP 모니터링 앱 개발을 권장합니다. 특히 RAP(ABAP RESTful Application Programming Model)로 입고 예정 승인 워크플로를 구축하면 실무 가치가 큽니다.

댓글 0

아직 댓글이 없습니다.