예측 대비 실적 차이 점검 — 현금흐름 예측이 어디서 어긋났는지 금액·시기·미실현·예측 외로 나누어 보는 화면
항목별 예측-실적 연결 · 주별 차이 4요인 분해 · 분류별 오차율·편향·정시 실현율 · 대사식 검증 · 항목 상세 — 소개 영상과 실제 화면 6종, 그리고 CDS 코드까지
소개 영상1분 25초8개 장면음성 안내·자막표지 → 처음 연 화면 → 점검 코드로 거르기 → 주별 차이 분해 → 분류별 정확도 → 대사 결과 → 항목 상세 → 정리
개발 배경 — 이 앱을 사용해야 하는 이유
자금 팀의 월간 점검에는 늘 같은 질문이 따라붙습니다. 지난 8주 동안 세운 현금흐름 예측이 얼마나 맞았나, 어디서 틀렸나, 다음 예측은 어디부터 고쳐야 하나. 지금은 표준 유동성 예측 화면과 은행 입출금 내역을 엑셀에 나란히 붙여 항목마다 손으로 견줍니다. 합계 차이는 금방 나오지만 그 차이가 금액이 달라서인지, 입금이 일주일 늦어서인지, 아예 예측에 없던 입출금인지는 엑셀 안에서 사람이 하나씩 가려야 합니다.
이 앱은 예측 항목과 실적 입출금을 항목마다 이어 붙인 뒤 차이를 네 가지 원인으로 나눕니다. 금액이 달랐던 몫, 주를 옮겨 간 몫, 실현되지 않은 몫, 예측에 없던 몫입니다. 네 몫을 더하면 총 차이와 정확히 같아지고, 그 등식을 포함한 대사식 여덟 개를 화면이 매번 검사해 결과를 보여 줍니다. 관련 기준서는 없으며, 대상 영역은 자금 예측 관리의 사후 점검입니다.
합계 차이만 보면 고칠 곳이 보이지 않는다
8주 예측 순현금흐름이 −1,550.6백만원, 실적이 −1,824.8백만원이면 총 차이는 −274.2백만원입니다. 이 숫자만으로는 “예측을 더 보수적으로 잡자”는 결론밖에 나오지 않습니다. 그런데 같은 기간 건별 절대 오차를 모두 더하면 1,565.0백만원으로 총 차이의 다섯 배가 넘습니다. 어떤 건은 위로, 어떤 건은 아래로 어긋나 서로를 상쇄하고 있다는 뜻입니다. 이 앱은 순차이와 절대 오차를 나란히 둡니다.
이 앱의 해결 — 순차이와 건별 절대 오차를 함께 보여 줍니다. 순차이는 작아도 건별 오차가 크면 주를 W04(건별 상쇄)로 따로 표시합니다.
늦게 들어온 돈과 틀린 돈은 다른 문제다
입금이 한 주 늦어졌을 뿐이라면 8주 합계에는 영향이 없습니다. 그러나 주별 잔고 예측은 어긋납니다. 반대로 금액이 틀렸다면 합계 자체가 움직입니다. 둘은 고치는 방법이 다릅니다 — 앞의 것은 입금·지급 시기를 잡는 가정을, 뒤의 것은 금액 산정 기준을 손봐야 합니다. 이 앱은 시기 효과를 따로 계산해 떠나는 주와 도착하는 주에 반대 부호로 올립니다. 그래서 조회 구간 안의 시기 효과 합계는 언제나 0이고, 이 사실도 대사식 하나로 검사합니다.
이 앱의 해결 — 시기 효과를 금액 효과와 분리해 주별로 보입니다. 시기 효과 합계가 0인지 대사식으로 검사합니다.
예측에 없던 돈과 실현되지 않은 돈은 따로 센다
실적에는 있는데 예측에 없는 입출금(예측 외)과, 예측에는 있는데 8주 안에 실현되지 않은 항목(미실현)은 둘 다 “차이”지만 원인이 반대입니다. 앞의 것은 예측 대상에서 빠진 거래이고, 뒤의 것은 구간 뒤로 넘어갔거나 취소된 거래입니다. 이 앱은 두 가지를 항목 단계에서 L03(미실현)과 L04(예측 외)로 갈라 표시하고, 주별로도 미실현 효과와 예측 외 효과로 따로 올립니다.
이 앱의 해결 — 미실현 효과와 예측 외 효과를 별도 열로 둡니다. 둘 중 어느 쪽이 큰지에 따라 주 판정 코드(W03)가 달라집니다.
분류마다 허용 오차가 다르다
급여·세금은 예측과 거의 같아야 하고, 설비투자 대금이나 기타 입금은 어느 정도 흔들려도 됩니다. 한 가지 기준으로 모든 분류를 판정하면 급여의 작은 오차는 놓치고 설비투자의 정상적인 흔들림은 경보로 처리합니다. 이 앱은 분류마다 오차율(WAPE)·편향·정시 실현율의 한도를 따로 읽어 판정하고, 한도를 정하지 않은 분류는 판정하지 않고 C04(확인 필요)로 남깁니다.
이 앱의 해결 — 분류별 한도를 정책 값으로 읽어 판정합니다. 한도가 없으면 판정을 보류하고 확인 필요로 남깁니다.
사용 방법
- 회계연도와 기간(월)을 입력합니다(필수). 회사·현금 분류·기준일 기간·점검 코드·점검 결과는 필요할 때만 고르며, 비우면 그 조건은 걸리지 않습니다.
- 입력 칸 오른쪽 끝의 조회 버튼을 누르거나 입력 칸에서 Enter 키를 누릅니다. 초기화는 조건을 처음 값으로 되돌립니다.
- 위쪽 요약 지표 여덟 개를 확인합니다. 점검한 예측 항목 수, 예측·실적 순현금흐름, 총 차이, 건별 절대 오차 합계, 한도를 벗어난 분류 수, 확인 필요 건 수, 정합성 대사 차이입니다.
- 탭을 항목별 차이 → 주별 차이 분해 → 분류별 정확도 → 대사 결과 순으로 옮기며 차이의 위치를 좁혀 갑니다.
- 항목별 차이 탭에서 행을 누르면 상세 창이 열립니다. 예측일에서 실적일로의 이동, 금액 차이, 같은 분류의 다른 예측 항목을 봅니다.
- CSV 내려받기로 지금 보이는 탭의 조회 결과를 파일로 저장합니다.
숫자를 믿을 수 있는가 — 검증 결과
예측과 실적을 견주는 화면에서 가장 비싼 질문은 “이 차이가 정말 맞나”입니다. 그래서 만드는 쪽에서 대사식을 먼저 세워 전수로 돌렸습니다.
| 대사식 | 검사 건수 | 차이 건수 |
|---|---|---|
| 예측 + 차이 = 실적 | 16 | 0 |
| 총 차이 = 금액 + 시기 + 미실현 + 예측 외 | 16 | 0 |
| 시기 효과 합계 = 0 | 2 | 0 |
| 항목 명세 합계 = 주별 예측 합계 | 16 | 0 |
| 분류별 순차이 합계 = 주별 총 차이 합계 | 2 | 0 |
| 분류별 절대 오차 = 항목별 절대 오차 합계 | 14 | 0 |
| 기초잔고 + 실적 순현금흐름 = 기말 실적잔고 | 2 | 0 |
| 기말 예측잔고 + 누적 차이 = 기말 실적잔고 | 2 | 0 |
대사식 8개, 검사 70건에서 차이는 0건입니다. 예측일이 없는 3건은 주를 정할 수 없어 집계에서 일부러 뺀 의도적 예외이며, 대사 결과 탭에 따로 표시됩니다.
무엇으로 만들었나
| 자리 | 무엇 | 왜 그렇게 두었나 |
|---|---|---|
| 조회 화면 | sap.m · sap.ui.table 표준 컨트롤 | 조회조건 · 요약 지표 · 4개 탭 표를 표준 컨트롤로 구성해 SAP 표준 화면과 같은 조작감을 유지합니다. |
| 판정·집계 로직 | 서비스 로직 파일(service.js) | 항목·주·분류 판정과 날짜 조건 처리를 한 곳에 모아, 화면은 판정을 다시 계산하지 않고 받은 값을 보여 줍니다. |
| 데이터 연동 | OData V2 모델(상대 경로 서비스) | manifest 의 서비스 경로 한 곳만 바꾸면 샘플 데이터에서 실제 서비스로 바뀝니다. 일괄 요청은 쓰지 않고 건수는 한 번에 함께 받습니다. |
| 요약 지표 | 서비스의 펑션 호출 | 한도 초과 분류 수와 절대 오차 합계는 서비스가 계산해 주며, 조회조건이 바뀌면 같은 조건으로 다시 부릅니다. |
| 테마 | sap_horizon | 표준 Horizon 테마를 그대로 써 SAP 앱과 한 제품처럼 보입니다. |
실행 화면
실제로 돌아가는 화면 6종을 사용 순서대로 싣습니다. 그림을 누르면 크게 볼 수 있고, 화면마다 무엇을 하는 자리인지 아래에 적었습니다. 숫자는 모두 검증용 샘플 데이터에서 나온 것이라 화면끼리 서로 맞춰 보셔도 됩니다.
처음 열었을 때
조회조건부터 요약 지표, 탭 표까지 한 화면에 세로로 놓입니다. 점검 코드로 거르면 같은 화면이 원인별 목록이 됩니다.

