수출 솔루션 · 수출 영업 · 물류 · 관리회계

SAP 수출 실적 다차원 분석 — 국가·지역별 매출과 공헌이익을 한 화면에서 쪼개 보고 청구 문서까지 내려가기

큐브 집계 · 드래그 앤 드롭 축 구성 · 칸에서 청구 문서까지의 드릴스루 · 계획 대비 차이와 요인 워터폴 · 행에 남는 변동 사유 · 숫자를 모델에 맡기지 않는 AI 분석 · 규칙에 걸리면 역할별로 올리는 AI 에이전트 — 소개 영상과 실제 화면 33종, 그리고 CDS 코드까지

소개 영상블로그 목차 순서대로 · 자막 포함

개발 배경 — 이 앱을 사용해야 하는 이유

수출 담당자와 관리회계 담당자가 매달 받는 질문은 비슷합니다. 어느 나라에서 얼마를 팔았나, 운임과 보험료, 수수료를 빼고 나면 남는 돈(공헌이익)은 얼마인가, 계획과 얼마나 달랐고 왜 달랐나, 그리고 청구한 돈은 들어왔나. 지금은 이 네 질문의 답이 표준 조회 화면 · 엑셀 피벗 · 물류 자료 · 채권 화면에 흩어져 있어서, 한 번 묻고 답을 맞추는 데 반나절이 갑니다.

이 화면은 청구 문서 라인을 국가 · 지역 · 고객 · 제품 · 인코텀즈 · 통화 단위의 큐브로 한 번 묶어 두고, 같은 큐브에서 축을 끌어다 놓으며 위 네 질문에 답합니다. 숫자는 모두 서비스가 계산하고, 화면과 AI 해설은 그 숫자를 읽기만 합니다. 어느 칸이든 누르면 그 금액을 만든 청구 문서 라인이 열려 “이 숫자 맞아?”를 그 자리에서 확인할 수 있습니다.

한 줄 요약 — 조회 리포트는 누구나 만듭니다. 이 화면의 값은 조회 다음에 있습니다. 축을 바꿔도 합계가 갈라지지 않고, 칸에서 원천 문서까지 내려가고, 계획 대비 차이를 요인으로 가르고, 사유를 행에 남기고, 사람이 열지 않아도 규칙에 걸린 숫자를 역할별로 올립니다.

국가별 매출은 보이는데, 남는 돈은 한참 뒤에야 알게 된다

청구 문서 조회 화면은 문서 한 건씩 보여 줍니다. 국가 단위 매출은 엑셀로 내려 모아야 하고, 운임 · 보험료 · 수수료는 가격 조건이라는 다른 자리에 있어서 매출과 따로 놓입니다. 그래서 “중국 매출은 컸는데 실제로 남은 건 얼마인가”는 월말에 별도 자료를 만들어야 답이 나옵니다.

이 화면은 매출에서 운임 · 보험료 · 수수료 · 변동원가를 뺀 공헌이익과 공헌이익률을 계산항목으로 서비스에 두고, 표의 행으로 올려 매출 바로 아래에서 읽게 합니다. 순매출과 공헌이익을 단계별로 늘어놓는 단계 보기도 있어 한 지역의 손익 사슬을 위에서 아래로 따라 읽을 수 있습니다.

같은 숫자를 지역 · 고객 · 제품 · 인코텀즈로 바꿔 보려면 리포트를 새로 만든다

지역별 보고서, 고객별 보고서, 인코텀즈별 보고서를 따로 만들면 합계가 서로 어긋나는 일이 생기고, 그때마다 “어느 보고서가 맞나”를 따지는 회의가 열립니다.

이 화면은 차원 칩을 사용 안 함 · 행 · 열 세 칸 사이로 끌어다 놓으면 브라우저가 큐브를 다시 묶습니다. 서버를 다시 부르지 않고, 축이 어떻게 바뀌어도 총합은 큐브 총합과 같습니다. 행은 세 단계, 열은 두 단계까지 쌓을 수 있습니다.

계획 대비 차이는 나는데, 왜 났는지는 회의에서 새로 찾는다

매출이 계획보다 모자랐다는 사실은 표준 리포트도 알려 줍니다. 그런데 물량이 줄었는지, 단가가 내려갔는지, 환율이 움직였는지, 운임이 올랐는지는 엑셀로 다시 분해해야 합니다.

비교 기준을 계획으로 두면 칸마다 실적 · 기준 · 차이 · 증감률이 붙고, 차트는 기준에서 실적까지를 물량 · 믹스 · 외화 단가 · 환율 · 운임보험 · 수수료 · 변동비 · 미계획 막대로 이은 워터폴로 바뀝니다. 요인의 합이 총차이와 같은지는 화면이 매번 검산해서 보여 줍니다. 차이가 난 행에는 사유를 적어 두면 조회 범위와 함께 남아 다음 달에도 따라옵니다.

청구한 돈이 들어왔는지는 다른 화면에서 본다

수출 채권은 청구 시점과 수금 시점이 멀어서, 매출이 좋아 보여도 회수가 늦으면 자금 계획이 틀어집니다. 채권 화면은 고객 단위로 따로 열어야 합니다.

이 화면의 측정값에는 수금액이 들어 있어 회수율(수금액 ÷ 매출)을 매출과 같은 표에서 국가 · 고객 단위로 봅니다. 회수율이 기준보다 낮은 고객은 CFO 앞 대기함으로 올라갑니다.

사용 방법

  1. 조회조건 입력 — 회사코드(필수, 기본 1000)와 시작 · 종료 기간(필수, 기본은 데이터가 있는 전 기간)을 정합니다. 계획 버전은 기준 계획 v1 로 고정되어 있고, 저장된 레이아웃은 선택 사항입니다.
  2. 조회 버튼 · Enter — 조회 버튼은 조회조건 영역 오른쪽 끝에 있고(초기화 버튼은 그 옆), 입력 필드에서 Enter 키를 눌러도 조회됩니다. 기본 + 자동 조회로 저장한 레이아웃이 있으면 화면을 여는 즉시 조회된 채로 시작합니다.
  3. 요약 확인 — 역할별 요약의 지표 카드(매출 · 공헌이익 · 공헌이익률 · 회수율)와 계획 대비 값을 봅니다. 역할 단추(CEO · CFO · 영업 책임자 · 물류 책임자)를 누르면 앞세우는 지표와 쪼개 보는 차원이 바뀌며 서비스를 다시 부르지 않습니다.
  4. 탭 · 축 이동 — 레이아웃 보드에서 차원 칩을 행 · 열 · 사용 안 함 사이로 끌어다 놓거나 칩 메뉴로 옮깁니다. 분석 항목과 보기 방식, 표시 행 수를 고르고 차원 필터 단추로 값을 여러 개 골라 범위를 좁힙니다. 차트 위 탭으로 항목 비교와 차이 분해를 오갑니다.
  5. 행 · 셀 클릭 상세 — 표의 행을 펼쳐 하위 차원으로 내려가고, 숫자 칸을 누르면 그 금액을 만든 청구 문서 라인이 열립니다. 계획 대비를 켜면 차이가 난 행에 사유 입력 아이콘이 나타납니다.
  6. 분석 · 내보내기 — AI 분석으로 요약과 근거 표를 보고 PowerPoint 보고서를 내려받습니다. 상단 CSV 단추로 현재 표를 내려받고, 레이아웃 단추로 현재 배치를 이름 붙여 저장합니다.

자동 조회는 기본 + 자동 조회로 저장한 레이아웃을 열 때만 일어나며, 그 밖에는 조회 버튼을 눌러야 서비스를 부릅니다.

숫자를 믿을 수 있는가 — 검증 결과

리포트에서 가장 비싼 질문은 “이 숫자 맞아?” 입니다. 그래서 만드는 쪽에서 먼저 대사식을 세워 전수로 돌렸습니다. 아래는 이 사례 데이터의 결과이며, 대사식 15종 · 검사 건수 17,618건 모두 차이가 0입니다. 의도적 예외(대사 차이와 분리한 것)는 없습니다. 에이전트가 올리는 점검 필요 보고는 업무 판정이지 대사 차이가 아닙니다.

대사식검사 건수차이 건수최대 차이
큐브 합계 = 원천 라인 합계(측정값별)700
큐브 칸(707) × 측정값 = 원천 그룹 합 (전수)4,94900
매출 − 운임·보험·수수료 − 변동비 = 공헌이익(합계 검산)100
인코텀즈 조건별 줄 수 합계 = 전체 줄 수100
기간별 요약 줄 수 합계 = 원천 줄 수100
기간별 요약 매출 = 원천 기간별 합 (기간 수)900
외화 금액 × 가정 환율 = 원화 매출 (줄별, 허용 1원)5,94800.50원
회수액 ≤ 매출 (줄별)5,94800
계획 행 수72900
축 배치 6가지 총합 = 큐브 총합(화면)600
칸 금액 = 드릴스루 원천 합계(화면, 12칸)1200
요인 합계 = 총차이(전체 · 아시아)200.01원 미만
다중 선택 합계 = 선택 값들의 큐브 합100
계산항목 = 토큰 식 결과(순매출 · 공헌이익 · 공헌이익률)300
큐브 합계 = 원천 합계(국가 CN, 화면 경유)100

