수입 구매 계약 물량 이행 다차원 분석 — 약정 대비 이행 금액의 차이를 다섯 요인으로 가르고 원천 라인까지 내려가는 수입 구매 점검
약정 대비 이행 금액의 차이를 다섯 요인으로 나누는 요인분해 · 피벗 축 전환 · 셀에서 원천 계약 이행 라인까지 드릴스루 · 행에 남는 변동 사유 · 숫자를 모델에 맡기지 않는 AI 분석 · 스스로 도는 AI 에이전트 — 소개 영상과 실제 화면 33종, 그리고 CDS 코드까지
소개 영상블로그 목차 순서대로 · 자막 포함
도입 포인트 — 이 앱을 사용해야 하는 이유
수입 구매 계약 이행 점검의 질문은 늘 같습니다. 이행 금액이 약정보다 얼마나 늘었나, 왜 늘었나, 누가 무엇을 확인해야 하나. 계약에는 수량 · 외화 단가 · 프리미엄·할증 · 결제 통화 · 인코텀즈가 정해져 있고, 실제 이행은 구매오더 · 선적 · 입고 · 송장을 거치며 환율이 곱해져 원화 금액이 됩니다. 한 건씩은 계약대로인 것 같아도 공급사 · 원산지 · 자재그룹이 섞이면 합계가 왜 움직였는지 설명하기 어렵습니다. 물대와 프리미엄·할증이 재고 원가로 이어지는 점은 IAS 2 재고자산(K-IFRS 제1002호), 외화 대금의 환산은 IAS 21 환율변동효과(K-IFRS 제1021호) 와 맞닿아 있지만, 이 화면은 두 기준서의 회계 처리를 판단하지 않고 숫자의 출처와 차이를 점검하는 자료만 만듭니다. 적용 범위는 회사 기준에 따라 확인이 필요합니다.
지금은 계약 조회(ME33K), 구매오더 조회(ME23N), 입고(MIGO), 자재 문서 목록(MB51), 송장(MIRO), 공급사 개별 항목(FBL1N)을 번갈아 열고 엑셀에서 계약별로 다시 맞춰 보는 방식이 많습니다. 이 앱은 그 자리에 같은 데이터를 한 번 묶은 큐브를 놓고, 축을 바꿔 가며 보고, 칸에서 원천 이행 라인까지 내려가고, 약정과의 차이를 다섯 요인으로 가르는 점검 화면을 더합니다. 표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회 · 검증 관점을 더해 확장합니다.
핵심 포인트 여덟 가지
| 핵심 포인트 | 고객이 얻는 것 | 지금 방식이라면 |
|---|---|---|
| ① 축을 바꿔도 합계가 갈라지지 않는 피벗 | 공급사 · 원산지 · 자재그룹 · 인코텀즈 · 결제 통화 등 11개 차원을 끌어다 놓아 행 3단계 · 열 2단계로 봅니다. 모든 축이 같은 큐브에서 나옵니다. | 공급사별 · 자재그룹별 엑셀 피벗을 따로 만들고, 합계가 다르면 어느 시트가 맞는지부터 따집니다. |
| ② 칸에서 원천 이행 라인까지 | 숫자를 누르면 그 금액을 만든 계약 품목 이행 라인이 열리고, 라인 합계가 칸 금액과 같은지 바로 보입니다. | 계약 · 구매오더 · 입고 · 송장 화면을 차례로 열어 계약 번호로 찾고 금액을 손으로 대조합니다. |
| ③ 약정 대비 차이를 다섯 요인으로 | 이행 수량 · 외화 단가 · 프리미엄·할증 · 환율 · 계약 외 이행으로 가르고, 요인 합이 총차이와 같은지 매번 검산합니다. | 이행 금액이 늘었다는 합계만 보고, 수량 때문인지 단가 때문인지 환율 때문인지는 사람 머릿속에서 추정합니다. |
| ④ 계약에 없던 이행을 따로 떼어 냄 | 계약 품목에 연결되지 않은 구매오더 라인을 '계약 외 이행' 으로 분리해 금액과 비중을 공급사별로 봅니다. | 약정 안의 차이와 약정 밖의 이행이 한 숫자에 섞여, 어느 쪽이 문제인지 가려내지 못합니다. |
| ⑤ 역할마다 앞세우는 숫자 | CFO · 구매 · 물류 · 자금 책임자 관점으로 요약 지표와 기본 행 축이 바뀝니다. 다시 조회하지 않습니다. | 부서마다 자기 시트를 만들어 같은 회의에 다른 숫자를 들고 옵니다. |
| ⑥ 변동 사유가 행에 남음 | 주된 요인과 사유를 행에 적어 두면 축을 바꾸거나 새로 고침해도 남아, 다음 달에 처음부터 다시 설명하지 않습니다. | 사유가 메일 · 메신저 · 회의록에 흩어져 담당이 바뀌면 사라집니다. |
| ⑦ 숫자를 모델에 맡기지 않는 AI 분석 | 금액과 비율은 서비스가 큐브에서 계산하고 해설은 그 숫자를 문장으로 옮기며, 문장마다 근거 표가 붙습니다. | 요약 문장을 사람이 쓰면서 숫자를 옮겨 적다가 틀리고, 근거를 되짚는 데 시간이 듭니다. |
| ⑧ 화면을 열지 않은 날에도 도는 감시 | 규칙 여섯 개를 돌려 임계를 넘은 항목을 받을 역할의 대기함에 올립니다. 하루 한 번 제한이 서버에서 판정됩니다. | 누군가 보고서를 열어 봐야 이상이 보이고, 월말에야 알게 됩니다. |
사례로 보는 효과 — 이행 금액 +329.43억원 증가의 이유
검증용 샘플 데이터(2026년 4월~9월, 이행 라인 3,620건 · 계약 180건) 기준으로 이행 금액은 약정 14,948.92억원에서 실적 15,278.35억원으로 +329.43억원(+2.2%) 늘었습니다. 합계 리포트는 여기까지 말해 줍니다. 이 앱은 그 다음을 답합니다 — 다섯 요인으로 가르자 이행 수량이 약정에 못 미쳐 −370.30억원이 빠졌는데도 합계가 늘어난 것은, 약정에 없던 계약 외 이행이 +522.20억원 더해졌기 때문이었습니다. 합계만 보면 “조금 늘었다” 로 끝날 일이, 요인으로 가르면 “수량은 줄었고 계약 밖 구매가 늘었다” 는 서로 다른 두 이야기로 나뉩니다.
| 요인 | 증감(억원) | 읽는 법 |
|---|---|---|
| 이행 수량 | −370.30 | 이행 수량이 약정보다 적어 이행 금액이 줄어든 몫입니다. 이행 수량은 약정의 99.7% 입니다. |
| 외화 단가 | +46.29 | 계약 외화 단가보다 높게 이행된 몫입니다. 샘플의 가정값입니다. |
| 프리미엄·할증 | +10.31 | 할증률이 약정 0.66% 에서 0.75% 로 높아진 몫입니다. |
| 환율 | +120.92 | 이행 시점 환율이 약정 시점보다 높아진 몫입니다. 환율은 샘플의 가정값입니다. |
| 계약 외 이행 | +522.20 | 계약 품목에 연결되지 않은 구매오더 라인 164건의 이행 금액 전액입니다. 이행 금액의 3.4% 입니다. |
| 검산 | 0 | 다섯 요인의 합이 총차이와 같습니다(표시 단위 반올림으로 0.01억원 차이가 날 수 있고, 원 단위로는 정확히 같습니다). |
요인분해는 이렇게 셉니다
약정값에서 이행값으로 가면서 한 번에 한 요인씩 실제 값으로 바꾸고, 그때마다 라인 단위 식 이행 수량 × 외화 단가 × 환율 + 외화 프리미엄·할증 × 환율 을 다시 계산합니다. 바뀐 만큼이 그 요인의 몫입니다.
모든 단계가 이어져 있으므로 다섯 몫을 더하면 총차이와 정확히 같아집니다. 그래서 잔차가 구조적으로 0 이고, 화면이 매번 “요인 합 − 총차이 = 0원” 을 적어 검산합니다. 요인을 바꾸는 순서를 달리하면 요인별 금액은 달라질 수 있으므로, 순서는 화면에 고정해 두었습니다.
요인의 크기는 샘플 데이터의 가정값에서 나온 것이며, 실제 환경의 크기를 말하는 것이 아닙니다. 중요한 것은 같은 화면에서 “어느 요인이 얼마” 가 바로 나온다는 점입니다.
도입하면 달라지는 것
- 월 점검 준비 — 요인분해 · 사유 · 보고서가 한 화면에서 나오므로 엑셀 취합과 캡처 작업이 줄어듭니다.
- 회의의 주제 — “어느 시트 숫자가 맞나” 가 아니라 “어느 공급사의 계약 외 구매를 어떻게 할 것인가” 를 이야기합니다.
- 다음 달로 이어지는 기록 — 사유와 레이아웃이 남아, 매달 같은 설명을 처음부터 다시 하지 않습니다.
- 놓치는 날이 없는 감시 — 아무도 화면을 열지 않은 날에도 규칙에 걸린 숫자는 받을 사람에게 올라갑니다.
이런 회사에 맞습니다
해외에서 원자재 · 상품을 장기 계약으로 들여오며 구매오더로 나누어 이행하는 회사, 계약 물량 소진과 단가 · 할증 · 환율 차이를 엑셀로 맞추고 있는 구매 · 자금 · 회계 조직, 그리고 구매 · 물류 · 자금이 이행 금액을 함께 확인해야 하는 경영지원 조직에 맞습니다. 외화 결제 통화가 여러 개이고 공급사와 원산지가 여럿일수록 효과가 큽니다. 이 화면은 점검 자료이며, 이행 금액의 회계 처리와 관세 · 세무상 취급은 회사와 감사인(세무 신고는 회사와 세무 대리인 · 관세사)이 판단합니다.
실행 화면
실제로 돌아가는 화면 33종을 사용 순서대로 싣습니다. 그림을 누르면 크게 볼 수 있고, 화면마다 무엇을 하는 자리이고 어떻게 읽는지를 아래에 적었습니다. 모든 캡처는 가상의 검증용 샘플 데이터로 찍었습니다.
사용 방법
- 조회 조건을 넣습니다. 회사코드(필수)와 시작 · 종료 기간(필수, 선적월 기준)을 고르고, 필요하면 공급사 · 자재그룹 같은 차원 값을 여러 개 골라 범위를 좁힙니다. 비워 두면 전체입니다.
- 조회를 누릅니다. 조회 조건 영역 오른쪽 끝의 조회 버튼을 누르거나 입력칸에서 Enter 를 누릅니다. 자동 조회는 저장한 레이아웃에서 지정한 경우에만 화면을 열 때 실행됩니다.
- 요약을 봅니다. 경영 요약에서 이행 금액 합계 · 계약 외 비중 · 물대 · 할증률을 약정과 함께 보고, 역할을 바꿔 앞세우는 지표를 바꿉니다.
- 축과 탭을 옮깁니다. 차원 칩을 끌어다 놓아 행 · 열을 짜고, 표시 항목 · 금액 단위 · 비교 기준을 바꿉니다. 결과 영역에서는 표와 막대 · 요인 워터폴을 오갑니다.
- 행이나 칸을 눌러 내려갑니다. 숫자 칸을 누르면 원천 이행 라인이 열리고, 차이 모드에서 행 이름을 누르면 그 범위로 요인분해가 계산되며, 사유 칸을 누르면 변동 사유를 적습니다.
- 내보냅니다. 결과 영역의 CSV 버튼은 피벗을, 드릴스루 창의 CSV 버튼은 읽은 원천 라인을 내려받습니다. AI 분석 창에서는 PPTX 보고서를 만듭니다.
무엇으로 만들었나
화면은 OpenUI5 표준 컨트롤과 직접 그린 SVG 차트로만 짰고, 서비스 쪽은 OData V2 규격을 따르는 서비스 한 벌입니다. 엔티티셋 16개(큐브 · 약정 · 원천 라인 · 차원 · 측정값 · 계산항목 · 요약 · 검산 · 사유 · 레이아웃 · 에이전트 · 결과 형식)와 펑션 3개(요인분해 · 해설 · 에이전트 실행)로 이루어져 있습니다. 아래는 모델 구성 수준으로 적은 구성입니다.
| 자리 | 무엇 | 왜 그렇게 두었나 |
|---|---|---|
| 화면 컨트롤 | OpenUI5 표준 컨트롤, 차원 칩 끌어다 놓기, SVG 차트 | 외부 차트 라이브러리를 들이지 않아 반입 심사가 필요 없고, 차트와 표가 같은 숫자를 씁니다. |
| 집계 · 판정 로직 | 큐브 묶기, 계산항목 식, 차이 색 판정 | 묶기는 브라우저가, 금액과 비율 계산 · 요인분해는 서비스가 맡아 숫자의 출처를 하나로 둡니다. |
| 서비스 | OData V2 — 읽기 · 쓰기 · 계산 호출 | 조회 조건은 필터 객체로 보내고, 사유와 레이아웃은 쓰기로 저장합니다. 운영 전환 때 서비스 주소만 바꿉니다. |
| 화면 상태 | JSON 모델(축 · 표시 항목 · 역할 · 접힘) | 서비스 모델과 화면 상태를 나누어, 축을 바꿀 때 서버를 부르지 않습니다. |
| 테마 | sap_horizon | SAP 표준 화면과 같은 결의 모양을 씁니다. |
SAP 표준 기능을 그대로 이어받은 부분. 구매 계약 · 구매오더 · 자재 문서 · 송장의 표준 데이터 구조를 그대로 이어받아 쓰고, 별도의 계약 체계를 새로 만들지 않습니다. 계약 체결과 입고, 송장 검증, 전표 반영은 SAP 표준 T-code 가 담당하고, 이 화면은 그 결과를 여러 축으로 조회하고 검증하는 관점을 더합니다.
| 항목 | 내용 |
|---|---|
| 솔루션 | 수입 솔루션 |
| 업무 영역 | 수입 구매 계약 약정 대비 이행 분석(이행 수량 · 외화 단가 · 프리미엄·할증 · 환율 · 계약 외 이행) |
| 관련 기준서 | IAS 2 재고자산(K-IFRS 제1002호) · IAS 21 환율변동효과(K-IFRS 제1021호) — 적용 범위는 회사 기준에 따라 확인 필요 |
| SAP 표준 T-code | ME33K · ME23N · MIGO · MB51 · MIRO · FBL1N |
| 화면 성격 | 다차원 큐브 분석 리포트(피벗 · 드릴스루 · 차이 요인분해 · AI 분석 · AI 에이전트) |
| 데이터 연동 | OData V2 (조회 · 쓰기 · 펑션) |
| 테마 | sap_horizon |
처음 열었을 때
조회 조건부터 피벗까지가 한 화면에 세로로 쌓입니다. 머리 영역은 접을 수 있어서, 축을 짜는 동안에는 펼쳐 두고 숫자를 볼 때는 접어 표와 차트를 넓게 씁니다.

