SAP 판매 추세·이상 변동 점검 — 전년동기와 다르다고 다 이상 신호는 아닙니다
월별 매출을 전년동기·직전 3개월 이동평균과 함께 보면, 단순 증가처럼 보이던 숫자도 계절 요인인지 실제 이상 변동인지 갈립니다
매출 증가는 대체로 반가운 신호지만, 그 증가가 통상적인 범위 안에 있는지는 따로 확인해야 합니다. 프로모션이나 밀어내기로 생긴 일시적 증가, 반대로 공급 차질이나 거래처 이탈로 인한 감소는 전년동기 실적이나 최근 몇 개월의 흐름과 나란히 놓고 봐야 드러납니다. 매출 데이터를 화면에 죽 나열하는 것만으로는 이 판단이 어렵습니다.
영업조직 × 제품군 × 월 단위로 매출을 집계하고, 같은 조합의 전년동기 매출 및 직전 3개월 이동평균과 함께 증감률을 계산해 통상 변동폭(±15%, ±30%)을 벗어난 구간을 자동으로 가려내는 화면을 OpenUI5로 만들었습니다. 표준 조회 기능이 실적 목록을 보여준다면, 이 화면은 그 위에 두 가지 비교 기준을 더해 어디부터 봐야 할지 우선순위를 정하는 관점을 더합니다. 실제 구동 화면 3종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 수주 조회 — 수주현황 목록 조회(
VA05)의 수주 문서·품목 구조를 그대로 이어받습니다 - 매출 집계 원천 — 청구현황 목록 조회(
VF05)의 청구 문서·순매출액을 집계 기준으로 씁니다
| 항목 | 내용 |
|---|---|
| 업무 영역 | 영업(SD) · 판매 분석 |
| 관련 대상 영역 | 판매 분석 — 매출 추세 및 이상 변동 점검(관련 기준서 없음) |
| Namespace | zui5.salestrend |
| 셸 구조 | 조회조건 영역(우측 조회) + 판정상태 요약 KPI + 탭 2개, 행 클릭 상세 Dialog |
| 화면 수 | 조회 화면 1개(탭 2개) + 상세 다이얼로그 |
| SAP 표준 T-code | VA05 · VF05 |
| 데이터 연동 방식 | OData V2 — 화면 블록마다 엔티티셋에 직접 바인딩 |
| 성격 | 조회·대사·점검형 — 실제 원인 확인과 최종 판단은 회사가 수행 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 3종 둘러보기
기본 조건으로 조회하면 판정상태 요약과 추세·이상 변동 명세가 뜹니다 → 영업조직 요약 탭에서 조직 단위 합계를 확인하고 → 행을 클릭해 상세 검증식을 봅니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
사용 방법
- 회계연도·시작기간·종료기간(필수)과 영업조직·제품군(선택)을 입력합니다. 선택 조건을 비워 두면 전체가 조회 대상입니다.
- 조회 버튼은 조회조건 입력 필드 줄의 가장 오른쪽에 있습니다. 입력 필드에서 Enter 키를 눌러도 같은 조회가 실행됩니다. 화면을 열면 기본 조건으로 한 번 자동 조회됩니다.
- 판정상태 요약에서 조회 건수와 정상·확인 필요·급증·급감 건수, 구간 내 최대 증감률을 먼저 확인합니다.
- 탭을 옮겨 추세·이상 변동 명세 → 영업조직 요약 순으로 봅니다.
- 명세에서 행을 클릭하면 당월·전년동기·이동평균과 검증식이 다이얼로그로 열립니다.
- CSV 내려받기(UTF-8 BOM)로 현재 조회 결과(명세 탭 기준)를 저장합니다.
이상 변동 판정 기준
| 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|
| 전년동기 대비 증감률의 절대값이 15% 이하 | 정상 | 별도 조치 불필요 |
| 전년동기 대비 증감률의 절대값이 15% 초과 30% 이하 | 확인 필요 | 담당자 확인 권장 |
| 전년동기 대비 증감률이 +30% 초과(급증) | 점검 필요(급증) | 프로모션·대량수주·단가 변동 등 원인 확인 |
| 전년동기 대비 증감률이 -30% 미만(급감) | 점검 필요(급감) | 공급 차질·거래처 이탈·계절 요인 등 원인 확인 |
| 이동평균 대비 변동률 절대값이 20%를 넘는 경우(보조 지표) | 이동평균 이탈 표시 | 전년동기 대비와 함께 추세 이탈 여부 참고 |
판정은 정해진 임계값에 따른 점검 후보 분류이며, 증감의 실제 원인과 조치는 담당자가 판단합니다. 임계값은 예시 기준이며 회사 정책에 맞게 조정할 수 있습니다.
전년동기·이동평균 대사 절차
| 단계 | 내용 |
|---|---|
| 1단계 | 영업조직 × 제품군 × 회계연도/기간별로 당월 매출과 판매수량을 집계합니다 |
| 2단계 | 같은 조합의 전년동기 매출을 대응시킵니다 |
| 3단계 | 전년동기 대비 증감률 = (당월매출 − 전년동기매출) ÷ 전년동기매출 |
| 4단계 | 같은 조합의 연속 시계열에서 직전 3개월(가용기간) 평균으로 이동평균을 계산하고, 이동평균 대비 변동률을 함께 계산합니다 |
| 5단계 | 임계값에 따라 판정상태(정상/확인 필요/점검 필요)를 결정합니다 |
| 6단계 | 영업조직 × 기간 단위로 제품군 합계를 재집계해 조직 요약을 만들고, 명세 합계와 대사합니다 |
조회조건
| 필드 | 필수 | 설명 |
|---|---|---|
| 영업조직 | 선택 | 전체면 조건 제외 |
| 제품군 | 선택 | 전체면 조건 제외 |
| 회계연도 | 필수 | 4자리 연도 |
| 시작기간 / 종료기간 | 필수 | 3자리 기간, 구간(BT) 조건으로 전달 |
| 이상 변동만 보기 | 선택 | 체크 시 판정상태가 정상이 아닌 행만 조회 |
결과 컬럼
| 컬럼 | 설명 |
|---|---|
| 영업조직 / 제품군 / 기간 | 집계 기준 조합 |
| 당월 매출 / 판매수량 | 해당 기간 실적 |
| 전년동기 매출 / 전년동기 대비 | 대응 전년동기 금액과 증감률 |
| 3개월 이동평균 / 이동평균 대비 | 추세 참고 지표 |
| 판정 | 정상 · 확인 필요 · 점검 필요(급증·급감) |
SAP 표준 기능 매핑
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 그 데이터에 전년동기·이동평균 비교 관점의 조회·점검을 더해 확장합니다.
| 표준 T-code | 표준 기능 | 이 화면이 더한 것 |
|---|---|---|
VA05 | 수주현황 목록 조회 | 영업조직·제품군별 수주 원천 확인(참고) |
VF05 | 청구현황(빌링 문서) 목록 조회 | 당월·전년동기 매출 집계의 원천 문서 조회(참고) |
분석 지표 정의표
| 지표 | 산출식 | 판정 기준 |
|---|---|---|
| 전년동기 대비 증감률 | (당월매출 − 전년동기매출) ÷ 전년동기매출 | |증감률| 15% 이하 정상 / 15~30% 확인 필요 / 30% 초과 점검 필요 |
| 이동평균 대비 변동률 | (당월매출 − 3개월이동평균) ÷ 3개월이동평균 | 절대값 20% 초과 시 이동평균 이탈 표시(보조 지표) |
| 조직 증감률 | (조직매출합계 − 조직전년동기합계) ÷ 조직전년동기합계 | 조직 단위 참고 지표 |
참고 CDS 뷰
| 원천 테이블 | 주요 필드 | 쓰임 |
|---|---|---|
VBRK / VBRP | VKORG · NETWR · FKIMG | 청구전표 헤더/품목 — 영업조직·순매출액·청구수량 |
VBAK / VBAP | VBELN | 수주 헤더/품목(참고 — 원천 문서 계통 확인용) |
MVKE | MVGR1 | 자재 영업뷰 — 제품군 매핑 참고 |
define view entity ZC_SALES_TREND_MONTHLY
as select from vbrp
inner join vbrk on vbrp.vbeln = vbrk.vbeln
inner join mvke on vbrp.matnr = mvke.matnr and vbrp.vkorg = mvke.vkorg
{
key vbrk.vkorg as SalesOrg,
key mvke.mvgr1 as ProdGroup,
key vbrk.gjahr as Gjahr,
key vbrk.poper as Poper,
sum(vbrp.netwr) as NetAmount,
sum(vbrp.fkimg) as Qty
}
group by vbrk.vkorg, mvke.mvgr1, vbrk.gjahr, vbrk.poper
전년동기·이동평균·증감률·판정 상태는 위 집계 결과를 바탕으로 애플리케이션 단계에서 파생 계산합니다.
OpenUI5 구성
| 기능 | 사용 컨트롤 · 구성 |
|---|---|
| 화면 골격 | sap.m.Page + 조회조건 패널 · 판정상태 요약 KPI · IconTabBar 2개 탭 |
| 데이터 연동 | manifest.json dataSources.mainService(OData V2, 상대 경로)로 기본 모델을 만들고 defaultCountMode:"Inline" · useBatch:false 로 구성합니다. 화면 블록마다 해당 엔티티셋에 직접 바인딩합니다 |
| 조회조건 | sap.ui.model.Filter 로 조립해 바인딩에 적용합니다. 전체를 고른 조건은 필터를 만들지 않습니다. 정렬은 Sorter, 총건수는 인라인 카운트로 받습니다 |
| 명세 표 | sap.ui.table.Table — 컬럼이 많은 명세, 행 클릭(cellClick)으로 상세 다이얼로그 |
| 요약 표 | sap.m.Table — 영업조직 요약 소량 집계 |
| 예외 메시지 | 메타데이터 실패·요청 실패·빈 결과를 구분해 안내하는 전용 처리기 |
파일 구성
| 경로 | 역할 |
|---|---|
index.html | OpenUI5 부트스트랩 — sap_horizon, OData 서비스에 연결 |
Component.js | 모델 초기화, 예외 메시지 처리기 연결 |
manifest.json | 앱 디스크립터 — zui5.salestrend · ko 로케일, OData 서비스와 모델 선언 |
view/Main.view.xml | 조회조건 · 판정상태 요약 · 2개 탭 |
view/DetailDialog.fragment.xml | 상세 검증식 다이얼로그 |
controller/Main.controller.js | 조회조건 조립 · 바인딩 · 다이얼로그 · CSV |
controller/BaseController.js | CSV 다운로드 공통 처리 |
model/formatter.js · model/ErrorHandler.js | 표시 서식 · 예외 메시지 처리 |
i18n/i18n_ko.properties | 화면 문구 |
검증 결과
검증용 샘플 데이터(영업조직 3개 × 제품군 5개 × 20개월, 300건)를 기준으로 대사식을 전수 검증했습니다. 점검 화면이라 의도적으로 넣은 이상치 62건을 판정 로직에 따라 확인 필요/점검 필요로 정상 분류함을 확인했습니다.
| 검증 항목 | 결과 |
|---|---|
| 전년동기 × (1+증감률) = 당월매출 (300건) | 통과(차이 0) |
| 판정상태(VarianceState) 재계산 (300건) | 통과(차이 0) |
| 영업조직 요약 합계(매출·전년동기·제품군수·이상건수) (60건) | 통과(차이 0) |
| 조직 증감률(OrgVarianceRate) 대사 (60건) | 통과(차이 0) |
| 이동평균(3개월/가용기간) 재계산 (300건) | 통과(차이 0) |
| 조회 조건 전달 — 필터 · 증감률 내림차순 정렬 · 상위 건수 · 총건수 표시 | 확인 |
| 표시 금지 검사 — 커스텀 프로그램ID·앱 식별자·출처 표현 | 0건 |
화면 렌더링 — 조회 버튼 위치 · sap_horizon 테마 · Enter 키 조회 · 서비스 미연결 시 안내 메시지 | 확인 |
모든 데이터는 검증용으로 구성한 가상 데이터입니다.
자주 묻는 질문
이 글의 화면은 어떤 기간의 데이터를 기준으로 하나요?
조회조건의 회계연도·시작기간~종료기간에 해당하는 영업조직×제품군별 월계 실적을 대상으로 합니다. 이동평균은 각 조합의 연속 시계열에서 가용한 직전 기간만 사용하며, 첫 1~2개 기간은 가용 기간만으로 평균을 계산합니다.
'확인 필요'와 '점검 필요'는 어떻게 다른가요?
전년동기 대비 증감률의 절대값이 15~30%이면 확인 필요, 30%를 초과(증가는 급증, 감소는 급감)하면 점검 필요로 표시합니다. 임계값은 예시 기준이며 회사 정책에 맞게 조정할 수 있습니다.
이 화면의 판정 결과를 그대로 의사결정에 반영해도 되나요?
이 화면은 조회조건에 따라 분류·집계·대사를 돕는 점검 도구이며, 증감의 실제 원인 확인과 최종 판단은 회사와 감사인(담당 부서)이 합니다.
전년동기 대비와 이동평균 대비, 둘 중 무엇을 우선 봐야 하나요?
전년동기 대비 증감률을 주 판정 지표로 쓰고, 이동평균 대비 변동률은 계절성과 무관한 최근 추세 이탈을 확인하는 보조 지표로 함께 봅니다. 두 지표가 같은 방향을 가리키면 우선순위를 높여 확인하는 것을 권장합니다.