화면 쪽은 이와 별도로 브라우저 자동화로 돌려 확인했습니다 — 축을 바꿔도 합계가 변하지 않는지, 칸 금액과 드릴스루 합계가 같은지, 요인 합계가 총차이와 같은지를 매번 다시 잽니다. 이 도구는 점검을 돕는 것이며, 최종 판단은 회사와 감사인(세무 신고는 회사와 세무 대리인 · 관세사)이 합니다.

무엇으로 만들었나

자리무엇왜 그렇게 두었나
화면 컨트롤XML 뷰, 트리 테이블(표), 드래그 가능한 CSS 그리드 레인(레이아웃 보드), 직접 그린 SVG 차트표준 컨트롤만 써서 외부 차트 라이브러리 반입 심사가 필요 없고, 사내망에서도 그대로 열립니다.
집계 · 판정 로직브라우저의 큐브 피벗 모듈과 서비스의 계산 모듈(같은 식을 공유)축을 바꾸는 일은 재집계일 뿐 새 숫자를 만들지 않게 하고, 금액 계산은 한 곳에서만 하게 합니다.
OData 서비스 구성조회용 큐브 · 계획 · 계산항목 · 기간별 요약 · 원천 문서 라인과, 변동 사유 · 레이아웃 · 에이전트 기록을 남기는 쓰기용 모음으로 나뉜 V2 서비스조회와 기록을 분리해 두면 운영에서 CDS 뷰와 RAP 기록 객체로 자연스럽게 대응됩니다.
AI 해설 · 에이전트숫자는 서비스가 계산해 근거로 넘기고 해설은 읽기만 하는 구조, 규칙 5개와 역할별 대기함모델을 끄면 같은 근거로 규칙 기반 해설이 나오므로 숫자의 출처가 늘 하나입니다.
보고서 · 내보내기브라우저에서 직접 짓는 PowerPoint 보고서, 현재 표 CSV서버에 파일을 남기지 않고, 외부 라이브러리 없이 동작합니다.
테마sap_horizonSAP 표준 화면과 같은 시각 언어를 써서 사용자가 새로 배울 것을 줄입니다.

앱 정보

항목내용
솔루션수출 솔루션
업무 영역수출 실적 · 수익성 분석(영업 · 물류 · 채권 관점)
관련 기준서 · 대상 영역기준서 연계 없음(-) · 대상 영역: 국가 · 지역별 수출 실적, 공헌이익, 계획 대비 차이
SAP 표준 T-codeVA03 · VL03N · VF03 · FBL5N · KE30
화면 성격다차원 분석 리포트(조회 · 분석 중심, 쓰기는 변동 사유 · 레이아웃 · 에이전트 기록)
데이터 연동OData V2 서비스를 앱 선언 파일(manifest)의 데이터 소스로 연결
테마sap_horizon
SAP 표준 기능을 그대로 이어받은 부분 — 판매 오더 · 납품 · 청구 문서라는 문서 흐름과 그 필드, 인코텀즈 · 통화 · 영업조직 같은 조직과 마스터 구분, 고객 개별 항목의 수금 정보를 이름 그대로 가져와 씁니다. 이 화면은 표준 데이터 구조를 그대로 이어받아 조회 · 검증 관점을 더해 확장하며, 표준 거래를 대체하지 않습니다.

실행 화면

실제로 돌아가는 화면 33종을 사용 순서대로 싣습니다. 그림을 누르면 크게 볼 수 있고, 화면마다 무엇을 하는 자리이고 왜 그렇게 두었는지를 아래에 적었습니다. 숫자는 모두 같은 샘플 자료에서 나온 것이라 화면끼리 맞춰 보셔도 됩니다. 거래처 이름과 문서번호는 모두 가상입니다.

처음 열었을 때

조회조건에서 피벗까지가 한 화면에 세로로 쌓입니다. 머리 영역은 접을 수 있어, 축을 짜는 동안에는 펼쳐 두고 숫자를 들여다볼 때는 접어 둡니다.

조회 전 — 틀이 먼저 보인다
조회 전 — 틀이 먼저 보인다 — 조회를 누르기 전에도 조회조건 · 레이아웃 보드 · 피벗 틀이 제자리에 놓여 있습니다.

차원 목록과 측정값은 조회조건과 상관없는 카탈로그라 화면을 열 때 먼저 읽습니다. 그래서 축을 미리 짜 두고 조회할 수 있습니다. 회사코드는 1000, 기간은 2026-01부터 2026-09까지가 기본이며, 조회 버튼은 입력 필드들의 오른쪽 끝에 있고 Enter 키로도 조회합니다.

조회 직후 — 지역 › 국가 피벗과 차트
조회 직후 — 지역 › 국가 피벗과 차트 — 조회하면 집계 707건 · 원천 5,948줄이 읽히고 표와 막대 차트가 함께 나옵니다.

서비스는 조회조건 필터로 큐브를 한 번만 읽습니다. 표는 지역 아래 국가로 펼쳐지는 트리이고, 오른쪽 차트는 같은 숫자를 막대로 보여 줍니다. 위 지표 카드의 매출 104,646백만원 · 공헌이익 34,493백만원은 표의 전체 합계 행과 같은 값입니다.

축을 끌어다 놓은 뒤
축을 끌어다 놓은 뒤 — 고객 칩을 열 칸으로 끌어다 놓으면 서버를 부르지 않고 표가 다시 묶입니다.

세 칸은 사용 안 함 · 행 · 열입니다. 칩을 눌러 나오는 메뉴로도 같은 이동을 할 수 있어 키보드만으로 조작할 수 있습니다. 열에 차원이 올라가면 항목은 첫 번째 것만 열에 펼쳐지고 그 사실을 안내줄로 알려 줍니다.

머리 영역을 접으면 요약 한 줄
머리 영역을 접으면 요약 한 줄 — 접으면 회사 · 기간 · 행 · 열 · 항목 · 계획 대비 · 필터 수가 한 줄로 남습니다.

표와 차트에 화면을 더 쓰고 싶을 때 접습니다. 접어도 조건은 그대로이며, 다시 펼치면 이어서 바꿀 수 있습니다.

경영 요약 — 역할이 바뀌면 앞세우는 숫자가 바뀐다

표 위 역할 단추는 네 가지입니다. 역할을 바꾸면 지표 카드와 쪼개 보는 차원이 함께 바뀌지만 서비스를 다시 부르지 않습니다.

CEO — 지역 · 국가별 매출과 공헌이익률
CEO — 지역 · 국가별 매출과 공헌이익률 — 지표 카드는 매출 · 공헌이익 · 공헌이익률 · 회수율이며 각각 계획 대비를 함께 보여 줍니다.

카드의 작은 글씨는 계획값과 달성 비율입니다. 회수율은 계획보다 낮을 때 빨갛게 표시되어 먼저 눈에 들어옵니다. 역할은 보는 관점을 바꾸는 것이지 권한을 나누는 것이 아닙니다.

CFO — 순매출과 수금 상황을 국가별로
CFO — 순매출과 수금 상황을 국가별로 — CFO 관점에서는 순매출 · 공헌이익 · 회수율을 국가 단위로 앞세웁니다.

순매출은 매출에서 운임 · 보험료 · 수수료를 뺀 값입니다. 행 차원이 국가로 바뀌지만 같은 큐브를 다시 묶을 뿐이라 합계는 달라지지 않습니다.

영업 책임자 — 국가 · 고객별 매출과 수량
영업 책임자 — 국가 · 고객별 매출과 수량 — 국가 아래 고객으로 내려가며 매출 · 수량 · 공헌이익을 봅니다.

수량은 EA 단위입니다. 고객은 가상 거래처 이름이며 실제 거래처를 쓰지 않았습니다.

물류 책임자 — 인코텀즈 · 국가별 운임과 보험료
물류 책임자 — 인코텀즈 · 국가별 운임과 보험료 — 운임 · 보험료 · 물류비율을 인코텀즈 조건 아래 국가로 나누어 봅니다.

물류비율은 (운임 + 보험료) ÷ 매출입니다. 인코텀즈 조건에 따라 운임과 보험료를 누가 내는지가 달라 조건별로 갈라 보는 것이 첫 단계입니다.

축 전환과 범위 — 끌어다 놓고, 골라서 좁힌다

차원 칩을 세 칸(사용 안 함 · 행 · 열) 사이로 끌어다 놓으면 브라우저가 큐브를 다시 묶습니다. 행은 세 단계, 열은 두 단계까지 쌓입니다.

열 두 단계 — 인코텀즈 › 통화
열 두 단계 — 인코텀즈 › 통화 — 열 축에 인코텀즈와 통화를 겹치면 조합마다 열이 생깁니다.

열 조합이 36개를 넘으면 더 올릴 수 없고 안내만 뜹니다. 머리글이 먼저 무너지기 때문입니다. 차트는 열마다 색을 달리한 묶음 막대로 바뀝니다.

차원 값 다중 선택
차원 값 다중 선택 — 국가 필터를 누르면 값마다 이름 · 코드 · 원천 줄 수가 보이는 선택 창이 열립니다.

큐브에 실제로 있는 값만 올라옵니다. 같은 차원 안에서는 or, 차원끼리는 and 로 걸립니다. 검색칸으로 값을 찾을 수 있고 선택 해제 단추가 있습니다.

좁힌 결과
좁힌 결과 — 국가 세 곳을 고르면 표 · 차트 · 지표 카드가 그 범위로 다시 계산됩니다.