회사코드 1000, 선적월 2026.04 ~ 2026.09 가 기본값입니다. 조회 버튼은 조회 조건 영역의 오른쪽 끝에 있고, 조회 조건 입력칸에서 Enter 키를 눌러도 조회됩니다. 빈 화면을 주지 않아서 처음 여는 사람도 무엇을 고르면 무엇이 채워지는지 봅니다.

값은 백만원 단위의 이행 금액 합계이고 행은 자재그룹 › 공급사, 열은 선적월입니다. 왼쪽 막대 차트와 오른쪽 피벗이 같은 범위를 보여 줍니다. 이후 축을 바꾸는 일은 서버를 다시 부르지 않고 브라우저에서 합니다.

칩 오른쪽 화살표 버튼으로도 풀 → 행 → 열 순서로 옮길 수 있습니다. 행 축은 최대 3개, 열 축은 최대 2개입니다. 쓰지 않는 차원은 왼쪽 칸에 모아 둡니다.
경영 요약 — 역할마다 앞세우는 숫자가 다르다
경영 요약은 역할을 바꾸면 앞세우는 지표와 기본 행 축이 바뀝니다. 같은 큐브에서 나온 숫자이므로 역할을 바꿔도 다시 조회하지 않습니다.

CFO 는 자재그룹 기준으로 이행 금액 합계 · 계약 외 비중 · 물대 · 할증률을 약정과 함께 봅니다. 약정을 넘긴 상위와 약정에 못 미친 상위가 나란히 나옵니다. 샘플 전체의 할증률은 약정 0.66% 에 견줘 0.75% 입니다.

약정에 없던 구매오더가 어느 공급사로 몰렸는지를 가려내는 관점입니다. 계약 외 이행 비중이 높은 공급사는 계약 갱신이나 발주 방식을 점검할 후보가 됩니다.

선적 예정일보다 늦게 선적된 라인의 비율과 평균 지연 일수를 운송수단별로 비교합니다. 샘플 전체에서 지연 라인은 1,296건으로 35.8% 이고, 지연 라인의 평균 지연은 11.0일입니다.

같은 이행 금액이라도 통화별로 환율 요인이 얼마나 섞였는지 확인하는 관점입니다. 환율은 샘플의 가정값입니다. 환율 요인이 큰 통화부터 결제 시점과 환 위험 관리 방식을 점검합니다.
축 전환과 범위
차원은 열 개가 넘고, 각 차원은 값을 여러 개 골라 범위를 좁힐 수 있습니다. 어떻게 쌓고 좁혀도 합계가 갈라지지 않는 것이 이 절의 기준입니다.

