수출 납기 이행 다차원 분석 — 약정 납기월과 선적월의 매출 차이를 요인으로 나누는 한 화면
큐브 집계 · 끌어 놓는 축 구성 · 칸에서 청구 라인까지의 드릴스루 · 기준 대비 차이와 요인분해 · 행에 남는 차이 사유 · 숫자를 모델에 맡기지 않는 인공지능 분석 · 하루 한 번 도는 에이전트 — 소개 영상과 실제 화면 15종, 그리고 CDS 코드까지
소개 영상블로그 목차 순서대로 · 자막 포함
도입 포인트 — 이 앱을 사용해야 하는 이유
수출 담당자가 월말 회의에서 받는 질문은 늘 비슷합니다. 약정한 납기월과 실제로 선적한 달이 다르면 매출은 얼마나 옮겨 갔나, 왜 옮겨 갔나, 누가 무엇을 확인해야 하나. 지금은 이 답이 표준 화면 여러 개와 엑셀, 포워더·관세사 자료 대조에 흩어져 있어, 숫자 하나를 설명하려면 판매오더·납품·청구 화면을 오가며 조건을 다시 맞춰야 합니다.
이 화면은 청구 라인을 선적월·고객·제품·인코텀즈·국가 축으로 한 번에 돌려 보고, 약정 납기월 기준 매출과 선적 실적 매출의 차이를 고객 요청 조기 선적·합적 앞당김·생산·출하 지연·서류·통관 대기·선복 대기·환율 여섯 요인으로 나눕니다. 관련 기준서는 IFRS 15 고객과의 계약에서 생기는 수익(K-IFRS 제1115호)이며, 이 화면은 수익 인식 시점을 점검하는 조회 도구입니다. 최종 판단은 회사와 감사인이 합니다.
핵심 포인트 일곱 가지
| 핵심 포인트 | 고객이 얻는 것 | 지금 방식이라면 |
|---|---|---|
| ① 축을 바꿔도 합계가 갈라지지 않는 피벗 | 국가·고객·인코텀즈·제품 등 차원을 끌어 놓아 행 3단계·열 2단계로 봅니다. 모두 같은 큐브에서 나오므로 합계가 어긋날 자리가 없습니다. | 고객별·국가별·인코텀즈별 리포트를 따로 만들고, 합계가 다르면 리포트를 맞추느라 시간을 씁니다. |
| ② 칸에서 청구 라인까지 한 번에 | 칸을 누르면 그 금액을 만든 청구 라인이 열리고, 칸 값과 원천 합계가 같은지 그 자리에서 보입니다. | 표준 화면을 따로 열어 조건을 손으로 다시 맞춥니다. |
| ③ 납기 차이를 여섯 요인으로 | 총차이를 조기 선적·합적·생산 지연·서류 대기·선복 대기·환율로 가르고, 요인 합계가 총차이와 같은지 검사합니다. | 엑셀로 차이를 나누고 합계를 다시 손으로 맞춥니다. |
| ④ 차이 사유가 행에 남는다 | 사유는 조회 범위와 행 경로에 묶여 저장되어 축을 바꿔도 다음 조회에서 그 행에 따라옵니다. | 같은 질문을 매달 다시 하고 지난달 답은 메일에서 찾습니다. |
| ⑤ 하루 한 번 도는 감시 | 규칙마다 기준값과 받을 역할(CEO·CFO·영업·물류)이 있어 걸린 항목이 받은 보고로 올라옵니다. | 숫자가 나빠진 날 아무도 화면을 열지 않으면 그대로 지나갑니다. |
| ⑥ 숫자는 모델에 맡기지 않는 분석 | 금액과 비율은 서비스가 계산하고 해설은 그 숫자를 읽어 쓰며, 원인은 단정하지 않고 점검 필요 항목만 제시합니다. | AI 가 만든 숫자를 보고서에 써도 되는지부터 따져야 합니다. |
| ⑦ 보고서와 저장 배치 | 보고 있는 범위로 PowerPoint 보고서가 브라우저에서 만들어지고, 자주 쓰는 배치는 이름을 붙여 저장합니다. | 화면을 캡처해 보고서를 다시 만들고 배치를 매번 다시 잡습니다. |
사례로 보는 효과 — 556백만원 차이는 어디서 났나
검증용 샘플 데이터 2026-01~2026-09 범위에서 선적 실적 매출은 30,212백만원, 약정 납기 기준은 29,656백만원으로 총차이는 556백만원(555,869,913원)입니다. 여섯 요인으로 가르면 생산·출하 지연 224백만원, 고객 요청 조기 선적 168백만원, 서류·통관 대기 104백만원, 선복 대기 31백만원, 합적 앞당김 30백만원, 환율 −0.7백만원이며 합은 총차이와 같습니다. 같은 달에 약정과 선적이 함께 일어난 정시 선적률은 77.45%(기준 78.9%)입니다.
표만 보면 "선적이 앞서 매출이 늘었다"에서 멈추지만, 요인으로 가르면 지연 요인(생산·출하·서류·선복 합 359백만원)이 조기 요인(198백만원)보다 크다는 점과 어느 고객·인코텀즈에서 큰지를 바로 짚을 수 있습니다. 감시 규칙은 같은 범위에서 7건을 올렸습니다. 이 값들은 샘플 데이터 값이며 원인을 단정하지 않습니다.
도입하면 달라지는 것
- 월말 점검 준비 — 차이 표·요인분해·사유·보고서가 한 화면에서 나와 엑셀 취합과 화면 캡처가 줄어듭니다.
- 회의의 주제 — "어느 숫자가 맞나"보다 "어느 고객·요인부터 확인할까"를 이야기합니다.
- 다음 달로 이어지는 기록 — 사유와 배치가 남아 같은 설명을 다시 하지 않습니다.
- 놓치지 않는 점검 — 화면을 열지 않아도 감시 규칙에 걸린 항목이 역할별 받은 보고로 올라옵니다.
이런 회사에 맞습니다
SAP S/4HANA에서 수출 판매오더·납품·청구 흐름을 운영하고, 약정 납기월과 선적월 차이를 엑셀로 점검하는 회사에 맞습니다. 인코텀즈가 여러 가지이고 통화가 여러 개인 수출 비중이 높은 조직, 영업·물류·재경이 같은 숫자를 서로 다른 화면으로 보고 있는 조직에서 효과가 큽니다. 수입 중심이거나 납기 개념이 없는 내수 위주 조직에는 맞지 않습니다.
실행 화면
사용 방법
- 조회 조건 — 회사코드(필수), 시작 기간·종료 기간(필수)을 정합니다. 비교 기준은 약정 납기월 기준으로 고정되어 있습니다.
- 조회 — 오른쪽 위 파란 조회 버튼을 누르거나 입력 칸에서 Enter 키를 누릅니다. 자동 조회를 지정한 레이아웃은 화면을 열 때 바로 조회합니다.
- 요약 확인 — 역할별 요약 탭(CEO·CFO·영업 책임자·물류 책임자)에서 선적 매출·이동분·이동 비율·정시 선적률을 봅니다.
- 축·탭 이동 — 차원 칩을 사용 안 함·행·열로 옮기고 보기 방식(차원 보기·단계 보기), 분석 항목, 표시 행 수를 고릅니다.
- 행·칸 클릭 — 행을 누르면 오른쪽 차트가 그 행 기준으로 바뀌고, 칸을 누르면 원천 청구 라인이 열립니다.
- 기준 대비·분석 — 기준 대비를 켜 차이를 보고, 인공지능 분석과 에이전트, 기간별 요약, 보고서를 위쪽 버튼에서 엽니다.
- 내보내기 — CSV 버튼으로 현재 표를 파일로 저장합니다.
무엇으로 만들었나
| 자리 | 무엇 | 왜 그렇게 두었나 |
|---|---|---|
| 화면 컨트롤 | OpenUI5 표준 컨트롤(sap.ui.table 트리 표·sap.m 대화상자)과 직접 그린 SVG 차트 | 외부 차트 라이브러리를 반입하지 않아 보안 검토 부담이 없습니다. |
| 집계·판정 로직 | 큐브 집계(cube.js)·차트(chart.js)·보고서(pptx.js)·레이아웃(layout.js) | 축을 바꿔도 서비스를 다시 부르지 않고 이미 받은 큐브에서 다시 집계합니다. |
| 서비스 구성 | OData V2 서비스를 manifest 에 상대 경로로 선언하고 큐브·기준·차원·원천 라인 셋을 읽습니다 | 금액 계산은 서비스가 하고 화면과 인공지능 해설은 읽기만 합니다. 경로를 코드에 박지 않아 운영 서비스로 바꾸기 쉽습니다. |
| 오류 처리 | 연결 실패·빈 결과·한도 초과를 사용자 문장으로 안내 | 빈 화면이나 콘솔 오류로 끝나지 않게 했습니다. |
| 테마 | sap_horizon | 표준 화면과 같은 시각 언어로 오가는 부담을 줄입니다. |
| 항목 | 내용 |
|---|---|
| 솔루션 | 수출 |
| 업무 영역 | 영업(SD) · 수출 납기 이행 |
| 관련 기준서 | IFRS 15 고객과의 계약에서 생기는 수익(K-IFRS 제1115호) — 수익 인식 시점 점검 관점 |
| SAP 표준 T-code | VA03 · VL03N · VF03 · FBL5N · VA05 |
| Namespace | zui5.expotd |
| 화면 성격 | 다차원 분석 리포트 |
| 테마 | sap_horizon |
처음 열었을 때
조회 전에는 조건과 보드만 보입니다. 데이터를 부르지 않고 어떤 축 배치로 시작할지 먼저 정합니다.

