솔루션 홈
자재 소요량 전개

SAP 자재 소요량 전개(MRP) 현황 — 재고가 마이너스로 떨어지는 날을 미리 본다

자재 하나하나의 입고·소요 예정을 날짜순으로 이어 붙이면, 재고가 부족해지는 순간이 미리 보입니다. 그 순간만 자동으로 골라내는 화면입니다.

자재 하나의 재고가 부족해지는지는 재고 수량 한 줄만 봐서는 알 수 없습니다. 지금 남은 재고에 앞으로 들어올 구매발주·계획오더·생산오더를 더하고, 나갈 판매오더·예약출고·의존소요를 뺀 누계가 날짜를 따라 어떻게 움직이는지를 봐야 합니다. 그 누계가 0 밑으로 떨어지는 바로 그 날짜가 현장에서 가장 궁금한 값입니다.

SAP 표준 MRP 요소 데이터 구조를 그대로 이어받아, 자재별로 이 누계를 예정일 순으로 전개하고 재고부족이 예상되는 최초 시점을 자동으로 짚어 주도록 OpenUI5 화면으로 확장한 것이 ZLPP0010입니다. 기존에 공개한 구매발주 미입고 현황이 "구매발주 한 문서 유형"의 지연만 다뤘다면, 이 화면은 입고계·소요계 MRP 요소 전체를 같은 타임라인 위에 올려 자재 단위의 재고부족 위험을 종합적으로 판정한다는 점에서 다릅니다. 실제 구동 화면 4종을 함께 공개합니다.

SAP 표준 기능을 그대로 이어받은 부분

  • MRP 요소 생성 — 표준 MRP 실행(MD01·MD02)이 만든 계획오더·의존소요를 그대로 사용
  • 구매 요소 — 구매요청(EBAN) · 구매발주(EKKO/EKPO/EKET)
  • 생산 요소 — 계획오더(PLAF) · 생산오더(AFKO/AFPO) · 예약(RESB)
  • 판매 요소 — 판매오더(VBAK/VBAP/VBEP)
  • 재고 · 자재마스터 — 플랜트 재고(MARD) · MRP뷰(MARC)
항목내용
업무 영역생산관리(PP) · 자재소요계획(MRP)
Namespacezui5.stockreq
셸 구조조회조건 영역(우측 조회) + 자재별 MRP요소 전개 그리드, 자재 상세 타임라인 Dialog
화면 수조회 화면 1개 + 상세 타임라인 Dialog
기준 T-codeMD04 (재고/소요량 리스트) — 다건 자재를 한 화면에서 훑어보는 관점으로 확장
성격조회·판정형 — MRP 요소 생성·실행은 표준 트랜잭션이 담당
UI 테마sap_horizon 단일 적용

실제 화면 4종 둘러보기

플랜트·MRP관리자를 좁히고 조회하면 자재별 MRP요소가 타임라인으로 펼쳐집니다 → 메시지스트립과 예외상태 컬럼으로 재고부족 자재를 바로 확인하고 → 행을 눌러 그 자재의 전체 타임라인 상세를 봅니다.

아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.

Main.view.xml
메인 화면 - 조회조건
메인 화면 — 조회조건 — 플랜트·MRP관리자·자재·MRP요소구분·조회기간을 넣는 조회조건이 헤더 영역 안에 있고, 조회·초기화 버튼은 그 영역 오른쪽 끝에 있습니다. 아직 조회 전이라 결과 영역은 비어 있습니다.
조회 결과
조회 결과 화면
조회 결과 — 18개 자재 199행, 재고부족 5개 자재 즉시 표시 — 조회 버튼 한 번으로 18개 자재·199행이 펼쳐지고, 메시지스트립이 재고부족 예상 자재 수(5개)를 바로 알려줍니다. 예외상태 컬럼의 경고 아이콘으로 어느 행에서 재고가 마이너스로 넘어가는지 한눈에 짚입니다.
Enter 키 조회
Enter 키로 즉시 재조회
Enter 키 조회 — 자재코드 입력 후 바로 재조회 — 자재코드 입력 필드에 값을 넣고 Enter 키만 누르면 버튼을 따로 누르지 않아도 즉시 재조회됩니다. 18개 자재가 4개 자재(39행)로 좁혀지는 것을 그대로 캡처했습니다.
상세보기 다이얼로그
상세보기 다이얼로그 — 자재별 전개 타임라인
상세보기 다이얼로그 — 기초재고부터 예정일 순 전체 타임라인 — 행의 상세 버튼을 누르면 그 자재의 현재고·안전재고·재고부족 최초예상일 요약과 함께, 기초재고부터 예정일 순으로 전개된 MRP요소 전체 타임라인을 다이얼로그로 보여줍니다.