선택한 값들의 큐브 합계와 표 합계가 같은지를 자동 검증에 넣었습니다. 선택은 다시 열어 바꾸거나 해제할 수 있습니다.

표와 차트 사이 손잡이
표와 차트 사이 손잡이 — 손잡이를 끌어 표와 차트의 너비를 나누면 그 브라우저에 기억됩니다.

다시 열면 같은 비율로 시작합니다. 폭이 1000px보다 좁으면 손잡이 대신 차트가 표 아래로 내려갑니다.

칸에서 원천 문서까지

표의 숫자를 누르면 그 금액을 만든 청구 문서 라인이 열립니다. 칸 금액과 문서 라인 합계가 같은지 그 자리에서 보입니다.

칸을 누르면 — 질의 조건과 일치 표시
칸을 누르면 — 질의 조건과 일치 표시 — 칸을 누르면 원천 줄을 가져온 조건과 함께 칸 금액 = 원천 합계 일치 표시가 나옵니다.

조건은 행 경로와 열 조합 그대로입니다. 분기처럼 문서에 없는 파생 차원은 기간 범위로 바꾸어 겁니다. 기본 500줄씩 읽고 더 보기로 이어 읽습니다.

청구 문서 라인
청구 문서 라인 — 중국 매출 5,811백만원의 원천 330줄이 외화 금액 · 환율 · 원화 금액 · 운임 · 수수료 · 변동원가 · 수금액으로 열립니다.

줄별 외화 금액에 가정 환율을 곱하면 원화 매출이 됩니다. 환율은 샘플 데이터용 가정값이며 실제 고시 환율이 아닙니다.

기간별 요약
기간별 요약 — 월별 라인 수 · 매출 · 운임 · 보험료 · 수수료 · 변동원가 · 공헌이익 · 회수율을 한 표로 봅니다.

서비스가 원천 라인을 월별로 합산한 값이고 합계 행이 맨 아래에 있습니다. 라인 수 합계는 원천 5,948줄과 같습니다.

계산항목 — 전기되지 않는 단계를 행으로

순매출·공헌이익·공헌이익률은 어느 문서에도 기록되지 않는 값입니다. 서비스가 들고 있는 식을 그대로 풀어 표의 항목으로 올립니다.

계산항목을 열로
계산항목을 열로 — 순매출 · 공헌이익 · 공헌이익률을 지역별 열로 세워 한 번에 비교합니다.

계산항목은 분석 항목에서 (계산) 표시가 붙은 것을 고릅니다. 비율 항목은 합계가 아니라 식 그대로 다시 계산되어 지역마다 올바른 비율이 나옵니다.

단계 보기 — 매출에서 공헌이익까지
단계 보기 — 매출에서 공헌이익까지 — 행에 매출 · 운임 · 보험료 · 수수료 · 순매출 · 변동비 · 공헌이익 · 공헌이익률이 순서대로 놓입니다.

한 지역의 손익 사슬을 위에서 아래로 따라 읽는 보기입니다. 열에는 지역이 펼쳐지고 차트는 단계별로 묶습니다.

계획 대비 차이 — 같은 표가 월간 실적 점검표가 된다

비교 기준을 켜면 칸마다 실적·기준·차이·증감률이 붙고, 금액과 비율이 둘 다 임계를 넘는 칸만 색이 입혀집니다.

계획 대비 켬 — 실적 · 기준 · 차이
계획 대비 켬 — 실적 · 기준 · 차이 — 칸 안에 실적과 함께 기준 · 차이 · 증감률이 작은 글씨로 붙습니다.

색은 금액 부호가 아니라 이익에 준 영향입니다. 금액 3천만원과 비율 5%를 둘 다 넘을 때만 칠하므로 작은 차이에 눈이 흩어지지 않습니다. 비율 항목은 1퍼센트포인트를 기준으로 합니다.

차이 사유 입력
차이 사유 입력 — 차이가 난 행의 아이콘을 누르면 사유 구분 · 내용을 적는 창이 열립니다.

구분은 환율 · 단가 · 물량 · 물류비 · 고객 사정 · 기타입니다. 키는 조회 범위와 행 경로라서 다음 기간에도 같은 행에 따라옵니다.

차이 워터폴 — 기준에서 실적까지
차이 워터폴 — 기준에서 실적까지 — 아시아의 공헌이익이 기준 10,855에서 실적 10,942로 가는 길을 요인별 막대로 잇습니다.

요인은 물량 · 믹스 · 외화 단가 · 환율 · 운임보험 · 수수료 · 변동비 · 미계획입니다. 초록은 이익을 늘린 요인, 빨강은 줄인 요인입니다.

요인 합 = 총차이 검산 줄
요인 합 = 총차이 검산 줄 — 차트 아래에 요인 합계와 총차이, 오차가 매번 나옵니다.

전체 범위에서는 요인 합계 −1,641과 총차이 −1,641이 같습니다. 같지 않으면 점검 필요 표시가 나옵니다.

AI 분석과 보고서

지금 보고 있는 범위의 숫자를 읽어 요약과 핵심 발견을 씁니다. 숫자는 서비스가 계산해 넘기고, 해설은 그 숫자를 읽기만 합니다.

AI 분석 — 요약과 주요 발견
AI 분석 — 요약과 주요 발견 — 범위 요약과 계획과의 차이가 큰 순서로 항목이 점검 필요로 정리됩니다.

분석 방식은 기본이 규칙 기반이며, 모델 연결은 서비스 설정 하나로 켭니다. 이미 사유가 적힌 항목은 건너뛰고 건너뛴 항목을 알려 줍니다.

근거 수치 표
근거 수치 표 — 해설이 읽은 숫자 표가 펼쳐져 있어 화면의 값과 맞춰 볼 수 있습니다.

대상별 매출 · 계획 매출 · 공헌이익 · 계획 공헌이익 · 차이 · 등록된 사유가 들어 있습니다. AI는 이 표에 없는 숫자를 만들지 않습니다.

PowerPoint 보고서 내려받기
PowerPoint 보고서 내려받기 — 보고서 단추를 누르면 표와 차트를 담은 보고서가 브라우저에서 만들어져 내려받아집니다.

외부 라이브러리 없이 압축 파일과 XML을 직접 지어 만들며 서버에 파일을 남기지 않습니다. 표지 · 요약 · 표 · 차트 · 워터폴 · 근거 순서입니다.

AI 에이전트 — 규칙에 걸리면 받을 역할 앞으로

감시 규칙마다 기준값과 받을 역할이 붙어 있습니다. 걸린 항목은 그 역할의 눈으로 다시 쓴 보고가 되어 대기함에 올라갑니다.

감시 규칙
감시 규칙 — 규칙마다 지표 · 기준값 · 점검 주기 · 받는 역할 · 사용 여부가 있습니다.

다섯 가지 규칙은 공헌이익률 하락 · 국가별 매출 계획 미달 · 환율 영향 임계 · 장기 미회수 · 운임보험 비율 상한 초과입니다. 기준값은 화면에서 바꿀 수 있습니다.

받은 보고 — 역할별 대기함
받은 보고 — 역할별 대기함 — 걸린 항목이 받을 역할의 관점으로 다시 쓰여 대기함에 쌓입니다.

물류 책임자에게는 운임보험 비율이, CFO에게는 회수율이 올라갑니다. 역할 선택으로 대기함을 좁혀 볼 수 있고, 오늘 이미 실행했으면 하루 1회 안내가 뜹니다.

실행 기록
실행 기록 — 실행 번호 · 시각 · 실행 주체 · 결과 · 발견 건수가 남습니다.

걸린 것이 없어도 기록은 남습니다. 두 번째 실행은 하루 1회 제한으로 건너뜀 처리되며, 이 판단은 화면이 아니라 서비스가 합니다.

레이아웃 저장과 복원

짜 둔 축과 조회조건을 이름 붙여 저장하고, 기본 레이아웃과 자동 조회를 지정하면 다음에 열 때 조회된 채로 시작합니다.

레이아웃 저장
레이아웃 저장 — 이름을 붙이고 기본 레이아웃 · 열 때 자동 조회를 고르면 현재 배치가 저장됩니다.

저장 내용은 축 · 조회조건 · 분석 항목 · 표시 행 수 · 접힘 상태입니다. 창 아래에 저장될 내용 요약이 보입니다.

레이아웃 관리
레이아웃 관리 — 적용 · 이름 변경 · 삭제와 기본 · 자동 조회 표시를 한 표에서 다룹니다.

기본 레이아웃은 하나만 둘 수 있습니다. 삭제는 확인을 한 번 더 묻습니다.

기본 + 자동 조회로 열면 조회된 채 시작
기본 + 자동 조회로 열면 조회된 채 시작 — 저장한 레이아웃이 기본 + 자동 조회라면 화면을 여는 즉시 그 배치로 조회된 상태입니다.

새로 고친 뒤에도 같은 배치와 선택값으로 시작하는지를 자동 검증에 넣었습니다.

좁은 화면과 한계

휴대폰 폭에서는 차트가 표 아래로 내려갑니다. 행과 열 조합이 상한을 넘으면 반쯤 그린 표 대신 범위를 좁히라는 안내가 나옵니다.

휴대폰 폭 390px
휴대폰 폭 390px — 차트가 표 아래로 내려가고 가로로 넘치지 않습니다.

손잡이는 숨겨지고 표는 가로로 스크롤됩니다. 조회조건은 접어서 숫자 영역을 먼저 보게 했습니다.

