SAP 흡수원가·변동원가 이익 차이 점검 — 재고에 남은 고정제조간접비로 두 이익의 차이를 대사하는 월마감 화면
품목·월 이익 차이 산출 · 재고 고정간접비 대사 · 점검 필요 품목 선별 · 월별·제품군 요약 · 행 클릭 상세 — 소개 영상과 실제 화면 6종, 그리고 CDS 코드까지
소개 영상1분 39초8개 장면음성 안내·자막조회조건 · 점검 필요 · 월별 · 제품군 · 대사 · 상세 순서
개발 배경 — 이 앱을 사용해야 하는 이유
제조업 월마감에서 가장 자주 받는 질문 가운데 하나가 “이번 달 이익이 왜 관리회계 보고서와 달라졌습니까” 입니다. 재무회계는 고정제조간접비를 재고에 얹어 두었다가 팔린 만큼만 매출원가로 내리는 흡수원가 방식으로 이익을 계산하고, 관리회계의 공헌이익 보고서는 고정제조간접비를 발생한 달에 전부 비용으로 보는 변동원가 방식으로 이익을 봅니다. 두 이익이 다른 것은 오류가 아니라 정상입니다. 다만 그 차이는 기말 재고에 들어 있는 고정제조간접비에서 기초 재고에 들어 있던 고정제조간접비를 뺀 금액과 정확히 같아야 합니다.
지금은 이 대사를 재고 현황, 물자 원장, 수익성 보고서, 원가요소 개별 항목을 번갈아 열고 엑셀에 옮겨 맞추는 방식으로 합니다. 품목이 수백 개이고 월이 아홉 개만 쌓여도 어느 품목의 어느 달에서 어긋났는지 찾는 데 하루가 갑니다. 이 화면은 그 대사를 품목·월 단위로 매번 다시 계산해, 장부와 맞지 않거나 재고 증감으로 차이가 큰 건만 점검 필요로 가려 줍니다.
관련 영역은 원가계산 방식(흡수원가·변동원가)의 비교와 재고자산 원가 배부입니다. 재고자산의 원가에 고정제조간접비를 어떻게 배부하는지는 K-IFRS 제1002호 재고자산이 다루는 영역이며, 이 화면은 기준서의 해석을 대신하지 않고 회사가 정한 배부 결과가 두 이익 사이에서 어떻게 드러나는지를 점검하는 조회 도구입니다.
차이를 맞추는 데 하루가 걸린다
월마감 직후 가장 먼저 묻는 것은 “두 보고서의 이익이 왜 다른가” 입니다. 표준 화면은 수량·재고 가치·수익성·원가요소를 각각 보여 주지만, 한 품목의 한 달을 따라가며 기초 재고 고정간접비 + 당월 발생 − 매출원가 반영 = 기말 재고 고정간접비 를 이어 붙이는 자리는 없습니다. 그래서 엑셀에 네 화면의 숫자를 옮겨 놓고 손으로 잇습니다. 이 화면은 그 이음을 품목·월마다 계산해 같은 줄에 나란히 놓습니다.
재고가 쌓인 달은 늘 이익이 더 크게 나온다
생산이 판매보다 많은 달에는 고정제조간접비 일부가 기말 재고로 넘어가 흡수원가 이익이 변동원가 이익보다 커집니다. 반대로 재고가 줄어드는 달에는 지난달에 넘어온 몫이 매출원가로 내려와 흡수원가 이익이 더 작아집니다. 월별 요약 탭은 이 흐름을 달마다 모아 보여 주어, 이익 차이가 우연이 아니라 재고 증감의 부호와 함께 움직이는지를 한눈에 확인하게 합니다.
허용 비중을 넘는 건만 사람이 본다
모든 차이를 들여다볼 수는 없습니다. 이익 차이를 흡수원가 이익으로 나눈 비중이 허용 비중 5.00%를 넘고, 차이 금액이 5백만 원 이상인 품목·월만 점검 필요로 올립니다. 비중만 보면 이익이 작은 품목이 줄줄이 걸리고, 금액만 보면 큰 품목이 늘 걸리기 때문에 두 조건을 함께 둡니다. 이 기준값은 회사가 정하는 것이며 화면은 그 기준을 적용한 결과를 보여 줄 뿐입니다.
장부에 반영된 값과 다시 계산한 값을 맞춘다
다시 계산한 매출원가 반영 고정간접비와 장부에 반영된 금액이 다르거나, 이번 달 기초 재고 금액이 전월 기말과 이어지지 않으면 그 건은 대사 항목에서 따로 표시됩니다. 검증용 샘플 데이터에는 이런 건을 6건(장부 반영 불일치 4건 · 기초 이월 불일치 2건) 일부러 넣어 두었고, 대사 차이 건수와 섞이지 않게 따로 세어 보여 줍니다.
사용 방법
- 회계연도를 입력합니다(필수, 4자리 숫자). 제품군·제품명·마감일 범위·점검 결과는 선택 조건입니다.
- 조회 버튼은 조회조건 바로 아래 왼쪽에 있고, 입력칸에서 Enter 키를 눌러도 조회됩니다. 화면을 열면 회계연도 2026 으로 한 번 자동 조회합니다.
- 위쪽 요약에서 매출액·흡수원가 이익·변동원가 이익·이익 차이 합계(백만원), 점검 필요 품목 수, 대사 차이 건수를 확인합니다.
- 탭을 품목·월 명세 → 월별 요약 → 제품군 요약 → 대사 결과 순서로 넘기며 같은 숫자를 다른 단위로 봅니다.
- 행을 클릭하면 상세 창이 열려 산출 값과 같은 제품의 월별 흐름을 보여 줍니다.
- CSV 내려받기 버튼으로 현재 탭의 결과를 파일로 저장합니다.
숫자를 믿을 수 있는가 — 검증 결과
화면을 만들기 전에 대사식 아홉 개를 세우고 샘플 72건 전수에 돌렸습니다. 아홉 식 모두 차이 0건입니다. 점검용으로 넣은 예외는 장부 반영 불일치 4건과 기초 이월 불일치 2건, 합계 6건이며 위 대사 차이 건수와 따로 집계합니다.
| 대사 | 대사식 | 검사 건수 | 차이 건수 |
|---|---|---|---|
| R01 | 매출액 − 변동 매출원가 = 공헌이익 | 72 | 0 |
| R02 | 공헌이익 − 고정간접비 − 판매관리비 = 변동원가 이익 | 72 | 0 |
| R03 | 기초 수량 + 생산 수량 − 판매 수량 = 기말 수량 | 72 | 0 |
| R04 | 기초 + 당월 − 매출원가 반영 = 기말 고정간접비 | 72 | 0 |
| R05 | 흡수 − 변동 이익 = 기말 − 기초 재고 고정간접비 | 72 | 0 |
| R06 | 기초 = 전월 기말 (예외 제외) | 62 | 0 |
| R07 | 월별 합계 = 명세 합계 | 9 | 0 |
| R08 | 제품군 합계 = 명세 합계 | 4 | 0 |
| R09 | 누적 이익 차이 = 최종 기말 − 최초 기초 − 이월 불일치 | 8 | 0 |
무엇으로 만들었나
| 자리 | 무엇 | 왜 그렇게 두었나 |
|---|---|---|
| 조회조건·요약 | sap.m 입력·선택·날짜 컨트롤과 KPI 상자 6개 | 조회 버튼을 조건 바로 아래 두고 Enter 키로도 조회되게 했습니다. |
| 결과 표 | sap.ui.table 4개(품목·월 · 월별 · 제품군 · 대사) | 열이 많은 명세는 고정 행 수와 서버 정렬로 다룹니다. |
| 집계·판정 로직 | OData 서비스의 service.js — 조회·단건·펑션(GetMinGapRate·GetMaxGapRate) | $filter 의 날짜 조건을 서비스가 직접 해석하고 숫자 보정을 맡습니다. |
| 데이터 연동 | OData V2 모델 1개, 화면 상태는 별도 JSON 모델 | 서비스 주소는 manifest 한 곳에만 선언해 운영 전환 때 한 줄만 바꿉니다. |
| 테마 | sap_horizon | 표준 컨트롤 색과 간격을 그대로 따릅니다. |
실행 화면
검증용 샘플 데이터로 실제 브라우저에서 찍은 화면 6종입니다. 이미지를 누르면 확대됩니다.
처음 열었을 때와 점검 필요만 보기
조회조건부터 표까지 한 화면에 세로로 쌓입니다. 요약 상자는 백만원 단위입니다.