조회조건 아래로 요약 지표 여덟 개가 먼저 보이고, 그 아래 탭이 항목별 차이를 보여 줍니다. 처음에는 회계연도 2026·기간 10이 들어 있고 나머지 조건은 비어 있어 두 회사 145건이 모두 나옵니다. 지표의 ‘정합성 대사 차이 0’이 맨 오른쪽에 있어, 숫자를 읽기 전에 계산이 맞는지부터 확인할 수 있습니다. 금액은 원 단위, 요약은 백만원 단위이며 입금은 +, 출금은 −입니다.

점검 코드 선택 상자에서 L02를 고르고 조회를 누른 결과입니다. 표 위 탭의 건수와 요약 지표 첫 칸이 모두 10건으로 바뀝니다. 이동(주) 열에 +1주 늦음, 1주 빠름처럼 옮겨 간 방향이 적혀 있어 같은 시기 차이라도 늦게 들어온 건과 일찍 들어온 건을 구분해서 볼 수 있습니다.
차이의 위치를 좁혀 가는 화면
주별 분해와 분류별 정확도는 같은 차이를 시간 축과 분류 축으로 나눠 보여 줍니다.

한 줄이 회사·주 하나입니다. 예측 순현금흐름과 실적 순현금흐름의 차이가 총 차이이고, 그 오른쪽 네 열을 더하면 총 차이와 같습니다. 3주차는 미실현 효과(−115.7백만원)와 예측 외 효과(−58.0백만원)가 크게 잡혀 주 판정이 미실현·예측 외 우세(W03)입니다. 순차이율이 한도 안인 주도 건별 오차가 크면 W04로 따로 표시됩니다.

매출채권 회수는 오차율 11.98%(한도 15%)·편향 −4.49%(한도 5%)로 모두 한도 안이라 정상이지만, 설비투자 대금은 오차율 12.32%가 한도 25% 안인데도 편향 −12.07%가 한도 10%를 넘어 점검 필요입니다. 한 분류가 세 지표 가운데 하나만 넘어도 점검 필요가 됩니다. 정시 실현율은 예측한 주에 실현된 비율이며, 평균 이동은 실현 항목이 평균 몇 주 움직였는지 보여 줍니다.
대사 결과와 항목 상세
숫자가 맞는지 확인하는 화면과, 한 건의 사연을 보는 화면입니다.

대사식 여덟 개 모두 차이 건수가 0이고 검사 건수 합계는 70건입니다. 마지막 줄은 예측일이 없어 주를 정할 수 없는 3건으로, 집계에서 빼는 것이 맞으므로 ‘의도적 예외’로 따로 보이며 차이 3건이 정상입니다. 이 줄이 0이 아니라고 오류로 읽으면 안 됩니다.