행 상한 초과 안내
행 상한 초과 안내 — 행이 500개를 넘으면 표를 그리지 않고 범위를 좁히라는 안내를 띄웁니다.

고객 · 품목 · 기간을 모두 행에 올리면 855개가 되어 이 안내가 나옵니다. 반쯤 그린 표로 오해하는 일을 막기 위해서입니다.

열 조합 상한
열 조합 상한 — 열 조합이 36개를 넘는 차원은 더 올릴 수 없습니다.

추가하려는 순간 막고 이유를 알려 줍니다. 열 축은 곱으로 늘어나므로 두 단계까지로 제한했습니다.

화면 뒤에서 일어나는 일

화면에 보이는 숫자는 아래 순서로 만들어집니다. 모든 식은 서비스가 계산하고 화면은 그대로 보여 줄 뿐입니다. 검증 결과는 “숫자를 믿을 수 있는가” 절에 있습니다.

순서산출 · 대사식설명
1큐브 합계 = 원천 라인 합계(측정값별)큐브는 원천 5,948줄을 707행으로 더한 값이며 측정값 7가지 모두 같아야 합니다.
2원화 매출 = 외화 매출 × 환율(줄별)샘플 환율은 가정값이며 줄마다 1원 이내로 맞습니다.
3순매출 = 매출 − 운임 − 보험료 − 수수료계산항목 순매출의 식입니다.
4공헌이익 = 매출 − 운임 − 보험료 − 수수료 − 변동원가계산항목 공헌이익의 식입니다.
5공헌이익률 = 공헌이익 ÷ 매출 × 100비율은 합계를 더하지 않고 식을 다시 계산합니다.
6실적 − 기준 = 차이, 차이 ÷ |기준| = 증감률계획 대비 모드의 칸 값입니다.
7요인 합계 = 총차이(물량 · 믹스 · 외화 단가 · 환율 · 운임보험 · 수수료 · 변동비 · 미계획)워터폴 끝값 = 기준 + Σ요인 = 실적입니다.
8칸 금액 = 드릴스루 원천 라인 합계칸을 누를 때마다 화면이 비교해 표시합니다.
9어떤 축 배치에서도 피벗 총합 = 큐브 총합축을 바꾸는 것은 재집계일 뿐 새 숫자를 만들지 않습니다.
10인코텀즈 조건별 줄 수 합계 = 전체 줄 수CIF 1,423 · FOB 1,384 · DAP 923 · CFR 1,773 · EXW 445 = 5,948줄

판정 조건 · 결과 상태 · 사용자 조치

화면은 판정을 단정하지 않고 점검 필요 · 확인 필요로 표시합니다. 임계값은 샘플 기준이며 고객사 기준으로 바꾸는 자리는 운영 단계에서 정합니다.

판정 조건결과 상태사용자 조치
계획 대비를 켠 칸에서 금액 차이 3천만원 이상이고 증감률 절댓값이 5% 이상 · 이익을 늘리는 방향초록(Success)호조 요인을 요인 분해에서 확인하고 계획 가정을 점검합니다.
같은 임계를 넘고 이익을 줄이는 방향빨강(Error) · 점검 필요차이 사유를 입력하고 칸을 눌러 원천 문서를 확인합니다.
비율 항목(공헌이익률 · 물류비율 · 회수율)은 차이 1퍼센트포인트 이상같은 색 규칙비율 변동을 금액 변동과 함께 읽습니다.
금액 또는 비율 중 한쪽만 임계를 넘음색 없음필요하면 표 칸의 기준 · 차이 글씨로 확인합니다.
칸 금액 ≠ 드릴스루 원천 합계확인 필요 표시질의 조건과 원천 줄을 확인합니다(검증에서는 12칸 모두 일치).
차이 요인 합계와 총차이의 오차가 1원 이상경고 · 확인 필요요인분해 입력(계획 · 실적 범위)을 확인합니다.
열 조합 36개 초과 · 행 노드 500개 초과표를 그리지 않고 안내열 차원을 줄이거나 필터를 걸어 범위를 좁힙니다.
규칙 R1 공헌이익률이 계획보다 2퍼센트포인트 이상 하락CFO 대기함에 보고국가별 공헌이익률 구성을 확인합니다.
규칙 R2 국가별 매출 달성률 92% 미만영업 책임자 대기함에 보고계획 미달 국가와 고객을 확인합니다.
규칙 R3 환율 영향이 −6천만원 미만CEO 대기함에 보고환율 요인과 단가 요인을 가려 봅니다.
규칙 R4 고객 회수율 94% 미만CFO 대기함에 보고미회수 금액과 청구 문서를 확인합니다.
규칙 R5 운임 · 보험 비율이 계획보다 1퍼센트포인트 초과물류 책임자 대기함에 보고인코텀즈 조건과 운임 계약을 확인합니다.
보고 한 건의 금액 절댓값이 1.5억원 초과심각도 높음(빨강)우선 확인합니다.
같은 날 에이전트를 두 번째로 실행하루 1회 제한으로 건너뜀(기록은 남음)다음 날 다시 실행합니다.

조회조건

필수 조건을 비우면 조회하지 않고 안내합니다. 시작 기간이 종료 기간보다 늦으면 조회 전에 안내합니다.

조회조건필수기본값서비스 필터($filter)
회사코드필수1000Bukrs eq '1000'
시작 기간필수데이터의 첫 기간(2026-01)Period ge '2026-01'
종료 기간필수데이터의 끝 기간(2026-09)Period le '2026-09'
계획 버전고정기준 계획 v1계획 조회의 Version 조건
차원 값 선택(지역 · 국가 · 고객 · 제품그룹 · 제품 · 인코텀즈 · 통화 · 사업부 · 영업조직)선택전체같은 차원 안은 or, 차원 사이는 and 로 묶음
분석 항목선택매출 · 공헌이익 · 공헌이익률화면 설정(서비스 호출 없음)
보기 방식 · 계획 대비 · 표시 행 수선택차원 보기 · 끔 · 14화면 설정
저장된 레이아웃선택없음저장 목록 조회

결과 컬럼

결과 컬럼의미산출
매출(원화)원화 환산 매출외화 매출 × 환율의 합
수량판매 수량(EA)합계
운임 · 보험료 · 수수료수출 부대 비용합계
변동원가변동 원가합계
수금액수금한 금액합계
순매출계산항목매출 − 운임 − 보험료 − 수수료
공헌이익계산항목순매출 − 변동원가
공헌이익률(%)계산항목공헌이익 ÷ 매출 × 100
물류비율(%)계산항목(운임 + 보험료) ÷ 매출 × 100
회수율(%)계산항목수금액 ÷ 매출 × 100
사유변동 사유 입력 여부변동 사유 목록의 행 경로

좁은 화면에서 달라지는 것

폭이 1000px보다 좁아지면 표와 차트 사이 손잡이가 사라지고 차트가 표 아래로 내려갑니다. 조회조건은 접어서 숫자 영역을 먼저 보게 하고, 표는 가로로 스크롤됩니다. 행이 500개를 넘거나 열 조합이 36개를 넘으면 반쯤 그린 표 대신 범위를 좁히라는 안내가 나옵니다. 화면 폭을 줄여도 기능이 빠지지 않는 것이 원칙이고, 휴대폰에서 긴 표를 훑는 일은 CSV로 내려받아 보는 것이 낫습니다.

파일 구성

앱 폴더
├─ index.html · Component.js · manifest.json     진입 · 컴포넌트 · 앱 선언
├─ view/
│   ├─ Main.view.xml                              조회조건 · 요약 · 레이아웃 보드 · 표 · 차트
│   └─ fragments/                                 값 선택 · 원천 문서 · 사유 · AI · 에이전트 · 레이아웃 창
├─ controller/                                    화면 동작(BaseController · Main.controller)
├─ model/
│   ├─ cube.js        큐브를 행·열 축으로 다시 묶는 피벗
│   ├─ chart.js       직접 그린 SVG 차트(막대 · 워터폴)
│   ├─ pptx.js        PowerPoint 보고서 생성
│   ├─ layout.js · formatter.js · ErrorHandler.js
├─ css/ · i18n/                                   스타일 · 문구
└─ media/ · readme.html                           소개 영상 · 앱 설명서

SAP 표준 기능 확장 포인트

표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회 · 검증 관점을 더해 확장합니다. 법정 · 감사 · 신고 대응은 표준 화면과 절차를 그대로 따릅니다.

표준으로 되는 것과 안 되는 것

하고 싶은 일SAP 표준표준에서 걸리는 자리이 앱이 하는 일
판매 오더 · 납품 · 청구 문서 한 건 확인VA03 · VL03N · VF03문서 단위 조회입니다. 국가 · 고객 단위로 모아 보려면 따로 내려받아 가공해야 합니다.칸을 누르면 같은 청구 문서 라인이 열리고, 문서번호로 표준 화면에서 다시 봅니다.
국가 · 지역 · 인코텀즈별 실적 비교표준 리스트 + 엑셀차원이 바뀔 때마다 리포트를 다시 만듭니다.같은 큐브에서 축만 끌어다 놓습니다.
공헌이익 · 수익성KE30수익성 분석 실행이 필요하고 특성 구성이 정해져 있습니다. 운영하지 않는 회사는 쓸 수 없습니다.청구 문서 기준으로 공헌이익을 계산해 비교합니다(대사 대상).
수금 · 회수율FBL5N고객 단위 개별 항목 조회입니다.매출과 같은 표에서 회수율을 국가 · 고객 단위로 봅니다.
계획 대비 차이의 원인 분해-표준 화면에는 같은 형태의 요인 분해가 없고 보통 엑셀로 만듭니다.물량 · 믹스 · 외화 단가 · 환율 · 운임보험 · 수수료 · 변동비로 나누고 합계를 검산합니다.
차이 사유 기록전표 텍스트 등문서 단위라 집계 행에는 붙일 곳이 없습니다.조회 범위 + 행 경로를 키로 남깁니다.
이상 징후 알림배치 + 메일잡은 돌지만 누가 봐야 하는지는 사람이 판단합니다.규칙마다 받을 역할이 붙어 있습니다.