왼쪽 위 보드에서 사용 안 함·행·열 세 칸에 차원 칩이 놓입니다. 기본 배치는 행에 지역과 국가가 올라가 있습니다. 조회 조건은 회사코드 1000, 2026-01~2026-09, 비교 기준은 약정 납기월 기준입니다. 조회를 누르기 전에는 데이터를 부르지 않습니다.
조회 결과와 역할별 요약
조회 한 번으로 표·차트·요약이 함께 채워집니다. 역할에 따라 먼저 볼 숫자가 다릅니다.

조회 버튼을 누르거나 입력 칸에서 Enter 를 누르면 표와 차트가 함께 채워집니다. 위쪽 요약은 CEO·CFO·영업 책임자·물류 책임자 역할별로 보는 지표가 다르며, 각 지표 아래에 기준 값과 기준 대비 비율이 붙습니다. 표 행을 누르면 오른쪽 차트가 그 행을 기준으로 바뀝니다.
축 전환과 범위
행과 열을 바꾸고 보고 싶은 값만 골라 범위를 좁힙니다. 합계는 어느 배치에서도 같습니다.

차원 칩을 끌어 다른 칸에 놓거나 칩을 눌러 메뉴에서 옮길 수 있습니다. 칸을 바꿔도 서비스를 다시 부르지 않고 이미 받은 큐브 데이터를 브라우저에서 다시 집계합니다. 열에 올린 차원이 있으면 첫 분석 항목만 열로 펼쳐 보이며, 이 사실은 표 위 안내 줄에 표시됩니다.