조회조건 바로 아래 왼쪽에 조회 버튼이 있고, 화면을 열면 회계연도 2026 으로 한 번 자동 조회합니다. 요약 상자는 백만원 단위이며 이익 차이 합계와 점검 필요 품목 수는 주황색 계열로 눈에 띄게 둡니다. 대사 차이 건수가 0 이면 초록으로 보입니다.

점검 필요 12건은 재고 증감으로 차이가 큰 건 6건과 점검용 예외 6건으로 이루어집니다. 점검 코드 열이 둘을 가릅니다. 건수는 위쪽 탭 숫자에도 바로 반영됩니다.
월별·제품군으로 모아 보기
월과 제품군 단위로 같은 숫자를 모아 보면 재고 증감과 이익 차이가 함께 움직이는지 보입니다.

재고가 쌓인 1월·3월은 이익 차이가 양수로 크고, 재고가 줄어든 8월·9월은 음수로 내려갑니다. 월별 요약에는 마감일 조건만 적용됩니다.

제품군은 점검 필요 품목·월 비율이 20% 이상이면 점검 필요로 올립니다. 제품군 요약에는 제품군과 점검 결과 조건만 적용된다는 안내가 표 위에 적혀 있습니다.
대사 결과와 행 상세
대사 결과 탭은 숫자가 맞는지 보는 자리이고, 상세 창은 한 행이 어떻게 나왔는지 보는 자리입니다.