T-code 별 연계 지점

T-code이름연계 지점 · 대사 · 오가는 방법 · 표준에 남길 일
VA03판매 오더 조회칸 아래 문서 라인의 판매 오더 번호로 수주 조건(납품처 · 가격 조건)을 확인합니다. 이 화면 → 표준: 문서 라인의 오더 번호를 VA03 에 넣습니다. 표준 → 이 화면: 해당 고객 · 제품의 칸을 다시 열어 같은 오더가 어느 기간에 잡혔는지 봅니다. 수주 변경은 표준에서 합니다.
VL03N납품 조회선적일 · 납품 번호로 출하 수량을 확인합니다. 선적일과 청구일이 다른 달에 걸리면 기간 기준을 어느 쪽으로 볼지 정해야 하며, 이 화면은 청구일 기준 기간과 선적일 열을 함께 보여 줍니다.
VF03청구 문서 조회칸 금액의 원천이 되는 청구 문서 · 품목을 같은 번호로 열어 대사합니다. 두 화면 숫자를 맞춰 보는 가장 직접적인 지점입니다. 청구 취소 · 정정은 표준에서 합니다.
FBL5N고객 개별 항목수금액과 회수율을 고객 채권 항목과 맞춰 봅니다. 청산 항목과 청구 문서를 잇는 방식은 운영에서 확정합니다(확인 필요). 채권 관리 · 독촉은 표준에 남깁니다.
KE30수익성 분석 실행공헌이익을 표준 수익성 분석 결과와 대사합니다. 원천 · 계획 매핑은 회사마다 달라 확인 필요이며, 법정 · 관리 보고용 수익성은 표준 결과가 기준입니다.

기존 리포트를 없애야 하나요? 없애지 않습니다. 표준 거래와 법정 · 감사 · 세무 신고 대응용 출력은 그대로 두고, 이 화면은 월별 실적 점검과 원인 추적, 회의 자료를 만드는 자리에 얹습니다. 운영 전환 직후 몇 달은 두 화면 숫자를 같은 기준으로 맞춰 보는 대사 기간으로 두는 것을 권합니다.

S/4HANA 분석 스택과의 자리

S/4HANA 에는 표준 CDS 분석 쿼리와 Fiori 분석 앱, Analysis for Office 같은 분석 도구가 있습니다. 이미 잘 정리된 표준 분석으로 충분한 질문은 그쪽을 쓰시면 됩니다. 이 화면은 그 사이에서 수출 실적을 국가 · 지역 · 인코텀즈 축으로 자유롭게 바꿔 보고, 칸에서 원천 문서까지 내려가고, 계획 대비 차이를 요인으로 가르는 한 가지 시나리오를 한 화면으로 묶은 것입니다. 표준 분석 쿼리가 있다면 이 화면의 큐브 뷰가 그 쿼리를 읽도록 바꾸는 것도 가능하며, 어떤 표준 뷰가 이미 같은 정의를 갖고 있는지는 시스템에서 확인해야 합니다(확인 필요).

확장 포인트 — 운영에서 실제로 손대는 자리

자리무엇을 정하나비고
국가 → 지역 매핑회사가 정하는 지역 분류(공동 판매 지역 등 예외 포함)기준 테이블 한 개를 고객이 직접 유지 보수합니다.
가격 조건 → 운임 · 보험 · 수수료어떤 조건 유형을 어떤 부대 비용으로 읽을지릴리스 · 회사별 가격 조건 구성 확인이 필요합니다.
인코텀즈별 비용 부담 기준조건에 따라 운임 · 보험을 누가 내는지물류비율을 해석하는 기준입니다.
확장 필드 · 사용자 정의 구분선적서류 번호 같은 고객 고유 필드CDS 확장 · 커스텀 필드로 큐브에 올립니다.
BAdI · 계산 로직공헌이익의 정의(변동원가 기준 등)서비스의 계산항목 식에서 바꿉니다.
권한영업조직 · 회사코드 단위 접근 제어DCL(접근 제어)로 집계 단계에서 겁니다.
계획 원천판매 계획 · 수익성 계획 · 외부 파일계획 큐브만 바꾸면 화면은 그대로입니다.

분석 지표 정의

지표산식 · 판정 기준대응 기능원천 데이터비고
매출(원화)외화 매출 × 환율의 합피벗 · KPI청구 품목 순액 · 환율가정 환율(샘플)
공헌이익매출 − 운임 − 보험료 − 수수료 − 변동원가계산항목 · 워터폴청구 · 가격 조건 · 원가매핑은 운영 시 확정
공헌이익률공헌이익 ÷ 매출 × 100KPI · 규칙 R1계산항목비율은 식 재계산
물류비율(운임 + 보험료) ÷ 매출 × 100물류 책임자 보기 · 규칙 R5가격 조건인코텀즈별 비교
회수율수금액 ÷ 매출 × 100CFO 보기 · 규칙 R4채권 청산 항목연계 방식 확인 필요
매출 달성률실적 ÷ 계획 × 100KPI · 규칙 R2계획 큐브계획 원천 확인 필요
환율 영향환율 요인 금액(요인분해)워터폴 · 규칙 R3청구 환율 · 계획 환율기준 환율 유형 확인 필요

CDS 구성

아래 CDS 뷰는 운영 연결을 위한 스케치입니다. 샘플 서비스가 하는 일을 S/4HANA 의 CDS 뷰 · 분석 쿼리 · 접근 제어 · 서비스 정의로 옮길 때 어떻게 나누는지를 보여 주며, 실제 원천 매핑은 도입 시 확정합니다.

원천 테이블

원천 테이블쓰는 필드(요지)용도
VBRK(청구 헤더)VBELN · FKDAT · VKORG · KUNAG · INCO1 · WAERK · KURRF · BUKRS문서 · 일자 · 조직 · 고객 · 인코텀즈 · 통화 · 환율
VBRP(청구 품목)POSNR · MATNR · MATKL · SPART · FKIMG · NETWR · WAVWR · AUBEL · VGBEL품목 · 수량 · 외화 순액 · 원가 · 오더 · 납품 참조
LIKP · LIPS(납품)WADAT_IST · 납품 번호선적일 · 출하 수량
VBAK · VBAP(판매 오더)오더 번호 · 조건수주 참조
KNA1(고객 마스터)KUNNR · LAND1고객 · 국가
BSAD(고객 청산 항목)청산 금액수금액(연계 방식 확인 필요)
가격 조건 요소운임 · 보험 · 수수료 조건 금액부대 비용(릴리스별 테이블 확인 필요)

필드 매핑

화면 항목원천 테이블.필드비고
청구문서 · 품목 · 회계연도VBRK.VBELN · VBRP.POSNR · 회계연도키
전기일 · 선적일VBRK.FKDAT · LIKP.WADAT_IST선적일은 납품 연계
고객 · 국가VBRK.KUNAG · KNA1.LAND1
지역국가 → 지역 매핑 기준회사가 정하는 분류
제품 · 제품그룹 · 사업부VBRP.MATNR · MATKL · SPART
인코텀즈 · 통화 · 영업조직VBRK.INCO1 · WAERK · VKORG
판매 오더 · 납품 번호VBRP.AUBEL · VGBEL
선적서류 번호선적서류 번호연계 원천 확인 필요
수량VBRP.FKIMG
외화 매출 · 환율VBRP.NETWR · VBRK.KURRF
매출(원화)파생 — 외화 매출 × 환율원화 환산
운임 · 보험료 · 수수료가격 조건 금액파생 — 조건 유형을 운임 · 보험 · 수수료로 매핑
변동원가VBRP.WAVWR표준 원가 기준
수금액채권 청산 금액파생 — 연계 방식 확인 필요
큐브 측정값청구 품목 필드의 같은 합계파생 — 기간 · 고객 · 제품 · 인코텀즈 단위 합계
계획 값계획 원천(확인 필요)실적과 같은 키
계산항목 식파생 — 토큰 식예: 공헌이익 = 매출 − 운임 − 보험 − 수수료 − 변동원가

뷰 레이어 구성