항목별 차이 탭에서 행을 누르면 열립니다. 위쪽에 예측일→실적일, 예측 금액→실적 금액(차이율), 예측 주차→실적 주차가 한 줄씩 적히고, 이 항목이 왜 정상 또는 점검 필요인지 판정 근거가 한 문장으로 붙습니다. 아래 표는 같은 회사·같은 분류의 예측 항목이라 같은 분류의 다른 건과 바로 견줄 수 있습니다. 닫기 버튼이나 Esc 키로 닫습니다.
화면 뒤에서 일어나는 일
조회를 누르면 화면은 조회조건을 서비스 조건($filter)으로 바꿔 항목·주·분류·대사 네 목록을 받아 옵니다. 판정은 서비스가 하고, 화면은 받은 판정 코드를 글자와 색으로 바꾸기만 합니다. 판정 순서는 항목 → 주 → 분류입니다.
| 대상 | 판정 코드 | 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|---|---|
| 항목 | L00 | 예측한 주에 예측 금액과 3% 이내로 실현 | 정상 | 없음 |
| 항목 | L01 | 같은 주에 실현됐지만 금액 차이가 3%를 넘음 | 점검 필요 | 일부 입금·단가 변경 같은 원인 확인 |
| 항목 | L02 | 예측한 주와 다른 주에 실현(시기 차이) | 점검 필요 | 입금·지급 시기 가정 확인 |
| 항목 | L03 | 조회 구간 8주 안에서 실현되지 않음(미실현) | 점검 필요 | 구간 뒤로 이월됐는지 취소됐는지 확인 |
| 항목 | L04 | 예측에 없던 입출금(예측 외) | 점검 필요 | 예측 대상에서 빠진 거래인지 확인 |
| 항목 | L05 | 예측일이 비어 주를 정할 수 없음 | 확인 필요 | 예측일을 채운 뒤 다시 계산 |
| 주 | W00 | 순차이율이 한도(12%) 안이고 건별 오차도 한도의 두 배 안 | 정상 | 없음 |
| 주 | W01 | 한도 초과 + 금액 효과가 가장 큼 | 점검 필요 | 건별 금액 차이부터 확인 |
| 주 | W02 | 한도 초과 + 시기 효과가 가장 큼 | 점검 필요 | 주를 옮겨 다닌 건 확인 |
| 주 | W03 | 한도 초과 + 미실현·예측 외 효과가 가장 큼 | 점검 필요 | 빠진 거래·구간 밖으로 넘어간 거래 확인 |
| 주 | W04 | 순차이는 한도 안, 건별 오차가 한도의 두 배 초과 | 점검 필요 | 서로 상쇄돼 가려진 차이 확인 |
| 분류 | C00 | 오차율·편향·정시 실현율이 모두 한도 안 | 정상 | 없음 |
| 분류 | C01 | 오차율이 한도 초과 | 점검 필요 | 항목별 차이 탭에서 원인 항목 확인 |
| 분류 | C02 | 편향이 한도 초과 | 점검 필요 | 낙관·보수 가정 확인 |
| 분류 | C03 | 정시 실현율이 하한 미달 | 점검 필요 | 시기 가정 확인 |
| 분류 | C04 | 분류별 한도를 정하지 않음 | 확인 필요 | 한도를 먼저 정해야 함 |
차이를 나누는 순서와 대사식
- 항목 연결 — 예측 항목과 실적 입출금을 거래 상대·분류로 이어 실현·미실현·예측 외로 나눕니다.
- 주 배정 — 예측일·실적일이 속한 주(월요일 시작)를 정합니다. 예측일이 없으면 주를 정하지 못하므로 집계에서 빼고 확인 필요로 남깁니다.
- 총 차이 = 실적 순현금흐름 − 예측 순현금흐름 = 금액 효과 + 시기 효과 + 미실현 효과 + 예측 외 효과. 같은 주에 실현된 항목의 금액 차이가 금액 효과, 주를 옮긴 금액이 시기 효과(떠나는 주와 도착하는 주에 반대 부호), 실현되지 않은 예측의 음수가 미실현 효과, 예측에 없던 입출금이 예측 외 효과입니다.
- 순차이율 = 총 차이 ÷ 예측 절대액 합계. 분류별 오차율(WAPE) = 건별 절대 오차 합계 ÷ 예측 절대액 합계, 편향 = (실적 − 예측) 합계 ÷ 예측 절대액 합계, 정시 실현율 = 예측한 주에 실현된 항목 수 ÷ 예측 항목 수입니다.
- 잔고 — 기초잔고에 주별 순현금흐름을 더해 예측 기준 기말잔고와 실적 기준 기말잔고를 만들고, 둘의 차이가 총 차이의 누적과 같은지 대사합니다.
조회조건
| 조회조건 | 필수 | 기본값 | $filter 변환 | 적용 탭 |
|---|---|---|---|---|
| 회계연도 | 필수 | 2026 | Gjahr eq '2026' | 전체 |
| 기간(월) | 필수 | 10 | Monat eq '10' | 전체 |
| 회사 | 선택 | 전체 | Bukrs eq '1000' | 항목·주·분류 |
| 현금 분류 | 선택 | 전체 | Cat eq 'COL' | 항목·분류 |
| 기준일 시작·종료 | 선택 | 전체 | 날짜 ge/le 범위(주별은 주 시작일) | 항목·주 |
| 점검 코드 | 선택 | 전체 | CheckCode eq 'L02' | 항목·주·분류 |
| 점검 결과 | 선택 | 전체 | CheckStatus eq 'CHECK' | 항목·주·분류 |
결과 컬럼
| 컬럼 | 의미 | 산출식 |
|---|---|---|
| 예측 금액 · 실적 금액 | 항목의 예측·실적 입출금(원, 입금 +) | 예측 항목·실적 입출금 연결값 |
| 차이 · 차이율 | 실적 − 예측, 예측 대비 비율 | 차이 ÷ |예측 금액| |
| 예측 주차 · 실적 주차 · 이동 | 예측일·실적일이 속한 주와 옮겨 간 주 수 | 실적 주차 − 예측 주차 |
| 금액 효과 | 같은 주에 실현된 항목의 금액 차이 합 | Σ(실적 − 예측) |
| 시기 효과 | 주를 옮긴 금액(떠나는 주 −, 도착하는 주 +) | 합계는 항상 0 |
| 미실현 효과 | 구간 안에서 실현되지 않은 예측의 음수 | −Σ예측(미실현) |
| 예측 외 효과 | 예측에 없던 입출금 합 | Σ실적(예측 외) |
| 순차이율 | 주 총 차이의 크기 | 총 차이 ÷ 예측 절대액 합계 |
| 오차율 · 편향 · 정시 실현율 | 분류별 정확도 세 지표 | 본문 산식 참고 |
좁은 화면에서 달라지는 것
화면 폭이 줄면 조회조건이 여러 줄로 쌓이고 표는 가로로 넘겨 보며, 요약 지표도 줄을 바꿔 놓입니다. 상세 창은 화면 폭에 맞춰 줄어듭니다. 점검 판정과 숫자는 폭과 무관하게 같습니다.
파일 구성
앱 폴더/ ├─ index.html 앱 진입점 ├─ Component.js · manifest.json ├─ controller/ BaseController · Main.controller ├─ view/ Main.view.xml · DetailDialog.fragment.xml ├─ model/ formatter · ErrorHandler ├─ css/ · i18n/ └─ odata/ 서비스 정의 · 서비스 로직 · 엔티티셋별 데이터
SAP 표준 기능 확장 포인트 — 표준 T-code 와 어떻게 연계되는지
표준으로 되는 것과 안 되는 것
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 예측과 실적을 견주는 사후 점검 관점을 더해 확장합니다. 표준 화면으로 충분한 일은 표준에 두고, 끊기는 자리만 이어 붙입니다.
| 하고 싶은 일 | SAP 표준 | 표준 화면의 한계 | 이 앱이 더하는 것 |
|---|---|---|---|
| 예측 현금흐름 조회 | FF7B (유동성 예측) | 예측만 보입니다. 실적과 항목 단위로 견주려면 따로 내려받아야 합니다 | 실적과 같은 표에 놓고 항목마다 연결 |
| 실적 현금 포지션 조회 | FF7A (현금 포지션) | 실적 합계는 보이지만 어떤 예측 항목과 대응하는지는 보이지 않습니다 | 예측 항목과 실적 입출금을 이어 붙임 |
| 실적 입출금 원천 확인 | FF_5 · FBL3N | 전표·내역 단위라 예측 대비 차이는 직접 계산해야 합니다 | 차이를 항목·주·분류로 집계 |
| 매입채무 지급 대조 | FBL1N | 공급업체 단위 개별 항목 조회입니다 | 분류(매입채무 지급)의 예측 정확도를 한눈에 |
| 매출채권 회수 대조 | FBL5N | 고객 단위 개별 항목 조회입니다 | 분류(매출채권 회수)의 편향·정시 실현율 |
| 차이의 원인 분해 | 없음(확인 필요) | 표준 화면에서 금액·시기·미실현·예측 외로 나누는 기능은 확인하지 못했습니다 | 네 효과로 가르고 합계를 검산 |
T-code 별 연계 지점
| T-code | 이름 | 연계 지점 |
|---|---|---|
| FF7B | 유동성 예측 | 이 앱의 예측 순현금흐름과 기말 예측잔고가 맞닿는 화면. 같은 기간·회사로 조회해 주별 합계를 견줘 봅니다. 표준 화면의 값이 원천이므로 법정·내부 보고용 예측은 표준에 남깁니다. |
| FF7A | 현금 포지션 | 실적 순현금흐름과 기말 실적잔고의 기준. 이 앱의 8주차 기말 실적잔고를 표준 화면의 같은 일자 잔고와 대사합니다. |
| FF_5 | 은행 전표 가져오기 | 실적 입출금이 들어오는 길. 은행 내역 가져오기가 늦어지면 이 앱의 미실현이 부풀어 보이므로 가져온 뒤에 점검합니다. |
| FBL1N | 공급업체 개별 항목 조회 | 매입채무 지급 분류의 항목을 원천까지 내려가 확인. 이 앱에서 점검 필요로 뜬 지급 항목의 거래 상대를 표준 화면에서 조회합니다. |
| FBL5N | 고객 개별 항목 조회 | 매출채권 회수 분류의 항목을 원천까지 확인. 편향이 큰 분류의 대표 고객 입금 내역을 대조합니다. |
| FBL3N | G/L 계정 개별 항목 조회 | 세금·차입 등 계정 기준 입출금 확인. 예측 외 입출금의 계정을 확인하는 용도입니다. |
운영 전환 시 기존 화면을 없애야 하나요? 없애지 않습니다. 표준 유동성 예측·현금 포지션 화면은 예측과 실적의 원천이고, 이 앱은 둘을 견주는 사후 점검입니다. 두 화면의 합계를 맞춰 보는 대사 지점을 운영 절차로 두면 됩니다.
S/4HANA 분석 스택과의 자리
표준 CDS 분석 쿼리나 Fiori 현금 관리 분석 앱이 보여 주는 값과 이 앱은 역할이 겹치지 않습니다. 표준 분석 앱은 현재의 현금 포지션과 예측을 보여 주고, 이 앱은 지난 예측이 얼마나 맞았나를 항목·주·분류로 되짚습니다. Analysis for Office 로 같은 CDS 큐브를 열어 피벗으로 보는 일도 가능하지만, 판정 코드와 대사 결과를 함께 보여 주는 화면은 이 앱 쪽에서 제공합니다. 표준 분석 뷰의 정확한 이름은 환경마다 달라 확인 필요로 남겼습니다.
확장 포인트 — 운영에서 실제로 손대는 자리
| 확장 포인트 | 운영에서 손대는 일 | 손대지 않으면 |
|---|---|---|
| 현금 분류 매핑 | 계획 그룹·계획 레벨을 7개 분류(매출채권 회수·매입채무 지급·급여·세금·차입·설비투자·기타 입금)로 묶는 표를 채움 | 분류별 정확도가 나오지 않거나 기타로 몰립니다 |
| 분류별 한도 | 오차율·편향·정시 실현율 한도를 회사가 정해 한도 표에 입력 | C04(확인 필요)로 남아 판정되지 않습니다 |
| 항목 연결 기준 | 예측 항목과 실적 입출금을 이을 키(거래 상대·계획 그룹·기간)를 정함 | 연결되지 않은 건이 미실현과 예측 외로 동시에 잡힙니다 |
| 조회 구간·주 시작 요일 | 기본 8주·월요일 시작을 회사 관행에 맞게 조정 | 주 경계가 은행 영업일과 어긋날 수 있습니다 |
| 허용 오차 | 항목별 금액 허용 오차(기본 3%)와 주 순차이율 한도(기본 12%)를 조정 | 판정이 현업 감각과 다를 수 있습니다 |
| 권한 | 회사코드 단위 표준 권한 객체를 서비스 쪽에 적용 | 다른 회사의 자금 정보가 보일 수 있습니다 |
분석 지표 정의
| 지표 | 산식 | 판정 기준 | 대응 기능 | 원천 데이터 | 비고 |
|---|---|---|---|---|---|
| 순차이율 | 주 총 차이 ÷ 예측 절대액 합계 | 한도 12% 초과 시 W01~W03 | 주별 차이 분해 | 예측·실적 항목 | 한도는 회사 정책 |
| 오차율(WAPE) | 건별 절대 오차 합계 ÷ 예측 절대액 합계 | 분류별 한도 초과 시 C01 | 분류별 정확도 | 예측·실적 항목 | 분류별 한도 |
| 편향 | (실적 − 예측) 합계 ÷ 예측 절대액 합계 | 분류별 한도 초과 시 C02 | 분류별 정확도 | 예측·실적 항목 | 방향성 확인 |
| 정시 실현율 | 예측한 주에 실현된 항목 수 ÷ 예측 항목 수 | 하한 미달 시 C03 | 분류별 정확도 | 예측·실적 항목 | 시기 가정 확인 |
| 항목 오차율 | |실적 − 예측| ÷ |예측| | 3% 초과 시 L01 | 항목별 차이 | 예측·실적 항목 | 허용 오차 정책 |
CDS 구성 — 코드와 운영 작업
아래 코드는 실제 환경에 맞추기 전의 구성 스케치입니다. 표준 테이블·필드 이름은 환경마다 달라 확인이 필요한 곳을 주석으로 표시했습니다. 객체 이름은 기능을 뜻하는 영문으로 지었습니다.
뷰 레이어 구성
| 레이어 | 뷰·객체 | 하는 일 | 왜 나누나 |
|---|---|---|---|
| 기준(매핑 테이블) | ZFCV_CATMAP · ZFCV_CATLIM | 계획 그룹을 현금 분류로 묶는 표, 분류별 한도 표 | 매핑과 한도는 회사가 정하는 값이라 코드가 아니라 표에 둡니다 |
| 차원 | ZI_FcstCat | 현금 분류 코드와 이름(텍스트) | 분류 이름을 한 곳에서만 정의해 모든 뷰가 같이 씁니다 |
| 기본 뷰 | ZI_FcstLine | 예측 항목과 실적 입출금을 이어 항목 한 줄로 만듦 | 항목 단계 판정(L00~L05)의 재료입니다 |
| 큐브 | ZI_FcstVarWeek | 회사·주 단위로 네 효과를 집계 | 총 차이 = 네 효과의 합을 한 곳에서 보장합니다 |
| 쿼리(Consumption) | ZC_FcstVarLine | 화면에 노출할 필드·필터·정렬 선언 | 화면이 쓰는 필드만 열고 나머지는 숨깁니다 |
| 권한(DCL) | ZC_FcstVarLine 접근 제어 | 회사코드 단위로 보이는 행을 제한 | 집계 뒤가 아니라 항목 단계에서 걸어야 새지 않습니다 |
| 서비스 | ZUI_FcstVar | OData V2 서비스 정의와 바인딩 | 화면이 부르는 엔티티셋·펑션을 한 곳에서 공개합니다 |
① 분류 매핑과 한도 표 — 회사가 정하는 값은 코드 밖에 둔다
이 객체에서 결정되는 것은 “어떤 계획 그룹이 어느 분류인가”와 “분류마다 얼마까지 틀려도 되는가”입니다. 운영에서 가장 자주 바뀌는 값이라 뷰 안에 상수로 박지 않고 표로 둡니다. 한도가 비어 있으면 서비스는 판정하지 않고 확인 필요(C04)로 돌려줍니다.
" ─────────────────────────────────────────────────────────────
" ZFCV_CATMAP / ZFCV_CATLIM — 분류 매핑 · 분류별 한도 (DDIC 테이블)
" 역할 : 계획 그룹 → 현금 분류, 분류 × 회사 → 한도
" 나눈 이유: 회사가 정하는 값은 이송 없이 현업이 고칠 수 있어야 한다
" ─────────────────────────────────────────────────────────────
@EndUserText.label : '현금 분류 매핑'
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
define table zfcv_catmap {
key mandt : mandt not null;
key grupp : fdgrp not null; " 계획 그룹 (필드 확인 필요)
cat : abap.char(3); " COL PAY PRL TAX DBT CPX ETC
}
@EndUserText.label : '분류별 정확도 한도'
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
define table zfcv_catlim {
key mandt : mandt not null;
key bukrs : bukrs not null;
key cat : abap.char(3) not null;
wape_limit : abap.dec(8,2); " 오차율 한도(%)
bias_limit : abap.dec(8,2); " 편향 한도(%)
ontime_floor : abap.dec(8,2); " 정시 실현율 하한(%)
}
② 현금 분류 차원 — 이름을 한 곳에서 정의한다
분류 코드와 화면에 보일 이름을 한 뷰에 모읍니다. 이름을 뷰마다 따로 쓰면 보고서마다 “매출채권 회수”와 “채권 회수”가 갈리는 일이 생깁니다.
@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: '현금 분류'
@ObjectModel.representativeKey: 'Cat'
define view entity ZI_FcstCat
as select distinct from zfcv_catmap
{
key cat as Cat,
case cat
when 'COL' then '매출채권 회수'
when 'PAY' then '매입채무 지급'
when 'PRL' then '급여·퇴직급여'
when 'TAX' then '세금·공과금'
when 'DBT' then '차입 이자·상환'
when 'CPX' then '설비투자 대금'
else '기타 입금'
end as CatName
}
③ 항목 기본 뷰 — 예측과 실적을 한 줄로 잇는다
예측 항목(계획 메모 레코드)과 실적 입출금(은행 전표 항목)을 거래 상대·분류·기간 키로 이어 한 줄로 만듭니다. 이 뷰에서 실현·미실현·예측 외가 갈리며, 항목 판정 코드(L00~L05)의 재료가 모두 여기서 나옵니다. 연결 키를 어떻게 잡느냐가 이 앱의 정확도를 좌우하므로 운영에서 가장 먼저 합의할 대상입니다.
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '예측-실적 항목'
define view entity ZI_FcstLine
as select from fdes as plan " 계획 메모 레코드 (필드 확인 필요)
left outer join febep as act " 은행 전표 항목 (필드 확인 필요)
on act.bukrs = plan.bukrs
and act.cat = plan.cat
association [1..1] to ZI_FcstCat as _Cat on _Cat.Cat = plan.cat
{
key plan.bukrs as Bukrs,
key plan.idenr as LineNo,
plan.cat as Cat,
plan.datum as FcstDate, " 예측일 (비어 있으면 L05)
act.kwaer_date as ActDate, " 실적일 (필드 확인 필요)
@Semantics.amount.currencyCode: 'Currency'
plan.wrshb as FcstAmt,
@Semantics.amount.currencyCode: 'Currency'
cast( coalesce( act.kwbtr, 0 ) as abap.curr(23,2) ) as ActAmt,
plan.waers as Currency,
case when plan.datum is initial then 'NOFD'
when act.kwbtr is null then 'UNREAL'
else 'MATCH' end as LineType,
_Cat
}
④ 주 단위 큐브 — 총 차이 = 네 효과의 합을 한 곳에서 보장한다
회사·주 단위로 예측과 실적을 모으고 네 효과를 계산합니다. 금액 효과·시기 효과·미실현 효과·예측 외 효과를 같은 뷰 안에서 만들기 때문에, 합이 총 차이와 어긋나면 이 뷰의 정의가 잘못된 것입니다. 시기 효과는 떠나는 주와 도착하는 주에 반대 부호로 올려 조회 구간 합계가 0이 됩니다.
@Analytics.dataCategory: #CUBE
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '주별 예측-실적 차이'
define view entity ZI_FcstVarWeek
as select from ZI_FcstLine
{
key Bukrs,
key WeekNo,
@Aggregation.default: #SUM
sum( case when LineType = 'MATCH' and FcstWeek = ActWeek
then ActAmt - FcstAmt else 0 end ) as AmtEffect,
@Aggregation.default: #SUM
sum( case when LineType = 'MATCH' and FcstWeek <> ActWeek
then ActAmt else 0 end ) as TimingIn, " 도착하는 주
@Aggregation.default: #SUM
sum( case when LineType = 'UNREAL' then - FcstAmt else 0 end ) as UnrealEffect,
@Aggregation.default: #SUM
sum( case when LineType = 'UNFC' then ActAmt else 0 end ) as UnfcstEffect,
@Aggregation.default: #SUM
sum( ActAmt - FcstAmt ) as TotalDiff
}
group by Bukrs, WeekNo
⑤ 소비 쿼리 — 화면이 쓰는 필드만 연다
화면이 쓰는 필드와 필터를 선언하는 자리입니다. 조회조건 중 필수인 회계연도·기간은 필터로 필수화하고, 나머지는 선택 필터로 둡니다. 큐브의 내부 필드를 그대로 열지 않고 판정 코드와 사람이 읽을 문구까지 함께 내려 화면이 판정을 다시 계산하지 않게 합니다.
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '예측 대비 실적 — 항목'
@UI.headerInfo: { typeName: '예측 항목', typeNamePlural: '예측 항목' }
define view entity ZC_FcstVarLine
as projection on ZI_FcstLine
{
@Consumption.filter: { mandatory: true, selectionType: #SINGLE }
key Gjahr,
@Consumption.filter: { mandatory: true, selectionType: #SINGLE }
key Monat,
@Consumption.filter.selectionType: #SINGLE
key Bukrs,
key LineNo,
@Consumption.filter.selectionType: #SINGLE
Cat,
@UI.lineItem: [{ position: 10 }] FcstAmt,
@UI.lineItem: [{ position: 20 }] ActAmt,
@UI.lineItem: [{ position: 30, criticality: 'CheckCrit' }] CheckText
}
⑥ 권한(DCL) — 집계 전에 항목 단계에서 건다
회사코드 단위 표준 권한 객체로 보이는 행을 제한합니다. 집계 결과에만 권한을 걸면 전사 합계와 자기 몫의 차이로 다른 회사 숫자가 드러나므로, 반드시 항목 단계 뷰에 걸어야 합니다.
@EndUserText.label: '예측 항목 — 회사코드 권한'
@MappingRole: true
define role ZC_FcstVarLine {
grant select on ZC_FcstVarLine
where ( Bukrs ) = aspect pfcg_auth( F_BKPF_BUK, BUKRS, ACTVT = '03' );
}
⑦ 서비스 정의와 바인딩 — 화면이 부르는 것만 공개한다
화면이 실제로 부르는 엔티티셋과 펑션만 공개합니다. 서비스 바인딩은 OData V2 UI 서비스로 게시하며, 앱의 manifest 서비스 주소를 이 바인딩 주소로 바꾸면 샘플 데이터에서 실제 데이터로 넘어갑니다.
@EndUserText.label: '예측 대비 실적 차이 점검'
define service ZUI_FcstVar {
expose ZC_FcstVarLine as LineSet;
expose ZC_FcstVarWeek as WeekSet;
expose ZC_FcstVarCat as CatSet;
expose ZC_FcstVarRecon as ReconSet;
}
/* 바인딩: OData V2 - UI. 게시 후 서비스 주소를 앱 설정에 넣는다. */
운영 시점에 해야 할 일
개발보다 정하는 일이 많습니다.
| 해야 할 일 | 무엇을 정하나 | 정하지 않으면 | 누가 |
|---|---|---|---|
| 분류 매핑 | 계획 그룹을 7개 분류에 어떻게 묶나 | 분류별 정확도가 기타로 몰립니다 | 자금 팀 |
| 분류별 한도 | 오차율·편향·정시 실현율 한도 | C04 확인 필요로 남아 판정되지 않습니다 | 자금 팀장 |
| 항목 연결 키 | 예측과 실적을 무엇으로 잇나 | 연결 안 된 건이 미실현과 예측 외로 동시에 잡힙니다 | 자금 팀 · IT |
| 예측 원천 확정 | 어느 예측(계획 메모·유동성 예측 버전)을 기준으로 보나 | "예측이 왜 이 숫자냐"가 반복됩니다 | 자금 팀 |
| 권한 설계 | 회사코드 단위 권한 객체와 역할 | 다른 회사 자금 정보가 보일 수 있습니다 | 보안 · 권한 |
| 성능 기준 | 조회 구간 길이와 필수 필터 | 범위 없이 부르면 응답이 느려집니다 | IT |
| 대사 체계 | 표준 유동성 예측·현금 포지션 화면과 맞출 항목 | 두 화면 숫자가 다를 때 원인을 못 찾습니다 | 자금 팀 · 회계 |
| 전송(TR) 순서 | 매핑 표 → 뷰 → 권한 → 서비스 순으로 이송 | 권한이 없는 뷰가 먼저 공개됩니다 | IT |
| 서비스 활성화 | 서비스 바인딩 게시 또는 서비스 등록 후 앱 설정의 서비스 주소 교체 | 화면이 샘플 데이터를 계속 읽습니다 | IT · Basis |
운영 데이터로 갈 때
예측 항목이 수백 건인 지금과 달리 운영에서는 항목이 수만 건까지 늘 수 있습니다. 집계는 큐브(회사·주 단위)에서 하고 항목 목록은 조회 구간과 회사를 필수 필터로 걸어 필요한 만큼만 받습니다. 항목·실적 연결 키 컬럼에는 인덱스를, 서비스에는 최대 건수 상한을 둡니다. 응답 시간 기준은 환경마다 달라 확인 필요로 남겼으며, 합의하기 전에는 구간을 8주로 제한한 기본값을 유지하는 편이 안전합니다.
자주 묻는 질문
도입 검토에서 자주 받는 질문들입니다. 네 묶음으로 나눠 적었습니다.
숫자와 산식
총 차이와 네 효과의 합은 정말 같습니까?
같습니다. 우연이 아니라 그렇게 되도록 정의했습니다. 같은 주에 실현된 항목의 금액 차이(금액 효과), 주를 옮긴 금액(시기 효과), 실현되지 않은 예측(미실현 효과), 예측에 없던 입출금(예측 외 효과)은 겹치지 않는 네 묶음이라 더하면 총 차이가 됩니다.
화면은 이 등식을 대사식으로 매번 검사합니다. 회사·주 16건 모두 차이가 0이며, 어긋나면 그 자체가 정의나 데이터의 오류 신호입니다.
시기 효과 합계가 왜 0입니까?
입출금이 한 주에서 다른 주로 옮겨 간 것이므로, 떠나는 주에는 −, 도착하는 주에는 +로 같은 금액이 올라갑니다. 조회 구간 안에서 두 값은 서로 지워집니다.
그러나 구간 끝을 넘어 이월된 입금은 도착하는 주가 구간 밖이라 지워지지 않고 미실현으로 잡힙니다. 그래서 시기 효과 합계 0은 구간 안에서만 성립합니다.
순차이율과 오차율(WAPE)은 어떻게 다릅니까?
순차이율은 주 총 차이를 예측 절대액 합계로 나눈 값이라 위·아래로 어긋난 건이 서로 상쇄됩니다. 오차율(WAPE)은 건별 절대 오차를 모두 더한 값을 예측 절대액 합계로 나눈 값이라 상쇄되지 않습니다.
이 자료의 8주 순차이는 −274.2백만원이지만 건별 절대 오차 합계는 1,565.0백만원입니다. 순차이만 보면 작아 보이는 예측도 건별로는 많이 틀렸을 수 있다는 뜻입니다.
편향은 무엇을 보여 줍니까?
예측과 실적의 차이가 한쪽으로 치우친 정도입니다. (실적 − 예측) 합계를 예측 절대액 합계로 나눕니다. 편향이 음수로 크면 늘 입금을 높게 또는 지급을 낮게 잡는 낙관 쪽 가정이 있다는 신호입니다.
오차율이 한도 안이어도 편향이 한도를 넘으면 점검 필요입니다. 흔들림은 작아도 늘 같은 방향으로 틀리면 고치기 쉬운 체계적 오류이기 때문입니다.
예측일이 없는 건은 왜 집계에서 빠집니까?
주를 정할 수 없어 주별·분류별 계산에 넣으면 숫자가 틀어지기 때문입니다. 이 자료에서는 3건이 해당하며 항목 단계에서 L05 확인 필요로 남깁니다.
대사 결과에서는 이 건들을 의도적 예외 줄로 따로 보여 줍니다. 차이 건수 3건은 오류가 아니라 “집계에서 일부러 뺀 건 수”입니다. 예측일을 채우고 다시 계산하면 사라집니다.
금액 허용 오차 3%와 주 한도 12%는 어떻게 정했습니까?
회사가 정하는 정책 값입니다. 이 자료에서는 항목별 금액 허용 오차 3%, 주 순차이율 한도 12%를 예시로 두었고 분류별 한도는 분류 특성에 맞춰 급여·세금은 촘촘하게, 설비투자·기타 입금은 넉넉하게 두었습니다.
실제 도입에서는 자금 팀이 과거 오차 분포를 보고 정하는 것이 맞으며, 이 앱은 그 값을 읽어 판정만 합니다.
화면과 조작
조회 버튼은 어디에 있습니까?
조회조건 영역의 입력 칸 맨 오른쪽에 있습니다. 입력 칸에서 Enter 키를 눌러도 조회됩니다. 초기화 버튼은 조건을 처음 값(회계연도 2026·기간 10)으로 되돌립니다.
점검 코드로 거르면 요약 지표도 바뀝니까?
바뀝니다. 요약 지표 여덟 개는 조회조건과 같은 조건으로 다시 계산됩니다. 점검 코드를 L02로 거르면 점검한 예측 항목 수가 10건으로 줄지만, 예측·실적 순현금흐름 같은 금액 지표는 조건에 맞는 항목만 더한 값이 됩니다.
행을 누르면 무엇이 열립니까?
항목별 차이 탭에서는 상세 창이 열립니다. 예측일에서 실적일로의 이동, 예측 금액에서 실적 금액으로의 변화와 차이율, 예측 주차에서 실적 주차로의 이동, 판정 근거가 적히고 같은 회사·같은 분류의 다른 예측 항목이 아래에 표로 나옵니다.
CSV 내려받기에는 무엇이 담깁니까?
지금 보이는 탭의 조회 결과가 담깁니다. 화면에서 보이는 컬럼과 같은 컬럼이며 조회조건으로 거른 행만 들어갑니다. 판정 코드와 판정 문구도 함께 들어가 엑셀에서 다시 거를 수 있습니다.
점검 필요와 확인 필요는 어떻게 다릅니까?
점검 필요는 한도를 벗어나 원인을 찾아봐야 하는 상태이고, 확인 필요는 판정에 필요한 정보가 없어 판정하지 못한 상태입니다. 예를 들어 예측일이 없는 항목이나 한도를 정하지 않은 분류가 확인 필요입니다. 둘 다 결론이 아니라 “사람이 봐야 한다”는 표시입니다.
분석 관점
주 판정 코드 W01~W04는 어떻게 가려집니까?
주 순차이율이 한도를 넘으면 네 효과 가운데 절대값이 가장 큰 쪽으로 가립니다. 금액 효과가 크면 W01, 시기 효과가 크면 W02, 미실현·예측 외 효과가 크면 W03입니다. 순차이율이 한도 안인데 건별 오차가 한도의 두 배를 넘으면 W04로 건별 상쇄를 알립니다.
코드는 “어디부터 볼지”를 알려 주는 안내이며 원인을 단정하는 것은 아닙니다.
분류별 정확도에서 편향만 한도를 넘는 경우는 어떻게 읽습니까?
오차율은 한도 안이라 건별 오차는 크지 않은데 같은 방향으로 치우쳤다는 뜻입니다. 이 자료의 설비투자 대금(회사 1000)이 그 예입니다. 대금 지급 예측이 늘 실제보다 컸다면 지급 시점을 낙관적으로 잡았을 가능성을 봅니다. 항목별 차이 탭에서 해당 분류만 걸러 건별 방향을 확인합니다.
정시 실현율이 낮은 분류는 어떻게 합니까?
예측한 주에 실현된 항목이 적다는 뜻이므로 금액보다 시기 가정을 먼저 봅니다. 입금 조건이 길어졌거나 지급 승인 주기가 달라졌는지 확인합니다. 시기 효과는 구간 합계에 영향이 없으므로 합계 오차는 작아 보여도 주별 잔고 예측에는 영향을 주는 점이 핵심입니다.
도입과 운영
이 화면은 어떤 회계기준과 관련이 있습니까?
특정 기준서가 아니라 자금 예측 관리 영역의 점검 화면입니다. 기준서 시행일이 따로 없으며 허용 오차와 분류별 한도는 회사가 정하는 값을 씁니다.
표준 SAP 화면과의 관계는 무엇입니까?
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 예측과 실적을 견주는 사후 점검 관점을 더해 확장합니다. 유동성 예측(FF7B)과 현금 포지션(FF7A)은 예측과 실적의 원천으로 그대로 두고 두 화면의 합계를 맞춰 보는 대사 지점을 운영 절차로 둡니다. 기존 화면을 없앨 필요가 없습니다.
데이터 원천과 정합성은 어떻게 확인합니까?
예측 원천(계획 메모 레코드 등)과 실적 원천(은행 전표 항목 등)을 같은 기준으로 이은 항목 단위 값을 쓰고, 화면이 대사식 여덟 개를 매번 검사합니다. 이 자료에서는 70건을 검사해 차이 0건이며 예측일 없는 3건만 의도적 예외입니다. 원천 필드명은 환경마다 달라 “확인 필요”로 남겼습니다.
실제 데이터에 연결하려면 얼마나 걸립니까?
기술 작업은 CDS 뷰를 만들고 서비스를 게시한 뒤 앱 설정의 서비스 주소를 바꾸는 일입니다. 걸리는 시간은 개발보다 합의에 좌우됩니다. 분류 매핑·분류별 한도·항목 연결 키를 정하는 데 며칠에서 몇 주가 걸릴 수 있으며, 환경에 따라 달라 확인이 필요합니다.
권한과 보안은 어떻게 처리합니까?
회사코드 단위 표준 권한 객체를 항목 단계 뷰에 겁니다. 집계 뒤에만 걸면 전사 합계와 자기 몫의 차이로 다른 회사 숫자가 드러나기 때문입니다. 화면은 표준 컨트롤만 쓰며 외부로 데이터를 보내지 않습니다.
항목이 아주 많아지면 느려지지 않습니까?
집계는 큐브에서 하고 항목 목록은 조회 구간과 회사를 필수 필터로 걸어 필요한 만큼만 받습니다. 항목 연결 키에는 인덱스를 두고 서비스에 최대 건수 상한을 둡니다. 구체적인 응답 시간은 환경마다 달라 확인 필요입니다.
분류 체계가 바뀌면 어떻게 합니까?
분류 매핑 표를 고치면 됩니다. 새 계획 그룹이 생기면 어느 분류인지만 적으면 되고, 적지 않으면 기타 입금으로 떨어져 분류별 정확도가 흐려집니다. 매핑은 코드가 아니라 표에 있어 이송 없이 현업이 고칠 수 있습니다.
이 화면이 회계 판단을 대신합니까?
아닙니다. 이 화면은 차이의 분류·집계·대사를 돕는 조회·점검 도구이고, 점검 필요나 확인 필요는 결론이 아니라 사람이 확인할 자리를 알려 주는 표시입니다. 예측 방식을 바꿀지, 어떤 차이를 허용할지의 최종 판단은 회사와 감사인이 합니다.
숫자가 기존 예측 보고서와 다르면 어떻게 확인합니까?
① 조회 범위가 같은지(회사·기간·구간) 봅니다. ② 분류 매핑이 같은지 봅니다. ③ 예측 원천(어느 버전의 예측인지)을 확인합니다. ④ 항목별 차이 탭에서 해당 항목을 눌러 예측일·금액을 원천 화면(FF7B)과 맞춰 봅니다. 대부분은 ①과 ③에서 갈립니다.