차원 이름 옆 필터 단추를 누르면 값 목록이 열립니다. 여러 값을 한 번에 고를 수 있고, 선택한 값은 표·차트·요약에 모두 같이 반영됩니다.
칸에서 원천 문서까지
숫자를 의심할 때 다른 화면을 열지 않고 그 자리에서 청구 라인으로 내려갑니다.

대화상자 위쪽에 칸 값과 원천 합계가 같은지 초록색 안내로 보여 줍니다. 아래 표에는 청구 문서, 선적일, 약정 납기일, 청구 전기일, 이동 사유, 수주번호, 고객, 국가, 제품이 줄마다 나옵니다. 줄이 많으면 더 보기로 이어서 읽습니다.
계산항목
조기 이동분·지연 이동분·이동 비율·정시 선적률처럼 서비스가 정의한 식을 항목처럼 고릅니다.

분석 항목 선택 상자에서 측정값과 계산항목을 함께 고를 수 있습니다. 계산항목은 서비스가 정의한 식(예: 이동 비율 = 이동분 ÷ 선적 매출)을 그대로 따릅니다. 단계 보기로 바꾸면 행 차원이 위에서부터 한 단계씩 펼쳐집니다.
기준 대비 차이 — 같은 표가 요인 분해가 된다
비교 기준만 켜면 같은 표가 납기 차이 리포트로 바뀌고, 행마다 요인 분해와 사유 기록이 이어집니다.

기준 대비 스위치를 켜면 선적 매출 아래에 기준 금액과 차이(금액·비율)가 한 줄로 붙습니다. 행을 누르고 차이 분해 탭을 고르면 기준 금액에서 선적 금액까지 요인별 증감이 막대로 이어집니다. 요인 합계와 총차이가 같은지 검사 문구가 함께 표시됩니다.

표의 사유 열 아이콘을 누르면 사유 구분(고객 요청·생산 지연·서류 대기 등)과 내용을 입력하는 창이 열립니다. 저장한 사유는 다음 조회에서도 그 행에 붙어 보입니다.
인공지능 분석과 보고서
숫자는 서비스가 계산하고 해설은 그 숫자를 읽어 씁니다. 결과는 보고서 파일로 내려받습니다.

분석은 규칙 기반이 기본이며 원인은 단정하지 않고 점검 필요 항목만 제시합니다. 항목마다 근거 수치(대상·선적 매출·기준·조기 이동분·지연 이동분·차이·등록된 사유)를 펼쳐 볼 수 있습니다. 같은 창의 보고서 단추로 발표용 PPTX 파일을 내려받을 수 있습니다.
인공지능 에이전트
사람이 열지 않아도 규칙에 걸린 항목을 찾아 역할별 보고로 올립니다.

에이전트 창에는 감시 규칙·받은 보고·실행 기록 세 탭이 있습니다. 역할 선택 상자로 받는 사람(CEO·CFO·영업·물류)별 보고를 걸러 볼 수 있습니다.

지금 실행을 누르면 규칙마다 기준값을 넘은 항목을 찾아 보고로 남깁니다. 하루 한 번만 실행하도록 제한해 같은 보고가 반복되지 않으며, 이미 실행한 날에는 건너뛴 사실이 실행 기록에 남습니다.
레이아웃 저장과 복원
자주 쓰는 배치를 이름을 붙여 저장하고 기본값·자동 조회를 지정합니다.

행·열 배치, 분석 항목, 보기 방식, 기준 대비 여부가 함께 저장됩니다. 기본 레이아웃으로 지정하면 화면을 열 때 바로 적용되고, 열 때 자동 조회를 켜면 조회까지 이어집니다.

레이아웃 관리 창에서 이름 변경·삭제·기본 지정을 할 수 있습니다.
좁은 화면과 한계
휴대폰 폭에서는 한 열로 쌓이고, 한도를 넘는 조합은 표를 그리지 않고 안내합니다.

표와 차트도 위아래로 나뉘어 한 열로 읽습니다.