레이어뷰하는 일왜 나누나
기준zexp_regmap(국가 → 지역 매핑 테이블) · 가격 조건 매핑국가를 지역으로 묶는 기준과 운임 · 보험 · 수수료로 읽을 가격 조건 유형을 한 곳에 둡니다.회사가 정하는 분류를 코드에 박아 두면 바뀔 때마다 전송이 필요합니다.
기본ZI_ExpBilling청구 문서 품목을 고객 · 국가 · 제품 · 인코텀즈와 통화 환산 금액까지 한 줄로 펼친 기본 뷰입니다.원천 테이블 조인을 한 곳에 모아 위 뷰들이 같은 정의를 쓰게 합니다.
큐브ZI_ExpCountryCube기본 뷰를 기간 · 고객 · 제품 · 인코텀즈 단위로 더해 놓은 분석 큐브입니다.화면의 큐브 조회가 읽는 단위이며, 축을 바꿔도 같은 집계를 쓰게 합니다.
큐브ZI_ExpPlanCube같은 차원 조합에 계획 값을 맞춰 둔 큐브입니다.계획 대비 차이를 같은 키로 맞붙이기 위해 실적 큐브와 키를 똑같이 둡니다.
쿼리ZC_ExpCountryQuery큐브를 분석 쿼리로 노출하고 계산항목과 필터를 선언합니다.화면이 읽을 이름과 조회조건을 한 곳에서 관리합니다.
권한ZR_ExpCountryCube영업조직 단위 접근 제어(DCL)입니다.권한이 없는 영업조직의 숫자는 서비스에서 내려가지 않게 합니다.
서비스ZUI_ExpCountry서비스 정의와 바인딩입니다.앱의 서비스 선언이 가리킬 OData 서비스를 게시합니다.

① 국가 → 지역 매핑 테이블 (기준)

회사마다 지역을 묶는 방식이 다르므로 코드가 아니라 테이블에 둡니다. 이 한 곳을 고치면 큐브 전체에 반영되고, 운영 단계에서 고객사가 직접 정합니다.

" ─────────────────────────────────────────────
" zexp_regmap : 국가 → 지역 매핑 (기준 테이블)
" 역할  : 국가 코드를 수출 분석용 지역으로 묶는다.
" 나눈 이유 : 지역 분류는 회사가 정하는 값이라 뷰 코드에 넣으면
"            분류가 바뀔 때마다 전송이 필요해진다.
" ─────────────────────────────────────────────
@EndUserText.label : '국가 지역 매핑'
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
@AbapCatalog.dataMaintenance : #ALLOWED
define table zexp_regmap {
  key mandt   : mandt not null;
  key land1   : land1 not null;
  region      : abap.char(2) not null;
  region_text : abap.char(20);
}

② 청구 품목 기본 뷰 ZI_ExpBilling

청구 문서 헤더 · 품목 · 고객 마스터를 조인하고 외화 금액에 환율을 곱해 원화 금액을 만듭니다. 이 뷰 한 곳에서만 조인과 환산을 하므로 위의 큐브들이 같은 정의를 씁니다.

" ─────────────────────────────────────────────
" ZI_ExpBilling : 청구 품목 기본 뷰
" 역할  : 청구 헤더(vbrk) · 품목(vbrp) · 고객(kna1) · 지역 매핑을 한 줄로 펼친다.
" 나눈 이유 : 조인과 통화 환산을 한 곳에 모아 큐브와 계획이 같은 정의를 쓰게 한다.
" ─────────────────────────────────────────────
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '수출 청구 품목'
@ObjectModel.usageType.sizeCategory : #XL
define view entity ZI_ExpBilling
  as select from vbrk as h
    inner join vbrp as i on i.vbeln = h.vbeln
    inner join kna1 as c on c.kunnr = h.kunag
    left outer join zexp_regmap as m on m.land1 = c.land1
{
  key h.vbeln                              as BillingDocument,
  key i.posnr                              as BillingItem,
      h.fkdat                              as BillingDate,
      h.vkorg                              as SalesOrganization,
      h.kunag                              as Customer,
      c.land1                              as Country,
      m.region                             as Region,
      i.matnr                              as Product,
      i.matkl                              as ProductGroup,
      i.spart                              as Division,
      h.inco1                              as Incoterms,
      h.waerk                              as TransactionCurrency,
      @Semantics.quantity.unitOfMeasure : 'BaseUnit'
      i.fkimg                              as BillingQuantity,
      i.vrkme                              as BaseUnit,
      @Semantics.amount.currencyCode : 'TransactionCurrency'
      i.netwr                              as NetAmountFc,
      h.kurrf                              as ExchangeRate,
      cast( i.netwr * h.kurrf as abap.curr( 15, 2 ) ) as NetAmountKrw,
      @Semantics.amount.currencyCode : 'CompanyCurrency'
      i.wavwr                              as CostAmount,
      h.bukrs                              as CompanyCode
}

③ 실적 큐브 ZI_ExpCountryCube

기본 뷰를 기간 · 고객 · 제품 · 인코텀즈 단위로 더합니다. 화면의 큐브 한 행에 해당하며, 측정값은 합계로 집계되도록 선언합니다. 환산과 가격 조건 합산은 기본 뷰가 끝낸 값을 그대로 읽습니다.

" ─────────────────────────────────────────────
" ZI_ExpCountryCube : 수출 실적 큐브
" 역할  : 청구 품목을 분석 차원 조합별로 더한다. 화면의 큐브 조회가 읽는 단위.
" 나눈 이유 : 축을 바꿔도 같은 집계를 쓰게 하고, 드릴스루는 기본 뷰로 내려간다.
" ─────────────────────────────────────────────
@Analytics.dataCategory : #CUBE
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '수출 실적 큐브'
define view entity ZI_ExpCountryCube
  as select from ZI_ExpBilling
{
  key CompanyCode,
  key cast( substring( cast( BillingDate as abap.char(8) ), 1, 6 ) as abap.char(6) ) as FiscalPeriod,
  key Customer,
  key Product,
  key Incoterms,
      Region,
      Country,
      ProductGroup,
      Division,
      SalesOrganization,
      TransactionCurrency,
      @Aggregation.default : #SUM
      sum( BillingQuantity )  as Quantity,
      @Aggregation.default : #SUM
      sum( NetAmountFc )      as SalesFc,
      @Aggregation.default : #SUM
      sum( NetAmountKrw )     as SalesKrw,
      @Aggregation.default : #SUM
      sum( CostAmount )       as VariableCost
}
group by CompanyCode, BillingDate, Customer, Product, Incoterms,
         Region, Country, ProductGroup, Division, SalesOrganization, TransactionCurrency

④ 계획 큐브 ZI_ExpPlanCube

계획 값을 실적 큐브와 같은 키로 맞춥니다. 키가 같아야 계획 대비 차이를 한 줄로 맞붙일 수 있습니다. 계획의 원천(판매 계획 · 수익성 계획 등)은 도입 시 확정이 필요한 항목입니다.

" ─────────────────────────────────────────────
" ZI_ExpPlanCube : 수출 계획 큐브 (원천은 도입 시 확정 필요)
" 역할  : 계획 값을 실적 큐브와 같은 차원 조합으로 맞춘다.
" 나눈 이유 : 같은 키여야 계획 대비 차이를 서비스에서 한 번에 맞붙일 수 있다.
" ─────────────────────────────────────────────
@Analytics.dataCategory : #CUBE
@EndUserText.label : '수출 계획 큐브'
define view entity ZI_ExpPlanCube
  as select from zexp_plan
{
  key bukrs     as CompanyCode,
  key version   as PlanVersion,
  key period    as FiscalPeriod,
  key kunnr     as Customer,
  key matnr     as Product,
  key inco1     as Incoterms,
      region    as Region,
      land1     as Country,
      @Aggregation.default : #SUM
      qty       as Quantity,
      @Aggregation.default : #SUM
      sales_fc  as SalesFc,
      @Aggregation.default : #SUM
      sales_krw as SalesKrw,
      @Aggregation.default : #SUM
      var_cost  as VariableCost
}

⑤ 분석 쿼리 ZC_ExpCountryQuery

큐브를 화면이 읽는 이름으로 노출하고 조회 필터를 선언합니다. 공헌이익처럼 문서에 없는 값은 계산 측정값으로 정의합니다.