대사 번호 R 로 시작하는 줄이 내부 대사이고 E 로 시작하는 줄이 일부러 넣은 예외입니다. 대사식 문자열이 함께 보여 어느 필드끼리 맞춘 것인지 바로 읽힙니다.

상세 창 위쪽에는 산출에 쓴 값(기초·당월·매출원가 반영·기말)이, 아래쪽에는 같은 제품의 월별 판매·생산·기말 수량과 이익 차이가 표로 나옵니다. 닫기 버튼으로 닫습니다.
화면 뒤에서 일어나는 일 — 점검 판정 로직
조회가 끝나면 서비스가 품목·월마다 아래 순서로 판정합니다. 앞의 조건에 걸리면 뒤 조건은 보지 않습니다.
| 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|
| 이익 차이 ÷ 흡수원가 이익 ≥ 허용 비중 5.00% 이고 차이 금액 ≥ 5백만 원 | 점검 필요 (재고 증감으로 차이가 큼) | 생산·판매 수량 차이와 단위 고정간접비 변동을 확인합니다. |
| 장부 반영 고정간접비 ≠ 재계산한 매출원가 반영 금액 | 점검 필요 (장부 반영 불일치) | 장부 반영 전표와 배부 기준을 확인합니다. |
| 기초 재고 고정간접비 ≠ 전월 기말 재고 고정간접비 | 점검 필요 (기초 이월 불일치) | 월 이월 처리와 마감 순서를 확인합니다. |
| 위 조건에 모두 해당하지 않음 | 정상 | 별도 조치가 없습니다. |
산출 순서는 다섯 단계입니다. 매출액에서 변동 매출원가를 빼 공헌이익을 구하고, 가중평균 배부율을 계산하고, 기말 수량에 배부율을 곱해 기말 재고 고정간접비를 구하고, 기초에 당월 발생을 더한 뒤 기말을 빼 매출원가 반영 고정간접비를 구하고, 마지막으로 두 이익의 차이를 기말과 기초의 차이로 대사합니다.
조회조건
| 조건 | 입력 방식 | 필수 | $filter 로 가는 모양 | 기본값 |
|---|---|---|---|---|
| 회계연도 | 4자리 숫자 | 필수 | Gjahr eq '2026' | 2026 |
| 제품군 | 선택 목록 | 선택 | ProdGrp eq 'P10' | 전체 |
| 제품명 | 문자 일부 | 선택 | substringof('펌프',ProdName) | 비어 있음 |
| 마감일 시작·종료 | 날짜 | 선택 | CloseDate ge datetime'…' and CloseDate le datetime'…' | 비어 있음 |
| 점검 결과 | 전체 / 정상 / 점검 필요 | 선택 | CheckStatus eq 'CHECK' | 전체 |
시작이 종료보다 늦으면 안내 문구가 나오고 조회하지 않습니다. 마감일 조건 두 개는 한 묶음(and)으로 보냅니다.
결과 컬럼
| 컬럼 | 의미 | 산출식 |
|---|---|---|
| 기말 재고 고정간접비 | 팔리지 않고 남은 수량에 붙은 고정간접비 | 기말 수량 × 평균 배부율 |
| 매출원가 반영 고정간접비 | 흡수원가 이익 계산에 쓴 고정간접비 | 기초 + 당월 − 기말 |
| 흡수원가 이익 | 재고를 반영한 이익 | 공헌이익 − 판매관리비 − 매출원가 반영 고정간접비 (판매관리비는 변동원가 이익과 동일하게 차감) |
| 변동원가 이익 | 고정간접비를 당월에 전부 비용으로 본 이익 | 공헌이익 − 당월 고정간접비 − 판매관리비 |
| 이익 차이 | 두 이익의 차이 | 흡수원가 이익 − 변동원가 이익 |
| 이익 차이 비중(%) | 차이가 이익에서 차지하는 비율 | 이익 차이 ÷ 흡수원가 이익 × 100 |
파일 구성
index.html · Component.js · manifest.json
controller/ (BaseController, Main)
view/ (Main.view.xml, DetailDialog.fragment.xml)
model/ (formatter, ErrorHandler)
css/ · i18n/
odata/ (서비스 메타데이터 · service.js · 샘플 응답)
media/ (소개 영상)
readme.html
SAP 표준 기능 확장 포인트
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·검증 관점을 더해 확장합니다.
표준으로 되는 것과 안 되는 것
| 하고 싶은 일 | 표준 화면으로 충분한 부분 | 이 앱이 더하는 관점 |
|---|---|---|
| 품목별 재고 수량 확인 | 수량·재고 현황 조회 | 기말·기초 수량을 산출식에 바로 연결 |
| 재고 가치 흐름 확인 | 물자 원장 분석 | 기초·기말 재고 고정간접비를 이익 차이와 한 줄에서 대사 |
| 제품별 이익 확인 | 수익성 분석 보고서 | 흡수원가·변동원가 이익을 나란히 놓고 차이를 설명 |
| 법정·감사 대응 숫자 | 표준 거래 | 그대로 표준에 두고, 이 화면은 분석과 월마감 점검만 담당 |
T-code 별 연계 지점
| T-code | 이름 | 연계 |
|---|---|---|
| MB52 | 창고 재고 현황 | 기말·기초 수량과 이 화면의 수량 열을 맞춥니다. 이 화면 결과 → MB52 로 원천 수량을 확인합니다. |
| CKM3 | 물자 원장 분석 | 기초·기말 재고 가치 흐름과 재고 고정간접비 열을 맞춥니다. |
| KE30 | 수익성 분석 보고서 | 제품별 이익을 두 이익과 비교합니다. 차이가 나면 원가계산 방식 설정부터 확인합니다. |
| KSB1 | 원가요소 개별 항목 조회 | 당월 고정간접비 합계와 맞춥니다. 표준 화면 값 → 이 화면의 품목·월 명세에서 다시 봅니다. |
| FAGLB03 | G/L 계정 잔액 조회 | 재고·매출원가 계정 잔액과 이 화면 합계를 맞춥니다. |
운영 전환 때 기존 리포트를 없애야 하는지 묻는다면 답은 아니요입니다. 표준 화면은 그대로 두고, 두 이익이 다르다는 질문이 나올 때 이 화면으로 내려가 근거를 대사합니다.
S/4HANA 분석 스택과의 자리
이 화면은 OData 서비스만 바라보므로 서비스 뒤에 무엇이 있든 같은 화면이 동작합니다. S/4HANA 에서는 CDS 큐브와 분석 쿼리가 서비스의 원천이 되고, 표준 Fiori 분석 앱이나 Analysis for Office 와 같은 숫자를 서로 다른 화면에서 맞춰 볼 수 있습니다. 표준 CDS 뷰 이름은 시스템마다 달라 이 글에서는 입력 뷰를 가정해 쓰며, 실제 이름은 확인이 필요합니다.
확장 포인트 — 운영에서 실제로 손대는 자리
| 자리 | 무엇을 손대나 | 비고 |
|---|---|---|
| 제품군 매핑 | 매핑 테이블에 제품·제품군·적용 기간 입력 | 현업이 직접 유지 |
| 배부율 방식 | 서비스의 배부율 계산 한 곳 | 대사식 R04·R05 로 확인 |
| 허용 비중·최소 금액 | 설정 값 | 점검 필요 건수를 보며 조정 |
| 확장 필드 | 큐브에 사용자 정의 필드 추가 | 화면 열은 서비스 메타데이터에서 추가 |
| 권한 | DCL 의 회사코드·플랜트 조건 | 표준 권한 객체에 연결 |
분석 지표 정의
| 지표 | 산식·판정 기준 | 대응 기능 | 원천 데이터 | 비고 |
|---|---|---|---|---|
| 이익 차이 | 흡수원가 이익 − 변동원가 이익 | 품목·월 명세 · 요약 | Item.ProfitGap | 기말 − 기초 재고 고정간접비와 같아야 함 |
| 이익 차이 비중 | 이익 차이 ÷ 흡수원가 이익 × 100 | 점검 판정 | Item.GapRate | 허용 비중 5.00% |
| 평균 배부율 | (기초 재고 고정간접비 + 당월 고정간접비) ÷ (기초 + 생산 수량) | 기말 재고 산출 | Item.AvgRate | 가중평균 |
| 점검 필요 비율 | 점검 필요 품목 ÷ 품목·월 수 × 100 | 제품군 요약 | Group.NeedRate | 20% 이상이면 제품군 점검 필요 |
CDS 구성
아래는 구조를 보이기 위한 스케치입니다. 입력 뷰 이름과 필드는 시스템마다 다를 수 있어 확인이 필요하며, 표준 CDS 뷰 이름은 실제로 확인한 것만 썼습니다.
뷰 레이어 구성
| 레이어 | 객체 | 하는 일 | 왜 나누나 |
|---|---|---|---|
| 기준 테이블 | ZABV_PRODGRP | 제품 → 제품군 매핑 | 제품군 기준이 바뀌어도 과거 월 요약이 흔들리지 않게 |
| 차원 | ZI_AbvProduct | 제품·제품군 이름과 연결 | 큐브가 이름을 직접 읽지 않게 |
| 큐브 | ZI_AbvItemMonth | 품목·월 단위 산출(배부율·기말·매출원가 반영) | 식을 한 곳에 둬 확인 지점을 하나로 |
| 쿼리 | ZC_AbvGapQuery | 회계연도 필수, 이익 차이·판정 | 대용량에서도 한 해 범위로만 집계 |
| 권한 | ZC_AbvGapQuery (DCL) | 회사코드·플랜트 접근 제어 | 요약 합계까지 쿼리 단계에서 걸러야 하므로 |
| 서비스 | ZUI_ABV_GAP | 엔티티셋 4종 노출 | 화면 이름과 같게 맞춰 manifest 주소만 교체 |
① 제품군 매핑 테이블 — 요약의 기준을 한 곳에 둔다
제품이 어느 제품군에 속하는지는 요약 탭의 모든 숫자를 가르는 기준입니다. 제품 마스터의 속성에 기대면 속성이 바뀔 때 과거 월 요약이 함께 바뀌므로, 적용 기간이 있는 매핑 테이블을 따로 둡니다. 현업이 직접 유지하는 유일한 테이블입니다.
" ───────────────────────────────────────────────────────────
" ZABV_PRODGRP — 제품 → 제품군 매핑 (현업 유지)
" 왜 따로 두나: 제품군 기준이 바뀌어도 과거 월 요약이 흔들리지 않게
" 적용 시작·종료일을 갖는 테이블에서 한 번에 관리한다.
" ───────────────────────────────────────────────────────────
@EndUserText.label : '제품군 매핑'
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #ALLOWED
define table zabv_prodgrp {
key client : abap.clnt not null;
key bukrs : bukrs not null;
key matnr : matnr not null;
key valid_from: abap.dats not null;
valid_to : abap.dats;
prodgrp : abap.char(3);
prodgrp_name : abap.char(16);
}
② 차원 뷰 — 품목과 제품군
큐브가 제품 이름과 제품군 이름을 직접 읽지 않고 차원 뷰를 거치게 해, 이름 변경이나 다국어가 큐브 집계에 영향을 주지 않게 합니다. 여기서 이름 텍스트와 제품군을 연결(association)해 둡니다.
" ───────────────────────────────────────────────────────────
" ZI_AbvProduct — 품목 차원
" 역할: 제품 코드·이름·제품군을 한 번에 제공. 큐브는 이 뷰의 키만 안다.
" ───────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #NOT_REQUIRED
@EndUserText.label : '품목 차원'
@Analytics.dataCategory : #DIMENSION
@ObjectModel.representativeKey : 'Product'
define view entity ZI_AbvProduct
as select from zabv_prodgrp as m
association [0..1] to I_ProductText as _Text
on _Text.Product = $projection.Product
and _Text.Language = $session.system_language
{
key m.bukrs as CompanyCode,
key m.matnr as Product,
key m.valid_from as ValidFrom,
m.valid_to as ValidTo,
m.prodgrp as ProductGroup,
m.prodgrp_name as ProductGroupName,
_Text
}
③ 큐브 — 품목·월 단위의 산출
이 글의 핵심 뷰입니다. 평균 배부율, 기말 재고 고정간접비, 매출원가 반영 고정간접비, 두 이익, 이익 차이까지 한 번에 산출해 화면이 계산을 다시 하지 않게 합니다. 수량·재고 가치·발생액을 읽어 오는 원천 뷰 이름은 시스템마다 다를 수 있어 아래에서는 입력 뷰 ZI_AbvSource 로 가정했습니다(확인 필요).
" ───────────────────────────────────────────────────────────
" ZI_AbvItemMonth — 품목·월 큐브
" 역할: 흡수원가·변동원가 이익과 재고 고정간접비를 품목·월마다 산출
" 이렇게 나눈 이유: 식을 서비스나 화면이 아니라 큐브 한 곳에 둬야
" 표준 화면과 숫자를 맞출 때 확인 지점이 하나다.
" ───────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '품목·월 흡수/변동원가 큐브'
@Analytics.dataCategory : #CUBE
define view entity ZI_AbvItemMonth
as select from ZI_AbvSource as s
association [1..1] to ZI_AbvProduct as _Product
on _Product.CompanyCode = $projection.CompanyCode
and _Product.Product = $projection.Product
{
key s.CompanyCode,
key s.FiscalYear,
key s.FiscalPeriod,
key s.Product,
_Product,
s.CloseDate,
s.OpenQty, s.ProdQty, s.SalesQty,
cast( s.OpenQty + s.ProdQty - s.SalesQty as abap.int4 ) as CloseQty,
@Semantics.amount.currencyCode : 'Currency'
s.SalesAmt,
@Semantics.amount.currencyCode : 'Currency'
s.VarCost,
@Semantics.amount.currencyCode : 'Currency'
s.FixedOverhead as FohAmt,
@Semantics.amount.currencyCode : 'Currency'
s.OpenFoh,
" 평균 배부율 = (기초 재고 FOH + 당월 FOH) / (기초 수량 + 생산 수량)
cast( case when ( s.OpenQty + s.ProdQty ) = 0 then 0
else ( s.OpenFoh + s.FixedOverhead ) / ( s.OpenQty + s.ProdQty )
end as abap.dec(15,4) ) as AvgRate,
s.Currency
}
④ 분석 쿼리 — 화면이 부르는 조회
화면의 조회조건(회계연도·제품군·제품명·마감일·점검 결과)이 그대로 쿼리의 필터가 됩니다. 회계연도를 필수 파라미터로 받아 대용량에서도 한 해 범위로만 집계하게 하고, 허용 비중과 최소 금액은 파라미터가 아니라 설정 테이블에서 읽어 판정의 일관성을 지킵니다.
" ───────────────────────────────────────────────────────────
" ZC_AbvGapQuery — 분석 쿼리 (화면 ItemSet 이 읽는 뷰)
" 역할: 이익 차이와 점검 판정을 계산해 서비스에 노출
" ───────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '이익 차이 점검 쿼리'
@Analytics.query : true
@ObjectModel.usageType.dataClass : #MIXED
define view entity ZC_AbvGapQuery
with parameters
@Consumption.filter : { mandatory : true }
P_FiscalYear : gjahr
as select from ZI_AbvItemMonth as c
{
@Consumption.filter.selectionType : #SINGLE
key c.FiscalYear,
key c.FiscalPeriod,
key c.Product,
@AnalyticsDetails.query.axis : #ROWS
c._Product.ProductGroup,
c.CloseQty * c.AvgRate as CloseFoh,
c.OpenFoh + c.FohAmt - ( c.CloseQty * c.AvgRate ) as CogsFoh
}
where c.FiscalYear = $parameters.P_FiscalYear
⑤ 권한 — 회사코드·플랜트 단위
권한은 쿼리에 겁니다. 서비스나 화면에서 걸러 내면 요약 합계가 전체 값으로 먼저 계산되어 남의 숫자가 뺄셈으로 새어 나갈 수 있습니다. DCL 로 회사코드와 플랜트를 표준 권한 객체에 연결합니다.
" ───────────────────────────────────────────────────────────
" ZC_AbvGapQuery 의 접근 제어 (DCL)
" 이유: 요약·합계까지 한 번에 걸러야 하므로 쿼리 단계에서 건다.
" ───────────────────────────────────────────────────────────
@EndUserText.label : '이익 차이 점검 권한'
@MappingRole : true
define role ZC_AbvGapQuery {
grant select on ZC_AbvGapQuery
where ( CompanyCode ) = aspect pfcg_auth( F_BKPF_BUK, BUKRS, ACTVT = '03' );
}
⑥ 서비스 정의와 바인딩
쿼리를 OData V2 서비스로 노출합니다. 노출 이름은 화면이 부르는 엔티티셋 이름(ItemSet · PeriodSet · GroupSet · ReconSet)과 같게 맞추고, 게시 뒤 manifest 의 서비스 주소만 교체합니다.
" ───────────────────────────────────────────────────────────
" ZUI_ABV_GAP — 서비스 정의 + 바인딩(OData V2 - UI)
" 이름 맞추기: 화면이 부르는 엔티티셋 이름과 같게 as 로 지정
" ───────────────────────────────────────────────────────────
@EndUserText.label : '흡수·변동원가 이익 차이 서비스'
define service ZUI_ABV_GAP {
expose ZC_AbvGapQuery as ItemSet;
expose ZC_AbvPeriodQ as PeriodSet;
expose ZC_AbvGroupQ as GroupSet;
expose ZC_AbvReconQ as ReconSet;
}
" 서비스 바인딩: 유형 OData V2 - UI, 게시 후 /IWFND/MAINT_SERVICE 에서 활성 여부 확인
운영 시점에 해야 할 일
개발보다 정하는 일이 많습니다. 아래 아홉 가지는 코딩이 아니라 합의입니다.
| 해야 할 일 | 무엇을 정하나 | 정하지 않으면 | 누가 |
|---|---|---|---|
| 제품군 매핑 | 어느 제품이 어느 제품군에 속하는지 | 요약이 명세와 다른 기준으로 모입니다 | 회계팀 · 현업 |
| 배부율 방식 | 가중평균·선입선출·표준원가 중 무엇을 쓰는지 | 대사식 R04·R05 가 새 방식에서 깨집니다 | 회계팀 |
| 허용 비중과 최소 금액 | 점검 필요를 올릴 기준 | 점검 필요가 너무 많아 아무도 보지 않거나 너무 적어 놓칩니다 | 관리회계팀 |
| 원천 확정 | 수량·재고 가치·발생액·장부 반영 금액을 어느 원천에서 읽는지 | 화면 숫자가 표준 화면과 첫 회의에서 어긋납니다 | 회계팀 · 기술팀 |
| 권한 범위 | 회사코드·플랜트 단위 조회 범위 | 요약이 전체 값으로 계산되어 남의 숫자가 보입니다 | 보안 · 권한 |
| 성능 기준 | 회계연도 필수·조회 행 상한·집계 위치 | 대용량에서 응답이 늦어집니다 | 기술팀 |
| 대사 체계 | 표준 T-code 와 맞출 항목과 주기 | 두 화면 숫자를 누가 언제 맞추는지 모호해집니다 | 회계팀 |
| 전송(TR) 순서 | 매핑 테이블 → 뷰 → 큐브 → 쿼리 → DCL → 서비스 | 권한이나 서비스가 먼저 올라가 조회가 비거나 막힙니다 | 기술팀 |
| 서비스 활성화 | 서비스 게시와 manifest 서비스 주소 교체 | 화면이 샘플 서비스를 계속 바라봅니다 | 기술팀 |
운영 데이터로 갈 때
품목이 수만 개, 월이 열두 개, 연도가 여러 개가 되면 집계 위치가 성능을 좌우합니다. 큐브에서 품목·월 집계를 끝내고 화면은 결과 행만 받게 하며, 회계연도를 필수 파라미터로 받고, 조회 행 수에 상한을 두고, 원천 뷰의 회계연도·품목 조건에 인덱스를 확인합니다. 응답 시간 기준은 첫 화면 몇 초 안으로 먼저 정해 두시기를 권합니다.
자주 묻는 질문
도입 상담에서 자주 받는 질문들을 네 묶음으로 적었습니다.
숫자와 산식
두 이익이 다른 것은 오류입니까?
아닙니다. 흡수원가 방식은 고정제조간접비를 재고에 얹어 두었다가 팔린 만큼만 매출원가로 내리고, 변동원가 방식은 발생한 달에 전부 비용으로 봅니다. 그래서 재고가 늘면 흡수원가 이익이 커지고 재고가 줄면 작아집니다. 오류 여부는 두 이익의 차이가 기말 재고 고정간접비에서 기초 재고 고정간접비를 뺀 금액과 같은지로 판단합니다.
평균 배부율은 어떻게 구합니까?
(기초 재고 고정간접비 + 당월 고정간접비) ÷ (기초 수량 + 생산 수량) 으로 구하는 가중평균입니다. 기말 재고 고정간접비는 이 배부율에 기말 수량을 곱한 값입니다. 선입선출이나 표준원가를 쓰는 회사는 배부율 계산식만 바꾸면 되며, 두 이익의 대사식 자체는 그대로입니다.
허용 비중 5.00%와 5백만 원은 누가 정합니까?
회사가 정합니다. 화면은 서비스가 내려 주는 허용 비중과 최소 차이 금액을 그대로 쓰고 값을 고정해 두지 않습니다. 검증용 샘플 데이터에서는 5.00%와 5백만 원으로 두었습니다. 기준을 낮추면 점검 필요 건수가 늘고 높이면 줄기 때문에, 첫 달에는 건수가 점검 가능한 수준인지 보면서 정하시기를 권합니다.
점검 필요가 나오면 오류가 난 것입니까?
아닙니다. 점검 필요는 확인할 대상이라는 뜻이며 원인을 단정하지 않습니다. 재고가 크게 늘거나 줄어 차이가 허용 비중을 넘은 것일 수도 있고, 장부에 반영된 금액이 재계산과 다른 것일 수도 있습니다. 최종 판단은 회사와 감사인이 합니다.
장부 반영 불일치와 기초 이월 불일치는 무엇입니까?
장부 반영 불일치는 장부에 실제로 반영된 고정간접비가 이 화면이 다시 계산한 매출원가 반영 금액과 다른 건입니다. 기초 이월 불일치는 이번 달 기초 재고 고정간접비가 전월 기말 재고 고정간접비와 이어지지 않는 건입니다. 두 경우 모두 점검 코드 열로 구분되며 대사 결과 탭에서 건수가 따로 집계됩니다.
검증용 샘플 데이터는 어떻게 구성했습니까?
전동 펌프·유량 밸브·제어 보드·센서 모듈 네 제품군, 제품 8개, 2026년 1~9월로 품목·월 72건입니다. 점검 필요 12건은 재고 증감으로 차이가 큰 건 6건과 일부러 넣은 예외 6건입니다. 실제 업무 데이터가 아니라 화면과 대사식을 검증하기 위한 샘플입니다.
왜 대사식이 아홉 개나 됩니까?
한 건의 이익 차이를 믿으려면 그 앞단의 숫자가 모두 맞아야 합니다. 매출·변동원가·공헌이익, 수량 흐름, 재고 고정간접비 흐름, 두 이익의 차이, 전월 이월, 월별·제품군 합계, 누적 차이를 각각 잠가 두면 어느 층에서 어긋났는지가 바로 나옵니다. 아홉 식 모두 이번 검증에서 차이 0건이었습니다.
조회 속도는 어떻습니까?
샘플 규모에서는 즉시 열립니다. 운영 규모에서는 품목·월 집계를 서비스 쪽 CDS 큐브에서 미리 끝내고 화면은 결과 행만 받도록 하는 것이 전제입니다. 회계연도를 필수 조건으로 둔 것도 그 때문입니다.
화면과 조작
월별 요약과 제품군 요약에는 왜 일부 조건만 적용됩니까?
월별 요약은 마감일, 제품군 요약은 제품군과 점검 결과 조건만 적용합니다. 제품명처럼 품목 단위에서만 의미가 있는 조건을 요약에 적용하면 합계가 명세와 어긋나 보이기 때문입니다. 표 위 안내 문구에 이 규칙이 적혀 있습니다.
CSV 에는 무엇이 담깁니까?
현재 탭에 보이는 열과 같은 순서로 같은 조건의 결과가 담깁니다. 금액은 원 단위 그대로이고 비중은 퍼센트 값입니다. 대사 결과 탭에서는 대사식 문자열까지 함께 저장되어 검토 자료로 바로 쓸 수 있습니다.
표준 T-code 화면을 없애도 됩니까?
아니요. 재고 수량은 MB52, 물자 원장은 CKM3, 수익성은 KE30, 원가요소 개별 항목은 KSB1, 계정 잔액은 FAGLB03 이 계속 담당합니다. 이 화면은 그 숫자를 이어 받아 두 이익의 차이 관점으로 대사하는 확장이며, 법정·감사 대응은 표준 거래에 그대로 둡니다.
표준 연계와 데이터
데이터 원천은 어디입니까?
수량과 재고 가치는 재고 마스터 계열 테이블, 고정제조간접비 발생액은 원가 집계, 매출은 청구 문서, 장부 반영 금액은 회계 전표에서 옵니다. S/4HANA 에서는 원가 정보가 유니버설 저널에 통합되어 있으므로 실제 필드 매핑은 시스템에서 확인이 필요합니다.
S/4HANA 와 ECC 모두에서 쓸 수 있습니까?
화면은 OData 서비스만 바라보므로 서비스 뒤의 원천이 무엇이든 같은 화면이 동작합니다. 원천이 ECC 이면 서비스를 ABAP 클래스나 CDS 기반으로, S/4HANA 이면 CDS 큐브 기반으로 구현합니다. 어느 쪽이든 화면과 대사식은 바뀌지 않습니다.
권한은 어떻게 겁니까?
회사코드와 플랜트 단위 표준 권한을 서비스의 집계 단계에 겁니다. 화면에만 걸면 요약 합계가 전체 값으로 계산되어 남의 숫자가 드러나므로, 요약을 만드는 쿼리에 먼저 걸어야 합니다. CDS 에서는 DCL 로 정의합니다.
제품 코드나 제품군이 바뀌면 어떻게 합니까?
제품군 매핑은 별도 매핑 테이블 한 곳에서만 관리합니다. 새 제품이 생기면 어느 제품군에 속하는지만 적어 주면 화면과 요약이 같은 기준으로 다시 집계됩니다. 이 작업은 현업이 직접 합니다.
배부율 계산 방식이 회사마다 다르면 어떻게 합니까?
가중평균이 아닌 방식을 쓰는 회사는 서비스의 배부율 계산 한 곳만 바꿉니다. 대사식과 화면은 그대로이고, 대사 결과 탭의 R04·R05 가 새 계산에서도 차이 0 이 되는지로 변경이 맞는지 확인합니다.
감사인에게 어떻게 설명합니까?
화면은 기준서 해석을 대신하지 않고 회사가 정한 배부 결과의 대사 근거를 보여 줍니다. 대사 결과 탭의 대사식과 CSV 를 근거 자료로 쓰시고, 최종 판단은 회사와 감사인이 합니다. 예외 건은 별도 표시되어 있어 설명 자료를 따로 만들 필요가 줄어듭니다.
도입과 운영
좁은 화면에서도 쓸 수 있습니까?
데스크톱과 태블릿을 대상으로 만들었습니다. 열이 많은 명세 표는 가로 스크롤을 쓰고 요약 상자는 줄바꿈으로 내려옵니다. 휴대폰은 대상이 아닙니다.
운영 데이터로 연결하는 절차와 시간은 어느 정도입니까?
CDS 큐브와 서비스를 올리고 manifest 의 서비스 주소만 바꾸는 순서입니다. 기술 작업은 며칠 단위이고, 오래 걸리는 쪽은 제품군 매핑·배부율 방식·허용 비중 같은 합의입니다. 합의가 끝나면 코드는 이 글의 CDS 구성을 출발점으로 쓰시면 됩니다.
적용 시기나 범위가 정해져 있습니까?
정해진 것은 없습니다. 이 글의 숫자는 검증용 샘플 데이터 기준이며, 회사의 결산 일정과 원가계산 방식에 맞춰 범위를 정합니다. 기준서 적용 시기에 관해 확인된 사실이 필요한 경우에는 해당 기준서의 시행 시점을 회사가 직접 확인하셔야 합니다.
기존 관리회계 보고서를 이 화면으로 대체해야 합니까?
대체가 아니라 병행입니다. 기존 보고서는 그대로 두고, 두 이익이 다르다는 질문이 나올 때 이 화면으로 품목·월까지 내려가 차이의 근거를 대사합니다. 몇 달 병행해 숫자가 맞는 것을 확인한 뒤 쓰임새를 정하시면 됩니다.
유지보수에서 매달 손이 가는 곳은 어디입니까?
제품군 매핑과 허용 비중 검토가 중심입니다. 새 제품이 생길 때 제품군을 지정하고, 점검 필요 건수가 너무 많거나 적으면 기준값을 조정합니다. 화면 코드를 고칠 일은 거의 없습니다.