SAP 재고 장기체류 점검 — 재고는 있는데, 언제부터 안 움직였는지부터 본다
재고 회전율만 보면 놓치는 자재가 있습니다. 최종 입출고일 기준으로 얼마나 오래 멈춰 있었는지부터 구간으로 나눠 봤습니다
재고 회전율이나 평균재고 지표는 전체 흐름은 잘 보여주지만, 특정 로트나 품목 하나가 오래 멈춰 있는 상황은 평균에 묻혀 잘 드러나지 않습니다. 그래서 자재·플랜트별로 최종 입출고일을 기준 삼아 지금까지 얼마나 지났는지를 구간으로 나눠 보는 방식을 OpenUI5 화면으로 구현했습니다.
경과일수를 0~30일 · 31~60일 · 61~90일 · 91~180일 · 181일 이상 다섯 구간으로 나누고, 플랜트·자재그룹별로 구간 금액을 집계해 91일 이상(장기체류) 비중을 바로 확인할 수 있게 했습니다. 표준 재고 조회·분석 기능이 담당하는 재고수량·평가금액 위에 경과일수라는 축 하나를 더한 셈입니다. 실제 구동 화면 6종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 재고 현황 — 재고 현황 조회(
MMBE)의 플랜트·자재별 재고수량 구조를 그대로 이어받습니다 - 창고 재고 목록 — 창고 재고 목록(
MB52)의 재고수량·평가금액 조회 방식을 참고해 구간별 요약을 구성합니다 - 기간별 조회 — 기간별 재고 조회(
MB5B)의 스냅샷 개념을 월별 추이 탭으로 확장합니다 - 재고 분석 — 재고 분석(
MC.9)의 표준 분석 관점을 경과일수 기반 관점으로 보완합니다
| 항목 | 내용 |
|---|---|
| 업무 영역 | 구매(MM) · 재고 분석 |
| Namespace | zui5.stockage |
| 셸 구조 | 조회조건 영역(우측 조회) + 대사 요약 KPI 4종 + 탭 3개, 행 클릭 상세 Dialog |
| 화면 수 | 조회 화면 1개(탭 3개) + 상세 다이얼로그 |
| SAP 표준 T-code | MMBE · MB52 · MB5B · MC.9 |
| 데이터 연동 방식 | OData V2 — 화면 블록마다 엔티티셋에 직접 바인딩 |
| 성격 | 조회·점검형 — 실제 처분·평가충당 판단은 회사가 수행 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 6종 둘러보기
기본 조건으로 조회하면 대사 요약과 구간별 요약이 뜹니다 → 품목별 명세 탭에서 자재 단위로 확인하고 → 월별 추이 탭에서 흐름을 보고 → 자재를 검색하거나 행을 클릭해 상세를 봅니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
사용 방법
- 화면에 들어오면 전체 조건으로 자동 조회가 1회 실행되어 구간별 요약·품목별 명세·월별 추이가 함께 채워집니다.
- 조회조건 영역에서 플랜트·자재그룹·경과구간을 선택합니다(선택하지 않으면 전체). 자재/자재명은 검색어 입력 필드에 직접 입력합니다(선택 입력).
- 조회 버튼은 조회조건 입력 필드 줄의 가장 오른쪽에 있습니다. 자재 검색어 입력 필드에서 Enter 키를 눌러도 같은 조회가 실행됩니다. 초기화 버튼은 모든 조건을 지우고 다시 조회합니다.
- 상단 카드에서 전체 재고금액 · 장기체류(91일 이상) 금액 · 장기체류 비중 · 조회 품목 수를 먼저 확인합니다.
- 탭을 옮겨 구간별 요약 → 품목별 명세 → 월별 추이 순으로 봅니다.
- 품목별 명세에서 행을 클릭하면 해당 자재의 상세 항목이 다이얼로그로 열립니다.
- 품목별 명세 탭의 CSV 내려받기(UTF-8 BOM)로 현재 조회 결과를 저장합니다.
경과구간 판정 기준
| 판정 조건(최종 입출고일 기준 경과일수) | 결과 상태 | 사용자 조치 |
|---|---|---|
| 0 ~ 90일 | 정상 | 조치 없음 |
| 91 ~ 180일 | 확인 필요 | 담당자가 수요·처분 계획을 확인 |
| 181일 이상 | 점검 필요 | 장기체류 사유·평가충당 필요 여부를 점검 |
위 구간·판정은 조회·점검을 돕기 위한 기준이며, 실제 폐기·평가충당 여부는 화면이 단정하지 않고 담당자와 관련 부서의 검토를 거칩니다.
구간화·집계 처리 절차
| 단계 | 내용 |
|---|---|
| 1단계 | 자재·플랜트별 최종 입출고일을 기준일과 비교해 경과일수를 산출 |
| 2단계 | 경과일수를 5개 구간(0~30 / 31~60 / 61~90 / 91~180 / 181일 이상)으로 분류 |
| 3단계 | 플랜트·자재그룹·구간 조합으로 품목수·재고수량·재고금액을 집계 |
| 4단계 | 구간별 집계금액을 플랜트 합계로 나눠 플랜트 내 비중을 계산(구간별 비중의 합 = 100%) |
| 5단계 | 월별로 총 재고금액과 91일 이상(장기체류) 금액·비중을 별도 집계해 추이 구성 |
조회조건
| 필드 | 필수 | 설명 |
|---|---|---|
| 플랜트 | 선택 | 전체면 조건 제외 |
| 자재그룹 | 선택 | 원재료 · 포장재 · 제품 · 소모성자재 — 전체면 조건 제외 |
| 경과구간 | 선택 | 5개 구간 중 선택 — 구간별 요약·품목별 명세에만 적용 |
| 자재/자재명 | 선택 | 자재코드 또는 자재명 일부로 검색 — 품목별 명세에만 적용 |
결과 컬럼
| 컬럼 | 설명 |
|---|---|
| 플랜트 · 자재그룹 · 경과구간 | 구간별 요약의 집계 축 |
| 품목수 · 재고수량 · 재고금액 | 구간에 속한 자재 건수와 수량·금액 합계 |
| 플랜트 내 비중 | 플랜트 합계 대비 구간 금액 비중 |
| 자재 · 자재명 · 자재그룹 | 품목별 명세의 자재 식별 정보 |
| 최종 입출고일 · 경과일수 | 구간화 산출 기준 |
| 상태 | 정상 · 확인 필요 · 점검 필요 |
| 총 재고금액 · 장기체류 금액 · 비중 | 월별 추이의 플랜트별 집계 |
SAP 표준 기능 매핑
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 그 데이터에 경과일수 기반 조회·점검 관점을 더해 확장합니다.
| 표준 T-code | 표준 기능 | 이 화면이 더한 것 |
|---|---|---|
MMBE | 재고 현황 조회 | 플랜트·자재별 재고수량 위에 경과일수·구간 축을 더합니다 |
MB52 | 창고 재고 목록 | 재고수량·평가금액을 구간별로 재집계합니다 |
MB5B | 기간별 재고 조회 | 기간 스냅샷 개념을 월별 장기체류 추이로 확장합니다 |
MC.9 | 재고 분석 | 표준 재고 분석 관점을 경과일수 기반 장기체류 관점으로 보완합니다 |
분석 지표 정의표
| 대상 영역 | 지표 | 정의 | 원천 데이터 |
|---|---|---|---|
| 재고 분석 | 경과일수 | 기준일 − 최종 입출고일 | 자재이동 최종일자 |
| 재고 분석 | 장기체류 비중 | 91일 이상 구간 금액 ÷ 전체 재고금액 | 재고평가금액 |
| 재고 분석 | 구간별 비중 | 구간 금액 ÷ 플랜트 합계 | 재고평가금액 |
참고 CDS 뷰
| 원천 테이블 | 주요 필드 | 쓰임 |
|---|---|---|
MARA / MAKT | MATNR · MATKL · MAKTX | 자재 마스터 — 자재·자재그룹·자재명 |
MARD | WERKS · LABST | 플랜트별 재고 — 가용재고수량 |
MBEW | VERPR · STPRZ · SALK3 | 자재 평가 — 단가·재고금액 |
MSEG / MKPF | BUDAT | 자재 이동 — 최종 이동전기일 산출 |
define view entity ZI_StockAgingItem
as select from mard as d
inner join mara as m on m.matnr = d.matnr
inner join makt as t on t.matnr = d.matnr and t.spras = 'K'
inner join mbew as w on w.matnr = d.matnr and w.bwkey = d.werks
left outer join ( select mseg.matnr, mseg.werks, max( mkpf.budat ) as budat
from mseg inner join mkpf on mkpf.mblnr = mseg.mblnr and mkpf.mjahr = mseg.mjahr
group by mseg.matnr, mseg.werks ) as mv
on mv.matnr = d.matnr and mv.werks = d.werks
{
key d.werks as Plant,
key d.matnr as Material,
t.maktx as MaterialText,
m.matkl as MatlGroup,
mv.budat as LastMovementDate,
d.labst as StockQty,
w.verpr as UnitPrice,
d.labst * w.verpr as StockValue
}
계정·마스터 구성은 가상 데이터 기준 스케치입니다. 최종 입출고일은 자재이동 명세의 최종 전기일을 별도 산출한 값입니다.
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.stockage · ko 로케일, OData 서비스와 모델 선언 |
view/Main.view.xml | 조회조건 · 대사 요약 · 3개 탭 |
view/DetailDialog.fragment.xml | 품목 상세 다이얼로그 |
controller/Main.controller.js | 조회조건 조립 · 바인딩 · 다이얼로그 · CSV |
controller/BaseController.js | CSV 다운로드 공통 처리 |
model/formatter.js · model/ErrorHandler.js | 표시 서식 · 예외 메시지 처리 |
i18n/i18n_ko.properties | 화면 문구 |
검증 결과
검증용 샘플 데이터(자재 52건, 플랜트 2개)를 기준으로 대사식을 전수 검증했습니다. 정렬·판정 동작을 확인하기 위해 경과일수 400일을 초과하는 극단값 2건을 의도적으로 포함했습니다.
| 검증 항목 | 결과 |
|---|---|
| 구간별 요약 합계 = 품목별 명세 합계 (30건 — 구간×그룹×플랜트) | 통과(차이 0) |
| 플랜트 내 비중 합계 = 100% (플랜트 2개) | 통과(반올림 오차 0.03%p 이내) |
| 월별 추이 최근월 합계 = 구간별 요약 현재 합계 (플랜트 2개) | 통과(차이 0) |
| 조회 조건 전달 — 플랜트·자재그룹·경과구간 필터 · 경과일수 내림차순 정렬 · 총건수 표시 | 확인 |
| 표시 금지 검사 — 커스텀 프로그램ID·앱 식별자·출처 표현 | 0건 |
화면 렌더링 — 조회 버튼 위치 · sap_horizon 테마 · Enter 키 조회 · 서비스 미연결 시 안내 메시지 | 확인 |
모든 데이터는 검증용으로 구성한 가상 데이터입니다.
자주 묻는 질문
경과일수는 어떤 기준으로 계산하나요?
자재·플랜트별 최종 입출고일과 조회 시점(기준일)의 차이를 일수로 계산합니다. 이동 이력이 없던 신규 자재 등 최종 입출고일을 확인할 수 없는 경우는 화면에서 확인 필요로 남습니다.
"점검 필요"로 표시되면 바로 폐기·평가충당 대상인가요?
아닙니다. 이 화면은 조회·점검을 돕는 도구이며, 폐기·평가충당 등 최종 판단은 담당자와 관련 부서가 별도 절차와 증빙을 근거로 결정합니다.
재고 회전율 점검과는 어떻게 다른가요?
회전율은 일정 기간의 출고금액과 평균재고를 비교하는 지표이고, 이 화면은 자재 한 건 한 건의 최종 입출고일로부터 지금까지 경과한 일수를 구간으로 나눠 봅니다. 회전율이 낮지 않아도 특정 로트·품목만 오래 멈춰 있는 경우를 함께 확인할 수 있습니다.
장기체류 비중은 어떻게 계산되나요?
경과구간이 91일 이상(91~180일, 181일 이상)인 재고금액의 합을 전체 재고금액으로 나눈 값입니다. 플랜트별로도 동일한 방식으로 별도 산출됩니다.