SAP 실제원가 가격차이 정산 — 표준과 실제의 간극을 재고와 매출원가로
자재원장 기준 표준원가와 기말 실제단가의 차이를 재고와 매출원가로 나눠 배부하고, 정산 상태를 확인하는 화면입니다.
표준원가로 기중에 계산하면 편하지만 기말에는 실제와 맞춰야 합니다. 그 차이가 자재원장의 가격차이입니다.
이 차이를 어디에 붙일지가 문제입니다. 아직 창고에 있으면 재고 가액에, 이미 팔렸으면 매출원가에 가야 합니다. 표준 자재원장 구조를 그대로 이어받아 배부 결과와 정산 상태를 보도록 OpenUI5 화면으로 확장한 것이 이 앱입니다. 실제 구동 화면 3종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 평가 객체 — 플랜트·자재 조합(
ValObj)과 상태(Status) - 자재 — 자재코드(
Matnr) · 명칭(MaktxName) · 자재유형(Mtart) - 플랜트 — 평가 영역(
Werk) - 정산 회차 — 실행 키(
RunKey)와 기간 - 가격차이 — 표준원가 대비 실제단가 차액
| 항목 | 내용 |
|---|---|
| 대응 T-code | CKM3N (자재원장 조회) · CKMLCP · MR21 |
| 업무 영역 | 관리회계(CO-PC) · 실제원가 · 재고평가 |
| Namespace | zui5.mlclose |
| 셸 구조 | 조회조건 영역(우측 조회·초기화) + 정산 현황 테이블 |
| 화면 수 | 조회 화면 1개 + 상세 |
| 데이터 | 평가 객체 36건 · 정산 이력 240건 |
| 성격 | 조회형(Read-Only) — 정산 실행은 표준이 담당 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 3종 둘러보기
플랜트·자재·기간으로 조회하면 자재별 가격차이가 나옵니다 → 재고귀속과 매출원가귀속 배부를 확인하고 → 정산 상태로 처리 여부를 점검합니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
조작 방법
- 플랜트를 고릅니다. 자재원장은 평가 영역 단위로 돌아갑니다.
- 자재나 자재유형으로 범위를 좁힙니다.
- 기간을 정산 대상 월로 지정합니다.
- 조회조건 입력필드에서 값을 바꾸거나 Enter 를 누르면 즉시 조회됩니다.
- 가격차이가 큰 자재를 확인합니다.
- 재고귀속과 매출원가귀속 비율을 봅니다. 회전이 빠른 자재는 매출원가 쪽이 큽니다.
- 정산 상태가 대기인 자재가 남아 있으면 결산이 안 끝난 것입니다.
- 결과는 CSV 다운로드로 내려받습니다.
배부 규칙
차이를 남은 것과 나간 것에 비례해 나눕니다.
실제단가(PUP) = (기초 재고금액 + 당월 입고금액) ÷ (기초 수량 + 입고 수량)
가격차이 = (실제단가 − 표준원가) × 수량
배부
재고귀속 = 가격차이 × (기말 재고 수량 ÷ 총 수량)
매출원가귀속 = 가격차이 × (출고 수량 ÷ 총 수량)
정산 상태 Pending → 아직 배부 안 됨
Settled → 배부·전기 완료
차이를 나눠 붙이는 이유
가격차이를 전부 매출원가로 보내면 재고 가액이 표준원가에 머물러 실제와 달라집니다. 반대로 전부 재고에 붙이면 이미 팔린 물건의 원가가 반영되지 않습니다. 남은 비율과 나간 비율대로 나눠야 재고와 손익이 모두 실제에 가까워집니다.
자재원장 정산 4단계
| 단계 | 내용 | 결과 |
|---|---|---|
| ① 데이터 수집 | 당월 입출고와 원가 집계 | 평가 객체별 수량·금액 |
| ② 실제단가 계산 | PUP 산출 | 기말 실제단가 |
| ③ 배부 | 차이를 재고·매출원가로 | 배부 금액 |
| ④ 전기 | 회계 반영과 마감 | 정산 완료 |
자재가 여러 단계로 얽혀 있으면(원재료→반제품→제품) 하위부터 순서대로 정산해야 합니다.
조회조건
| 필드 | 필수 | 설명 |
|---|---|---|
플랜트 Werk | 필수 | 평가 영역 |
자재 Matnr | 선택 | 자재코드·명칭 |
자재유형 Mtart | 선택 | 원재료 · 반제품 · 제품 |
| 기간 | 필수 | 정산 대상 월 |
상태 Status | 선택 | Pending / Settled |
결과 컬럼
| 컬럼 | 의미 · 표시 |
|---|---|
플랜트 Werk | 평가 영역 |
자재 Matnr · MaktxName | 자재코드와 명칭 |
자재유형 Mtart | 원재료 · 제품 등 |
평가 객체 ValObj | 플랜트·자재 조합 |
정산 회차 RunKey | 실행 단위 |
| 표준원가 | 기중 평가 기준 |
| 실제단가(PUP) | 기말 계산 단가 |
| 가격차이 | 실제 − 표준 |
| 재고귀속 | 재고 가액에 반영된 금액 |
| 매출원가귀속 | 매출원가로 간 금액 |
상태 Status | Pending / Settled. 상태 색 |
SAP 표준 기능 매핑
| 표준 | 역할 | 이 화면에서의 확장 |
|---|---|---|
CKM3N | 자재원장 조회 | 배부 결과와 정산 상태를 한 화면에 |
CKMLCP | 자재원장 마감 | 정산 실행 |
MR21 | 가격 변경 | 표준원가 조정 |
CKMLHD · CKMLPP | 자재원장 헤더와 기간 데이터 | 조회 원천 |
CKMLCR | 자재원장 통화·평가 데이터 | 금액 정보 |
MBEW | 자재 평가 | 표준원가 |
도입 시 확인이 필요한 부분
자재원장은 정산 순서가 중요합니다. 원재료를 먼저 정산해야 그 차이가 반제품으로, 다시 제품으로 흘러갑니다. 순서가 꼬이면 차이가 상위로 전달되지 않습니다. 또 정산은 되돌리기 어려우므로 실행 전에 대기 건을 모두 확인해야 합니다.
참고 CDS 뷰
@AbapCatalog.sqlViewName: 'ZCMLCLOSE'
@EndUserText.label: '자재원장 정산 현황 (Z)'
define view Z_C_ML_CLOSING
as select from ckmlhd as MlHead
inner join ckmlpp as MlPeriod on MlHead.kalnr = MlPeriod.kalnr
left outer join ckmlcr as MlPrice on MlHead.kalnr = MlPrice.kalnr
and MlPeriod.bdatj = MlPrice.bdatj
and MlPeriod.poper = MlPrice.poper
left outer join makt as MatText on MlHead.matnr = MatText.matnr
and MatText.spras = 'K'
{
key MlHead.kalnr,
key MlPeriod.bdatj,
key MlPeriod.poper,
MlHead.matnr,
MatText.maktx as MaktxName,
MlHead.bwkey as Werk,
MlPeriod.lbkum as StockQty,
MlPrice.stprs as StandardPrice,
MlPrice.pvprs as PeriodicUnitPrice,
MlPeriod.status as Status
// 가격차이 = (PUP − 표준원가) × 수량
// 재고·매출원가 귀속은 수량 비율로 배부 (소비 뷰에서 계산)
}
매핑 이해를 돕기 위한 참고용 설계입니다. 실제 도입 시에는 운영 환경 설정과 릴리즈에 맞춰 조정합니다.
OpenUI5 구성
| 기능 | 사용 컨트롤 |
|---|---|
| 화면 골격 | sap.m.Page + 조회조건 영역 · 정산 현황 테이블 |
| 조회조건 | sap.m.Select · sap.m.DatePicker · sap.m.Input — 우측 끝에 조회·초기화 |
| 이벤트 | 모든 버튼이 onPAI 단일 진입점, fcCode 로 분기 |
| 현황 테이블 | sap.m.Table — 표준·실제·차이·배부 순서 |
| 상태 표시 | sap.m.ObjectStatus — Pending / Settled |
| 금액 | sap.m.ObjectNumber — 차이 부호 색 |
정산 상태를 열로 둔 이유
자재원장 정산은 자재 수가 많아 일부가 빠지기 쉽습니다. 전체가 끝났다고 생각했는데 몇 건이 대기로 남아 있으면 재고 평가가 어긋납니다. 상태를 목록에 두면 결산 전에 대기 건을 한 번에 확인할 수 있습니다.
파일 구성
| 경로 | 역할 |
|---|---|
manifest.json | 앱 디스크립터 — 앱 ID(zui5.mlclose) · ko 로케일 |
view/Main.view.xml | 조회조건과 정산 현황 테이블 |
controller/Main.controller.js | 조회 · 차이 계산 · 배부 · CSV |
model/ModelMock.js | localdata JSON 읽기(Promise) |
js/formatter.js | 금액 · 단가 · 상태 색 포맷터 |
localdata/mlobjects.json | 평가 객체 36건 |
localdata/mlruns.json | 정산 이력 240건 |
검증 결과
| 검증 항목 | 결과 |
|---|---|
| 가격차이 = (실제단가 − 표준원가) × 수량 (전 건) | 통과 |
| 재고귀속 + 매출원가귀속 = 가격차이 | 통과 |
| 배부 비율 = 재고 수량 ÷ 총 수량 | 통과 |
| Settled 건은 배부 금액 존재 | 통과 |
| 자재 코드가 있으면 명칭도 존재 | 통과 |
| XML · JSON 전체 파싱 | 오류 0건 |
| 화면 렌더링 — 실브라우저 조회 후 캡처 | 3/3 |
| 테마 런타임 확인 | sap_horizon |
자주 묻는 질문
PUP 는 무엇의 약자인가요?
기간단위가격(Periodic Unit Price)입니다. 기초 재고와 당월 입고를 합쳐 가중평균한 단가로, 그 기간의 실제 원가를 나타냅니다.
정산 순서가 왜 중요한가요?
원재료의 가격차이가 반제품 원가에 반영되고, 그것이 다시 제품으로 흘러가야 합니다. 상위부터 정산하면 하위 차이가 전달되지 않아 제품 원가가 실제와 달라집니다.
정산을 되돌릴 수 있나요?
어렵습니다. 전기가 이미 나갔고 다음 기간 데이터가 그 위에 쌓이기 때문입니다. 실행 전에 대기 건과 데이터 정합을 확인하는 것이 중요합니다.
SAP 표준 기능과 어떻게 이어지나요?
자재원장 계산과 정산은 표준 CKMLCP 가 수행합니다. 이 화면은 그 결과를 자재별로 펼쳐 가격차이가 어디로 배부됐는지와 정산 상태를 보여 주는 확장입니다.