SAP 안전재고 점검 — 있어야 할 재고와 있는 재고, 둘 다 확인합니다
안전재고 대비 현재고를 자재 하나하나 대사해 두면, 결품 위험과 과잉 재고를 한 화면에서 함께 가려낼 수 있습니다
재고 회전율이나 평균재고 지표는 전체 추세를 보여주지만, "이 자재, 지금 얼마나 있어야 안전한가"라는 질문에는 바로 답하지 못합니다. 그래서 자재·플랜트별 평균 일사용량과 리드타임으로 안전재고를 산출하고, 이를 현재고와 나란히 놓고 대사하는 화면을 OpenUI5로 구현했습니다.
충족률(현재고 ÷ 안전재고)이 50% 미만이면 결품 위험이 큰 "점검 필요", 100% 미만이거나 300%를 넘으면 "확인 필요"로 자동 판정합니다. 표준 재고 조회 기능이 담당하는 현재고 조회 위에, 자재별로 계산한 안전재고 기준선을 더한 셈입니다. 실제 구동 화면 3종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 재고 현황 — 재고 현황 조회(
MMBE)의 플랜트·자재별 재고수량 구조를 그대로 이어받습니다 - 수급 목록 — 재고/요구사항 목록(
MD04)의 결품 위험 판단 관점을 화면의 판정 로직으로 옮겨 왔습니다 - 재고 분석 — 재고 분석(
MC.9)의 표준 분석 관점을 안전재고 대사 관점으로 보완합니다 - 마스터 조회 — 자재 마스터 조회(
MM03)의 리드타임 필드를 안전재고 산출에 그대로 활용합니다
| 항목 | 내용 |
|---|---|
| 업무 영역 | 구매(MM) · 재고 분석 |
| Namespace | zui5.safetystk |
| 셸 구조 | 조회조건 영역(우측 조회) + 대사 요약 KPI 4종 + 탭 3개, 행 클릭 상세 Dialog |
| 화면 수 | 조회 화면 1개(탭 3개) + 상세 다이얼로그 |
| SAP 표준 T-code | MMBE · MD04 · MC.9 · MM03 |
| 데이터 연동 방식 | OData V2 — 화면 블록마다 엔티티셋에 직접 바인딩 |
| 성격 | 조회·점검형 — 실제 발주·재고 조정 판단은 회사가 수행 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 3종 둘러보기
기본 조건으로 조회하면 요약 KPI와 그룹별 요약이 뜹니다 → 자재별 명세 탭에서 자재 단위로 확인하고 → 행을 클릭해 상세를 봅니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
사용 방법
- 화면에 들어오면 전체 조건으로 자동 조회가 1회 실행되어 그룹별 요약·자재별 명세·월별 추이가 함께 채워집니다.
- 조회조건 영역에서 플랜트·자재그룹·판정을 선택합니다(선택하지 않으면 전체). 자재/자재명은 검색어 입력 필드에 직접 입력합니다(선택 입력).
- 조회 버튼은 조회조건 입력 필드 줄의 가장 오른쪽에 있습니다. 자재 검색어 입력 필드에서 Enter 키를 눌러도 같은 조회가 실행됩니다. 초기화 버튼은 모든 조건을 지우고 다시 조회합니다.
- 상단 카드에서 조회 자재 수 · 부족·과잉 후보 · 부족분 재고금액 · 후보 비중을 먼저 확인합니다.
- 탭을 옮겨 그룹별 요약 → 자재별 명세 → 월별 추이 순으로 봅니다.
- 자재별 명세에서 행을 클릭하면 해당 자재의 산출 근거가 다이얼로그로 열립니다.
- 자재별 명세 탭의 CSV 내려받기(UTF-8 BOM)로 현재 조회 결과를 저장합니다.
부족·과잉 판정 기준
| 판정 조건(충족률 = 현재고 ÷ 안전재고 × 100) | 결과 상태 | 사용자 조치 |
|---|---|---|
| 충족률 < 50% | 점검 필요 | 결품 위험이 높은 자재로, 발주·생산계획 담당자의 우선 확인이 필요 |
| 50% ≤ 충족률 < 100% | 확인 필요 | 안전재고에 못 미치는 상태로, 보충 계획을 점검 |
| 100% ≤ 충족률 ≤ 300% | 정상 | 조치 없음 |
| 충족률 > 300% | 확인 필요 | 과잉 재고 후보로, 발주 주기·수량 조정을 점검 |
위 구간·판정은 조회·점검을 돕기 위한 기준이며, 실제 발주·재고 조정 여부는 화면이 단정하지 않고 담당자와 관련 부서의 검토를 거칩니다.
안전재고 산출·대사 절차
| 단계 | 내용 |
|---|---|
| 1단계 | 자재·플랜트별 평균 일사용량과 리드타임(일)을 확인 |
| 2단계 | 안전재고 = 평균 일사용량 × (리드타임 + 버퍼일)로 산출 |
| 3단계 | 현재고와 비교해 충족률·부족수량(= max(0, 안전재고 − 현재고))을 계산 |
| 4단계 | 충족률 구간에 따라 판정(정상 / 확인 필요 / 점검 필요)을 부여 |
| 5단계 | 플랜트·자재그룹별로 자재수·후보건수·부족분 금액·재고금액을 집계(그룹 합계 = 명세 합계) |
| 6단계 | 월별로 후보건수·부족분 금액 추이를 별도 집계(당월 추이 = 현재 그룹별 요약 합계) |
조회조건
| 필드 | 필수 | 설명 |
|---|---|---|
| 플랜트 | 선택 | 전체면 조건 제외 |
| 자재그룹 | 선택 | 원재료 · 포장재 · 제품 · 소모성자재 — 전체면 조건 제외 |
| 판정 | 선택 | 정상 · 확인 필요 · 점검 필요 — 자재별 명세에만 적용 |
| 자재/자재명 | 선택 | 자재코드 또는 자재명 일부로 검색 — 자재별 명세에만 적용 |
결과 컬럼
| 컬럼 | 설명 |
|---|---|
| 플랜트 · 자재그룹 | 그룹별 요약의 집계 축 |
| 자재수 · 후보 건수 · 부족분 금액 · 재고금액 | 그룹에 속한 자재 건수와 후보 건수·금액 합계 |
| 자재 · 자재명 · 자재그룹 | 자재별 명세의 자재 식별 정보 |
| 안전재고 · 현재고 · 충족률 · 부족수량 | 대사 산출값 |
| 판정 | 정상 · 확인 필요 · 점검 필요 |
| 년월 · 후보 건수 · 부족분 금액 | 월별 추이의 플랜트별 집계 |
SAP 표준 기능 매핑
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 그 데이터에 안전재고 대사 관점을 더해 확장합니다.
| 표준 T-code | 표준 기능 | 이 화면이 더한 것 |
|---|---|---|
MMBE | 재고 현황 조회 | 플랜트·자재별 재고수량 위에 안전재고 대비 충족률 축을 더합니다 |
MD04 | 재고/요구사항 목록 | 결품 위험 판단 관점을 자재별 판정 로직으로 재구성합니다 |
MC.9 | 재고 분석 | 표준 재고 분석 관점을 안전재고 대사 관점으로 보완합니다 |
MM03 | 자재 마스터 조회 | 리드타임 마스터 필드를 안전재고 산출에 활용합니다 |
분석 지표 정의표
| 대상 영역 | 지표 | 정의 | 원천 데이터 |
|---|---|---|---|
| 재고 분석 | 안전재고 | 평균 일사용량 × (리드타임일수 + 버퍼일) | 소비이력, 리드타임 마스터 |
| 재고 분석 | 충족률 | 현재고 ÷ 안전재고 × 100 | 재고, 안전재고 산출값 |
| 재고 분석 | 부족수량 | max(0, 안전재고 − 현재고) | 재고, 안전재고 산출값 |
참고 CDS 뷰
| 원천 테이블 | 주요 필드 | 쓰임 |
|---|---|---|
MARA / MAKT | MATNR · MATKL · MAKTX | 자재 마스터 — 자재·자재그룹·자재명 |
MARC | WERKS · PLIFZ | 플랜트별 자재 데이터 — 리드타임 |
MARD | WERKS · LABST | 플랜트별 재고 — 현재고 수량 |
MBEW | VERPR · STPRZ | 자재 평가 — 단가 |
define view entity ZC_SafetyStockItem
as select from marc as c
inner join mara as m on m.matnr = c.matnr
inner join makt as t on t.matnr = c.matnr and t.spras = 'K'
inner join mard as d on d.matnr = c.matnr and d.werks = c.werks
inner join mbew as w on w.matnr = c.matnr and w.bwkey = c.werks
{
key c.werks as Plant,
key c.matnr as Material,
t.maktx as MaterialText,
m.matkl as MatlGroup,
c.plifz as LeadTimeDays,
sum( d.labst ) as CurrentStock,
w.verpr as UnitPrice
}
group by c.werks, c.matnr, t.maktx, m.matkl, c.plifz, w.verpr
계정·마스터 구성은 가상 데이터 기준 스케치입니다. 평균 일사용량은 소비이력을 별도 집계한 파생값입니다.
OpenUI5 구성
| 기능 | 사용 컨트롤 · 구성 |
|---|---|
| 화면 골격 | sap.m.Page + 조회조건 패널 · 요약 KPI · IconTabBar 3개 탭 |
| 데이터 연동 | manifest.json dataSources.mainService(OData V2, 상대 경로)로 기본 모델을 만들고 defaultCountMode:"Inline" · useBatch:false 로 구성합니다. 화면 블록마다 해당 엔티티셋에 직접 바인딩합니다 |
| 조회조건 | sap.ui.model.Filter 로 조립해 바인딩에 적용합니다. 전체를 고른 조건은 필터를 만들지 않습니다. 정렬은 Sorter, 총건수는 인라인 카운트로 받습니다 |
| 그룹별 요약 · 자재별 명세 | sap.m.Table — 행 클릭(press)으로 상세 다이얼로그를 엽니다 |
| 예외 메시지 | 메타데이터 실패·요청 실패·빈 결과를 구분해 안내하는 전용 처리기 |
파일 구성
| 경로 | 역할 |
|---|---|
index.html | OpenUI5 부트스트랩 — sap_horizon, OData 서비스에 연결 |
Component.js | 모델 초기화, 예외 메시지 처리기 연결 |
manifest.json | 앱 디스크립터 — zui5.safetystk · ko 로케일, OData 서비스와 모델 선언 |
view/Main.view.xml | 조회조건 · 요약 KPI · 3개 탭 |
view/DetailDialog.fragment.xml | 자재 상세 다이얼로그 |
controller/Main.controller.js | 조회조건 조립 · 바인딩 · 다이얼로그 · CSV |
controller/BaseController.js | CSV 다운로드 공통 처리 |
model/formatter.js · model/ErrorHandler.js | 표시 서식 · 예외 메시지 처리 |
i18n/i18n_ko.properties | 화면 문구 |
검증 결과
검증용 샘플 데이터(자재 58건, 플랜트 2개)를 기준으로 대사식을 전수 검증했습니다. 경계 판정 동작을 확인하기 위해 현재고가 0인 결품 사례 1건과 안전재고가 미설정(0)인 사례 1건을 의도적으로 포함했습니다.
| 검증 항목 | 결과 |
|---|---|
| 그룹별 요약 합계 = 자재별 명세 합계 (8건 — 플랜트×자재그룹) | 통과(차이 0) |
| 부족수량 = max(0, 안전재고 − 현재고) (58건 전수) | 통과(차이 0) |
| 월별 추이 당월 합계 = 그룹별 요약 현재 합계 (플랜트 2개) | 통과(차이 0) |
| 조회 조건 전달 — 플랜트·자재그룹·판정 필터 · 충족률 오름차순 정렬 · 총건수 표시 | 확인 |
| 표시 금지 검사 — 커스텀 프로그램ID·앱 식별자·출처 표현 | 0건 |
화면 렌더링 — 조회 버튼 위치 · sap_horizon 테마 · Enter 키 조회 · 서비스 미연결 시 안내 메시지 | 확인 |
모든 데이터는 검증용으로 구성한 가상 데이터입니다.
자주 묻는 질문
안전재고는 어떤 기준으로 산출되나요?
자재·플랜트별 평균 일사용량에 (리드타임일수 + 버퍼일)을 곱해 산출합니다. 조회 시점의 소비이력·리드타임 마스터를 기준으로 매번 다시 계산합니다.
"점검 필요"로 표시되면 바로 발주해야 하나요?
아닙니다. 이 화면은 조회·점검을 돕는 도구이며, 발주·재고 조정 등 최종 판단은 담당자와 관련 부서가 별도 절차와 기준에 따라 결정합니다.
재고 회전율 점검과는 어떻게 다른가요?
회전율은 일정 기간의 출고금액과 평균재고를 비교하는 지표이고, 이 화면은 자재 한 건 한 건의 현재고를 그 자재에 필요한 안전재고 수준과 직접 대사합니다. 회전율이 정상이어도 특정 자재만 결품 위험이나 과잉 상태인 경우를 함께 확인할 수 있습니다.
안전재고가 설정되지 않은 자재는 어떻게 표시되나요?
안전재고 값이 0(미설정)인 자재는 판정을 임의로 내리지 않고 충족률을 "확인 필요"로 표기합니다. 마스터 설정 여부를 먼저 확인하도록 안내합니다.