SAP 코스트센터 통계지표(SKF) 등록현황 — 배부하기 전에 기준값부터 점검한다
코스트센터별 인원수·면적·가동시간 같은 통계지표가 매달 빠짐없이 들어왔는지, 갑자기 튄 값은 없는지 한 화면에서 확인합니다.
배부 사이클(코스트센터 어세스먼트·배분)은 금액이 아니라 통계지표를 기준으로 원가를 나눕니다. 인원수·면적·가동시간 같은 값이 그 역할을 하는데, 정작 이 값 자체가 몇 달째 등록되지 않았거나 갑자기 두 배로 튀었는지는 배부를 돌리는 순간까지 잘 드러나지 않습니다.
이 화면은 코스트센터 x 통계지표 조합별로 조회기간 안의 등록 여부를 매달 빠짐없이 확인하고, 등록된 값 중 마지막 두 개 월을 비교해 급격한 변동을 잡아냅니다. 배부 결과 자체를 검증하는 기존 화면들과 달리, 배부가 돌기 전 단계 — 기준값의 품질을 통제 대상으로 삼습니다. 실제 구동 화면 5종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 코스트센터 — 코드(
Kostl)와 회사코드(Bukrs) · 책임자 - 통계지표 — 지표코드(
Stagr)와 명칭 · 단위(Meaeh) - 측정유형 — 잔액형(이월) / 합계형(집계) 구분(
Kzst) - 등록 전표 — 전표번호 · 등록일 · 등록자
- 기간 — 회계연도(
Gjahr)와 월(Monat)
| 항목 | 내용 |
|---|---|
| 대응 T-code | KB31N(통계지표 입력) · KB33N(통계지표 조회) |
| 업무 영역 | 관리회계(CO) · 통계지표(SKF) 등록 완전성 |
| Namespace | zui5.skf |
| 셸 구조 | 조회조건 영역(우측 조회·초기화) + 조합 목록 + 월별 등록현황 상세 |
| 화면 수 | 조회 화면 1개 + 월별 상세 다이얼로그 |
| 데이터 | 배정 조합 25건 · 등록 전표 196건(의도적 결측 3조합 · 급변 3조합 포함) |
| 성격 | 조회형(Read-Only) — 지표 입력·저장은 표준이 담당 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 5종 둘러보기
회사코드·기간으로 조회하면 조합별 등록현황이 나옵니다 → 미등록·급변 건을 필터링하고 → 행을 선택해 월별 이력을 드릴다운합니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
조작 방법
- 회사코드와 회계연도·조회기간(시작월~종료월)을 지정합니다.
- 필요하면 코스트센터를 부분 일치로 입력하거나 지표그룹을 선택합니다.
- 조회조건 입력필드에서 값을 바꾸거나 Enter 를 누르면 이미 조회한 상태에서는 즉시 재조회됩니다.
- 미등록만 체크박스로 결측 조합만, 급변만 체크박스로 이상치 조합만 좁혀 봅니다(동시 체크 시 AND).
- 조회조건 영역 가장 오른쪽의 [조회](또는 Enter)를 누르면 즉시 집계됩니다.
- 행을 선택하거나 상세 버튼을 누르면 월별 등록현황이 다이얼로그로 열립니다.
- 목록·월별 상세 모두 CSV 다운로드로 내려받아 배부 실행 전 점검 자료로 첨부합니다.
등록완전성 & 이상치 판정 로직
결측이 하나라도 있으면 값의 크기와 무관하게 최우선으로 "미등록"이 됩니다. 결측이 없을 때만 증감률로 이상치를 판정합니다.
조합(코스트센터 x 통계지표)별 조회기간 내 월 목록을 구성
→ 등록 전표가 있는 월만 매핑
미등록개월 = 조회기간 전체 월수 − 등록된 월수
미등록개월 > 0 → 상태 = "미등록" (최우선, 값 크기와 무관)
등록개월 ≥ 2 인 경우만 증감률 계산
증감률 = (최근등록값 − 직전등록값) / 직전등록값 × 100
|증감률| ≥ 임계값(기본 30%) → 상태 = "급변"
그 외 → 상태 = "정상"
정렬 우선순위 : 미등록 > 급변 > 정상
미등록이 급변보다 항상 우선하는 이유
값 자체가 없으면 증감률을 계산할 수 없고, 결측은 배부 실행이 아예 막히거나 엉뚱한 코스트센터가 부담을 떠안는 직접 원인이 됩니다. 그래서 두 조건이 동시에 성립할 수 없도록 설계하고, 정렬도 미등록을 항상 앞에 두어 담당자가 가장 급한 항목부터 보게 합니다.
조합별 월별 매칭 처리 단계
| 단계 | 내용 | 산출 |
|---|---|---|
| ① 배정 조합 산출 | 회사코드(+코스트센터/지표그룹 필터)로 대상 조합 추출 | 조합 리스트 |
| ② 월별 매칭 | 등록 전표를 월(Monat) 키로 매핑 | 월→전표 맵 |
| ③ 결측 계산 | 조회기간 전체 월 − 매핑된 월 | 미등록개월 |
| ④ 증감 계산 | 등록된 마지막 두 월의 값 비교 | 증감률 |
| ⑤ 상태 판정 & 정렬 | 미등록 > 급변 > 정상 규칙 적용 | 상태 · 정렬순서 |
③을 건너뛰면 배부기준이 빠진 채로 실행되어 다른 코스트센터가 부담을 대신 떠안는 왜곡이 결산 이후에나 발견됩니다.
조회조건
| 필드 | 필수 | 설명 |
|---|---|---|
회사코드 Bukrs | 필수 | 대상 법인 |
회계연도 Gjahr | 필수 | 조회 연도 |
조회기간 MonatFrom~MonatTo | 필수 | 시작월~종료월 구간 |
코스트센터 Kostl | 선택 | 부분 일치, Enter 로 즉시 조회 |
지표그룹 StagrGrp | 선택 | 인사/공통 · 설비/자산 · 생산활동 |
| 미등록만 | 선택 | 상태=미등록 조합만 |
| 급변만 | 선택 | 상태=급변 조합만(미등록만과 동시 체크 시 AND) |
결과 컬럼
| 컬럼 | 의미 · 표시 |
|---|---|
| 코스트센터 · 코스트센터명 · 책임자 | 코스트센터 마스터 조인 |
| 통계지표 · 지표명 · 지표그룹 | SKF 마스터 조인 |
| 측정유형 | 잔액형(이월) / 합계형(집계) |
| 최근등록값 · 직전등록값 | 조회기간 내 마지막 두 등록월 값(단위 포함) |
| 증감률 | (최근-직전)/직전×100, 상태에 따라 색상 |
| 미등록개월 | 조회기간 내 등록 누락 월수 |
| 상태 | 미등록 / 급변 / 정상 |
| 상세 | 월별 등록현황 다이얼로그(등록여부·값·증감률·등록일·등록자) |
SAP 표준 기능 매핑
| 표준 | 역할 | 이 화면에서의 확장 |
|---|---|---|
KB31N | 통계지표 전표 입력 | 월별 개별 입력 결과가 빠짐없이 들어왔는지 사후 점검 |
KB33N | 통계지표 전표 조회 | 전표 단건 조회를 조합x월 매트릭스로 확장 |
KP26/KP06 | 활동유형/코스트센터 계획 | 통계지표는 계획이 아닌 실적성 등록값 — 이 화면은 계획·실적 차이가 아니라 등록 완전성을 다룸 |
KSU5/KSV5(어세스먼트·배분) | 통계지표를 배부기준으로 사용 | 배부 실행 전 기준값 품질을 통제하는 선행 단계로 연결 |
도입 시 확인이 필요한 부분
증감률 임계값과 지표별 결측 허용 정책은 조직마다 다릅니다. 잔액형 지표는 값이 거의 고정이라 작은 변화도 의미가 있을 수 있고, 합계형 지표는 계절성이 있어 임계값을 더 넉넉히 둬야 할 수 있습니다. 배부 사이클의 어세스먼트/배분 설정과 함께 검토가 필요합니다.
참고 CDS 뷰
@AbapCatalog.sqlViewName: 'ZCSKFCPL'
@EndUserText.label: '코스트센터 통계지표 등록현황 (Z)'
define view Z_C_SKF_COMPLETENESS
as select from cssk as SkfAssign
inner join csks as CostCenter on CostCenter.kostl = SkfAssign.kostl
and CostCenter.bukrs = SkfAssign.bukrs
left outer join coep as SkfLine on SkfLine.kostl = SkfAssign.kostl
and SkfLine.stagr = SkfAssign.stagr
and SkfLine.gjahr = $parameters.p_gjahr
{
key SkfAssign.bukrs,
key SkfAssign.kostl,
key SkfAssign.stagr,
CostCenter.verak,
SkfLine.perio as Monat,
SkfLine.mbgbtr as Value,
SkfLine.cpudt as Erdat,
SkfLine.usnam as Ersnam
// 미등록개월 · 증감률 · 상태는 애플리케이션 계층(OpenUI5 Main.controller.js)에서
// 조회기간 파라미터를 받아 파생 계산한다 (CDS 는 원천 라인만 제공)
}
매핑 이해를 돕기 위한 참고용 설계입니다. 실제 도입 시에는 운영 환경 설정과 릴리즈에 맞춰 조정합니다.
OpenUI5 구성
| 기능 | 사용 컨트롤 |
|---|---|
| 화면 골격 | sap.f.DynamicPage — 타이틀(KPI) · 조회조건 헤더 · 목록 콘텐츠 |
| 조회조건 | sap.m.Select · sap.m.Input · sap.m.CheckBox — 우측 끝에 조회·초기화 |
| 이벤트 | 모든 버튼/필드가 onPAI 단일 진입점, fcCode 로 분기 |
| 조합 목록 | sap.ui.table.Table(13컬럼, 10개 초과) — 상태별 행 강조 |
| 상태 표시 | sap.m.ObjectStatus — 미등록/급변/정상 → Error/Warning/Success |
| 월별 상세 | 행 선택 시 sap.m.Dialog + sap.m.Table 로 등록 이력 펼침 |
월별 상세를 다이얼로그로 둔 이유
목록은 조합(코스트센터x지표) 단위로 상태를 한눈에 훑는 용도이고, 다이얼로그는 "왜 이 조합이 미등록/급변인지"를 월 단위로 추적하는 용도입니다. 두 관점을 한 화면에 욱여넣지 않고 목록→상세로 분리해 각각의 밀도를 유지했습니다.
파일 구성
| 경로 | 역할 |
|---|---|
manifest.json | 앱 디스크립터 — 앱 ID(zui5.skf) · ko 로케일 |
view/Main.view.xml + view/fragments/* | 타이틀 · 조회조건 · 메시지스트립 · 목록 · 상세 프래그먼트 |
controller/Main.controller.js | 조회 · 집계(등록완전성/이상치 판정) · 상세 · CSV |
model/ModelMock.js | localdata JSON 읽기(Promise) |
model/formatter.js | 값·증감률·상태색 포맷터 |
localdata/skfassign.json | 코스트센터x지표 배정 25건 |
localdata/skfpostings.json | 월별 등록 전표 196건 |
검증 결과
| 검증 항목 | 결과 |
|---|---|
| Python 재구현 집계와 UI5 로직 결과 전량 일치(25조합) | 통과 |
| 의도적 결측 3조합 → "미등록" 판정 | 통과 |
| 의도적 급변 3조합 → "급변" 판정 | 통과 |
| 모든 postings 가 배정 조합·회사코드에 정합 | 고아 레코드 0건 |
| XML · JSON 전체 파싱 | 오류 0건 |
| i18n 키 · 이벤트 핸들러 누락 | 0건 |
| 화면 렌더링 — 실브라우저 조회→필터→상세 실동작 후 캡처 | 5/5 |
| 테마 런타임 확인 | sap_horizon |
자주 묻는 질문
통계지표(SKF)가 미등록이면 배부 자체가 안 되나요?
배부 사이클(어세스먼트·배분)은 통계지표를 배부기준(Tracing Factor)으로 쓰므로, 해당 코스트센터의 값이 없으면 그 코스트센터는 배부 대상에서 빠지거나 0으로 처리됩니다. 결과적으로 관련 없는 다른 코스트센터가 그 부담을 떠안는 왜곡이 생길 수 있어 결산 전에 반드시 확인해야 합니다.
증감률 임계값 30%는 어떻게 정해지나요?
이 화면은 기준값을 mock 데이터의 meta.json 에 파라미터로 두었습니다. 실제 도입 시에는 지표 성격(잔액형/합계형)이나 부문별로 다른 임계값을 적용할 수 있도록 커스터마이징 테이블이나 사용자 파라미터로 옮기는 것을 권장합니다.
잔액형과 합계형 통계지표는 무엇이 다른가요?
인원수·면적·차량대수처럼 월말 시점 값을 그대로 유지·이월하는 지표가 잔액형이고, 설비가동시간·전력사용량·생산수량처럼 그 달의 실적을 누적해 등록하는 지표가 합계형입니다. 배부 계산과 화면 표시 방식(정수/소수)이 이 구분에 따라 달라집니다.
SAP 표준 기능과 어떻게 이어지나요?
통계지표의 입력과 저장은 표준 KB31N·KB33N 이 수행합니다. 이 화면은 그 결과를 코스트센터 x 지표 매트릭스로 펼쳐 결측과 이상치를 배부 실행 전에 드러내는 조회·검증 확장입니다.