SAP 핵심지표 요인분해 점검 — 이익률이 움직였다면, 어느 요인이 얼마나 밀었는가
영업이익률·매출총이익률 변동을 하위 요인 트리로 분해하고, 기여분 합계가 상위 지표와 맞물리는지 대사합니다
영업이익률이나 매출총이익률 같은 핵심 경영지표는 매달 계획 대비 몇 %p가 움직였는지까지는 쉽게 나옵니다. 어려운 쪽은 그다음입니다 — "그 변동이 매출 때문인지, 원가율 때문인지, 판관비 때문인지"를 스프레드시트로 쪼개다 보면 하위 요인을 다 더했을 때 상위 지표 변동액과 슬며시 어긋나는 경우가 생깁니다. 배분 기준이 바뀌었거나 요인 하나가 누락된 것인데, 눈으로는 잘 드러나지 않습니다.
핵심 경영지표를 레벨1(지표) → 레벨2(요인) → 레벨3(세부요인) 3단 트리로 분해하고, 레벨마다 하위 기여분 합계가 상위 노드 기여분과 정확히 맞물리는지 자동으로 대사하는 화면을 OpenUI5로 확장했습니다. 실제 구동 화면 2종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 계획·실적 데이터 — 코스트센터 계획/실적 집계, 범용 원장(ACDOCA) 표준 구조를 그대로 사용
- 표준 화면 — 코스트센터 계획/실적 비교 리포트(S_ALR_87013611) · 코스트센터 실제 라인아이템(KSB1) · 수익성분석 조회(KE30/KE24)
| 항목 | 내용 |
|---|---|
| 업무 영역 | 관리회계(CO) · 사업계획·실적 |
| 관련 기준서 | - (대상 영역: 사업계획·실적 - 핵심지표 요인분해) |
| Namespace | zui5.kpitree |
| 셸 구조 | 조회조건 영역(우측 조회) + 탭(요인 트리/정합성 점검), 상세 Dialog |
| 화면 수 | 조회 화면 1개(탭 2개) + 상세 다이얼로그 |
| SAP 표준 T-code | S_ALR_87013611 · KSB1 · KE30 · KE24 (§7 참고) |
| 성격 | 조회·집계·대사형 — 최종 관리회계 판단은 회사·담당 부서 몫 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 2종 둘러보기
회계연도·기간·지표를 골라 조회하면 요인 트리가 뜹니다 → 정합성 점검 탭에서 하위 요인 합계와 상위 노드 기여분이 맞물리는지 확인 → 행을 클릭하면 대사 상세가 다이얼로그로 열립니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
조작 방법
- 회계연도 · 기간(월) · 지표 · 점검결과를 지정합니다.
- 입력 필드에서 Enter 키를 누르거나 조회조건 영역 오른쪽 끝의 조회 버튼을 누르면 재조회됩니다. 초기화 버튼은 조건을 비웁니다.
- 기간·지표·점검결과를 "전체"로 두면 해당 조건 없이 조회합니다.
- 정합성 점검 탭의 행을 클릭하면 대사 상세 다이얼로그가 열립니다.
- 정합성 점검 탭 우측 하단의 CSV 내려받기 버튼으로 현재 조회된 목록을 내려받을 수 있습니다.
요인 기여도 판정 로직
지표별로 등록된 계획값·실적값의 차이를 %p로 환산한 뒤, 요인·세부요인 단위로 배분된 기여분의 합계가 상위 노드 기여분과 일치하는지 대사합니다.
| 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|
| 하위 요인 기여분 합계 = 상위 노드 기여분 (오차 0.005%p 미만) | 정상 | 추가 조치 불필요 |
| 하위 요인 기여분 합계 ≠ 상위 노드 기여분 | 확인 필요 | 요인 트리 탭에서 해당 지표·기간의 하위 요인 값을 재확인 |
이 화면이 대신 정하지 않는 것
요인별 배분 가중치는 관리회계 판단의 결과물이지 이 화면이 만들어내지 않습니다. 이 화면은 등록된 요인 트리를 바탕으로 산술 정합성을 점검하는 도구이며, 요인 구분·배분 기준의 타당성에 대한 최종 판단은 회사와 담당 부서, 감사인이 합니다.
요인분해 산출 단계
| 단계 | 내용 |
|---|---|
| 1단계 | 지표(레벨1)의 계획값·실적값을 확정하고 변동액을 %p로 산출 |
| 2단계 | 변동액을 레벨2 요인(매출액 효과·원가율 효과·판관비율 효과 등) 단위로 배분 |
| 3단계 | 레벨2 요인의 기여분을 레벨3 세부요인 단위로 재배분 |
| 4단계 | 레벨3→레벨2, 레벨2→레벨1 순으로 합계를 재계산해 상위 노드와 대조 |
| 5단계 | 합계가 어긋나는 노드를 정합성 점검 탭에 "확인 필요"로 표시 |
레벨3(세부요인) 기여분 합계 = 레벨2(요인) 기여분
레벨2(요인) 기여분 합계 = 레벨1(지표) 기여분
레벨1(지표) 기여분 = 실적값 - 계획값 (%p 환산)
조회조건
| 필드 | 필수 | 설명 |
|---|---|---|
| 회계연도 | 선택 | 4자리 연도 |
| 기간(월) | 선택 | 전체/06/07/08(전체 선택 시 조건 미전달) |
| 지표 | 선택 | 전체/OPM(영업이익률)/GPM(매출총이익률) |
| 점검결과 | 선택 | 전체/정상/확인 필요, Enter 키로 바로 조회 |
결과 컬럼
| 컬럼 | 설명 |
|---|---|
| 지표ID · 지표명 · 기간(월) | 분해 대상 지표와 회계기간 |
| 레벨 · 요인명 | 1(지표)/2(요인)/3(세부요인) 구분과 계층별 명칭 |
| 기여분(%p) · 계획값 · 실적값 | 상위 노드 변동액에 대한 기여분과, 레벨1의 계획·실적 비율 |
| 상위 기여분 · 하위 합계 · 차이 · 점검결과 | 대사식 좌변·우변 구성 요소와 정상/확인 필요 판정 |
SAP 표준 기능 매핑
| SAP 표준 T-code | 연관 기능 |
|---|---|
S_ALR_87013611 | 코스트센터 계획/실적 비교 리포트 — 레벨1 지표의 계획·실적값 참고 |
KSB1 | 코스트센터 실제 라인아이템 — 원가율·판관비율 요인 집계 참고 |
KE30 / KE24 | 수익성분석(CO-PA) 조회 — 매출·매출원가 요인 분해 참고 |
요구사항 매핑표
| 대상 영역 | 요구사항 | 대응 기능 | 원천 데이터 |
|---|---|---|---|
| 사업계획·실적(핵심지표 요인분해) | 지표 변동의 원인 요인별 기여도 확인 | 요인 트리 탭(레벨1~3 계층 분해) | 코스트센터·손익센터 계획/실적 집계 |
| 사업계획·실적(핵심지표 요인분해) | 요인분해 트리의 롤업 정합성 모니터링 | 정합성 점검 탭(상위 기여분=하위 합계) | 요인 트리 산출 결과 |
도입 시 확인이 필요한 부분
지표 종류와 요인 트리의 계층 구성(레벨 수, 요인 명칭)은 회사의 관리회계 보고 체계에 맞춰 조정해야 합니다.
참고 CDS 뷰
운영 서비스로 연결할 때를 가정해 새로 스케치한 집계 뷰 예시입니다(운영 반영 시 권한 체크를 추가해야 합니다).
@AbapCatalog.sqlViewName: 'ZKPIFACTOR'
define view Z_I_KpiFactorTree
as select from acdoca
association [1..1] to csks as _Ccenter on acdoca.kostl = _Ccenter.kostl
{
key acdoca.gjahr as FiscalYear,
key acdoca.poper as Period,
_Ccenter.kostl as CostCenter,
sum(case when acdoca.rldnr = '0L' then acdoca.hsl else 0 end) as ActualAmount,
sum(case when acdoca.drcrk = 'H' then acdoca.hsl else 0 end) as RevenueAmount
}
group by acdoca.gjahr, acdoca.poper, _Ccenter.kostl
// 요인별 기여분 배분은 별도 계층형 엔티티셋으로 관리
OpenUI5 구성
| 기능 | 사용 컨트롤 |
|---|---|
| 화면 골격 | sap.m.Page + 조회조건 Toolbar + IconTabBar(2탭) |
| 조회조건 | sap.m.Input · sap.m.Select — 우측 끝에 조회 버튼, Enter 키로 즉시 재조회 |
| 요인 트리 · 정합성 점검 | sap.ui.table.Table(각 엔티티셋에 개별 바인딩) — 정합성 점검 행 클릭 시 상세 다이얼로그 |
| 상세 | sap.m.Dialog — 선택 행의 바인딩 컨텍스트를 그대로 사용 |
| 공통 처리 | 전역 오류 처리기(ErrorHandler) — 메타데이터·요청 실패를 메시지로 표시 |
서비스 경로는 manifest.json 의 dataSources 에 상대 경로로 선언한 OData V2 모델을
그대로 바인딩하며, 조회조건은 sap.ui.model.Filter 로 조립해 $filter 로만 전달합니다.
조건을 "전체"로 둘 때는 필터를 아예 생성하지 않습니다. 요인 트리는 상위 노드 아래로 하위 요인이
이어지도록 정렬 조건을 함께 구성했습니다.
파일 구성
| 경로 | 역할 |
|---|---|
index.html | OpenUI5 부트스트랩 — sap_horizon |
Component.js | 컴포넌트 초기화, 전역 오류 처리기 연결 |
manifest.json | 앱 디스크립터 — zui5.kpitree · OData dataSources · ko 로케일 |
view/Main.view.xml | 조회조건 + 탭(요인 트리/정합성 점검) |
view/DetailDialog.fragment.xml | 정합성 점검 상세 다이얼로그 |
controller/Main.controller.js | 조회·필터 조립·다이얼로그 로직 |
controller/BaseController.js | 공통 처리(CSV 내려받기 등) |
model/ErrorHandler.js | 전역 오류 처리 |
model/formatter.js | 기여분·비율·점검상태 서식 |
i18n/i18n_ko.properties | ko 로케일 리소스 |
검증 환경 구성 상세는 이 글에서 다루지 않습니다. 운영 전환 시에는 화면과 판정 로직은 그대로 두고 데이터 계층만 실제 서비스 호출에 맞추면 됩니다.
검증 결과
화면 구성에 쓴 데이터는 레벨3→레벨2→레벨1 순의 기여분 합계 관계가 항상 검증되도록 구성했습니다.
| 검증 항목 | 결과 |
|---|---|
| 대사식 전수 검증(하위 요인 기여분 합계=상위 노드 기여분, 24개 점검 행) | 통과(차이 0건, 의도적 예외 2건 별도 표시) |
| 표시 금지 검사 — 커스텀 프로그램ID·앱 식별자·출처 표현 검출 | 0건 |
| 화면 렌더링 — 실브라우저에서 조회 → 탭 전환 → 행 클릭 상세까지 실동작 후 캡처 | 2/2 |
| 조회 버튼 위치 · sap_horizon 테마 적용 · Enter 키 조회 | 확인 |
| OData 계약 — 동사 경로 미사용, $filter·$orderby·$top·$inlinecount 로만 조회조건·페이징 전달 | 확인 |
화면 수치는 모두 검증용으로 구성한 가상 데이터입니다.
자주 묻는 질문
이 화면은 언제부터, 어떤 범위에 사용할 수 있나요?
별도의 법정 시행일은 없습니다. 사내 관리회계 프로세스에서 산출하는 핵심 경영지표(영업이익률·매출총이익률 등)의 월별 변동 요인 분석을 대상 범위로 합니다.
"확인 필요" 표시는 오류가 확정되었다는 뜻인가요?
아니요. 이 화면은 분류·집계·대사를 돕는 조회·점검 도구이며, 표시된 차이의 원인 확정과 최종 판단은 회사와 감사인이 합니다.
화면에서 보이는 데이터는 실제 운영 데이터인가요?
아니요. 이 글과 화면 캡처에 쓰인 수치는 화면 동작과 대사 로직을 확인하기 위해 구성한 검증용 샘플 데이터이며, 실제 경영지표 데이터가 아닙니다.
요인별 기여분은 어떻게 계산되나요?
지표(레벨1)의 실적값에서 계획값을 뺀 변동액을 100분율(%p)로 환산한 뒤, 이를 레벨2 요인과 레벨3 세부요인 단위로 순차 배분합니다. 하위 요인 기여분의 합계가 상위 노드 기여분과 다르면 화면에 "확인 필요"로 표시됩니다.