SAP 재고실사 차이 현황 — 실사수량과 장부수량, 허용오차 안에서 갈렸는가
실사 담당자가 숫자를 입력했다고 끝이 아닙니다. 장부와 실사 사이의 차이가 계수 오차인지, 진짜 과부족인지, 그리고 그 차이가 정리됐는지를 한 화면에서 가릅니다.
재고실사는 숫자를 세는 일처럼 보이지만, 실제로는 판단의 연속입니다. 저울 눈금이나 낱개 계수에서 생기는 사소한 오차와, 분실·오출고·전산 미반영처럼 진짜로 짚어야 할 과부족을 같은 기준으로 섞어 보면 실사 담당자도 결산 담당자도 지칩니다. 실사수량은 MI04로 입력되고 차이는 MI07로 정리되지만, 그 사이에 "이 차이가 정리해야 할 차이인가"를 판단하는 화면은 따로 없는 경우가 많습니다.
이 화면은 실사문서와 실사품목의 표준 데이터 구조를 그대로 이어받아, 장부수량 대비 실사수량 차이를 허용오차 기준으로 미실사·일치·과잉·부족 4단계로 자동 판정하고, 과잉·부족 건에 대해서는 MI07 차이전기가 실행됐는지 여부까지 같은 줄에서 보여주도록 OpenUI5 화면으로 확장한 것이 ZLMM03000입니다. 인접한 재고 수불 조회 화면과 달리, 이 화면은 실사 결과의 "판정"과 "후속 처리 상태"를 분리해서 추적한다는 점이 다릅니다. 실제 구동 화면 3종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 실사문서 원천 — 헤더(
IKPF)와 품목(ISEG) 구조를 그대로 사용 - 재고·평가 마스터 — 플랜트/저장위치별 재고(
MARD), 자재 평가(MBEW) - 텍스트 — 자재(
MAKT) · 플랜트(T001W) · 저장위치(T001L) - 차이 정리 여부 — 실사품목의
XDIFF플래그(MI07 실행 결과)를 그대로 표시 - 실사 프로세스 — 문서 생성(MI01)·수량 입력(MI04)·차이 정리(MI07) 표준 흐름은 그대로 유지
| 항목 | 내용 |
|---|---|
| 업무 영역 | 자재관리(MM) · 재고관리 · 재고실사 |
| Namespace | zui5.physinv |
| 셸 구조 | 조회조건 영역(우측 조회) + 플랜트·상태별 집계 패널 + 실사품목 목록, 실사품목 상세 Dialog |
| 화면 수 | 조회 화면 1개 + 상세 다이얼로그 |
| T-code 근거 | MI01(실사문서 생성) · MI04(실사수량 입력) · MI07(차이 정리) |
| 성격 | 조회·검증형 — 실사문서 생성과 차이 전기는 표준 트랜잭션이 담당 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 3종 둘러보기
실사일·플랜트·저장위치·자재·차이상태를 넣고 조회하면 실사품목이 목록으로 뜹니다 → 조회조건 영역에서 조건을 좁히고 → 품목을 골라 상세에서 같은 문서 내 다른 품목까지 확인합니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
조작 방법
- 실사일(시작/종료) · 플랜트 · 저장위치 · 자재코드/자재명 · 차이상태를 조회조건 영역에서 지정합니다.
- "차이 발생 건만 보기" 체크박스를 켜면 미실사·일치를 제외하고 과잉·부족 건만 남습니다.
- 조회조건 입력필드에서 Enter 를 눌러도 바로 조회됩니다. 조회·초기화 버튼은 조회조건 영역 오른쪽 끝에 있습니다.
- 플랜트별·상태별 집계 패널의 배지(예: "과잉 (50)")를 클릭하면 해당 조건이 즉시 필터에 반영됩니다.
- 목록 툴바의 차이금액 큰 순 정렬 토글로 절대 차이금액이 큰 건부터 확인할 수 있습니다.
- 목록 행의 상세 버튼을 누르면 해당 품목의 상세와 같은 실사문서 내 다른 품목(최대 8건)을 확인합니다.
- 목록은 CSV 다운로드로 내려받습니다. UTF-8 BOM 이 붙어 엑셀에서 한글이 깨지지 않습니다.
실사 차이 판정 로직 — 계수오차 허용범위와 4단계 신호등
재고실사는 "숫자가 다르면 무조건 차이"로 보지 않습니다. 저울 오차·낱개 계수 오차 등 실무적으로 허용되는 범위가 있기 때문에, 이 화면은 다음 규칙으로 4단계 상태를 판정합니다.
| 단계 | 조건 | 의미 |
|---|---|---|
| 미실사 | 실사수량이 아직 입력되지 않음(NULL) | MI04 실사수량 입력이 아직 안 된 품목 |
| 일치 | |실사수량 − 장부수량| ≤ 허용오차 | 계수 오차 범위 내 — 별도 조치 불필요 |
| 과잉 | (실사수량 − 장부수량) > 허용오차 | 장부보다 실사수량이 많음 — 차이 전기 시 재고 증가 |
| 부족 | (실사수량 − 장부수량) < −허용오차 | 장부보다 실사수량이 적음 — 차이 전기 시 재고 감소 |
허용오차 공식: tolerance = max(1, round(장부수량 × 2%)) — 장부수량의 2%, 최소 1 단위. 장부수량이 100 EA 이면 허용오차는 2 EA 이므로, 실사수량이 98~102 EA 사이면 "일치"로 판정합니다.
판정과 정리 상태를 분리하는 이유
과잉·부족으로 판정된 품목은 별도로 차이정리(MI07 실행) 여부를 "정리대기/정리완료"로 함께 표시합니다. 판정 결과와 후속 처리 상태를 한 컬럼에 합쳐 버리면, 이미 정리된 과거 차이와 아직 손대지 않은 차이를 구분할 수 없기 때문입니다.
헤더-품목 조인부터 차이금액 환산까지 5단계 처리 흐름
- 헤더-품목 조인: 실사문서 헤더(
IKPF: 실사일 · 실사자 · 플랜트 · 저장위치)와 실사품목(ISEG: 자재 · 배치 · 장부수량 · 실사수량)을 실사문서번호 기준으로 결합합니다. - 마스터 매핑: 플랜트(
T001W)·저장위치(T001L) 코드에 명칭을 매핑합니다. - 차이수량 계산: 미실사가 아닌 모든 품목에 대해 차이수량 = 실사수량 − 장부수량을 계산합니다.
- 임계치 판정 및 금액 환산: 3장의 허용오차 규칙으로 상태를 판정하고, 자재평가단가(
MBEW)를 곱해 차이금액과 차이율을 계산합니다. - 필터·집계: 조회조건으로 필터링한 뒤 플랜트별/상태별 건수와 "차이정리 대기" 건수·금액(과잉·부족 중 미정리)을 재계산해 요약 패널에 반영합니다.
조회조건
| 필드 | 구분 | 설명 |
|---|---|---|
| 실사일(시작/종료) | 선택 | 실사일 기준 기간 필터 |
| 플랜트 | 선택 | 전체 플랜트 또는 특정 플랜트만 조회 |
| 저장위치 | 선택 | 전체 저장위치 또는 특정 저장위치만 조회 |
| 자재코드/자재명 | 선택 | 부분일치 검색 (Enter로 조회) |
| 차이상태 | 선택 | 전체/미실사/일치/과잉/부족 |
| 차이 발생 건만 보기 | 선택 | 미실사·일치를 제외하고 과잉·부족만 표시 |
결과 컬럼
| 컬럼 | 의미 · 표시 |
|---|---|
| 실사문서 · 품목 | 실사문서번호와 문서 내 품목번호 |
| 플랜트 · 저장위치 | 코드와 명칭 |
| 자재코드 · 자재명 · 배치 | 대상 자재 (배치 없으면 "-") |
| 실사일 | YYYY.MM.DD 형식 |
| 장부수량 · 실사수량 | 우측정렬, 단위 포함 (미입력 시 "미실사") |
| 차이수량 · 차이금액 · 차이율 | 파생 계산값, 부호 포함 우측정렬 |
| 차이상태 | 미실사/일치/과잉/부족 신호등 |
| 차이정리 | 정리대기/정리완료/해당없음 |
SAP 표준 기능 매핑
표준 실행은 T-code가 그대로 담당하고, 이 화면은 그 위에 조회·검증 관점을 더해 확장합니다.
| 표준 기능 | T-code | 이 화면이 더하는 것 |
|---|---|---|
| 실사문서 생성 | MI01 | (변경 없음 — 표준 기능 그대로 사용) |
| 실사수량 입력 | MI04 | (변경 없음 — 표준 기능 그대로 사용) |
| 차이 정리(전기) | MI07 | 정리대기 건을 사전에 한눈에 식별해 MI07 대상 선별에 활용 |
| 실사 현황 리스트 | MI22/MI24 계열 | 플랜트/상태별 집계, 임계치 기반 4단계 신호등, 차이금액 환산을 추가 제공 |
도입 시 확인이 필요한 부분
허용오차율(2%)과 최소 허용단위(1)는 자재군·업종에 따라 달라질 수 있어 고정값으로 두지 않고 설정값으로 관리하는 것을 권장합니다. 평가단가(MBEW) 기준도 이동평균가/표준가 중 회사 정책에 맞는 쪽으로 선택해야 합니다.
참고 CDS 뷰
운영 서비스로 연결할 때는 헤더와 품목에 자재·플랜트 명칭, 평가단가까지 붙인 뷰로 서빙하는 구성을 제안합니다.
@AbapCatalog.sqlViewName: 'ZCPHYSINV'
@EndUserText.label: '재고실사 차이 조회용 (Z)'
define view Z_C_PHYSINV_VARIANCE
as select from iseg as Item
inner join ikpf as Header on Header.iblnr = Item.iblnr
left outer join makt as MatText on MatText.matnr = Item.matnr
and MatText.spras = 'K'
left outer join mbew as Valuation on Valuation.matnr = Item.matnr
and Valuation.bwkey = Item.werks
{
key Item.iblnr,
key Item.zeili,
Item.werks,
Item.lgort,
Item.matnr,
MatText.maktx,
Item.charg,
Header.zldat,
Header.ernam,
Item.buchm,
Item.zaehl,
Item.zaehl - Item.buchm as DiffQty,
( Item.zaehl - Item.buchm ) * Valuation.verpr as DiffValue,
Item.xdiff
// 임계치 판정(미실사/일치/과잉/부족)은 소비 계층에서 tolerance 규칙으로 계산
}
매핑 이해를 돕기 위한 참고용 설계입니다. 실제 도입 시에는 운영 환경의 평가 기준(이동평균가/표준가)과 허용오차 정책에 맞춰 조정합니다.
OpenUI5 구성
| 기능 | 사용 컨트롤 |
|---|---|
| 화면 골격 | sap.m.Panel 3단 — 조회조건 · 집계 · 목록 |
| 조회조건 | sap.m.DatePicker · sap.m.Select · sap.m.Input — 우측 끝에 조회 버튼 |
| 결과 목록 | sap.ui.table.Table — 16개 컬럼, 스크롤/고정헤더 대응 |
| 상세 화면 | sap.m.Dialog + sap.ui.layout.form.SimpleForm + sap.m.Table |
| Mock 데이터 계층 | ModelMock.js — localdata JSON 을 fetch 로 읽어 Promise 로 반환 |
| CSV 다운로드 | BaseController.downloadCsv() 공통 헬퍼 (UTF-8 BOM) |
파일 구성
| 경로 | 역할 |
|---|---|
index.html | OpenUI5 부트스트랩 — sap_horizon · lodash · moment |
Component.js | 디바이스 모델 초기화 · ErrorHandler 연결 |
manifest.json | 앱 디스크립터 — 앱 ID(zui5.physinv) · ko 로케일 |
view/Main.view.xml | 조회조건 + 집계 패널 + 실사품목 목록 |
view/DetailDialog.fragment.xml | 실사품목 상세 + 같은 문서 내 다른 품목 |
controller/Main.controller.js | 판정 로직 · 필터 · 집계 · CSV |
model/ModelMock.js | localdata JSON 읽기(Promise) |
model/formatter.js | 수량 · 금액 · 비율 · 상태 포맷 |
i18n/i18n_ko.properties | ko 로케일 리소스 |
localdata/*.json | 실사문서 · 실사품목 · 플랜트 · 저장위치 검증용 데이터 |
검증 결과
화면 구성에 쓴 데이터는 실사문서 18건 · 실사품목 190건이며, 미실사 30건 · 일치 73건 · 과잉 50건 · 부족 37건, 차이정리 대기 87건입니다.
| 검증 항목 | 결과 |
|---|---|
| XML/JSON 전량 파싱 무결성 | 통과 |
| 정적 리소스 전 경로 HTTP 200 (로컬 서버 기준) | 통과 |
| 뷰 사용 i18n 키 45개 전량 정의 (누락 0건) | 통과 |
| 뷰 참조 이벤트 핸들러 8개 전량 구현 | 통과 |
| 차이상태-차이수량 부호 불일치 0건 | 통과 |
| 미실사 건에 차이전기(XDIFF) 플래그 모순 0건 | 통과 |
| 플랜트/저장위치 참조무결성 오류 0건 | 통과 |
| 화면 렌더링 — 실브라우저에서 조회 → 상세 다이얼로그 실동작 후 캡처 | 3/3 |
| 조회조건 버튼 배치 — 필터 행 우측 끝(하단 바 아님) | 통과 |
| sap_horizon 테마 적용 확인 | 통과 |
플랜트·자재·수량·금액은 모두 검증용 데이터입니다.
자주 묻는 질문
실사수량과 장부수량이 조금만 달라도 전부 "차이"로 표시되나요?
아니요. 장부수량의 2%(최소 1단위)까지는 계수 오차로 보고 "일치"로 판정합니다. 그 이상 벗어난 경우만 과잉/부족으로 분류합니다.
"정리대기"와 "차이상태(과잉/부족)"는 어떻게 다른가요?
차이상태는 장부 대비 실사수량의 방향성(과잉/부족)을 판정한 결과이고, 정리 여부는 그 차이에 대해 MI07 차이전기가 실제로 실행되었는지를 별도로 추적하는 값입니다. 과잉이어도 이미 MI07이 실행됐다면 "정리완료"로 표시됩니다.
이 화면에서 실사수량을 직접 입력하거나 차이를 전기할 수 있나요?
아니요. 이 화면은 조회 전용입니다. 실사수량 입력은 MI04, 차이 전기는 MI07 표준 트랜잭션에서 수행하며, 이 화면은 그 결과를 모아서 검증하는 용도입니다.
배치(Batch) 관리 대상이 아닌 자재는 어떻게 표시되나요?
배치번호가 없는 자재는 배치 컬럼에 "-" 로 표시됩니다.