조작 방법

  1. 플랜트 · MRP관리자로 대상을 좁히고, 필요하면 자재(코드/명) 일부를 입력합니다.
  2. MRP요소구분을 특정 유형(예: 판매오더)으로 좁혀도 가용재고 누계 계산 자체는 항상 그 자재의 전체 MRP요소 이력을 기준으로 이뤄집니다. 필터는 화면에 보여줄 행만 줄일 뿐입니다.
  3. [조회] 버튼을 누르거나 아무 조회조건 필드에서나 Enter 키를 눌러도 즉시 재조회됩니다.
  4. 결과 그리드 행의 오른쪽 화살표(상세) 버튼을 누르면 그 자재의 전체 타임라인 상세 다이얼로그가 열립니다.
  5. 다이얼로그의 요약 카드에서 현재고 · 안전재고 · 재고부족 최초예상일을 한 번에 확인합니다.
  6. 하단 툴바의 [CSV 다운로드]로 현재 조회 결과를 그대로 내려받습니다.

가용재고 누계 판정 로직

자재(플랜트+자재코드) 단위로 그 자재에 걸린 모든 MRP요소를 예정일 → 요소 우선순위 순으로 정렬한 뒤, 기초재고에서 시작해 요소를 하나씩 반영하며 누계를 이어갑니다. 같은 날짜에 여러 요소가 겹치면 입고계(구매발주 → 계획오더 → 생산오더 → 구매요청)를 소요계(판매오더 → 예약출고 → 의존소요)보다 먼저 반영합니다.

단계계산
0. 시작가용재고 누계 = 자재의 기초재고(조회기준일 시점)
1. 반영MRP요소를 정렬된 순서대로 하나씩 누계에 더합니다 (입고 = +, 소요 = -)
2. 판정누계가 0 미만으로 떨어지는 최초 요소의 예정일을 재고부족 최초예상일로 기록합니다
3. 표시재고부족 최초예상일이 있는 자재는 예외상태 = "재고부족 예상", 없으면 "정상"

계산과 검증을 분리한 이유

이 로직은 Node.js로 별도 재구현해 모의데이터(자재 18건·MRP요소 181건) 전체를 다시 계산한 뒤, 앱이 실제로 표시한 값과 같은 5개 자재가 재고부족으로 판정되는지, 각 자재의 재고부족 최초예상일과 최종 가용재고 누계가 자재마스터·MRP요소 원본 수치와 정확히 일치하는지 교차검증했습니다.

MRP요소 수집부터 예외 표시까지 처리 흐름

단계처리 내용
① 조건 축소플랜트 · MRP관리자 · 자재코드/명 조건으로 대상 자재를 먼저 추립니다
② 전체 이력 로드추려진 자재마다 그 자재에 걸린 전체 MRP요소(필터 무시)를 가져옵니다
③ 정렬 · 전개예정일 → 요소 우선순위로 정렬한 뒤 가용재고 누계를 순차 계산합니다
④ 표시 필터 적용계산이 끝난 뒤에야 MRP요소구분 · 조회기간(~까지) 필터로 화면에 보여줄 행만 추립니다
⑤ 정렬 · 출력플랜트 → 자재 → 예정일 순으로 정렬해 그리드에 표시하고, 재고부족 자재 수를 메시지스트립에 요약합니다

③(계산)과 ④(표시 필터)를 분리한 것이 이 화면의 핵심입니다. 필터링을 먼저 하고 나중에 누계를 계산하면, 예컨대 "판매오더만" 필터링했을 때 그 사이에 있던 구매발주 입고분이 계산에서 빠져 가용재고 누계가 실제보다 낮게 나옵니다. 그래서 항상 원본 전체 이력으로 먼저 계산하고, 화면에 무엇을 보여줄지는 그다음에 결정합니다.

조회조건

필드설명
플랜트Select — 전체 / 서울 본사공장 / 구미 생산공장 / 창원 부품공장
MRP관리자Select — 전체 / 담당자별 MRP관리자 코드
자재(코드/명)Input — 자재코드 또는 자재명 부분 일치
MRP요소구분Select — 전체 / 구매요청 / 구매발주 / 계획오더 / 생산오더 / 판매오더 / 예약출고 / 의존소요
조회기간(~까지)DatePicker — 지정 시 그 날짜까지의 요소만 표시(계산에는 영향 없음)