행 축에 인코텀즈를 더하자 자재그룹 › 인코텀즈 › 공급사 순서의 3단 트리가 만들어졌습니다. 축을 바꾼 뒤에도 총합은 같습니다. 되돌리고 싶으면 기본 축 버튼으로 처음 배치로 돌아옵니다.

선적월과 운송수단을 열에 놓은 모양입니다. 열 조합이 상한(36개)을 넘으면 표를 그리지 않고 안내 문구를 먼저 보여 줍니다. 열 조합이 많아질 때는 아래 '한계' 화면처럼 먼저 알려 줍니다.

접힘 상태는 레이아웃에 함께 저장됩니다. 접힌 줄에는 지금 어떤 범위를 보고 있는지가 남아 있어, 범위를 잊은 채 숫자를 읽는 일을 막습니다.

같은 차원 안에서는 or, 차원 사이에서는 and 로 거릅니다. 비워 두면 전체입니다. 선택 창에는 값마다 이행 라인 수가 함께 보입니다.

선택한 개수는 조회 조건 줄의 '차원 값' 버튼에 표시됩니다. 고른 값은 다시 열어 바꾸거나 모두 비울 수 있습니다.

큐브를 다시 읽지 않고 브라우저에서 거릅니다. 합계는 3,258.3억원으로 줄었습니다. 범위를 좁힌 상태에서 요인분해를 보면 그 범위의 차이만 가릅니다.
칸에서 원천 이행 라인까지
집계 화면에서 가장 많이 나오는 말은 이 숫자의 근거가 무엇이냐는 것입니다. 숫자 칸을 누르면 그 칸을 이룬 계약 품목 이행 라인이 열립니다.

창 위에서 칸의 값과 읽은 라인의 합이 같은지 판정합니다. 차원 조건은 $filter 로 서버에 보내고 읽는 단위는 $top 으로 정합니다. CSV 로 내려받을 수 있습니다. 라인마다 계약 번호 · 품목 · 선적일 · 수량 · 외화 단가 · 환율 · 이행 금액이 한 줄로 보입니다.

차이 열이 모두 0 입니다. 월별 요약에서는 라인 · 계약 · 물대 · 이행 금액 · 약정 금액 · 지연 라인을 한눈에 봅니다. 대사 결과는 검증용 샘플에서 모두 같았습니다.
계산항목 — 차원으로는 나오지 않는 행
계약 외 이행 비중이나 납기 지연 라인 비율은 합산으로는 안 나옵니다. 칸마다 분자와 분모를 각각 합산한 뒤 나누어야 하기 때문입니다.

분자와 분모를 칸마다 합산한 뒤 나눕니다. 행을 합쳐도 비율이 맞습니다. 합계 행에서도 맞는 비율이 나옵니다.

측정값 토큰 식으로 정의되어 서비스에서 내려옵니다. 지연 라인의 평균 지연 일수도 같은 방식의 계산항목으로 볼 수 있습니다.
약정 대비 차이 — 같은 표가 구매 점검 자료가 된다
비교 기준을 약정으로 바꾸면 같은 표가 차이 리포트가 됩니다. 칸마다 약정 · 이행 · 차이 · 차이율이 붙고, 차이를 다섯 요인으로 가른 뒤 사유를 행에 남깁니다.

붉은색은 약정을 넘겨 이행한 쪽, 초록색은 약정에 못 미친 쪽입니다. 금액 임계와 비율 임계는 샘플의 가정값(2천만원 · 3퍼센트)이며 회사 기준에 맞게 바꿉니다. 칸 하나하나가 약정 대비 어디서 벌어졌는지 눈으로 먼저 찾는 용도입니다.

검산 줄이 '요인 합 − 총차이 = 0원' 으로 표시됩니다. 요인은 이행 수량 · 외화 단가 · 프리미엄·할증 · 환율 · 계약 외 이행입니다. 샘플 전체는 이행 수량 −370.30, 외화 단가 +46.29, 프리미엄·할증 +10.31, 환율 +120.92, 계약 외 이행 +522.20(억원)입니다.

에너지 원료를 눌렀더니 이행 수량 요인이 크게 줄어든 모양이 나왔습니다. 범위가 바뀌어도 검산 줄은 0 입니다. 다른 행을 누르면 그 범위로 다시 계산되어, 같은 차트로 공급사 · 자재그룹마다 원인을 비교합니다.

원인 요인과 차이 금액, 차이율이 함께 저장됩니다. 사유는 점검 메모이며 단정하는 문장이 아닙니다. 입력한 사유는 서비스의 쓰기로 저장됩니다.

서비스의 쓰기 기능으로 저장하며, 검증용 샘플에서는 브라우저에 보관됩니다. 담당이 바뀌어도 사유가 행에 남아 있습니다.
AI 분석과 보고서
표 위 AI 분석은 지금 보고 있는 범위를 읽어 줍니다. 금액과 비율은 서비스가 큐브에서 계산해 근거로 넘기고, 해설은 그 숫자를 문장으로 옮길 뿐입니다.

금액은 서비스가 계산한 값만 쓰고, 원인은 '확인 필요' 로 적습니다. 외부 AI 서비스는 연결 설정이 켜진 경우에만 쓰입니다. 역할을 바꾸면 그 역할 관점으로 점검 대상을 다시 짚습니다.

축 · 값 · 라인 수 · 약정 · 실적 · 차이 · 주된 요인을 표로 보여 주고, 보고용 슬라이드 파일(PPTX)로 내려받을 수 있습니다. 근거 표의 숫자는 화면의 표와 같은 큐브에서 나옵니다.
AI 에이전트
화면을 열어야만 점검되는 구조는 놓치는 날이 생깁니다. 에이전트는 감시 규칙을 돌려 걸린 항목을 받을 역할의 대기함에 올립니다.

여섯 규칙(계약 외 이행 비중 · 납기 지연 · 할증률 · 수량 · 환율 · 단가)의 임계는 모두 샘플의 가정값입니다. 규칙의 임계와 주기는 화면에서 바꿀 수 있습니다.

이번 샘플에서는 여섯 규칙 중 다섯 규칙이 걸렸고 역할별 점검 필요 목록이 만들어졌습니다. 항목을 열면 받을 역할 관점의 제목과 근거가 보입니다.

두 번째 실행은 하루 한 번 제한으로 LIMITED 판정이 기록되고 새 보고는 올라가지 않습니다. 배치 잡이 같은 호출을 주기적으로 실행하는 구성도 가능합니다.
레이아웃 저장과 복원
축을 짜 두고 다음에 또 쓰려면 저장해 두어야 합니다. 축 · 조회 조건 · 표시 항목 · 접힘 상태를 이름 붙여 저장하고 기본과 자동 조회를 지정합니다.

저장한 목록에서 적용 · 기본 지정 · 자동 조회 지정 · 삭제를 할 수 있습니다. 레이아웃은 사용자별로 여러 개 둘 수 있습니다.

기본 표시가 붙은 항목이 새로 열 때 쓰입니다. 자동 조회를 켜면 화면을 열자마자 저장한 범위로 조회됩니다.

저장한 행 축(공급사)과 열 축(자재그룹)이 그대로 복원됩니다. 월 점검 때 같은 배치를 처음부터 다시 짜지 않아도 됩니다.
좁은 화면과 열 조합이 많은 구성
휴대폰 폭에서도 같은 리포트를 보고, 읽을 수 없는 표는 처음부터 그리지 않습니다.

버튼 이름은 줄고 경영 요약 지표는 두 줄로 겹쳐 보입니다. 조회 조건 입력과 조회 버튼은 같은 순서로 쓰입니다.

열이 많은 표도 잘리지 않고 옆으로 밀어 볼 수 있습니다. 축을 짜는 일은 넓은 화면이 편하고, 숫자를 확인하는 용도로는 좁은 화면으로도 충분합니다.