" ─────────────────────────────────────────────
" ZC_ExpCountryQuery : 수출 실적 분석 쿼리
" 역할  : 화면이 읽을 이름 · 필터 · 계산 측정값을 한 곳에서 선언한다.
" 나눈 이유 : 조회조건과 계산식을 서비스 쪽에 두어 화면이 숫자를 만들지 않게 한다.
" ─────────────────────────────────────────────
@Analytics.query : true
@AccessControl.authorizationCheck : #CHECK
@EndUserText.label : '수출 실적 분석'
define view entity ZC_ExpCountryQuery
  as select from ZI_ExpCountryCube
{
  @Consumption.filter : { mandatory : true, selectionType : #SINGLE }
  key CompanyCode,
  @Consumption.filter : { mandatory : true, selectionType : #INTERVAL }
  @AnalyticsDetails.query.axis : #ROWS
  key FiscalPeriod,
  @AnalyticsDetails.query.axis : #ROWS
  Region,
  @AnalyticsDetails.query.axis : #ROWS
  Country,
  @Consumption.filter.selectionType : #MULTIPLE_ELEMENTS
  Customer,
  Product,
  Incoterms,
  @AnalyticsDetails.query.axis : #COLUMNS
  SalesKrw,
  @AnalyticsDetails.query.axis : #COLUMNS
  VariableCost
}

⑥ 접근 제어 ZR_ExpCountryCube

영업조직 단위로 조회 권한을 겁니다. 권한이 없는 영업조직의 행은 서비스에서 읽히지 않으므로 화면이 걸러 줄 필요가 없습니다.

" ─────────────────────────────────────────────
" ZR_ExpCountryCube : 영업조직 접근 제어 (DCL)
" 역할  : 조회 권한이 있는 영업조직의 행만 읽히게 한다.
" 나눈 이유 : 권한을 화면이 아니라 데이터 계층에서 걸어야 우회할 수 없다.
" ─────────────────────────────────────────────
@EndUserText.label : '수출 실적 큐브 접근 제어'
@MappingRole : true
define role ZR_ExpCountryCube {
  grant select on ZI_ExpCountryCube
    where ( SalesOrganization ) = aspect pfcg_auth( V_VBRK_VKO, VKORG, ACTVT = '03' );
}

⑦ 서비스 정의 ZUI_ExpCountry

분석 쿼리를 OData 서비스로 노출합니다. 이 서비스를 활성화한 뒤 앱의 서비스 선언 주소만 바꾸면 운영 데이터로 연결됩니다.

" ─────────────────────────────────────────────
" ZUI_ExpCountry : 서비스 정의
" 역할  : 분석 쿼리를 OData 서비스로 노출한다.
" 나눈 이유 : 화면은 서비스 선언 한 곳만 바라보므로 주소만 바꾸면 운영으로 연결된다.
" ─────────────────────────────────────────────
@EndUserText.label : '수출 실적 분석 서비스'
define service ZUI_ExpCountry {
  expose ZC_ExpCountryQuery as ExpCountry;
}

운영 시점에 해야 할 일

개발보다 정하는 일이 많습니다. 아래 항목은 코딩이 아니라 합의이며, 합의가 끝나면 기술 작업은 뷰를 만들고 서비스를 게시한 뒤 앱 선언 파일의 서비스 주소를 바꾸는 일로 줄어듭니다.

해야 할 일무엇을 정하나정하지 않으면누가
지역 분류 · 매핑국가를 지역으로 묶는 기준과 고객사 고유의 예외(공동 판매 지역 등)지역 합계가 보고서마다 달라져 숫자를 맞추는 회의가 생깁니다영업기획 · IT
가격 조건 → 운임 · 보험 · 수수료 매핑어떤 조건 유형을 운임 · 보험료 · 수수료로 읽을지(릴리스별 가격 조건 테이블 확인 필요)공헌이익이 표준 수익성 화면과 어긋납니다영업 · 물류 · 관리회계
인코텀즈별 비용 부담 기준조건별로 운임 · 보험을 누가 내는지와 매출 인식 시점의 기준같은 매출인데 물류비율이 조건마다 다르게 읽힙니다물류 · 회계
환율 유형과 환산 시점청구 문서 환율을 쓸지 기준 환율 유형을 쓸지, 환산 시점외화 금액 × 환율과 원화 금액이 맞지 않을 수 있습니다자금 · 회계
실적 · 계획 원천 확정계획 원천(판매 계획 · 수익성 계획)과 계획 버전 관리 방식계획 대비 차이가 의미를 잃습니다영업기획 · 관리회계
수금액 연결청구 문서와 채권 청산 항목을 이어 수금액을 만드는 방식회수율이 실제와 다르게 나옵니다재무 · 채권
차원 범위화면에 올릴 차원과 값의 범위, 열 조합 상한열 머리글이 무너지거나 조회가 느려집니다현업 · IT
권한 설계영업조직 · 회사코드 단위 접근 제어와 역할 단추의 관계권한 밖 숫자가 노출될 수 있습니다보안 · IT
성능 기준조회 기간 필수화 · 응답 시간 기준 · 집계 위치대용량에서 조회가 길어집니다IT
대사 체계표준 T-code 와 맞춰 볼 항목과 허용 오차두 화면의 차이를 설명할 기준이 없습니다회계 · 감사 대응
전송(TR) 순서기준 테이블 → 기본 뷰 → 큐브 → 쿼리 → 접근 제어 → 서비스 순서활성화 오류로 서비스가 열리지 않습니다IT
서비스 활성화와 주소 교체서비스 활성화(/IWFND/MAINT_SERVICE 또는 바인딩 게시)와 앱 선언 주소앱이 샘플 서비스를 계속 바라봅니다IT
배치 등록에이전트 실행을 부르는 배치(SM36 또는 cron)와 시각사람이 없는 시간에는 감시가 돌지 않습니다IT · 운영

운영 데이터로 갈 때

청구 문서 라인이 수천만 건이 되면 지금처럼 큐브 전체를 브라우저로 내려 묶는 구조는 맞지 않습니다. 첫째, 집계는 데이터베이스 안에서 합니다(큐브 뷰의 group by 와 분석 쿼리). 둘째, 조회 기간과 회사코드를 필수 파라미터로 두어 읽는 범위를 제한합니다. 셋째, 청구일 · 영업조직 · 고객 같은 필터 열에 맞는 인덱스나 칼럼 저장소 특성을 확인합니다. 넷째, 드릴스루는 칸 하나에 해당하는 원천 줄만 페이징해서 읽습니다. 응답 시간 기준은 사용자가 기다릴 수 있는 수준(예: 조회 몇 초, 드릴스루 1~2초)을 먼저 합의하고 그에 맞춰 집계 위치를 정합니다. 화면은 행 500개 · 열 조합 36개 상한을 두어 범위가 넓어질 때 먼저 안내하도록 해 두었습니다.

자주 묻는 질문

도입을 검토하실 때 자주 나오는 질문을 네 묶음으로 정리했습니다. 답변의 숫자는 모두 이 글의 샘플 자료 기준입니다.

숫자와 산식

공헌이익은 어떻게 계산합니까?

공헌이익 = 매출 − 운임 − 보험료 − 수수료 − 변동원가입니다. 이 식은 화면 코드가 아니라 서비스의 계산항목 목록(계산항목 목록)에 토큰 식으로 들어 있고, 화면은 그 식을 그대로 풀어 합산합니다. 순매출은 매출에서 운임 · 보험료 · 수수료까지만 뺀 값이며, 공헌이익률은 공헌이익을 매출로 나눈 비율입니다. 비율은 합계를 더하지 않고 식을 다시 계산하므로 지역마다 올바른 값이 나옵니다. 이 식을 바꾸고 싶으면 화면이 아니라 계산항목 한 줄을 고치면 됩니다.

셀 금액과 원천 문서 합계가 정말 같습니까?

같습니다. 큐브가 원천 라인을 더해 만든 값이기 때문입니다. 이 사례에서 12개 칸을 눌러 드릴스루 합계와 칸 금액을 비교했고 모두 일치했습니다. 예를 들어 중국 매출 5,811백만원을 누르면 원천 330줄이 열리고 합계가 같은 금액으로 표시됩니다. 일치하지 않으면 같은 자리에 확인 필요 표시가 나오도록 만들어 두었습니다.

외화와 환율은 어떻게 다룹니까?

줄마다 외화 매출에 그 줄의 환율을 곱해 원화 매출을 만듭니다. 이 사례 5,948줄 모두에서 외화 금액 × 환율과 원화 금액의 차이가 1원 이내였고 최대 차이는 0.5원 미만이었습니다. 환율은 샘플 데이터용 가정값이며 실제 고시 환율이 아닙니다. 계획 대비 차이를 요인으로 나눌 때는 환율 요인이 따로 잡혀 환율 때문에 생긴 차이와 단가 때문에 생긴 차이를 가를 수 있습니다.

큐브는 왜 따로 두나요?

원천 라인을 그대로 묶으면 축을 바꿀 때마다 수천 줄을 다시 훑어야 합니다. 같은 기간 · 고객 · 제품 · 인코텀즈 조합의 라인을 미리 한 행으로 더해 두면 축을 바꾸는 일은 그 행들을 다시 묶는 일이 됩니다. 이 사례에서는 원천 5,948줄이 707행의 큐브로 줄었습니다. 운영 SAP 환경에서는 이 묶기를 분석용 CDS 큐브 뷰가 맡습니다.

계산항목은 차원과 무엇이 다릅니까?

차원은 문서에 들어 있는 값이라 그 값으로 묶으면 행이 나옵니다. 지역 · 국가 · 고객이 그렇습니다. 공헌이익이나 순매출은 어느 문서에도 전기되지 않고 식으로만 존재합니다. 그래서 계산항목은 분석 항목에서 (계산) 표시를 붙여 따로 고르고, 단계 보기에서는 매출에서 공헌이익까지의 사슬을 행으로 세워 보여 줍니다.

화면과 조작

축을 바꾸면 서버를 다시 부릅니까?

부르지 않습니다. 조회할 때 조회조건 필터로 큐브를 한 번 읽고, 이후 축을 끌어다 놓는 일은 브라우저가 이미 받은 행을 다시 묶는 일입니다. 자동 검증에서 축을 여섯 가지로 바꾸며 서비스 요청 수를 세었고 늘지 않았으며, 어느 배치에서도 총합이 큐브 총합 104,646,272,197원과 같았습니다.

행 축은 세 단계, 열 축은 두 단계로 제한한 이유가 있습니까?

열 축은 조합이 곱으로 늘어 머리글이 먼저 무너집니다. 그래서 열 축은 두 단계, 열 조합은 36개로 막고 넘기려 하면 추가를 막고 안내합니다. 행 축은 트리로 접히므로 세 단계까지 둘 수 있게 했습니다. 행 노드가 500개를 넘으면 반쯤 그린 표 대신 범위를 좁히라는 안내를 띄웁니다.

키보드만으로도 축을 옮길 수 있습니까?

옮길 수 있습니다. 차원 칩을 누르면 행으로 · 열로 · 사용 안 함으로 이동하는 메뉴와 앞으로 · 뒤로 순서 바꾸기가 나옵니다. 끌어다 놓기는 마우스 사용자를 위한 편의이고, 같은 일을 메뉴로도 할 수 있습니다.

차이가 음수인데 초록으로 보입니다. 맞습니까?

맞을 수 있습니다. 색은 금액 부호가 아니라 이익에 준 영향으로 칠하기 때문입니다. 운임처럼 줄수록 이익에 보탬이 되는 항목은 차이가 음수여도 초록이 됩니다. 금액 부호로 칠하면 비용 절감이 빨갛게 보여 거꾸로 읽힙니다. 항목마다 영향 방향이 서비스의 측정값 목록에 들어 있습니다.

작은 차이까지 전부 칠하지 않는 이유는 무엇입니까?

금액과 비율을 둘 다 넘을 때만 칠하는 규칙을 썼습니다. 이 사례에서는 금액 3천만원과 증감률 5%이며, 비율 항목은 1퍼센트포인트입니다. 한쪽만 넘는 작은 차이에 색이 입혀지면 정작 봐야 할 칸이 묻힙니다. 임계값은 화면 코드에 있는 점검 기준이며 고객사 기준에 맞게 바꾸는 자리를 운영 단계에서 정합니다.

변동 사유는 축을 바꾸면 사라집니까?

사라지지 않습니다. 사유의 키는 축 배치가 아니라 조회 범위와 행 경로입니다. 축 순서를 바꾸거나 트리를 다시 펼쳐도 같은 행이면 사유가 따라옵니다. 기간을 바꾸면 다른 키가 되어 지난 기간의 사유가 섞이지 않습니다. 한 행에 사유는 하나이며 다시 적으면 쌓이지 않고 바뀝니다.

분석 기능

차이 요인분해는 어떤 요인으로 나눕니까?

공헌이익 차이를 물량 · 믹스 · 외화 단가 · 환율 · 운임보험 · 수수료 · 변동비 · 미계획의 여덟 요인으로 나눕니다. 계획에 있는 조합은 계획 수량 비율과 실제 수량을 맞대어 물량과 믹스를 가르고, 계획에 없던 조합의 실적은 미계획으로 따로 둡니다. 여덟 요인의 합이 총차이와 같은지는 차트 아래 검산 줄이 매번 보여 줍니다. 허용 오차는 1원 미만입니다.

AI 분석은 숫자를 직접 만듭니까?

만들지 않습니다. 금액과 비율은 서비스가 큐브에서 계산해 근거 표로 넘기고, 해설은 그 표를 읽어 정리할 뿐입니다. 근거 표는 화면에서 펼쳐 볼 수 있어 해설의 숫자를 바로 맞춰 볼 수 있습니다. 기본은 모델 연결 없이 규칙으로 쓰는 해설이며, 모델 연결은 서비스 설정 하나로 켜고 기본은 꺼져 있습니다. API 키는 화면 · 설명서 · 이 글 어디에도 두지 않습니다.

사유가 적힌 차이를 AI 분석이 건너뛰는 이유는 무엇입니까?

이미 사람이 설명을 적어 둔 차이를 다시 점검 필요로 올리면 같은 일이 반복되기 때문입니다. 건너뛴 항목은 안내줄에 이름으로 남겨 무엇을 뺐는지 알 수 있게 했습니다. 사유를 지우면 다음 분석부터 다시 점검 대상으로 올라옵니다.

AI 에이전트는 화면을 닫아도 돌아갑니까?

판단과 기록은 화면이 아니라 서비스에 있습니다. 화면의 타이머는 이 화면이 열려 있는 동안만 하루 1회 점검을 부르는 편의 기능입니다. 사람이 없는 시간에는 운영 서버의 배치(SM36 또는 cron)가 같은 실행 호출을 부르도록 연결합니다. 하루 1회 제한은 서버가 실행 기록을 보고 판정하므로 어디서 부르든 같습니다.

PowerPoint 보고서에는 무엇이 들어갑니까?

표지 · 요약과 핵심 발견 · 조회 결과 표 · 항목 비교 차트 · 공헌이익 차이 워터폴 · 해설에 쓴 근거 표가 들어갑니다. 지금 보고 있는 범위와 행 경로가 그대로 반영됩니다. 파일은 브라우저가 압축 파일과 XML을 직접 지어 만들고 서버에 남기지 않으며, 외부 라이브러리를 쓰지 않습니다.

도입과 운영

도입하면 누가 가장 먼저 달라집니까?

수출 영업 담당자와 관리회계 담당자입니다. 매달 국가별 · 지역별 실적과 공헌이익을 엑셀로 모아 맞추던 시간이 줄고, 회의에서 “어느 숫자가 맞나”를 따지는 대신 “어느 국가의 무엇을 손볼까”를 이야기합니다. 물류 책임자는 인코텀즈별 물류비율을, 재무 담당자는 고객별 회수율을 같은 화면에서 봅니다. 대상 사용자는 보는 사람이지 입력하는 사람이 아니므로, 화면을 새로 배우는 부담은 크지 않습니다. 다만 효과의 크기는 지역 분류와 가격 조건 매핑이 얼마나 정리되어 있는지에 달려 있습니다.

표준 T-code 와는 어떤 관계입니까?

표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회와 검증 관점을 더해 확장합니다. 판매 오더 · 납품 · 청구 문서는 VA03 · VL03N · VF03 으로, 고객 채권은 FBL5N 으로, 수익성은 KE30 으로 원천을 확인합니다. 이 화면의 드릴스루 문서번호로 표준 화면을 열어 같은 문서를 맞춰 볼 수 있습니다. 기존 표준 리포트를 없애는 것이 아니라 함께 두고 대사하는 것을 전제로 합니다.

이 화면의 결과로 회계나 세무 판단을 해도 됩니까?

이 화면은 분류 · 집계 · 대사를 돕는 점검 도구입니다. 최종 판단은 회사와 감사인이 하고, 세무 신고는 회사와 세무 대리인 · 관세사가 합니다. 화면에 나오는 점검 필요 표시는 확인할 대상을 좁혀 줄 뿐 원인을 단정하지 않습니다. 영세율 신고나 관세 환급 같은 업무는 표준 화면과 해당 전문가의 확인 절차를 그대로 따릅니다.

적용 시기와 범위는 어떻게 됩니까?

이 글의 화면은 검증용 샘플 데이터로 동작을 확인한 결과이며, 실제 적용 시기는 고객사의 SAP 환경과 일정을 확인한 뒤 정합니다. 확인되지 않은 시행일이나 세율 · 관세율은 이 글에 싣지 않았고, 샘플 데이터의 환율 · 비율은 모두 가정값입니다. 운영 연결에는 원천 매핑 확정, 서비스 활성화, 권한 설계, 대사 체계 합의가 필요하며 그 목록은 CDS 구성 절의 운영 시점에 해야 할 일에 표로 정리했습니다.

운영 데이터에 연결하려면 어떤 일이 필요합니까?

원천 매핑을 확정하고(청구 문서 · 납품 · 고객 · 가격 조건), CDS 뷰를 만들어 전송하고, 서비스를 활성화한 뒤 앱의 서비스 주소만 운영 서비스로 바꿉니다. 화면 코드는 서비스 선언 한 곳만 바라보므로 화면을 다시 만들 필요가 없습니다. 소요는 매핑 확정 범위에 따라 달라지므로 고객사와 범위를 정한 뒤 산정합니다.

권한과 보안은 어떻게 설계합니까?

행 단위 권한은 CDS 접근 제어(DCL)로 영업조직 단위에 겁니다. 역할 단추는 보는 관점을 바꾸는 것이지 권한이 아니므로, 권한이 없는 영업조직의 숫자는 서비스에서 아예 내려가지 않습니다. 화면에는 외부 차트 라이브러리를 쓰지 않아 반입 심사 대상이 늘지 않고, AI 모델 연결은 서비스 설정 한 곳에서만 켜므로 키가 화면에 노출되지 않습니다.

대용량 데이터에서도 이렇게 동작합니까?

운영에서는 큐브 집계를 데이터베이스에서 하고, 조회조건에 기간 · 회사코드를 필수로 걸어 읽는 범위를 제한합니다. 원천 문서 라인은 한 번에 500줄씩 읽어 가며 전체 건수만 따로 받습니다. 큐브 행이 수만 건을 넘으면 조회조건을 더 좁히거나 집계 단위를 올리는 설계를 함께 합니다. 응답 시간 기준은 도입 단계에서 합의합니다.

고객 · 제품 · 영업 조직 체계가 바뀌면 어떻게 합니까?

차원 목록과 값 목록은 서비스가 내려 주는 카탈로그입니다. 차원이 늘거나 이름이 바뀌어도 화면은 목록을 읽어 칩을 만들므로 화면 코드를 고치지 않습니다. 지역 묶음처럼 회사가 정하는 분류는 매핑 테이블 한 곳을 고치면 큐브 전체에 반영됩니다.

샘플 데이터의 고객과 문서번호는 실제 자료입니까?

아닙니다. 고객 · 제품 · 문서번호 · 환율 · 금액은 모두 이 설명용으로 만든 가상 값입니다. 가상 값이지만 합계와 대사식은 실제 데이터와 같은 방식으로 맞아떨어지도록 검증했습니다.