결과 컬럼

컬럼의미 · 산출
플랜트 · 자재코드 · 자재명 · MRP관리자자재마스터 그대로
MRP요소구분요소 타입 코드 → 한글 라벨 + 아이콘 매핑
MRP요소번호요소별 문서번호/Item (구매요청 · 구매발주 · 계획오더 · 생산오더 · 판매오더 · 예약)
예정일요소의 예정일자 (기초재고 행은 조회기준일)
입고/소요수량입고 = +수량, 소요 = -수량 (부호로 방향 표현)
가용재고(누계)산출값 = 이전 누계 + 이 행의 입고/소요수량
거래처/참조구매발주 = 구매처명, 판매오더 = 고객명, 예약 · 의존소요 = 참조 텍스트
예외상태산출값 = 가용재고(누계) < 0 이면 "재고부족 예상", 아니면 "정상"

SAP 표준 기능 매핑

이 화면은 MRP 실행이나 요소 생성을 대체하지 않습니다. 계획오더 · 의존소요 같은 MRP 요소는 표준 MRP 실행이 만들고, 구매 · 생산 · 판매 각 모듈의 표준 트랜잭션이 나머지 요소를 쌓습니다. 이 화면은 그 요소를 자재 단위 타임라인으로 재구성해 재고부족 시점만 먼저 짚어 주는 조회 레이어입니다.

테이블 · 오브젝트역할
MARD · MARC플랜트 재고(기초재고) · MRP뷰(안전재고/재발주점)
EBAN구매요청 — 미승인/미전환 잔량
EKPO · EKET구매발주 — 미입고 잔량과 확정 납기일
PLAF계획오더 — 입고예정일/수량
AFKO · AFPO생산오더 — 완료예정일 기준 입고
VBAP · VBEP판매오더 — 미출고 잔량과 일정 확정일
RESB예약출고 · 의존소요 — 생산오더 자재 불출/BOM 하위자재 소요

도입 시 확인이 필요한 부분

같은 날짜에 여러 MRP요소가 겹칠 때의 반영 순서(입고계 우선)는 화면 안에서 정한 단순화된 규칙이며, 실제 도입 때는 표준 MRP 처리 순서와 예외 메시지 체계에 맞춰 조정합니다. 재고부족 최초예상일은 경보용 산출값일 뿐 결품 확정을 의미하지 않으므로, 실제 조치는 담당자의 후속 판단을 거칩니다.

참고 CDS 뷰

운영 서비스로 연결할 때는 자재별 재고와 MRP요소를 UNION으로 모은 뷰로 서빙하는 구성을 제안합니다.

@AbapCatalog.sqlViewName: 'ZCSTOCKREQ'
@EndUserText.label: '재고/소요량 전개 라인 (Z)'
define view Z_C_STOCKREQ_TIMELINE
  as select from mard as Stock
  association [0..*] to eket as _PoSchedule on _PoSchedule.ebeln = Stock.matnr  // 실제로는 EKPO 경유
  association [0..*] to vbep as _SoSchedule on _SoSchedule.vbeln = Stock.matnr  // 실제로는 VBAP 경유
{
  key Stock.werks,
  key Stock.matnr,
      Stock.labst              as Bestand,
      // 입고계 : 구매발주(EKPO/EKET) · 계획오더(PLAF) · 생산오더(AFKO/AFPO)
      // 소요계 : 판매오더(VBAP/VBEP) · 예약(RESB)
      // 애플리케이션 레이어에서 두 그룹을 UNION 후 예정일 순 정렬 → 가용재고 누계 계산(위 판정 로직)
      _PoSchedule,
      _SoSchedule
}

매핑 이해를 돕기 위한 참고용 설계입니다. 실제 도입 시에는 운영 환경의 MRP 요소 저장 구조와 플랜트별 예외 메시지 설정에 맞춰 조정합니다.

OpenUI5 구성

기능사용 컨트롤
화면 골격sap.f.DynamicPage — 조회조건은 헤더 영역, 결과는 content 영역
조회조건sap.m.Select · sap.m.Input · sap.m.DatePicker — 조회조건 영역 오른쪽 끝에 조회/초기화 버튼
결과 그리드sap.ui.table.Table — 11개 컬럼 · 수백 행 스크롤과 RowAction 지원
상세 다이얼로그sap.m.Dialog + sap.m.Table — 자재 1건의 타임라인만 보여주는 소량 데이터
모델ModelMain(조회조건/결과) · ModelMainView(화면상태/상세) · ModelMock(localdata fetch) 3분리
다운로드공통 BaseController.downloadCsv — UTF-8 BOM 포함 CSV
테마sap_horizon — index.html 부트스트랩에서 고정