선적월 6개와 공급사 12개를 열에 놓으면 72 조합이 되어 상한 36개를 넘습니다. 열 축을 줄이거나 차원 값을 골라 범위를 좁힙니다. 읽을 수 없는 표를 그리지 않는 것이 이 안내의 목적입니다.
화면 뒤에서 일어나는 일
조회를 누르면 서비스에서 큐브와 약정 값을 한 번 읽어 와 브라우저가 들고 있고, 축을 바꾸는 모든 조작은 그 위에서 일어납니다. 칸을 눌러 원천 라인으로 내려갈 때와 요인분해 · 해설 · 에이전트를 부를 때만 서비스를 다시 부릅니다. 읽는 일과 쓰는 일이 나뉘어 있어 사유와 레이아웃만 저장 대상입니다.
이행 금액 산출과 점검 규칙
계약 품목에 걸린 구매오더 이행 라인 단위로 물대와 프리미엄·할증을 원화로 계산하고 그 합을 큐브에 묶습니다. 아래 판정은 모두 “점검 필요” 수준의 안내이며, 취득원가 산입과 환율 효과의 회계 처리는 회사와 감사인이 판단합니다.
| 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|
| 이행 라인이 계약 품목에 연결됨 | 약정 수량 · 단가 · 할증 · 환율과 견주어 네 요인으로 분해 | 요인별 금액이 약정과 맞는지 원천 라인에서 확인 |
| 이행 라인이 계약 품목에 연결되지 않음 | 요인 “계약 외 이행” 으로 분리(이행 금액 전액) | 라인 단위 드릴스루로 구매오더 사유 확인 |
| 금액 차이와 비율 차이가 둘 다 임계 초과(기본 2천만원 · 3퍼센트, 가정값) | 칸을 붉은색(약정 초과) 또는 초록색(약정 미달)으로 표시 | 변동 사유 입력 또는 요인분해로 원인 확인 |
| 실제 선적일이 선적 예정일보다 늦음 | 납기 지연 라인으로 집계(지연 일수 별도) | 운송수단 · 공급사별 지연 확인 |
| 감시 규칙 임계 초과 | 대기함에 받을 역할 관점의 보고 등록 | 역할별 점검 후 사유 기록 |
| 하루에 두 번째 에이전트 실행 | 제한됨(LIMITED)으로 기록 | 다음 날 다시 실행 |
산출 순서
- 물대(원화) = 이행 수량 × 외화 단가 × 환율
- 프리미엄·할증(원화) = 외화 프리미엄·할증 × 환율
- 이행 금액 합계 = 물대 + 프리미엄·할증
- 계약 외 이행 비중 = 계약 외 이행 금액 ÷ 이행 금액 합계 × 100, 납기 지연 라인 비율 = 지연 라인 ÷ 전체 라인 × 100
요인분해 처리 단계와 대사식
약정값에서 이행값으로 한 번에 한 요인씩 바꿔 같은 식을 다시 계산합니다. 요인은 이행 수량 → 외화 단가 → 프리미엄·할증 → 환율 순서로 바꾸고, 계약에 연결되지 않은 라인은 “계약 외 이행” 으로 따로 둡니다. 요인 합은 총차이와 정확히 같고, 순서를 바꾸면 요인별 금액은 달라질 수 있습니다. 대사식은 네 가지입니다.
- 큐브 합계 = 원천 라인 합계 (선적월 × 측정값)
- 약정 큐브 합계 = 원천 라인 약정 열 합계
- 라인 이행 금액 재계산 = 저장된 금액
- 요인 합 − 총차이 = 0
조회조건
| 필드 | 필수 | 기본값 | OData 조건 |
|---|---|---|---|
| 회사코드 | 필수 | 1000 | Bukrs eq '1000' |
| 시작 기간(선적월) | 필수 | 2026.04 | Period ge '202604' |
| 종료 기간(선적월) | 필수 | 2026.09 | Period le '202609' |
| 차원 값(다중 선택) | 선택 | 전체 | 큐브에서 읽은 뒤 브라우저에서 거름(차원 안 or · 차원 간 and). 드릴스루는 차원 조건을 $filter 로 보냄 |
| 표시 항목 · 금액 단위 · 비교 · 단계 보기 | 선택 | 이행 금액 합계 · 백만원 · 실적만 · 끔 | 화면 표시 설정(서버 호출 없음) |
| 금액 임계 · 비율 임계 | 선택 | 20,000,000원 · 3퍼센트 | 화면 표시 설정(가정값 — 회사 기준에 맞게 조정) |
| 표시 행 수 · 원천 라인 읽는 단위 | 선택 | 14 · 500 | $top 으로 전달(드릴스루) |
결과 컬럼
| 컬럼 | 의미 | 산출식 |
|---|---|---|
| 행 트리 | 선택한 행 축 순서대로 내려가는 계층 | - |
| 열 머리글 | 열 축 값(선적월 등) 조합 | - |
| 값 | 선택한 표시 항목의 합 | 큐브 합 또는 계산항목 식 |
| 약정 · 이행 · 차이 · 차이율 | 약정 대비 모드에서 칸마다 표시 | 차이 = 이행 − 약정, 차이율 = 차이 ÷ 약정 |
| 사유 | 변동 사유 입력 상태 | 사유 있음 / 사유 쓰기 |
좁은 화면에서 달라지는 것
이 화면은 표와 차트를 한 줄에 나란히 두고 씁니다. 창이 좁아지면 차트를 감추지 않고 표 아래로 내려, 휴대폰에서도 같은 리포트를 봅니다. 표는 가로로 스크롤됩니다. 열 조합이 상한(36개)을 넘으면 표를 반쯤 그리는 대신 범위를 좁히라는 안내를 먼저 보여 줍니다.
파일 구성
(앱 폴더)
├─ index.html · Component.js · manifest.json · readme.html
├─ view/ · controller/ · model/ (cube · chart · layout · pptx · formatter · ErrorHandler)
├─ i18n/ · css/ · media/ (소개 영상 · 포스터 · 챕터)
└─ odata/ 서비스 선언(metadata) · 서비스 로직 · 엔티티셋별 데이터
SAP 표준 기능 확장 포인트
이 앱은 표준을 대체하지 않고 표준이 비어 있는 자리를 채웁니다. 어디까지가 표준이고 어디부터가 이 앱인지를 표로 적었습니다.
표준으로 되는 것과 안 되는 것
계약 체결 · 변경, 구매오더 발행, 입고 처리, 송장 검증과 대금 정산은 표준 화면으로 충분합니다. 표준 화면으로 어려운 것은 같은 계약 이행을 공급사 · 원산지 · 자재그룹 · 인코텀즈 · 결제 통화로 돌려 보면서 약정과의 차이를 요인으로 가르고, 숫자 한 칸에서 원천 라인까지 내려가는 일입니다. 표준에 남겨 둘 일과 이 앱이 더하는 관점을 나란히 놓았습니다.
| 하고 싶은 일 | SAP 표준 | 표준에서 걸리는 자리 | 이 앱이 하는 일 |
|---|---|---|---|
| 계약 한 건의 약정 확인 | 계약 조회(ME33K) | 계약을 한 건씩 열어 봄 | 약정 열을 같은 차원으로 묶어 이행과 나란히 보여 줍니다 |
| 구매오더 단위 이행 확인 | 구매오더 조회(ME23N) | 오더 하나씩, 계약과의 연결은 눈으로 | 계약에 연결되지 않은 오더를 '계약 외 이행' 으로 분리합니다 |
| 입고 시점 · 수량 확인 | 입고(MIGO) · 자재 문서 목록(MB51) | 문서 목록을 엑셀로 옮겨 합산 | 선적 예정일 대비 지연과 이행 수량을 같은 표에서 봅니다 |
| 송장 금액 확인 | 송장 입력(MIRO) | 송장별로 열어 대조 | 이행 금액과 송장 금액 대조를 위한 원천 라인을 열어 줍니다 |
| 대금 개별 항목 대조 | 공급사 개별 항목(FBL1N) | 공급사를 하나씩 조회 | 공급사 축에서 이행 금액을 보고 표준 화면으로 되돌아갑니다 |
| 약정 대비 차이의 원인 분해 | 없음 | 합계 차이만 보이고 원인은 사람이 추정 | 다섯 요인으로 가르고 검산합니다 |
T-code 별 연계 지점
| T-code | 이름 | 연계 |
|---|---|---|
ME33K | 구매 계약 조회 | 이 앱의 약정 열이 쓰는 수량 · 외화 단가 · 조건의 원천입니다. 약정이 달라 보이면 이 화면에서 계약 조건을 먼저 확인합니다. 법정 · 감사 대응은 표준 화면에 남깁니다. |
ME23N | 구매오더 조회 | 이행 라인의 수량 · 단가 · 통화와 계약 참조가 같은 테이블에서 옵니다. 드릴스루에서 구매오더 번호를 확인해 이 화면으로 넘어가고, 거꾸로 표준 화면의 값은 이 앱에서 공급사 · 자재 축으로 다시 봅니다. |
MIGO | 자재 문서 처리(입고) | 입고 일자와 수량이 이행 라인의 선적 · 입고 시점과 맞는지 점검합니다. 입고 처리 자체는 표준에서만 합니다. |
MB51 | 자재 문서 목록 | 입고 라인 합계와 이 앱의 이행 수량 합계를 같은 기간으로 대조하는 지점입니다. |
MIRO | 송장 입력 | 송장 금액과 이행 금액의 차이를 확인하는 지점입니다. 송장 검증과 전표 반영은 표준에서 합니다. |
FBL1N | 공급사 개별 항목 조회 | 대금 전표와 이행 금액을 공급사 단위로 대조합니다. 지급 · 정산은 표준에서 합니다. |
운영으로 옮길 때 “기존 리포트를 없애야 하나” 라는 질문이 나옵니다. 없애지 않습니다. 기존 표준 리포트는 법정 · 감사 · 세무 신고 대응으로 그대로 두고, 이 앱은 월 점검과 원인 분석 자리를 맡습니다. 두 화면의 합계를 맞추는 일을 운영 대사 항목으로 정해 두면 병행 기간 동안 신뢰가 쌓입니다.
분석 지표 정의표
| 지표 | 산식 · 판정 기준 | 대응 기능 | 원천 데이터 | 비고 |
|---|---|---|---|---|
| 이행 금액 합계 | 물대 + 프리미엄·할증 (원화) | 피벗 · 경영 요약 | 이행 라인 | 환율은 샘플의 가정값 |
| 약정 대비 차이 | 이행 금액 − 약정 금액 | 차이 모드 · 요인 워터폴 | 이행 라인 · 약정 열 | 차이 원인은 점검 필요 |
| 계약 외 이행 비중 | 계약 외 이행 금액 ÷ 이행 금액 합계 | 계산항목 · 감시 규칙 | 이행 라인 | 임계는 가정값 |
| 납기 지연 라인 비율 | 지연 라인 ÷ 전체 라인 | 계산항목 · 감시 규칙 | 선적 예정일 · 실제 선적일 | 선적일 필드는 확인 필요 |
| 환율 요인 | 외화 항목에 이행 환율과 약정 환율의 차를 대입한 변화 | 요인분해 | 환율 | IAS 21 환율변동효과(K-IFRS 제1021호)의 회계 처리와는 별개 — 확인 필요 |
| 취득원가 관련 점검 | 물대 · 프리미엄·할증의 구성 | 측정값 · 드릴스루 | 이행 라인 · 송장 | IAS 2 재고자산(K-IFRS 제1002호) 원가 산입 여부는 회사와 감사인이 판단 — 확인 필요 |
S/4HANA 분석 스택과의 자리
S/4HANA 에는 표준 CDS 분석 쿼리와 Fiori 분석 앱, Analysis for Office 같은 분석 도구가 있습니다. 이 앱은 그것들과 경쟁하는 자리가 아니라, 구매 계약 이행 한 주제에 대해 약정 대비 요인분해와 원천 라인 드릴스루, 변동 사유, 감시 규칙을 한 화면에 묶은 점검용 화면입니다. 표준으로 제공되는 구체적인 앱 이름과 범위는 고객사 릴리스에서 확인이 필요합니다.
| 자리 | 역할 |
|---|---|
| SAP 표준 화면 | 계약 · 구매오더 · 입고 · 송장 · 전표 반영 같은 실행과 원장 |
| CDS 큐브 · 분석 쿼리 | 차원 × 측정값 집계, 약정과 이행의 같은 모양 비교 |
| 이 앱 | 축 전환 · 드릴스루 · 요인분해 · 변동 사유 · AI 분석 · 에이전트를 한 화면에 묶은 점검 화면 |
| Analysis for Office · 표준 분석 앱 | 표준 쿼리를 엑셀 또는 표준 분석 화면에서 다루는 자리 — 같은 쿼리를 함께 쓸 수 있습니다 |
확장 포인트 — 운영에서 실제로 손대는 자리
| 자리 | 정할 것 |
|---|---|
| 프리미엄·할증 조건 | 구매 계약의 어떤 조건 유형을 프리미엄 · 할증으로 읽을지, 그 금액을 물대와 어떻게 나눌지 |
| 약정 스냅숏 | 약정을 계약 체결 시점 값으로 고정할지, 변경 이력을 어디까지 반영할지 |
| 계약 연결 기준 | 구매오더 라인이 계약 품목에 연결되었다고 보는 기준(계약 번호 · 품목 참조)과 예외 |
| 환율 원천 | 약정 환율과 이행 환율을 어느 환율 유형 · 어느 일자 기준으로 읽을지 |
| 선적 예정일 · 실제 선적일 | 어느 필드를 쓰는지(확장 필드 또는 선적 관련 문서), 지연 판정 기준 |
| 권한 | 회사코드 · 플랜트 권한을 표준 권한 객체로 어떻게 이어받을지 |
CDS 구성
운영 연결에서는 샘플의 서비스 대신 CDS 뷰가 같은 모양의 OData 서비스를 냅니다. 아래 코드는 구조를 보여 주는 스케치이며, 테이블 · 필드 이름은 고객사 환경에서 확인하고 고쳐 씁니다. 객체 이름은 기능을 뜻하는 영문으로 지었습니다.
뷰 레이어 구성
| 레이어 | 뷰 | 하는 일 | 왜 나누나 |
|---|---|---|---|
| 기준 | ZIMP_CTMAP · ZIMP_CTPLAN | 분류 매핑과 약정 스냅숏 테이블 | 분류와 약정을 코드 밖에 두어 바뀌어도 뷰를 다시 만들지 않습니다 |
| 차원 | ZI_ImpContractSupplier · ZI_ImpContractMaterial | 공급사 · 자재 이름과 분류 | 마스터 이름이 바뀌어도 큐브가 흔들리지 않습니다 |
| 기초 | ZI_ImpContractFulfilLine | 계약 품목 이행 라인 한 줄 | 수량 · 단가 · 환율 · 금액 파생을 한 곳에서 합니다 |
| 큐브 | ZI_ImpContractFulfilCube · ZI_ImpContractPlanCube | 이행 · 약정 집계 | 같은 차원 · 같은 측정값 이름이어야 나란히 비교됩니다 |
| 쿼리 | ZC_ImpContractFulfilQuery | 행 · 열 기본 배치와 계산 측정값 | 비율은 분자와 분모를 각각 더한 뒤 나눕니다 |
| 권한 | ZI_IMPCONTRACTFULFILCUBE (DCL) | 회사코드 · 플랜트 권한 | 큐브를 읽는 자리에 걸어야 빼기로 알아내는 길이 막힙니다 |
| 서비스 | ZUI_ImpContractAnalysis | 쿼리를 OData 로 게시 | 화면은 서비스 주소만 바꾸면 됩니다 |
① 분류 매핑 테이블과 약정 스냅숏 테이블
인코텀즈 묶음과 계약 규모 구간 같은 분류는 코드가 아니라 테이블 행으로 둡니다. 약정은 기간 시작 때 스냅숏으로 고정해야 차이 비교가 흔들리지 않습니다. 테이블 이름과 필드는 스케치이며 고객사 환경에서 정합니다.
" ───────────────────────────────────────────────────────────
" ZIMP_CTMAP : 분류 매핑 (인코텀즈 묶음 · 계약 규모 구간 · 자재 분류)
" 역할 : 리포트 분류를 코드에서 떼어 행으로 관리
" 나눈 이유 : 분류가 바뀔 때 뷰를 고치지 않고 행만 바꾸기 위해
" ───────────────────────────────────────────────────────────
@EndUserText.label : '수입 계약 이행 분류 매핑'
define table zimp_ctmap {
key client : abap.clnt not null;
key map_type : abap.char(8) not null; " INCOTERM / BAND / MATGRP
key code : abap.char(10) not null;
valid_from : abap.dats;
valid_to : abap.dats;
group_text : abap.char(40);
}
" ZIMP_CTPLAN : 약정 스냅숏 (계약 품목 단위, 기간 시작 때 고정)
@EndUserText.label : '수입 계약 약정 스냅숏'
define table zimp_ctplan {
key client : abap.clnt not null;
key plan_ver : abap.char(5) not null;
key ct_no : abap.char(10) not null; " 계약 번호(EKKO-EBELN)
key ct_item : abap.numc(5) not null; " 계약 품목(EKPO-EBELP)
plan_qty : abap.quan(13,3); " 약정 수량 (목표 수량, 확인 필요)
plan_unit_fc : abap.curr(15,4); " 약정 외화 단가
plan_surch_fc : abap.curr(15,4); " 약정 프리미엄·할증(외화)
plan_fx : abap.dec(15,5); " 약정 환율
plan_ccy : abap.cuky;
}
② 공급사 · 자재 차원 뷰
공급사와 자재 이름은 마스터에서 읽어 큐브와 분리합니다. 차원 뷰를 따로 두면 이름이 바뀌어도 큐브를 다시 만들 필요가 없습니다.
@AccessControl.authorizationCheck : #NOT_REQUIRED
@EndUserText.label : '공급사 차원'
define view entity ZI_ImpContractSupplier
as select from lfa1
{
key lifnr as Supplier,
name1 as SupplierName,
land1 as Origin
}
@AccessControl.authorizationCheck : #NOT_REQUIRED
@EndUserText.label : '자재 차원'
define view entity ZI_ImpContractMaterial
as select from mara as m
left outer join t023t as g on g.matkl = m.matkl and g.spras = $session.system_language
{
key m.matnr as Material,
m.matkl as MaterialGroup,
g.wgbez as MaterialGroupName
}
③ 계약 품목 이행 라인 기초 뷰
구매오더 라인과 계약 품목, 약정 스냅숏을 이행 라인 한 줄로 모으는 기초 뷰입니다. 물대 · 프리미엄·할증 · 이행 금액은 여기서 파생합니다. 계약 참조 필드와 선적일 필드는 환경마다 다르므로 확인이 필요합니다.
" ───────────────────────────────────────────────────────────
" ZI_ImpContractFulfilLine : 구매오더 라인 단위 이행 + 약정 열
" 계약 연결 기준 : EKPO 의 계약 참조(KONNR / KTPNR, 확인 필요)
" 계약에 연결되지 않은 라인은 OffContract = 'X' 로 표시
" ───────────────────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '수입 계약 이행 라인'
define view entity ZI_ImpContractFulfilLine
as select from ekko as h
inner join ekpo as i on i.ebeln = h.ebeln
left outer join zimp_ctplan as p
on p.ct_no = i.konnr
and p.ct_item = i.ktpnr
{
key h.ebeln as PurchaseOrder,
key i.ebelp as PurchaseOrderItem,
h.bukrs as CompanyCode,
h.lifnr as Supplier,
i.matnr as Material,
i.matkl as MaterialGroup,
i.werks as Plant,
h.inco1 as Incoterms,
h.waers as Currency,
i.konnr as Contract,
i.ktpnr as ContractItem,
case when p.ct_no is null then 'X' else '' end as OffContract,
i.aedat as ShipDate, " 실제 선적일 필드는 환경마다 다름 — 확인 필요
i.meins as Unit,
i.menge as FulfilQty,
i.netpr as UnitPriceFc,
p.plan_qty as PlanQty,
p.plan_unit_fc as PlanUnitFc,
p.plan_fx as PlanFx,
cast( 'KRW' as abap.cuky ) as LocalCurrency,
" 물대(원화) = 이행 수량 × 외화 단가 → 이행 시점 환율로 환산
currency_conversion( amount => i.menge * i.netpr, source_currency => h.waers,
target_currency => cast( 'KRW' as abap.cuky ),
exchange_rate_date => i.aedat, exchange_rate_type => 'M' ) as GoodsLc,
" 프리미엄·할증(원화) — 구매오더 조건에서 읽을 조건 유형은 회사 기준으로 정함(확인 필요)
" 아래 두 줄은 자리 표시이며, 조건 값을 읽는 뷰를 붙여 SurchargeLc 를 채우고 합을 FulfilAmountLc 로 둠
cast( 0 as abap.curr(23,2) ) as SurchargeLc,
cast( 0 as abap.curr(23,2) ) as FulfilAmountLc
}
④ 이행 큐브
기초 뷰를 차원 조합으로 더한 큐브입니다. 측정값마다 합계 집계 방식을 선언하고 통화 필드를 붙입니다. 환율을 곱한 원화 금액은 환산 시점을 정한 뒤 이 자리에서 한 번만 계산합니다.
@AccessControl.authorizationCheck : #CHECK
@Analytics.dataCategory : #CUBE
@EndUserText.label : '수입 계약 이행 큐브'
define view entity ZI_ImpContractFulfilCube
as select from ZI_ImpContractFulfilLine
{
key CompanyCode,
key substring( ShipDate, 1, 6 ) as ShipPeriod,
key Supplier,
key MaterialGroup,
key Incoterms,
key Plant,
key Currency,
key Unit,
key LocalCurrency,
@Aggregation.default : #SUM
@Semantics.quantity.unitOfMeasure : 'Unit'
FulfilQty,
@Aggregation.default : #SUM
@Semantics.amount.currencyCode : 'LocalCurrency'
GoodsLc,
@Aggregation.default : #SUM
@Semantics.amount.currencyCode : 'LocalCurrency'
SurchargeLc,
@Aggregation.default : #SUM
@Semantics.amount.currencyCode : 'LocalCurrency'
FulfilAmountLc,
@Aggregation.default : #SUM
@Semantics.amount.currencyCode : 'LocalCurrency'
case when OffContract = 'X' then FulfilAmountLc else 0 end as OffContractAmountLc,
@Aggregation.default : #SUM
1 as LineCount
}
⑤ 약정 큐브
이행 큐브와 같은 차원 · 같은 측정값 이름으로 약정 스냅숏을 묶습니다. 이름과 차원이 같아야 두 큐브를 나란히 놓고 차이를 낼 수 있습니다.
@AccessControl.authorizationCheck : #CHECK
@Analytics.dataCategory : #CUBE
@EndUserText.label : '수입 계약 약정 큐브'
define view entity ZI_ImpContractPlanCube
as select from zimp_ctplan as p
inner join ekko as h on h.ebeln = p.ct_no
{
key p.plan_ver as PlanVersion,
key h.bukrs as CompanyCode,
key h.lifnr as Supplier,
@Aggregation.default : #SUM
p.plan_qty as PlanQty,
@Aggregation.default : #SUM
cast( p.plan_qty * p.plan_unit_fc * p.plan_fx as abap.curr(23,2) ) as PlanGoodsLc,
@Aggregation.default : #SUM
cast( p.plan_qty * p.plan_surch_fc * p.plan_fx as abap.curr(23,2) ) as PlanSurchargeLc
}
⑥ 분석 쿼리
행 · 열 기본 배치와 계산 측정값을 선언합니다. 계약 외 이행 비중은 합산이 아니라 분자와 분모를 각각 더한 뒤 나누는 식으로 둡니다.
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '수입 계약 이행 분석'
@Analytics.query : true
define view entity ZC_ImpContractFulfilQuery
as select from ZI_ImpContractFulfilCube
{
@AnalyticsDetails.query.axis : #ROWS
key MaterialGroup,
@AnalyticsDetails.query.axis : #ROWS
key Supplier,
@AnalyticsDetails.query.axis : #COLUMNS
key ShipPeriod,
@EndUserText.label : '이행 금액 합계'
FulfilAmountLc,
@EndUserText.label : '계약 외 이행 금액'
OffContractAmountLc,
@EndUserText.label : '계약 외 이행 비중(%)'
@AnalyticsDetails.query.formula : 'OffContractAmountLc / FulfilAmountLc * 100'
@AnalyticsDetails.query.decimals : 2
cast( 0 as abap.dec(9,2) ) as OffContractShare
}
⑦ 권한 (DCL)
집계 화면에서 권한을 드릴스루에만 걸면, 권한 없는 사람이 전체 합계에서 자기 몫을 빼 다른 범위의 숫자를 알아냅니다. 그래서 큐브를 읽는 자리에 겁니다. 권한 객체 이름은 환경에 맞게 확인합니다.
@EndUserText.label : '수입 계약 이행 큐브 권한'
@MappingRole : true
define role ZI_IMPCONTRACTFULFILCUBE {
grant select on ZI_ImpContractFulfilCube
where ( CompanyCode ) = aspect pfcg_auth ( F_BKPF_BUK, BUKRS, ACTVT = '03' )
and ( Plant ) = aspect pfcg_auth ( M_BEST_WRK, WERKS, ACTVT = '03' );
}
⑧ 서비스 정의
쿼리를 OData 서비스로 게시하는 자리입니다. 서비스 바인딩에서 OData V2 를 선택해 게시하고, 활성화 후 화면 쪽 manifest 의 서비스 주소를 바꿉니다.
@EndUserText.label : '수입 계약 이행 분석 서비스'
define service ZUI_ImpContractAnalysis {
expose ZC_ImpContractFulfilQuery as ContractFulfilQuery;
expose ZI_ImpContractPlanCube as ContractPlanCube;
}
운영 시점에 해야 할 일
개발보다 정하는 일이 많습니다. 아래 표의 왼쪽은 대부분 코딩이 아니라 합의입니다.
| 해야 할 일 | 무엇을 정하나 | 정하지 않으면 | 누가 |
|---|---|---|---|
| 분류 매핑 | 인코텀즈 묶음 · 계약 규모 구간 · 자재 분류 | 리포트 분류가 기존 보고서와 어긋나 첫 회의에서 막힙니다 | 구매 · 회계팀 |
| 프리미엄·할증 조건 | 어느 조건 유형을 프리미엄 · 할증으로 읽을지, 물대와의 구분 | 물대와 할증이 섞여 원가 점검이 안 됩니다 | 구매 · 회계팀 |
| 약정 스냅숏 | 약정을 체결 시점으로 고정할지, 변경을 반영할지 | 계약이 바뀔 때마다 지난달 차이가 달라집니다 | 구매 책임자 |
| 계약 연결 기준 | 구매오더 라인이 계약 품목에 연결되었다고 보는 기준 | 계약 외 이행이 과대 · 과소로 잡힙니다 | 구매팀 · IT |
| 환율 유형 · 환산 시점 | 약정 환율과 이행 환율을 어느 유형 · 일자로 읽을지 | 환율 요인이 회계 환산과 어긋납니다 | 자금 · 회계팀 |
| 원천 확정 | 선적 예정일 · 실제 선적일 필드, 약정 수량 필드 | 납기 지연과 수량 요인이 비어 나옵니다 | IT · 물류팀 |
| 차원 범위 | 공급사 · 원산지 등 차원 중 화면에 올릴 것 | 조합이 폭증하거나 필요한 축이 빠집니다 | 구매 · 경영지원 |
| 권한 설계 | 회사코드 · 플랜트 권한과 역할 | 누구나 합계를 보거나 반대로 아무도 못 봅니다 | IT · 보안 |
| 성능 기준 | 큐브 행 수 · 응답 시간 · 파라미터 필수화 | 대용량에서 화면이 멈춥니다 | IT |
| 대사 체계 | 표준 T-code 와 맞출 항목과 주기 | 기존 보고서와 다를 때 확인 순서가 없습니다 | 회계팀 · IT |
| 전송(TR) 순서 | 테이블 → 차원 → 큐브 → 쿼리 → DCL → 서비스 | 활성화 오류로 전송이 되돌아옵니다 | IT |
| 서비스 활성화 | 서비스 게시와 manifest 서비스 주소 교체 | 화면이 샘플 서비스를 계속 읽습니다 | IT |
| 배치 등록 | 에이전트 실행 호출을 주기적으로 부르는 잡 | 화면을 열어야만 감시가 돕니다 | IT · 구매팀 |
위 항목이 끝나면 기술 작업은 CDS 뷰를 만들고 서비스를 게시한 뒤 화면의 서비스 주소를 바꾸는 일로 줄어듭니다.
숫자를 믿을 수 있는가 — 검증 결과
리포트에서 가장 비싼 질문은 “이 숫자 맞아?” 입니다. 그래서 만드는 쪽에서 먼저 대사식을 세워 두고 전수로 돌렸습니다. 아래는 이 사례(가상 샘플 데이터) 기준 결과입니다.
| 대사식 | 검사 건수 | 차이 |
|---|---|---|
| 큐브 합계 = 원천 라인 합계(선적월 × 측정값) | 48 | 0 |
| 약정 큐브 합계 = 원천 라인 약정 열 합계(선적월 × 측정값 5종) | 30 | 0 |
| 라인 이행 금액 재계산 = 저장 금액(물대 · 할증 · 합계) | 3,620 | 0 |
| 라인 약정 금액 재계산 = 저장 약정 금액(계약 연결 라인) | 3,456 | 0 |
| 피벗 총합 = 원천 총합(축 배치 6종 × 측정값 3종) | 18 | 0 |
| 피벗 칸 = 드릴스루 라인 합계(칸 13개) | 13 | 0 |
| 요인 합 − 총차이(전체 · 선적월 · 자재그룹 · 공급사 · 원산지 · 통화 · 운송수단 · 인코텀즈 범위) | 44 | 0 |
| 검산 결과 대조(측정값 8종) | 8 | 0 |
모든 대사식이 차이 0 입니다. 의도적으로 섞어 둔 예외는 “계약 외 이행” 라인 164건이며, 오류가 아니라 요인으로 분리해 합계에 포함했습니다. 화면 쪽은 이와 별도로 브라우저 자동화로 기능 15종을 돌려, 축을 바꿔도 합계가 변하지 않는지와 칸 금액이 드릴스루 라인 합계와 같은지를 확인했습니다.
운영 데이터로 갈 때 — 이행 라인이 수백만 건이면
이 사례는 이행 라인 3,620건이 큐브 6,525행이 됩니다. 라인이 늘어도 큐브 행 수는 라인 건수가 아니라 차원 조합 수를 따라갑니다. 문제는 조합이 많을 때입니다.
| 구간 | 어떻게 되나 | 무엇을 손보나 |
|---|---|---|
| 큐브 수천 행 | 지금 방식 그대로 — 브라우저가 들고 묶어도 걸리지 않습니다 | 손볼 것 없음 |
| 큐브 수만 ~ 수십만 행 | 한 번에 읽는 양이 커집니다 | 조회 조건을 필수로 두고, 기간과 회사코드로 범위를 먼저 좁힙니다 |
| 큐브 수십만 행 이상 | 브라우저에서 묶기가 느려집니다 | 묶기를 서비스 쪽(분석 쿼리)으로 옮기고 화면은 결과만 받습니다 |
| 이행 라인 수천만 건 | 드릴스루가 전체를 읽으면 안 됩니다 | 차원 조건을 서비스에 보내고 읽는 단위를 제한하며, 큐브는 야간에 미리 집계합니다 |
자주 묻는 질문
도입 상담과 데모에서 자주 나오는 질문들입니다. 네 묶음으로 나눠 적었습니다.
숫자와 산식
이행 금액 합계는 어떻게 계산합니까?
구매오더 이행 라인 한 줄마다 이행 수량 × 외화 단가 × 환율 로 물대를, 외화 프리미엄·할증 × 환율 로 프리미엄·할증을 원화로 구하고 둘을 더합니다. 큐브는 이 줄들을 차원 조합으로 더한 것이라 어느 축으로 묶어도 합계가 같습니다. 단가 · 할증 · 환율은 샘플의 가정값이며, 운영에서는 계약 조건과 회사 기준으로 정합니다.
칸 금액과 원천 라인 합계가 정말 같습니까?
같습니다. 큐브가 원천 이행 라인을 더해 만든 값이기 때문입니다. 샘플 검증에서 칸 13개를 골라 드릴스루 라인 합계와 대조했고 모두 차이가 0이었습니다. 화면도 드릴스루 창 위에서 칸 값과 라인 합계가 같은지 매번 판정해 보여 줍니다.
요인분해의 합이 정말 총차이와 같습니까?
같습니다. 약정값에서 이행값으로 한 번에 한 요인씩 실제 값으로 바꾸며 같은 식을 다시 계산하므로, 단계별 변화를 모두 더하면 총변화가 됩니다. 샘플에서는 전체 · 선적월 · 자재그룹 · 공급사 · 원산지 · 통화 · 운송수단 · 인코텀즈 범위 44곳을 검사했고 차이가 모두 0이었습니다. 화면에도 “요인 합 − 총차이 = 0원” 줄이 매번 표시됩니다.
요인의 순서를 바꾸면 요인별 금액이 달라지지 않습니까?
달라질 수 있습니다. 순차 대입은 어떤 순서로 바꾸느냐에 따라 요인 사이의 교차 효과가 어느 쪽에 얹히는지가 달라지기 때문입니다. 그래서 순서를 이행 수량 → 외화 단가 → 프리미엄·할증 → 환율로 고정해 두었고, 합계가 총차이와 같다는 성질은 어떤 순서에서도 유지됩니다. 순서를 다르게 정하고 싶다면 회사 기준으로 정한 뒤 서비스 쪽 계산 순서를 바꾸면 됩니다.
계약 외 이행은 무엇입니까?
계약 품목에 연결되지 않은 구매오더 라인입니다. 약정이 없으므로 이행 금액 전액을 별도 요인으로 분리하고, 약정 안의 수량 · 단가 · 할증 · 환율 요인과 섞지 않습니다. 샘플에는 164건이 의도적으로 섞여 있고 금액은 522.20억원으로 이행 금액의 3.4% 입니다. 계약 연결 기준은 회사마다 다르므로 운영에서 정해야 합니다.
납기 지연 라인은 어떻게 셉니까?
실제 선적일이 선적 예정일보다 늦은 라인을 지연으로 보고, 지연 일수는 따로 합산합니다. 샘플에서는 지연 라인이 1,296건(35.8%)이고 지연 라인의 평균 지연은 11.0일입니다. 선적일 필드는 환경마다 달라 운영에서 원천 필드를 확정해야 합니다.
임계값은 어떻게 정해집니까?
샘플의 임계(금액 2천만원 · 비율 3퍼센트, 감시 규칙의 비중 · 비율 상한)는 모두 가정값이며, 어떤 기준이 있는 값이 아닙니다. 회사의 허용 편차와 중요성 기준으로 정해 화면 설정과 규칙에서 바꿉니다. 임계를 넘었다는 표시는 점검이 필요하다는 안내이지 잘못이라는 판정이 아닙니다.
화면과 조작
축을 바꿀 때마다 서버를 다시 부릅니까?
아닙니다. 조회를 누르면 큐브와 약정 값을 한 번 읽어 오고, 이후 행 · 열을 바꾸는 조작은 브라우저가 들고 있는 데이터 위에서 일어납니다. 서버를 다시 부르는 것은 조회 조건을 바꿔 조회할 때, 칸에서 원천 라인으로 내려갈 때, 요인분해 · 해설 · 에이전트를 부를 때뿐입니다.
행 · 열을 몇 단계까지 쌓을 수 있습니까?
행 축은 3단계, 열 축은 2단계입니다. 열 조합이 상한(36개)을 넘으면 더 추가할 수 없고, 이미 넘은 경우에는 표를 반쯤 그리지 않고 범위를 좁히라는 안내를 먼저 보여 줍니다. 샘플에서 선적월 6개와 공급사 12개를 열에 놓으면 72 조합이 되어 안내가 나옵니다.
차이 색이 음수인데 초록으로 보이기도 합니다. 맞습니까?
맞습니다. 색은 부호가 아니라 약정에 대한 방향으로 칠합니다. 약정을 넘겨 이행한 쪽은 붉은색, 약정에 못 미친 쪽은 초록색이며, 금액 차이와 비율 차이가 둘 다 임계를 넘을 때만 칠합니다. 작은 금액의 큰 비율이나 큰 금액의 작은 비율로 화면이 알록달록해지는 것을 막기 위한 이중 임계입니다.
변동 사유는 어디에 저장됩니까? 축을 바꾸면 사라집니까?
서비스에 저장되고 키는 조회 범위와 행 경로입니다. 그래서 축 배치를 바꾸거나 트리를 다시 펼쳐도, 새로 고침해도 남습니다. 사유에는 주된 요인과 차이 금액 · 차이율이 함께 기록되며, 사유는 점검 메모이지 원인을 단정하는 문장이 아닙니다.
휴대폰에서도 쓸 수 있습니까?
390px 폭에서 영역이 세로로 쌓이고 차트가 표 아래로 내려가는 것을 확인했습니다. 표는 가로로 스크롤됩니다. 축을 짜는 일은 넓은 화면이 편하고, 숫자를 확인하는 용도로는 좁은 화면으로도 충분합니다.
CSV 는 어떤 것을 내려받습니까?
결과 영역의 CSV 는 지금 보이는 피벗을, 드릴스루 창의 CSV 는 읽은 원천 라인을 내려받습니다. 금액은 화면 단위가 아니라 원 단위 원값으로 담깁니다.
AI 분석과 에이전트
AI 가 숫자를 만들어 냅니까?
아닙니다. 금액과 비율은 서비스가 큐브에서 계산하고, 해설은 그 숫자를 읽어 문장으로 옮길 뿐입니다. 해설에 쓴 숫자마다 근거 표(축 · 값 · 라인 수 · 약정 · 실적 · 차이 · 주된 요인)가 붙고, 원인은 단정하지 않고 “확인 필요” 로 적습니다. 외부 AI 서비스는 연결 설정이 켜진 경우에만 쓰입니다.
AI 에이전트는 무엇을 합니까?
감시 규칙 여섯 개(공급사 계약 외 이행 비중 · 운송수단 납기 지연 · 자재그룹 할증률 · 이행 수량 요인 · 환율 요인 · 단가 요인)를 돌려, 임계값을 넘은 항목을 받을 역할(CFO · 구매 · 물류 · 자금) 관점의 보고로 대기함에 올립니다. 이번 샘플에서는 여섯 규칙 중 다섯 규칙이 걸렸습니다. 실행할 때마다 시각과 호출 주체, 판정이 활동 기록에 남습니다.
에이전트를 사람이 누르지 않아도 돌릴 수 있습니까?
서비스의 에이전트 실행 호출이 화면의 버튼과 같은 일을 하므로, 배치 잡이 그 호출을 주기적으로 두드리면 됩니다. 하루에 한 번만 실제로 돌도록 서버가 판정해서, 두 번째 호출은 제한됨(LIMITED)으로 기록되고 새 보고는 올라가지 않습니다.
PowerPoint 보고서는 어디서 만들어집니까?
브라우저 안에서 만들어집니다. 외부 라이브러리 없이 압축과 XML 을 직접 짓기 때문에 서버에 파일을 올리지 않고, 해설과 근거 표를 장으로 옮겨 담습니다. 만든 파일은 표준 슬라이드 파일로 열립니다.
도입과 운영
이 화면이 표준 화면을 대체합니까?
대체하지 않습니다. 계약 체결, 입고, 송장 검증, 전표 반영은 SAP 표준 T-code 가 담당하고, 이 화면은 그 결과를 여러 축으로 조회하고 검증하는 관점을 더해 확장합니다. 기존 표준 리포트도 법정 · 감사 · 세무 신고 대응용으로 그대로 둡니다.
이행 금액의 회계 처리는 누가 판단합니까?
이 화면은 분류 · 집계 · 대사를 돕는 점검 도구이며, 물대와 프리미엄·할증의 재고 원가 산입 여부(IAS 2 재고자산, K-IFRS 제1002호)와 외화 대금의 환산(IAS 21 환율변동효과, K-IFRS 제1021호), 관세와 세무 신고는 판단하지 않습니다. 최종 판단은 회사와 감사인이, 세무 신고는 회사와 세무 대리인 · 관세사가 합니다.
샘플의 값은 실제 값입니까?
아닙니다. 공급사 · 계약 번호 · 구매오더 번호 · 금액은 모두 가상이고, 단가 · 할증 · 환율 · 임계값은 가정값입니다. 사례의 요인별 금액도 샘플의 결과이며 실제 환경의 크기를 말하는 것이 아닙니다.
적용 시기와 범위는 어떻게 됩니까?
회사의 계약 관리 기준과 SAP 시스템 구성에 따라 달라집니다. 이 글은 확인된 사실만 적었고, 샘플 기간은 2026년 4월부터 9월입니다. 어느 계약 유형과 자재까지 올릴지는 도입 협의에서 정합니다.
외화와 환율은 어떻게 처리합니까?
외화 단가와 외화 프리미엄·할증을 외화로 들고 있다가 환율을 곱해 원화 금액을 만듭니다. 환율은 요인분해의 독립 요인이라 환율이 이행 금액에 얼마나 영향을 줬는지가 따로 나옵니다. 환율 유형과 환산 시점은 운영에서 정하며, 회계 환산과 같은지는 확인이 필요합니다.
운영 시스템에 연결하는 절차는 어떻게 됩니까?
순서가 있습니다. 먼저 분류 매핑과 프리미엄·할증 조건, 약정 스냅숏, 환율 원천에 대한 합의를 하고, CDS 객체를 만들어 서비스로 게시한 뒤, 화면의 서비스 주소를 바꾸고 표준 T-code 와 대사합니다. 소요는 합의 범위에 가장 크게 좌우되며 기술 작업은 상대적으로 작습니다.
권한은 어떻게 걸립니까?
CDS 에 DCL 을 붙여 회사코드와 플랜트 권한을 표준 권한 객체로 따릅니다. 별도의 권한 체계를 만들지 않습니다. 권한을 드릴스루에만 걸면 전체 합계와 자기 몫의 차이로 다른 범위를 알아낼 수 있으므로 큐브를 읽는 자리에 겁니다.
데이터가 아주 많으면 느려지지 않습니까?
데모는 서비스가 라인을 들고 브라우저가 큐브를 묶는 구조라 운영 규모에서는 그대로 쓰지 않습니다. 큐브 행 수는 라인 수가 아니라 차원 조합 수를 따르므로 먼저 범위를 좁히고, 규모가 커지면 묶기를 분석 쿼리로 옮기고 큐브를 미리 집계합니다. 드릴스루는 차원 조건을 서비스에 보내고 읽는 단위를 제한합니다.
분류 체계나 매핑이 바뀌면 어떻게 됩니까?
인코텀즈 묶음과 계약 규모 구간 같은 분류는 매핑 테이블에서 읽으므로 코드를 고치지 않고 행만 바꿉니다. 유효기간을 두어 과거 기간의 숫자가 흔들리지 않게 하고, 바꾼 뒤에는 대사식을 다시 돌려 차이가 0인지 확인합니다.
숫자가 기존 보고서와 다르면 어떻게 확인합니까?
순서가 있습니다. 먼저 조회 범위(회사코드 · 기간)가 같은지, 다음으로 계약 연결 기준과 프리미엄·할증 포함 범위가 같은지, 그다음 환율 기준이 같은지를 봅니다. 그래도 다르면 드릴스루로 칸을 이룬 라인을 열어 구매오더 번호로 표준 T-code 에서 원천을 확인합니다.
누가 쓰는 화면입니까?
구매 · 물류 · 자금 · 회계 담당과 책임자가 같은 큐브를 서로 다른 역할 관점으로 봅니다. CFO 는 자재그룹 단위 이행 금액과 약정 편차를, 구매 책임자는 공급사별 계약 외 이행을, 물류 책임자는 운송수단별 납기 지연을, 자금 책임자는 통화별 환율 영향을 앞세워 봅니다.