열 조합 최대 개수와 행 최대 개수를 넘으면 표를 그리지 않고 줄일 방법을 안내합니다. 차트도 같은 범위에서는 그리지 않습니다.
화면 뒤에서 일어나는 일
조회 한 번에 서비스가 선적월·고객·제품·인코텀즈 단위 큐브와 기준 큐브를 돌려주고, 화면은 그 두 벌로 표·차트·요약을 모두 계산합니다. 칸을 누를 때만 원천 청구 라인을 쪽 단위로 읽습니다.
판정 조건과 사용자 조치
| 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|
| 선적월 = 약정 납기월 | 정시 선적 | 필요 없음 |
| 선적월 < 약정 납기월 · 고객 요청 | 조기 이동분(고객 요청 조기 선적) | 고객 변경 요청 근거 확인 · 점검 필요 |
| 선적월 < 약정 납기월 · 합적 | 조기 이동분(합적 앞당김) | 합적 사유와 납기 합의 확인 · 점검 필요 |
| 선적월 > 약정 납기월 · 생산·출하 | 지연 이동분(생산·출하 지연) | 생산·출하 일정 확인 · 점검 필요 |
| 선적월 > 약정 납기월 · 서류·통관 | 지연 이동분(서류·통관 대기) | 서류·통관 상태 확인 · 점검 필요 |
| 선적월 > 약정 납기월 · 선복 | 지연 이동분(선복 대기) | 선복 확보 상태 확인 · 점검 필요 |
| 선적일 환율 ≠ 약정 납기일 환율 | 환율 요인 | 환율 가정값과 차이 확인 · 확인 필요 |
처리 단계와 대사식
- 청구 라인 수집 — 선적일·약정 납기일·외화 금액·환율
- 원화 환산 — 외화 금액 × 인식 환율
- 이동 사유 분류 — 약정 납기월과 선적월 비교
- 큐브 집계 — 선적월·고객·제품·인코텀즈
- 기준 대비 — 총차이와 요인분해
대사식은 네 가지입니다. ① 큐브 합계 = 원천 라인 합계, ② 총차이 = 선적 실적 − 기준, ③ 요인 합계 = 총차이, ④ 칸 금액 = 드릴스루 합계.
조회조건
| 필드 | 필수 | 기본값 | 처리 |
|---|---|---|---|
| 회사코드 | 필수 | 1000 | 서비스 필터(회사코드 일치) |
| 시작 기간 · 종료 기간 | 필수 | 2026-01 ~ 2026-09 | 서비스 필터(기간 구간) |
| 비교 기준 | 고정 | 약정 납기월 기준 | 기준 큐브 선택 |
| 차원 값 선택 | 선택 | 전체 | 브라우저 집계 |
| 표시 행 수 | 선택 | 14 | 화면 처리 |
결과 컬럼
| 컬럼 | 의미 | 산출식 |
|---|---|---|
| 선적 매출(원화) | 선적월 기준 매출 | Σ 외화 금액 × 인식 환율 |
| 납기월 이동분 합계 | 약정 납기월과 달라진 금액 | 조기 이동분 + 지연 이동분 |
| 이동 비율(%) | 선적 매출 중 이동 비중 | 이동분 ÷ 선적 매출 × 100 |
| 정시 선적률(%) | 같은 달 선적 비중 | 정시 선적분 ÷ 선적 매출 × 100 |
| 기준 / 차이 | 약정 납기 기준 금액과 차이 | 차이 = 선적 − 기준 |
좁은 화면에서 달라지는 것
조회 조건·보드·요약·표·차트가 한 열로 쌓이고, 표와 차트는 위아래로 나뉘어 각각 가로로 밀어 볼 수 있습니다. 표시 한도는 같습니다.
파일 구성
index.html · Component.js · manifest.json
controller/ 화면 동작
view/ 화면 정의와 대화상자
model/ 큐브 집계 · 차트 · 보고서 · 레이아웃
i18n/ · css/ 문구와 스타일
media/ 소개 영상
readme.html 설명서
SAP 표준 기능 확장 포인트
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·검증 관점을 더해 확장합니다. 표준을 없애지 않고 끊기는 자리만 이어 붙입니다.
표준으로 되는 것과 안 되는 것
| 하고 싶은 일 | SAP 표준 | 표준에서 걸리는 자리 | 이 앱이 하는 일 |
|---|---|---|---|
| 약정 납기일 확인 | VA03 판매오더 일정 라인 | 건별로는 충분하지만 월·고객 단위로 모아 보려면 화면을 반복해 열어야 합니다 | 약정 납기월을 큐브 축으로 올려 기준 매출을 한 번에 만듭니다 |
| 실제 선적일 확인 | VL03N 납품 | 납품 단위라 청구 금액·환율과 이어 보려면 다른 화면이 필요합니다 | 선적일과 청구 라인을 같은 줄에서 보여 줍니다 |
| 청구 금액·전기일 | VF03 청구 문서 | 문서 한 건씩 열어 합계를 맞춥니다 | 칸 합계와 원천 라인 합계를 자동으로 대조합니다 |
| 매출 계정 대사 | FBL5N 고객 개별 항목 | 고객 단위 개별 항목은 선적월 귀속 관점이 없습니다 | 고객별 선적월 매출을 같은 표에 놓아 대사 대상을 좁힙니다 |
| 납기 점검 대상 찾기 | VA05 판매오더 목록 | 납기 지연 여부를 월 매출 영향으로 환산하지 않습니다 | 납기 이동분을 금액으로 환산해 우선순위를 정합니다 |
| 차이의 요인 분해 | 없음 | 표준에는 선적월·약정월 차이를 요인으로 나누는 화면이 없습니다 | 여섯 요인으로 가르고 합계를 검산합니다 |
T-code 별 연계 지점
| T-code | 이름 | 연계 |
|---|---|---|
| VA03 | 판매오더 조회 | 약정 납기일(일정 라인)을 이어받습니다. 이 앱의 납기월이 의심되면 VA03 일정 라인으로 원천을 확인합니다. |
| VL03N | 납품 조회 | 실제 선적일을 이어받습니다. 선적일이 다르면 VL03N 에서 납품 상태를 확인합니다. |
| VF03 | 청구 문서 조회 | 금액·환율·수량을 이어받습니다. 칸 합계와 청구 문서 합계를 맞춰 봅니다. |
| FBL5N | 고객 개별 항목 | 고객별 매출 대사에 씁니다. 표준 화면 값은 이 앱의 고객 행에서 다시 봅니다. |
| VA05 | 판매오더 목록 | 납기 점검 대상 오더를 찾을 때 이 앱의 고객·제품 행과 함께 봅니다. |
이 앱 결과에서 표준 T-code 로 원천을 확인하고, 표준 화면의 값은 이 앱의 해당 고객·제품 행에서 다시 봅니다. 두 화면 숫자를 맞춰 보는 지점은 선적 매출 합계와 청구 문서 합계입니다. 법정 공시와 세무 신고 대응은 표준에 남겨 두므로 기존 리포트를 없앨 필요는 없습니다.
S/4HANA 분석 스택과의 자리
표준 분석 쿼리와 Fiori 분석 앱, Analysis for Office 는 표준 정의의 범위에서 강합니다. 이 화면은 납기월 이동 관점의 요인 분해와 사유 기록처럼 표준에 없는 관점을 같은 큐브 위에 더합니다. 확인하지 못한 Fiori 앱 이름은 적지 않았습니다.
확장 포인트 — 운영에서 실제로 손대는 자리
| 자리 | 어디를 손대나 | 내용 |
|---|---|---|
| 조건 유형·부대비용 | 확인 필요 | 수출 부대비용을 매출 비교에 넣을지 정합니다 |
| 인코텀즈별 통제 이전 시점 | 고객 계약 기준 | 인코텀즈마다 매출을 보는 시점이 다르므로 기준표를 정합니다 |
| 이동 사유 매핑 | 사유 코드↔요인 | 고객 요청·합적·생산·서류·선복 사유 코드를 요인에 연결합니다 |
| 확장 필드 | BAdI·커스텀 필드 | 약정 납기일이 다른 필드에 있으면 읽는 위치를 바꿉니다 |
| 권한 | 회사코드·영업조직 | 집계 단계에 권한을 겁니다 |
분석 지표 정의표
| 지표 | 산식·판정 기준 | 대응 기능 | 원천 데이터 | 비고 |
|---|---|---|---|---|
| 선적 매출(원화) | Σ 외화 금액 × 인식 환율 | 조회 결과·요약 | VBRP·VBRK | 환율은 가정값 |
| 기준 매출 | 같은 라인을 약정 납기월 기준으로 합산 | 기준 대비 | VBEP·VBRP | 기준 큐브 |
| 납기월 이동분 합계 | 조기 이동분 + 지연 이동분 | 역할별 요약 | 계산항목 | |
| 이동 비율(%) | 이동분 ÷ 선적 매출 × 100 | 역할별 요약·표 | 계산항목 | |
| 정시 선적률(%) | 정시 선적분 ÷ 선적 매출 × 100 | 역할별 요약 | 계산항목 | |
| 총차이 | 선적 실적 − 기준 | 차이 분해 | 요인분해 결과 | 요인 합계와 같아야 함 |
CDS 구성
뷰 레이어 구성
| 레이어 | 뷰 | 하는 일 | 왜 나누나 |
|---|---|---|---|
| 기준 | 매핑·환율 기준 테이블 | 이동 사유 코드↔요인, 환율 유형을 담는다 | 사유 분류가 바뀌어도 뷰를 고치지 않는다 |
| 차원 | 고객·제품·국가 뷰 | 텍스트와 계층을 붙인다 | 큐브에서 조인을 반복하지 않는다 |
| 큐브 | 청구 라인 집계 뷰 | 선적월·고객·제품·인코텀즈별로 합산한다 | 모든 화면이 같은 합계에서 출발한다 |
| 쿼리 | 분석 쿼리 | 화면 항목·필터·기준 대비를 정의한다 | 화면 변경이 큐브에 번지지 않는다 |
| 권한 | DCL | 회사코드·영업조직 단위로 제한한다 | 집계 단계에서 걸어야 합계로 새지 않는다 |
| 서비스 | 서비스 정의·바인딩 | OData 로 게시한다 | 화면이 읽는 주소를 한 곳에서 관리한다 |
① 이동 사유 매핑 테이블 — 사유 코드를 요인에 연결
사유가 요인으로 바뀌는 규칙을 코드가 아니라 데이터로 둡니다. 회사마다 사유 코드가 달라도 이 표만 고치면 됩니다.
@EndUserText.label : '이동 사유 매핑'
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
define table zexp_reasonmap {
key client : abap.clnt not null;
key reason : abap.char(5) not null; " 사유 코드(고객 요청·합적·생산·서류·선복)
factor : abap.char(5); " ADV · CONS · PROD · DOC · SPACE
description : abap.char(40);
}
② 청구 라인 기준 뷰 — 선적일·약정 납기일·금액을 한 줄로
약정일·선적일·청구 금액을 한 줄에 모아 두면 이후 큐브는 월 비교만 합니다. 청구 전기일 필드는 확인 필요로 두고 청구일을 읽습니다.
@AccessControl.authorizationCheck : #NOT_REQUIRED
@EndUserText.label : '수출 청구 라인(기준)'
define view entity ZI_ExportBillingLine
as select from vbrp as P
inner join vbrk as K on K.vbeln = P.vbeln
left outer join vbep as E on E.vbeln = P.aubel and E.posnr = P.aupos and E.etenr = '0001'
left outer join lips as D on D.vbeln = P.vgbel and D.posnr = P.vgpos
left outer join likp as H on H.vbeln = D.vbeln
{
key P.vbeln as BillingDocument,
key P.posnr as BillingItem,
K.bukrs as CompanyCode,
K.kunag as Customer,
P.matnr as Product,
K.waerk as TransactionCurrency,
K.kurrf as ExchangeRate,
E.edatu as DueDate, " 약정 납기일(일정 라인)
H.wadat_ist as ShipDate, " 실제 선적일(납품)
K.fkdat as BillingDate,
@Semantics.amount.currencyCode : 'TransactionCurrency'
P.netwr as NetAmount
}
③ 큐브 뷰 — 월 비교로 정시·조기·지연을 가른다
합계는 모두 이 큐브에서 나옵니다. 외화 금액은 통화별로 따로 두고 원화 환산은 환율 유형을 정한 뒤 큐브 안에서 합니다.
@AccessControl.authorizationCheck : #CHECK
@Analytics.dataCategory : #CUBE
@EndUserText.label : '수출 납기 큐브'
define view entity ZI_ExportDueCube
as select from ZI_ExportBillingLine as L
{
key L.CompanyCode,
key substring( cast( L.ShipDate as abap.char(8) ), 1, 6 ) as ShipPeriod,
key L.Customer,
key L.Product,
@Semantics.amount.currencyCode : 'LocalCurrency'
sum( case when substring( cast( L.ShipDate as abap.char(8) ), 1, 6 )
= substring( cast( L.DueDate as abap.char(8) ), 1, 6 )
then L.NetAmount else 0 end ) as OnTimeAmount,
@Semantics.amount.currencyCode : 'LocalCurrency'
sum( case when L.ShipDate < L.DueDate then L.NetAmount else 0 end ) as EarlyAmount,
@Semantics.amount.currencyCode : 'LocalCurrency'
sum( case when L.ShipDate > L.DueDate then L.NetAmount else 0 end ) as LateAmount,
L.TransactionCurrency as LocalCurrency
}
group by L.CompanyCode, L.Customer, L.Product, L.TransactionCurrency,
substring( cast( L.ShipDate as abap.char(8) ), 1, 6 )
④ 분석 쿼리 — 화면이 읽는 모양
회사코드는 필수로, 기간은 구간으로 받아 대용량에서도 전체를 읽지 않게 합니다.
@AccessControl.authorizationCheck : #CHECK
@Analytics.query : true
@EndUserText.label : '수출 납기 이행 분석'
define view entity ZC_ExportDueQuery
as select from ZI_ExportDueCube
{
@AnalyticsDetails.query.axis : #ROWS
@Consumption.filter : { selectionType : #SINGLE, mandatory : true }
key CompanyCode,
@AnalyticsDetails.query.axis : #ROWS
@Consumption.filter : { selectionType : #INTERVAL }
key ShipPeriod,
@AnalyticsDetails.query.axis : #ROWS
key Customer,
@AnalyticsDetails.query.axis : #COLUMNS
OnTimeAmount,
@AnalyticsDetails.query.axis : #COLUMNS
EarlyAmount,
@AnalyticsDetails.query.axis : #COLUMNS
LateAmount
}
⑤ 권한 — 집계 단계에 건다
집계 뒤에만 권한을 걸면 전체 합계와 자기 몫의 차이로 남의 숫자가 드러납니다.
@EndUserText.label : '수출 납기 권한'
@MappingRole : true
define role ZC_ExportDueQuery {
grant select on ZC_ExportDueQuery
where ( CompanyCode ) = aspect pfcg_auth( F_VBRK_BUK, BUKRS, ACTVT = '03' );
}
⑥ 요인 분해용 사유 뷰 — 사유를 요인으로 묶는다
사유 코드를 읽는 필드는 고객사마다 다르므로 확인 필요로 남겼습니다. 읽는 위치만 바꾸면 요인 분해가 동작합니다.
@AccessControl.authorizationCheck : #NOT_REQUIRED
define view entity ZI_ExportShiftReason
as select from ZI_ExportBillingLine as L
left outer join zexp_reasonmap as M on M.reason = P.zzreason
{
key L.BillingDocument,
key L.BillingItem,
M.factor as Factor " 사유 코드 위치는 확인 필요 — 고객사 필드에 맞춰 교체
}
⑦ 서비스 정의
화면이 읽는 엔티티셋을 한 곳에서 게시합니다. 게시 뒤 화면의 서비스 주소만 교체합니다.
@EndUserText.label : '수출 납기 이행'
define service ZUI_ExportDue {
expose ZC_ExportDueQuery;
expose ZI_ExportDueCube;
expose ZI_ExportBillingLine;
}
운영 시점에 해야 할 일
개발보다 정하는 일이 많습니다.
| 해야 할 일 | 무엇을 정하나 | 정하지 않으면 | 누가 |
|---|---|---|---|
| 조건 유형·부대비용 처리 | 수출 부대비용을 비교에 포함할지 | 매출이 청구 금액과 어긋나 보임 | 재경·영업관리 |
| 인코텀즈별 통제 이전 시점 기준 | 인코텀즈마다 매출을 보는 시점 | 선적월 비교가 조건마다 달라짐 | 회계·영업관리 |
| 이동 사유 코드 매핑 | 사유 코드 ↔ 여섯 요인 | 요인 분해가 기타로 몰림 | 영업·물류 |
| 환율 유형·환산 시점 | 선적일/청구일/약정일 환율 | 환율 요인이 의미를 잃음 | 재경 |
| 부호 규칙 | 반품·취소 청구 | 합계가 어긋남 | 재경 |
| 원천 확정 | 약정 납기일을 읽는 필드 | 기준 매출이 비어 있음 | 영업관리·IT |
| 차원 범위 | 화면에 둘 차원 | 나중에 뷰를 고쳐 다시 이송 | 현업·IT |
| 권한 설계 | 회사코드·영업조직 단위 | 남의 숫자 노출 | 보안·IT |
| 성능 기준 | 조회 기간·행 한도 | 응답이 느려짐 | IT |
| 대사 체계 | 표준 화면과 맞출 항목 | 숫자를 믿지 못함 | 재경·IT |
| 전송(TR) 순서 | 테이블→기준 뷰→큐브→쿼리→권한→서비스 | 활성화 오류 | IT |
| 서비스 활성화 | 서비스 게시와 manifest 주소 교체 | 화면이 서비스에 연결되지 않음 | IT |
숫자를 믿을 수 있는가 — 검증 결과
대사식별 검사 건수와 차이 건수입니다. 의도적 예외는 0건입니다.
| 대사식 | 검사 건수 | 차이 건수 |
|---|---|---|
| 선적 매출 합계 (큐브 = 원천) | 1 | 0 |
| 정시 선적분 | 1 | 0 |
| 조기·지연 이동 5개 요인 | 5 | 0 |
| 수량·라인 수 | 2 | 0 |
| 선적 매출 식별식(합계 항등) | 1 | 0 |
| 기준 매출(약정 납기 기준) | 1 | 0 |
| 외화 금액 통화별(CNY·EUR·JPY·USD) | 4 | 0 |
| 요인 합계 = 총차이 | 1 | 0 |
검증용 샘플 데이터 기준으로 원천 청구 라인 3,104줄이 큐브 863행이 되었고, 요인 합계 555,869,913원은 총차이 555,869,913원과 같습니다.
운영 데이터로 갈 때
청구 라인이 수천만 건이면 집계는 큐브 뷰에서 하고 조회 때 회사코드와 기간을 필수로 받습니다. 원천 라인은 쪽 단위로만 읽고, 열 조합과 행 수 한도는 화면에서 유지합니다. 응답 시간 기준은 고객사 데이터 규모를 본 뒤 정하며 현재는 확인 필요입니다.
자주 묻는 질문
숫자와 산식, 화면과 조작, 분석 기능, 도입과 운영 네 묶음으로 24문항을 정리했습니다.
숫자와 산식
선적 매출은 어떻게 계산합니까?
청구 라인의 외화 금액에 인식 환율을 곱해 원화로 환산한 값을 선적월 기준으로 합산합니다. 계산은 서비스가 하고 화면은 읽어서 보여 줍니다. 샘플 환율은 가정값입니다.
기준 매출은 무엇입니까?
같은 청구 라인을 약정 납기월 기준으로 다시 합산한 금액입니다. 선적월이 약정 납기월과 같으면 두 값이 같고, 달라지면 그 금액이 납기월 이동분으로 잡힙니다.
요인 합계가 총차이와 정말 같습니까?
같습니다. 샘플 범위에서 요인 합계 555,869,913원이 총차이 555,869,913원과 일치하며, 화면이 매번 요인 합계와 총차이를 나란히 보여 줍니다.
정시 선적률은 어떻게 읽습니까?
같은 달에 약정 납기와 선적이 함께 일어난 금액을 선적 매출로 나눈 값입니다. 샘플 범위에서 77.45%(기준 78.9%)입니다.
환율 요인은 무엇입니까?
약정 납기일 환율과 선적일 환율의 차이로 생기는 금액입니다. 샘플에서는 −0.7백만원으로 작지만, 통화가 많은 회사에서는 따로 보아야 합니다.
원인을 확정해 주나요?
아닙니다. 요인은 약정 납기월과 선적월을 비교한 분류이며 점검 필요 항목을 보여 줄 뿐입니다. 점검 도구이며 최종 판단은 회사와 감사인이 합니다.
화면과 조작
행과 열에 몇 개까지 올릴 수 있습니까?
행에는 최대 3개, 열에는 최대 2개 차원을 올릴 수 있고 열 조합은 36개, 표 행은 500개를 넘으면 표를 그리지 않고 줄일 방법을 안내합니다.
축을 바꾸면 서비스를 다시 부릅니까?
부르지 않습니다. 조회 때 받은 큐브를 브라우저에서 다시 집계하므로 축을 바꿔도 즉시 반응하고 합계가 달라지지 않습니다.
칸 값과 원천 합계가 다르면 어떻게 됩니까?
대화상자 위쪽 안내가 "확인 필요"로 바뀝니다. 먼저 필터 범위와 표시 단위(백만원)를 확인한 뒤 원천 라인 합계와 맞춰 보십시오.
차이 사유는 축을 바꾸면 사라집니까?
사라지지 않습니다. 사유는 조회 범위와 행 경로에 묶여 저장되어 같은 행이 다시 나타나면 따라붙습니다.
레이아웃에는 무엇이 저장됩니까?
행·열 배치와 분석 항목, 보기 방식, 기준 대비 여부가 저장됩니다. 기본 레이아웃과 열 때 자동 조회를 지정할 수 있습니다.
휴대폰에서도 보입니까?
보입니다. 좁은 화면에서는 조회 조건과 보드가 한 열로 쌓이고 표와 차트가 위아래로 나뉩니다.
분석 기능
인공지능 분석은 어떤 방식입니까?
규칙 기반 해설이 기본입니다. 금액과 비율은 서비스가 계산한 값만 쓰고, 해설은 점검 필요 항목과 근거 수치를 보여 줍니다. 원인을 단정하지 않습니다.
에이전트는 무엇을 합니까?
감시 규칙 5개를 켜 두면 기준값을 넘은 항목을 찾아 역할별 받은 보고로 올립니다. 샘플 범위에서는 7건이 올라왔습니다.
같은 보고가 반복되지 않습니까?
하루 한 번만 실행하도록 제한하고, 이미 실행한 날에는 건너뛴 사실을 실행 기록에 남깁니다.
보고서는 어떻게 만들어집니까?
지금 보고 있는 범위로 표와 차트를 담은 PowerPoint 파일을 브라우저에서 만듭니다. 서버에 파일을 남기지 않습니다.
기간별 요약은 무엇이 다릅니까?
선적월별로 라인 수·고객 수·매출·이동분을 한 표로 모은 창입니다. 기준 매출과 이동 비율의 산식이 아래에 적혀 있습니다.
도입과 운영
표준 화면을 대체합니까?
대체하지 않습니다. 표준 실행은 표준 T-code 가 담당하고, 이 화면은 조회·검증 관점을 더해 확장합니다. 법정 공시·세무 신고 대응은 표준에 남겨 둡니다.
운영 데이터로 연결하려면 무엇이 필요합니까?
CDS 뷰(기준·차원·큐브·쿼리·권한)와 서비스 게시, manifest 의 서비스 주소 교체입니다. 화면 코드는 그대로 둡니다. 소요는 고객사 데이터 구조에 따라 달라 확인 필요입니다.
권한은 어떻게 겁니까?
쿼리 뷰에 DCL 을 붙여 회사코드·영업조직 단위로 집계 단계에서 제한합니다. 드릴스루에만 거는 방식은 권하지 않습니다.
청구 라인이 수천만 건이면 느리지 않습니까?
조회 때 기간과 회사코드를 필수로 받고 큐브를 서비스 쪽에서 집계해 화면이 받는 행 수를 줄입니다. 원천 라인은 쪽 단위로만 읽습니다.
계정체계나 사유 코드가 바뀌면 어떻게 합니까?
사유 코드↔요인 매핑 표를 고치면 됩니다. 화면과 큐브 정의는 바꾸지 않습니다.
외화와 환율은 어떻게 다룹니까?
통화별 외화 금액은 따로 합계하고 원화 환산은 정한 환율 유형으로 큐브에서 합니다. 서로 다른 통화를 그대로 더하지 않습니다.
누가 최종 판단을 합니까?
이 화면은 분류·집계·대사를 돕는 점검 도구이며 최종 판단은 회사와 감사인(세무 신고는 회사와 세무 대리인·관세사)이 합니다.