파일 구성

경로역할
index.htmlOpenUI5 부트스트랩 — sap_horizon · lodash · moment
Component.js디바이스 모델 · 라우터 초기화
manifest.json앱 디스크립터 — 앱 ID(zui5.stockreq) · ko 로케일
view/Main.view.xml · view/fragments/*조회조건 · 메시지스트립 · 결과 그리드 · 상세 다이얼로그
controller/Main.controller.js자재 필터링 · 타임라인 전개 · 가용재고 계산 · 예외 판정
model/ModelMock.jslocaldata JSON 읽기(Promise)
js/formatter.js수량 · 일자 · 요소구분 · 예외상태 포맷
i18n/i18n_ko.propertiesko 로케일 리소스
localdata/*.json플랜트 3건 · MRP관리자 4건 · 자재 18건 · MRP요소 181건

운영 전환 시에는 ModelMock 내부만 실제 서비스 호출로 바꾸면 화면과 판정 로직은 그대로 씁니다.

검증 결과

화면 구성에 쓴 데이터는 자재 18건 · MRP요소 181건(입고 76건 · 소요 105건)이며, 이 중 5개 자재가 조회기간 내 재고부족으로 판정됩니다.

검증 항목결과
XML/JSON 전체 파싱 (manifest 1 · JSON 4 · XML 8)통과
정적 리소스 200 확인 (app 폴더 문서루트, 27개 파일)통과
i18n 키 · 뷰 이벤트 핸들러 누락 점검0건
가용재고 누계 · 재고부족 판정 로직 Node.js 재구현 교차검증100% 일치 (5/18 자재 재고부족)
화면 렌더링 — 실브라우저에서 조회 → Enter 재조회 → 상세 실동작 후 캡처4/4
조회 버튼 위치 — 조회조건 영역 오른쪽 끝(하단 푸터 아님)통과
적용 테마 sap_horizon — 부트스트랩 · 런타임 이중 확인통과

거래처 · 자재명 · 수량은 모두 검증용 데이터입니다.

자주 묻는 질문

MRP요소구분 필터를 걸면 가용재고 누계도 그 유형만으로 다시 계산되나요?

아니요. 필터는 화면에 보여줄 행만 추릴 뿐이고, 가용재고 누계는 항상 그 자재에 걸린 전체 MRP요소 이력을 기준으로 계산합니다. 필터링부터 먼저 하면 화면에 안 보이는 구간의 입고·소요가 계산에서 빠져 누계가 실제와 달라지기 때문에, 계산을 먼저 끝내고 그다음에 표시 여부만 걸러냅니다.

재고부족 예상으로 표시된 자재는 실제로 결품이 확정된 것인가요?

아니요. 이 화면은 현재 시스템에 등록된 MRP 요소를 그대로 전개한 결과이며, 이후 구매요청 승인이나 계획오더 전환 같은 추가 조치가 들어오면 결과는 달라집니다. 재고부족 최초예상일은 확정 통보가 아니라, 담당자가 먼저 조치할 시점을 알려 주는 경보 신호로 쓰는 값입니다.

같은 날짜에 입고와 소요가 함께 있으면 어느 쪽이 먼저 반영되나요?

구매발주 → 계획오더 → 생산오더 → 구매요청 순의 입고계를, 판매오더 → 예약출고 → 의존소요 순의 소요계보다 먼저 반영합니다. SAP MD04가 요소를 정렬하는 규칙을 화면 안에서 단순화해 적용한 우선순위입니다.

SAP 표준 기능과 어떻게 이어지나요?

MRP 요소 자체는 표준 MRP 실행(MD01·MD02)과 구매·생산·판매 각 모듈의 표준 트랜잭션이 만들어 시스템에 쌓습니다. 이 화면은 그 요소를 새로 만들거나 바꾸지 않고, 자재 단위 타임라인으로 재구성해 가용재고 누계와 재고부족 시점만 먼저 짚어 주는 조회·판정 레이어입니다.

자재 재고부족, 지금 쓰는 SAP 위에서 미리 확인해 보세요

재고가 실제로 부족해진 뒤에 대응하는 대신, MRP 요소가 쌓이는 시점에 미리 짚어낼 수 있으면 구매·생산 담당자의 대응 시간이 늘어납니다. 현재 SAP 환경 기준으로 어떻게 적용되는지 함께 확인해 드립니다.

MRP재고소요량MD04가용재고재고부족OpenUI5