SAP 수입 솔루션 — 입항 후 하역·보관·내륙운송 물류비 다차원 분석, 예정 대비 차이를 일곱 요인으로 가르는 리포트
큐브 한 번 조회 · 드래그 앤 드롭 축 전환 · 칸에서 원천 반출 라인까지의 드릴스루 · 예정 대비 차이와 요인분해 · 행에 남는 변동 사유 · 숫자를 모델에 맡기지 않는 AI 해설 · 스스로 도는 점검 에이전트 — 소개 영상과 실제 화면 33종, 그리고 CDS 코드까지
소개 영상블로그 목차 순서대로 · 자막 포함
도입 포인트 — 이 앱을 사용해야 하는 이유
수입 자재가 입항한 뒤에는 하역, 보관, 내륙 운송, 검수·반출 수수료가 차례로 붙습니다. 분기가 지나면 구매·자금·물류 담당이 같은 질문을 받습니다. "이번 분기 입항 후 물류비가 왜 예정보다 늘었나, 업체 탓인가 보관 기간 탓인가, 입항지마다 다른가?" 지금은 구매오더(ME23N), 입고(MIGO), 자재 문서(MB51), 송장 검증(MIRO), 공급업체 항목(FBL1N)을 번갈아 열어 필요한 숫자를 엑셀에 모으고, 업체별·입항지별·보관 방식별로 표를 다시 만들어 예정과 맞춥니다. 표가 늘수록 합계가 어긋날 자리도 늘고, 어긋나면 그 표를 맞추는 회의가 열립니다.
이 화면은 입항 후 물류비를 한 번 조회해 큐브로 읽고, 그 큐브를 브라우저에서 어느 축으로든 다시 묶습니다. 칸을 누르면 원천 반출 라인으로 내려가고, 비교를 예정으로 바꾸면 총차이가 반출 물량·하역 단가·보관 요율·보관 일수·운송 단가·수수료·미계획 입항 일곱 요인으로 나뉩니다. 이 글의 관련 기준서는 없고(-), 대상 영역은 수입 입항 후 물류비입니다. 특정 기준서의 시행 시기에 매인 화면이 아니라, 지금의 방식을 한 화면으로 모으는 분석 도구입니다.
한 줄 요약 — 입항 후 물류비를 업체·입항지·보관 방식 어느 축으로 묶어도 합계가 같고, 예정 대비 차이를 일곱 요인으로 가르며, 칸 하나에서 원천 반출 라인과 표준 T-code 까지 되짚을 수 있는 수입 솔루션입니다.
핵심 포인트 여덟 가지
| 핵심 포인트 | 고객이 얻는 것 | 지금 방식이라면 |
|---|---|---|
| ① 축을 바꿔도 합계가 갈라지지 않는 피벗 | 업체·입항지·자재그룹·화물 형태·보관 방식 같은 11개 차원을 끌어다 놓아 행 3단계·열 2단계로 다시 묶습니다. 모든 배치가 한 번 읽은 같은 큐브에서 나오므로 총합이 어긋날 자리가 없고, 서버를 다시 부르지 않습니다. | 업체별 표, 입항지별 표, 보관 방식별 표를 엑셀에서 따로 만들고, 합계가 다르면 어느 표가 맞는지부터 맞춥니다. |
| ② 칸에서 원천 반출 라인까지 한 번에 | 표의 금액 칸을 누르면 그 금액을 만든 반출 라인이 열리고, 칸의 값과 읽은 라인의 합이 같은지 머리에 바로 보입니다. 열린 라인에서 구매오더·입고·송장 번호를 들고 표준 T-code 로 넘어갑니다. | 표준 화면을 열어 구매오더·입고·송장을 따로 찾고, 조건을 손으로 다시 맞춰 합계를 대조합니다. |
| ③ 예정 대비 차이를 일곱 요인으로 | 비교를 예정으로 바꾸면 칸마다 실적·예정·차이·차이율이 나옵니다. 총차이는 반출 물량·하역 단가·보관 요율·보관 일수·운송 단가·수수료·미계획 입항 일곱 요인으로 갈리고, 요인 합과 총차이의 검산이 매번 0원으로 표시됩니다. | 엑셀에서 밤새 분해하고, 요인 합이 총차이와 맞는지 다시 손으로 확인합니다. 산식이 사람마다 달라집니다. |
| ④ 차이 사유가 행에 남는다 | 차이 난 행에 사유 구분(물량·하역 단가·보관 요율·보관 일수·운송 단가·수수료·미계획 입항)과 내용을 적으면 조회 범위와 행 경로에 묶여 저장됩니다. 축을 바꿔도, 다음 기간에도 같은 행에 따라옵니다. | 같은 질문을 분기마다 다시 하고, 지난번 답은 메일함이나 회의록에서 찾습니다. |
| ⑤ 역할을 바꾸면 보는 지표가 바뀐다 | CFO·구매 책임자·자금 책임자·물류 책임자 네 역할을 고르면 앞세우는 지표와 쪼개 보는 차원이 함께 바뀝니다. 다시 조회하지 않고 같은 결과를 각자의 눈으로 읽습니다. | 역할마다 보고용 표를 따로 만들어 돌리고, 같은 숫자를 각자 다른 표에서 다시 확인합니다. |
| ⑥ 사람이 열지 않아도 도는 점검 | 감시 규칙(평균 보관 일수 상한, 공급사 반출 지연율 상한 등)마다 임계값과 받을 역할이 붙어, 걸린 항목이 받을 역할 관점의 보고로 대기함에 올라갑니다. 하루 한 번 제한은 서버가 판정하고 실행 기록이 남습니다. | 보관 일수가 늘어난 입항지가 있어도 아무도 화면을 열지 않으면 분기 마감 때까지 모릅니다. |
| ⑦ 숫자는 서비스가, 문장은 규칙이 | AI 분석의 금액·비율은 서비스가 큐브에서 계산하고, 기본 해설은 규칙 기반으로 문장을 만듭니다. 해설에 쓴 근거 표를 펼쳐 볼 수 있고, 같은 범위의 표와 차트는 PowerPoint 보고서로 브라우저에서 바로 내려받습니다. | 해설 문장의 숫자가 어디서 왔는지 확인하기 어렵고, 보고서는 화면을 캡처해 숫자를 옮겨 적어 만듭니다. |
| ⑧ 표준 T-code 로 돌아가는 길이 열려 있다 | 구매오더(ME23N)·입고(MIGO)·송장 검증(MIRO)·자재 문서(MB51)·공급업체 항목(FBL1N)이 가진 같은 데이터를 이어받아 대조 지점을 정해 두었습니다. 표준 실행은 표준에 남기고, 이 화면은 조회·검증 관점을 더합니다. | 분석용 리포트가 표준과 따로 놀아 숫자가 다를 때 어느 쪽을 믿을지 정하는 데 시간이 듭니다. |
사례로 보는 효과 — 총차이 +928.3 백만원의 가장 큰 몫은 미계획 입항
샘플 기준 입항 후 물류비 실적은 5,515.9 백만원, 예정은 4,587.6 백만원으로 총차이가 +928.3 백만원(+20.2%)입니다. 표준 리포트만으로도 "예정보다 늘었다" 까지는 알 수 있습니다. 일곱 요인으로 가르면 미계획 입항 +396.6(총차이의 약 43%), 보관 일수 +232.9(약 25%), 운송 단가 +131.2(약 14%) 순으로 나옵니다. 그 다음은 보관 요율 +60.7, 하역 단가 +58.6, 반출 물량 +46.3, 수수료 +1.9입니다.
읽는 순서가 바뀝니다. "업체 단가가 올랐나" 를 먼저 따지기 전에, 예정에 없던 입항이 큰 몫을 차지한다는 사실과 보관 일수가 두 번째라는 사실이 같은 화면에서 보입니다. 요인 합과 총차이의 검산은 원 단위로 0원이고, 백만원 표시의 합(928.2)이 928.3과 0.1 어긋나 보이는 것은 반올림 때문입니다. 샘플의 예정은 가정값이므로 이 비중이 실제 고객사의 모습은 아닙니다. 화면이 어떤 식으로 질문을 바꿔 주는지 보여 주는 사례입니다.
도입하면 달라지는 것
- 분기 마감 전 물류비 점검 — 표·요인분해·사유·보고서가 한 화면에서 나와 엑셀 취합과 캡처가 줄어듭니다.
- 회의의 주제 — "어느 표가 맞나" 가 아니라 "보관 일수를 어떻게 줄일까" 를 이야기합니다.
- 다음 기간으로 이어지는 기록 — 사유와 레이아웃이 남아 같은 설명을 다시 하지 않습니다.
- 놓치지 않는 점검 — 아무도 화면을 열지 않아도 규칙에 걸린 항목이 대기함에 올라옵니다.
이런 회사에 맞습니다
수입 자재를 정기적으로 들여오고 입항 후 하역·보관·내륙운송을 여러 업체에 나눠 맡기는 제조·유통 회사. 입항지·보관 방식·운송 거리 구간별로 비용을 다시 묶어 보는 구매·물류·자금 담당 조직. AI 해설을 쓰고 싶지만 숫자의 출처를 통제해야 하는 경영지원 조직. 수입 비중이 높고 입항지·업체·보관 방식이 여러 개일수록, 통화가 여러 개이거나 부대비용 조건 유형이 많을수록 한 화면으로 모으는 효과가 큽니다. 반대로 입항 건수가 적고 업체가 한두 곳이면 표준 화면과 엑셀로도 충분할 수 있습니다.
실행 화면
사용 방법
- 조회조건 입력 — 회사코드(필수), 시작 기간·종료 기간(필수, 입항월 기준)을 정합니다. 기본값은 회사코드 1000, 2026.04~2026.09이고 차원 값은 선택입니다.
- 조회 — 조회조건 영역 오른쪽 끝의 조회 버튼을 누르거나 Enter 를 칩니다. 큐브와 예정을 한 번 읽어 표와 차트가 같이 그려집니다.
- 요약 확인 — 임원 요약에서 역할(CFO · 구매 책임자 · 자금 책임자 · 물류 책임자)을 고르면 앞세우는 지표가 바뀝니다. 지표 아래 값은 예정과 차이입니다.
- 탭·축 이동 — 분석 축 보드에서 차원 칩을 행 축(최대 3)·열 축(최대 2)으로 끌어다 놓거나 칩의 화살표 버튼으로 옮깁니다. 표시 항목·금액 단위·비교(실적만 / 예정 대비)도 여기서 바꿉니다.
- 행·칸 클릭 상세 — 행의 펼침 화살표로 하위 차원으로 내려가고, 금액 칸을 누르면 그 칸의 원천 반출 라인이 열립니다. 차이 모드에서 행 이름을 누르면 그 행 범위로 요인분해가 다시 계산됩니다.
- 차이·사유 — 비교를 예정 대비로 바꾸면 실적·예정·차이·차이율이 나오고, 차이 난 행의 사유 링크로 사유 구분과 내용을 적습니다.
- 분석·보고 — 상단 AI 분석(해설·근거 표·PowerPoint 보고서)과 AI 에이전트(규칙·대기함·실행 기록)를 엽니다.
- 내보내기 — 피벗 도구 줄의 CSV 는 현재 표를, 드릴스루 창의 CSV 는 읽은 원천 라인을 내려받습니다.
- 레이아웃 저장 — 상단 레이아웃 버튼으로 현재 상태를 이름 붙여 저장하고 기본·자동 조회를 지정합니다.
무엇으로 만들었나
화면은 OpenUI5(sap_horizon 테마)로 만들었고, 서비스 쪽은 OData V2 계약을 따릅니다. 서비스는 차원·큐브·예정·원천 라인·레이아웃·변동 사유·감시 규칙 같은 엔티티셋 16개와 요인분해·해설·에이전트 실행 펑션 3개로 나뉩니다. 이 구성을 운영의 CDS 서비스로 바꿀 때 화면 코드는 그대로 두고 서비스 주소만 바꾸는 것이 목표입니다.
| 자리 | 무엇 | 왜 그렇게 두었나 |
|---|---|---|
| 화면 컨트롤 | 피벗은 트리 테이블, 차트는 SVG 로 직접 그림, 대화상자 다섯 개(원천 라인·사유·레이아웃·AI·에이전트) | 외부 차트 라이브러리 없이 표준 컨트롤만 써서 사내망 반입 심사 대상을 줄입니다. |
| 집계·판정 로직 | 브라우저의 큐브 묶기 모듈(축 이동·접기·다중 선택)과 서비스의 계산 모듈(요인분해·해설·에이전트·검산) | 숫자는 서비스가 계산하고 화면은 합산과 배치만 합니다. 축을 바꿔도 서버를 다시 부르지 않습니다. |
| OData 구성 | OData V2 모델을 묶음 요청 없이 엔티티셋별로 읽고, 쓰기는 생성·수정·삭제, 계산은 펑션 호출로 나눕니다. 서비스 주소는 코드에 박지 않고 설정 한 곳에서 읽습니다. | 운영 서비스로 옮길 때 바꿀 곳이 한 곳이어야 합니다. 서비스 응답 문제는 한 곳에서 메시지로 띄웁니다. |
| 내보내기 | CSV 와 PowerPoint 는 브라우저에서 만듭니다. | 서버에 파일을 남기지 않고, 외부 라이브러리 없이 zip 과 XML 로 짓습니다. |
| 테마 | sap_horizon | SAP 표준 화면과 같은 결을 유지해 현업이 낯설어하지 않게 합니다. |
| 항목 | 내용 |
|---|---|
| 솔루션 | 수입 솔루션 |
| 업무 영역 | 수입 — 입항 후 하역·보관·내륙 운송 물류비 |
| 관련 기준서 · 대상 영역 | - · 수입 입항 후 물류비 |
| SAP 표준 T-code | ME23N · MIGO · MIRO · MB51 · FBL1N |
| 화면 성격 | 다차원 분석 리포트 — 큐브 조회, 축 전환, 드릴스루, 기준 대비 차이·요인분해, 변동 사유·레이아웃 저장, AI 해설·에이전트 |
| 검증용 샘플 데이터 | 가상 반출 라인 3,028건 → 큐브 1,677칸 (회사코드 1000, 입항월 2026.04~2026.09) |
| 테마 | sap_horizon |
SAP 표준 기능을 그대로 이어받은 부분 — 구매오더 품목, 입고·자재 문서 이동, 송장 라인, 공급업체 마스터가 가진 데이터 구조를 그대로 이어받아 확장했습니다. 표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·검증 관점을 더합니다.
처음 열었을 때 — 조회 전에도 틀이 먼저 보입니다
조회 버튼을 누르기 전에도 조회조건, 레이아웃 보드, 피벗 틀이 먼저 보입니다. 조회하면 큐브를 한 번 읽어 표와 차트가 같이 그려지고, 머리 영역은 접어서 요약 한 줄만 남길 수 있습니다.

회사코드 1000과 2026.04~2026.09가 기본값이며 조회 버튼은 조회조건 영역 오른쪽 끝에 있습니다. 조회 전에는 칸 수가 0으로 표시됩니다.

조회하면 큐브를 한 번 읽어 운송·보관 업체 × 보관 방식 행과 입항월 열로 표가 그려지고 왼쪽에 업체별 막대 차트가 붙습니다. 칸 수 1,677은 큐브에서 묶인 조합 수이고, 상단 검산 줄은 큐브 합계와 원천 라인 합계의 차이 0을 보여 줍니다.

서버를 다시 부르지 않았고 총합은 그대로입니다. 차트는 열 축이 있어 묶음 막대로 바뀝니다.

조회조건, 분석 축, 임원 요약을 접으면 요약 한 줄만 남고 표와 차트가 화면 대부분을 씁니다. 접힘 상태는 레이아웃에 함께 저장됩니다.
경영 요약 — 역할을 바꾸면 보는 지표가 바뀝니다
같은 조회 결과를 두고 역할 네 가지(CFO · 구매 책임자 · 자금 책임자 · 물류 책임자)를 바꾸면 앞세우는 지표와 쪼개 보는 차원이 함께 바뀝니다. 다시 조회하지 않습니다.

물류비 5,515.9 백만원은 예정 4,587.6 대비 +928.3입니다. 붉은 숫자는 비용이 예정보다 늘어난 방향입니다.

구매 책임자는 반출 지연율, 평균 보관 일수를 앞세우고 공급사별로 예정 초과 상위를 봅니다. 지연율 48.51%는 반출 라인 3,028건 중 예정 반출일을 넘긴 1,469건의 비율입니다.

자금 책임자는 물류비 합계와 보관료 비중, 입방미터당 하역비를 앞세우고 업체별 비용을 봅니다. 지급 예정 금액을 업체 단위로 가늠할 때 쓰는 관점입니다.

물류 책임자는 평균 보관 일수와 운송비 비중을 앞세우고 입항지별로 봅니다. 보관 일수가 예정보다 길어진 입항지가 위로 올라옵니다.
축 전환과 범위 — 끌어다 놓으면 브라우저에서 바로 다시 묶입니다
차원 칩을 행 축·열 축으로 끌어다 놓거나 화살표 버튼으로 옮기면 서버를 다시 부르지 않고 브라우저에 읽어 둔 큐브를 다시 묶습니다. 행은 최대 3단계, 열은 최대 2단계이고 총합은 어떤 배치에서도 같습니다.

열에 분기와 보관 방식을 함께 놓으면 열 머리글이 두 단계 조합으로 늘어납니다. 열 조합이 36개를 넘으면 추가가 막히고 범위를 좁히라는 안내가 뜹니다.

같은 차원 안에서는 또는, 차원 사이에서는 그리고로 묶입니다. 큐브에 있는 값만 올라옵니다.

입항지에서 부산항과 인천항을 고른 상태입니다. 적용하면 같은 큐브를 브라우저에서 걸러 다시 묶으며, 조회조건 요약에 선택한 차원 수가 표시됩니다.

두 입항지만 남긴 결과입니다. 합계는 선택 범위 기준으로 다시 계산되고, 검산 줄은 큐브 전체 범위 기준으로 유지됩니다.

표와 차트 사이 손잡이를 끌어 너비를 조절합니다. 조절한 너비는 브라우저가 기억해 다음에 열 때도 같은 비율로 시작합니다.
칸에서 원천 문서까지 — 금액을 만든 반출 라인으로 내려갑니다
표의 칸을 누르면 그 금액을 만든 반출 라인(원천 문서 라인)이 열립니다. 행 경로와 열 조합이 조건이 되고, 칸의 값과 읽은 라인의 합이 같은지 머리에 표시합니다.

운송·보관 업체 K01의 2026.04 칸(196.9 백만원)을 누른 화면입니다. 칸의 값 196.9와 읽은 라인 합 196.9가 같다는 표시와 함께 101건 중 101건을 읽었다고 알려 줍니다.

라인 표에는 반출 번호, 품목, 공급사, 업체, 보관 방식, 운송 거리 구간, 보관 일수 구간, 입고 플랜트, 상태가 나옵니다. 기본 500행씩 읽고 더 읽기로 이어 봅니다.

검산 영역에는 측정값별 큐브 합계와 원천 라인 합계, 차이가 나옵니다. 아래 입항월 요약은 월별 라인 수, 반출 문서 수, 화물 가액, 물류비, 예정 물류비, 반출 지연 건수입니다.
계산항목 — 전기되지 않는 단계를 식으로 정의해 행으로 만듭니다
물류비율, 입방미터당 비용, 보관료 비중처럼 전표에 남지 않는 단계는 토큰 식으로 정의해 표시 항목으로 고릅니다. 식은 서비스가 계산하고 화면은 합산과 배치만 합니다.

표시 항목을 물류비율(%)로 바꾸면 행은 업체, 열은 분기로 같은 큐브가 비율로 다시 계산됩니다. 비율은 합산이 아니라 분자와 분모를 각각 합한 뒤 나눈 값입니다.

입방미터당 물류비를 입항지 · 자재그룹 행과 화물 형태 열로 본 화면입니다. 열 축을 세우면 계산항목도 열로 늘어납니다.
기준 대비 차이 — 예정 대비 실적이 같은 표 안에서 요인으로 나뉩니다
비교를 예정으로 바꾸면 칸마다 실적 · 예정 · 차이 · 차이율이 나타납니다. 금액과 비율 임계를 둘 다 넘는 칸만 색이 칠해지고, 총차이는 요인별 워터폴로 나뉘며 요인 합과 총차이의 검산 줄이 매번 0으로 표시됩니다.

비교를 예정으로 바꾸면 분기 열 뒤에 예정 · 실적 · 차이 · 차이율 열이 붙습니다. 금액 임계 1,000,000원과 비율 임계 10%를 둘 다 넘는 칸만 붉게 표시되어, 같은 증가라도 규모가 작으면 칠하지 않습니다.

차이 난 행의 사유 버튼을 누르면 사유 구분과 내용을 적는 창이 열립니다. 사유 구분은 물량 · 하역 단가 · 보관 요율 · 보관 일수 · 운송 단가 · 수수료 · 미계획 입항 중에서 고릅니다.

저장하면 그 행의 버튼이 사유 있음으로 바뀝니다. 키가 조회 범위와 행 경로라서 다음 기간에도 따라오며, CSV와 AI 근거에 함께 실립니다.

예정 4,587.6에서 실적 5,515.9까지를 반출 물량 +46.3, 하역 단가 +58.6, 보관 요율 +60.7, 보관 일수 +232.9, 운송 단가 +131.2, 검수·반출 수수료 +1.9, 미계획 입항 +396.6으로 이은 워터폴입니다. 요인 합 − 총차이 = 0원 검산 줄이 매번 나옵니다.

차이 모드에서 행 이름을 누르면 그 행 범위로 요인분해가 다시 계산됩니다. 범위가 좁아져도 요인 합은 그 범위의 총차이와 같습니다.
AI 분석과 보고서 — 규칙 기반 해설과 PPTX 보고서
현재 범위를 읽어 요약과 점검 대상을 문장으로 정리합니다. 기본은 규칙 기반 해설이고 숫자는 서버가 계산한 값만 씁니다. 해설에 쓴 근거 표를 펼쳐 볼 수 있고, 같은 범위의 표와 차트를 PowerPoint 보고서로 브라우저에서 만들어 내려받습니다.

맨 위 안내처럼 외부 AI 서비스를 부르지 않고 서버가 읽은 수치를 정해진 규칙으로 문장으로 옮깁니다. 이미 사유가 적힌 차이는 건너뜁니다.

해설 문장의 숫자는 모두 이 표에서 나옵니다. AI는 숫자를 만들지 않습니다.

PPTX 보고서 버튼을 누르면 현재 범위의 요약 · 점검 대상 · 워터폴 · 요인표를 담은 PowerPoint 파일을 브라우저에서 만들어 내려받습니다. 외부 라이브러리 없이 만듭니다.
AI 에이전트 — 감시 규칙 · 대기함 · 실행 기록
감시 규칙(임계값 · 받을 역할)에 걸린 항목을 받을 역할 관점의 보고로 대기함에 올립니다. 하루 한 번 제한은 서버가 판정하고, 걸린 것이 없어도 실행 기록이 남습니다.

임계값을 바꾸고 저장하면 다음 실행부터 적용됩니다. 열어 둔 동안 한 시간마다 실행하는 옵션은 기본 꺼져 있습니다.

지금 실행하면 걸린 규칙 여섯 건이 받을 역할 관점의 보고로 대기함에 올라옵니다. 각 보고에는 근거가 되는 업체 · 지표 · 임계값이 붙습니다.

같은 날 두 번째 실행은 한도에 걸려 LIMITED로 기록되고 새 보고를 올리지 않습니다. 이 판정은 서버가 합니다.
레이아웃 저장과 복원 — 기본과 자동 조회로 열면 조회된 채 시작합니다
축 · 조회조건 · 표시 항목 · 표시 행 수 · 접힘 상태를 이름 붙여 저장하고, 기본 레이아웃과 자동 조회를 지정하면 열 때 바로 조회된 상태로 시작합니다.

현재 축 · 조회조건 · 표시 항목 · 접힘 상태를 이름을 붙여 저장합니다. 기본과 자동 조회를 함께 지정할 수 있고, 목록에서 적용 · 이름 바꾸기 · 삭제를 관리합니다.

기본 + 자동 조회로 저장한 레이아웃은 화면을 새로 열면 조회가 이미 끝난 상태로 시작합니다. 저장한 축(입항지 · 자재그룹 / 분기)과 표시 항목(입방미터당 물류비)이 그대로 복원됩니다.
좁은 화면과 범위 상한 — 반쯤 그린 표 대신 안내를 띄웁니다
좁은 화면에서는 차트가 표 아래로 내려갑니다. 행·열 조합이 상한(열 36개)을 넘으면 반쯤 그린 표 대신 범위를 좁히라는 안내가 뜹니다.

좁은 화면에서는 표가 위, 차트가 아래로 쌓이고 머리 영역 버튼은 더보기 메뉴로 접힙니다. 표는 가로로 넘겨 봅니다.

열 조합이 72개로 상한 36개를 넘으면 표를 그리지 않고 열 축을 줄이거나 차원 값을 골라 범위를 좁히라는 안내를 띄웁니다.
화면 뒤에서 일어나는 일
조회 버튼을 누르면 화면은 큐브와 예정을 한 번씩 읽습니다. 이후의 축 이동·접기·펼치기·다중 선택은 브라우저에 읽어 둔 큐브를 다시 묶는 일이라 서버를 부르지 않습니다. 서버를 다시 부르는 것은 칸을 눌러 원천 라인을 읽을 때, 요인분해·해설·에이전트 같은 계산 펑션을 부를 때, 변동 사유·레이아웃을 저장할 때뿐입니다.
| 단계 | 무슨 일이 일어나나 | 어디서 |
|---|---|---|
| ① 조회 | 회사코드·입항월 범위로 큐브 행과 예정 행을 읽습니다. 큐브 행에는 측정값 9종(건수·물량·화물 가액·하역비·보관료·운송비·수수료·반출 지연 건수·보관 일수)이 들어 있습니다. | 서비스 → 브라우저 |
| ② 묶기 | 행 축·열 축 조합대로 큐브를 다시 묶어 트리 구조를 만들고 총합을 계산합니다. 열 조합이 36개를 넘으면 그리지 않고 안내합니다. | 브라우저 |
| ③ 검산 | 큐브 합계와 원천 라인 합계의 차이를 측정값별로 보여 줍니다. 차이는 항상 0이어야 하고, 아니면 점검이 필요합니다. | 서비스 |
| ④ 드릴스루 | 칸의 행 경로·열 조합을 조건으로 원천 라인을 읽습니다. 기본 500행씩 읽고 더 읽기로 이어 봅니다. | 서비스 → 브라우저 |
| ⑤ 차이 계산 | 비교를 예정으로 바꾸면 같은 칸의 예정을 얹어 차이·차이율을 구하고, 요인분해는 서비스의 계산 펑션이 합니다. | 브라우저 · 서비스 |
물류비 산식과 점검 규칙 — 판정이 아니라 점검 후보를 알려 줍니다
이 화면은 점검을 돕는 조회 도구이며 판단을 단정하지 않습니다. 아래 규칙의 결과는 모두 점검 필요·확인 필요 수준의 안내입니다.
| 규칙 | 판정 조건 | 결과 표시 | 사용자 조치 |
|---|---|---|---|
| 물류비 산식 | 하역비 = 물량 × 하역 단가, 보관료 = 물량 × 보관 요율 × 보관 일수, 내륙 운송비 = 물량 × 운송 단가, 수수료 = 건당 금액 | 물류비 합계 = 네 가지의 합 | 원천 라인으로 내려가 단가·일수 확인 |
| 차이 색칠 | 차이 금액이 금액 임계 이상이고 차이율도 비율 임계 이상일 때만 | 비용 증가 방향 붉은색, 감소 방향 초록색 | 임계를 화면에서 조정하며 점검 대상 범위를 좁힘 |
| 요인분해 | 예정 값에서 요인을 하나씩 실적 값으로 바꿔 가며 순서대로 차이를 계산 | 요인별 막대 + 검산 줄(요인 합 − 총차이) | 검산이 0이 아니면 점검 필요 |
| 변동 사유 | 차이 난 행에 사유 구분·내용 저장 | 링크가 사유 있음으로 바뀜 | 다음 기간에도 같은 행에 따라옴 |
| AI 해설 | 사유가 없는 차이를 큰 순서로 정렬해 주된 요인과 함께 문장화 | 요약·점검 대상·근거 표 | 사유 확인 필요 항목에 사유 입력 |
| 에이전트 규칙 | 평균 보관 일수 상한, 공급사 예정 반출일 초과율 상한, 자재그룹별 물류비 예정 초과율, 보관 요율·보관 일수·운송 단가 요인 영향 임계 | 받을 역할별 대기함 보고, 보고의 근거 업체·지표 점검 | 하루 한 번 제한 — 같은 날 두 번째 실행은 LIMITED, 새 보고 없음 |
미계획 입항은 예정(구매오더 기준 계획)에 없는 입항 라인의 물류비 전액입니다. 샘플 데이터의 예정은 가정값입니다.
입항 후 흐름과 데이터 지점, 대사식
| 단계 | 무슨 일이 일어나나 | SAP 데이터 지점 | 이 화면의 위치 |
|---|---|---|---|
| ① 구매오더·예정 | 구매오더 조건으로 예정 반출일·예정 단가를 둡니다 | 구매오더(ME23N) | 예정 |
| ② 입항·입고 | 입항월 기준으로 입고가 전기됩니다 | 입고 전표(MIGO) · 자재 문서(MB51) | 입항월 차원 |
| ③ 하역·보관·내륙 운송 | 업체별로 하역·보관·운송 청구가 생깁니다 | 송장 검증(MIRO) · 공급업체 항목(FBL1N) | 업체·보관 방식·운송 거리 구간 |
| ④ 반출 | 반출일이 정해지고 보관 일수가 확정됩니다 | 자재 문서 이동 | 보관 일수 구간·반출 지연 건수 |
- 원천 라인 금액 = 물량 × 단가(하역·운송), 물량 × 요율 × 일수(보관), 건당 수수료. 라인 합계 = 네 가지의 합.
- 큐브 합계 = 원천 라인 합계(측정값 · 입항월별). 차이는 검산표에 항상 표시합니다.
- 예정 큐브 합계 = 예정 라인 합계(예정에 있는 라인만).
- 계산항목 = 분자와 분모를 각각 합산한 뒤 식에 따라 계산(비율·단가는 칸마다 평균을 내지 않음).
- 요인 합 = 총차이(실적 − 예정). 같은 범위에서 매번 검산합니다.
- 드릴스루 합계 = 칸 금액.
조회조건
| 항목 | 필수 | 기본값 | 전달 방식 |
|---|---|---|---|
| 회사코드 | 필수 | 1000 | Bukrs eq '1000' |
| 시작 기간 · 종료 기간 | 필수 | 2026.04 · 2026.09 | Period ge '202604' and Period le '202609' |
| 차원 값(11개 차원) | 선택 | 전체 | 브라우저에서 걸러 다시 묶음(차원 안 또는, 차원 간 그리고) |
결과 컬럼
| 컬럼 | 의미 | 산출 |
|---|---|---|
| 열 머리글(입항월·분기 등) | 열 축에 놓은 차원 조합 | 열 조합 상한 36 |
| 합계 / 예정 · 실적 · 차이 · 차이율 | 행 범위의 값 | 차이 = 실적 − 예정, 차이율 = 차이 ÷ 예정 |
| 사유 | 변동 사유 입력·표시 | 행 경로에 묶여 저장 |
기능 버튼은 조회 · 초기화 · 차원 값 · 행 · 열 바꾸기 · 기본 축 · 펼치기 · 접기 · 요인 워터폴 · CSV · AI 분석 · AI 에이전트 · 레이아웃입니다. 상한을 넘는 축 조합은 표를 그리지 않고 안내를 띄웁니다.
좁은 화면에서 달라지는 것
- 차트가 표 아래로 내려가고 머리 영역 버튼은 더보기 메뉴로 접힙니다.
- 표는 가로로 넘겨 봅니다. 축 끌어다 놓기는 넓은 화면이 편하므로 좁은 화면은 읽는 용도로 둡니다.
- 행·열 조합이 상한(열 36개)을 넘으면 반쯤 그린 표 대신 범위를 좁히라는 안내가 뜹니다.
파일 구성
index.html · Component.js · manifest.json · readme.html
controller/ BaseController · Main.controller
view/ Main.view.xml · fragment/ (원천 라인 · 사유 · 레이아웃 · AI · 에이전트)
model/ ErrorHandler · chart · cube · formatter · layout · pptx
css/ · i18n/ 스타일 · 한국어 문구
media/ 소개 영상 · 포스터 · 재생 지점
odata/ 서비스 정의 · 계산 로직 · 엔티티셋별 샘플 데이터
SAP 표준 기능 확장 포인트 — 표준 T-code 와 어떻게 연계되는지
표준 실행은 SAP 표준 T-code 가 담당하고, 이 화면은 조회·검증 관점을 더해 확장합니다. 아래는 표준 화면으로 충분한 일과 이 화면이 더하는 관점을 나란히 놓은 것입니다.
표준으로 되는 것과 안 되는 것
| 하고 싶은 일 | SAP 표준 | 표준에서 걸리는 자리 | 이 앱이 하는 일 |
|---|---|---|---|
| 구매오더 예정 확인 | ME23N | 오더 한 건씩 확인하는 화면이라 업체·입항지 합계는 따로 묶어야 합니다 | 예정을 같은 차원 조합의 큐브에 얹어 실적과 나란히 봅니다 |
| 입고·자재 문서 대조 | MIGO · MB51 | 문서 목록 단위라 입항월·플랜트 합계는 따로 묶어야 합니다 | 입항월·입고 플랜트 차원으로 묶고 보관 일수를 만듭니다 |
| 청구 금액 확인 | MIRO | 송장 단위로 확인합니다 | 비용을 하역·보관·운송·수수료로 갈라 합산합니다 |
| 업체별 미결·결제 | FBL1N | 항목 단위라 물류비 묶음별 비교는 따로 해야 합니다 | 업체별 비용을 같은 표에서 나란히 봅니다 |
| 차이의 요인 분해 | - | 표준 화면에서 바로 제공되는지 확인 필요, 보통 엑셀로 만듭니다 | 일곱 요인으로 가르고 합계를 검산합니다 |
| 차이 사유 기록 | - | 집계 행에 사유를 붙일 자리가 있는지 확인 필요 | 조회 범위 + 행 경로를 키로 남깁니다 |
| 점검 알림 | SM36 | 배치 잡은 돌지만 누구에게 어떤 항목을 보낼지는 사람이 정합니다 | 규칙마다 임계값과 받을 역할이 붙어 있습니다 |
T-code 별 연계 지점
| T-code | 이름 | 이어받는 데이터와 대조 지점 | 오가는 방법과 표준에 남길 일 |
|---|---|---|---|
ME23N | 구매오더 조회 | 구매오더 품목의 공급사·자재그룹·플랜트·예정 조건(같은 테이블·필드)을 이어받습니다. 예정 큐브 합계와 구매오더 조건의 예정 금액을 대조합니다. | 이 앱의 드릴스루 라인에서 구매오더 번호를 들고 ME23N 으로 확인합니다. 계약 조건 변경 같은 실행은 표준에 남깁니다. |
MIGO | 입고 처리 | 입고 전표의 전기일과 수량을 입항월·반출 물량으로 이어받습니다. 입고 문서의 전기일이 입항월과 같은지 대조합니다. | 라인의 입고 문서에서 MIGO 로 전표를 확인합니다. 입고 전기·취소는 표준에서 합니다. |
MIRO | 송장 검증 | 송장 라인의 조건별 금액을 하역·보관·운송·수수료로 갈라 이어받습니다. 송장 합계와 큐브 비용 네 가지의 합을 대조합니다. | 청구 금액이 의심되면 라인의 송장 번호로 MIRO 의 송장을 확인합니다. 송장 입력·지급 차단은 표준에서 합니다. |
MB51 | 자재 문서 목록 | 입고·반출 이동의 수량과 전기일로 보관 일수와 반출 지연 여부를 만듭니다. 이동 수량 합과 반출 물량을 대조합니다. | 보관 일수가 길게 나온 라인의 이동 내역을 MB51 목록에서 확인합니다. |
FBL1N | 공급업체 항목 조회 | 운송·보관 업체의 항목을 업체 차원으로 이어받습니다. 업체별 미결·결제 항목과 이 화면의 업체별 비용을 맞춰 봅니다. | 업체별 금액이 표준과 다르면 FBL1N 의 업체 항목에서 원인을 찾습니다. 지급 실행은 표준에서 합니다. |
운영 전환 때 "기존 리포트를 없애야 하나" 는 질문에는 없애지 않아도 됩니다가 답입니다. 법정·감사·세무 대응은 표준 기능에 남기고, 이 화면의 값이 위 대조 지점에서 표준 화면과 맞는 것을 한 분기 이상 확인한 뒤 기존 분석용 엑셀부터 줄이는 순서를 권합니다.
S/4HANA 분석 스택과의 자리
S/4HANA 에는 표준 CDS 분석 쿼리, Fiori 분석 앱, Analysis for Office 같은 분석 도구가 있습니다. 이 화면은 그것들을 대신하려는 것이 아니라, 입항 후 물류비라는 좁은 질문에 맞춰 예정과의 요인분해, 행에 남는 사유, 점검 에이전트를 한 화면에 모은 것입니다. 같은 질문에 답하는 표준 분석 앱이 고객사 버전에 이미 있는지는 릴리스마다 달라 확인 필요이며, 있다면 그 앱의 데이터와 이 화면의 큐브를 같은 원천에서 읽도록 맞추는 것이 좋습니다. 이 글의 CDS 구성은 구매 오더·송장·자재 문서 테이블을 직접 읽는 형태로 썼고, 쓸 수 있는 표준 CDS 뷰의 이름은 고객사 버전에서 확인해 바꾸는 것을 전제로 했습니다.
확장 포인트 — 운영에서 실제로 손대는 자리
| 자리 | 무엇을 손대나 | 영향 |
|---|---|---|
| 조건 유형 매핑 | 송장 조건 유형이 하역·보관·운송·수수료 중 어디인지 | 비용 네 가지의 크기가 달라짐. 효력 시작일로 과거 기간 보호 |
| 차원 출처 | 입항지·보관 방식·운송 거리 구간·화물 형태를 확장 필드 또는 매핑 테이블 중 무엇에서 읽을지 | 화면의 축 후보와 차원 값 목록 |
| 예정 원천 | 예정 단가·일수를 조건 레코드, 계약 단가표 중 무엇으로 삼을지 | 차이의 크기와 미계획 입항 요인의 몫 |
| 임계값 | 금액 임계·비율 임계, 감시 규칙의 임계 | 색칠과 에이전트 보고 건수 |
| 권한 | 플랜트·회사코드 권한 객체와 역할 설계 | 어느 사용자가 어느 행을 보는지 |
| BAdI·확장 필드 | 라인 단계에서 계산 로직이나 고객 필드를 더할 자리 | 라인 뷰와 큐브의 필드 구성 |
분석 지표 정의표
| 지표 | 산식 · 판정 기준 | 대응 기능 | 원천 데이터 | 비고 |
|---|---|---|---|---|
| 물류비 합계 | 하역비 + 보관료 + 내륙 운송비 + 수수료 | 표시 항목, 요인분해 | 청구 라인 금액 | 원화 |
| 물류비율 | 물류비 합계 ÷ 화물 가액 × 100 | 계산항목 | 청구 라인, 입고 가액 | 비율은 합산 후 계산 |
| 입방미터당 물류비 | 물류비 합계 ÷ 반출 물량 | 계산항목 | 반출 물량 | 원/입방미터. 입방미터 환산은 확인 필요 |
| 평균 보관 일수 | 보관 일수 합 ÷ 반출 라인 건수 | 물류 책임자 요약 | 입고일·반출일 | 일 |
| 반출 지연율 | 예정 반출일을 넘긴 라인 ÷ 반출 라인 × 100 | 구매 책임자 요약 | 예정 반출일·반출일 | 점검 필요 판정 아님 |
CDS 구성 — 코드와 운영 작업
화면이 읽는 샘플 서비스를 운영의 CDS 서비스로 바꾸는 방법을 정리했습니다. 아래 코드는 구조를 보여 주는 예시이며, 표준 CDS 뷰의 이름이 고객사 버전에서 확인되지 않은 부분은 원천 테이블 기준으로 썼고 확인 필요로 표시했습니다.
뷰 레이어 구성
| 레이어 | 뷰 | 하는 일 | 왜 나누나 |
|---|---|---|---|
| 기준 | 조건 유형 매핑 테이블 | 송장 조건 유형 → 비용 묶음 | 코드에 조건 유형을 박지 않고 데이터로 둡니다 |
| 라인 | 반출 라인 뷰 | 입고·청구를 반출 라인 한 줄로 | 집계와 드릴스루가 같은 뷰를 읽어야 합계가 맞습니다 |
| 차원 | 업체 등 차원 뷰 | 코드 + 이름 | 이름 조인이 집계 비용을 키우지 않게 association 으로만 잇습니다 |
| 큐브 | 큐브 뷰 · 예정 뷰 | 차원 조합별 합계 · 예정 | 합산 가능한 값만 두고 비율은 화면에서 계산 |
| 쿼리 | 분석 쿼리 뷰 | 기본 축 · 필수 필터 | 필터 없는 전체 읽기를 막습니다 |
| 권한 | DCL | 플랜트 권한 | 집계 전에 행을 걸러 합계가 새지 않게 합니다 |
| 서비스 | 서비스 정의 · 바인딩 | OData V2 게시 | 화면이 부르는 단 하나의 문 |
① 조건 유형 매핑 테이블 — 어떤 청구 조건이 어느 비용 묶음인가
입항 후 물류비 분석에서 가장 먼저 정해지는 것은 코드가 아니라 매핑입니다. 송장 라인의 조건 유형(하역료·보관료·내륙 운송료·검수 수수료…)이 네 가지 비용 묶음 중 어디에 속하는지는 회사마다 다르고, 이 테이블이 그 기준입니다. 효력 시작일을 두어 매핑이 바뀌어도 과거 기간 숫자가 흔들리지 않게 합니다.
" ───────────────────────────────────────────────────────────────
" 이름 : ZIMP_CHGKEY (입항 후 물류비 조건 유형 매핑)
" 역할 : 송장 라인의 조건 유형 → 비용 묶음(HAND/STORE/HAUL/MISC)
" 이렇게 나눈 이유 : 코드에 조건 유형을 박으면 새 부대비용이 생길 때마다
" 뷰를 고쳐 이송해야 한다. 매핑은 데이터로 둔다.
" 확인 필요 : 조건 유형 코드 체계는 고객사 설정에 따른다.
" ───────────────────────────────────────────────────────────────
@EndUserText.label : '입항 후 물류비 조건 유형 매핑'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C
@AbapCatalog.dataMaintenance : #ALLOWED
define table zimp_chgkey {
key client : abap.clnt not null;
key bukrs : bukrs not null;
key cond_type : abap.char(4) not null;
key valid_from : abap.dats not null;
cost_kind : abap.char(5) not null; " HAND | STORE | HAUL | MISC
valid_to : abap.dats;
note : abap.char(60);
}
② 라인 뷰 — 반출 라인 한 줄이 비용 네 가지를 갖는다
큐브의 바닥은 반출 라인입니다. 송장 라인을 매핑 테이블로 비용 묶음에 나누고, 같은 구매오더 품목의 입고·반출 이동과 이어 보관 일수를 구합니다. 이 뷰에서 정해지는 것은 "한 줄이 무엇인가" 이고, 이후 모든 합계는 이 줄의 합입니다.
" ───────────────────────────────────────────────────────────────
" 이름 : ZI_ImpHaulLine
" 역할 : 입고 라인 + 청구 라인 → 반출 라인(비용 4종 · 보관 일수)
" 이렇게 나눈 이유 : 집계(큐브)와 라인 단위 드릴스루가 같은 뷰를 읽어야
" 칸 금액과 라인 합계가 같아진다.
" 보조 뷰 : ZI_ImpHaulMove 는 입고·반출 자재 문서 이동에서 보관 일수와
" 예정 반출일 초과 표시를 만드는 같은 모양의 뷰다.
" 확인 필요 : 청구 라인과 입고 라인의 연결 키(구매오더 이력 기준 여부)는
" 고객사의 송장 입력 방식에 따라 다르다.
" ───────────────────────────────────────────────────────────────
@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: '입항 후 물류비 라인'
define view entity ZI_ImpHaulLine
as select from rseg
inner join rbkp on rbkp.belnr = rseg.belnr
and rbkp.gjahr = rseg.gjahr
inner join ekpo on ekpo.ebeln = rseg.ebeln
and ekpo.ebelp = rseg.ebelp
inner join ekko on ekko.ebeln = ekpo.ebeln
inner join zimp_chgkey as map
on map.bukrs = rbkp.bukrs
and map.cond_type = rseg.cond_type
left outer join ZI_ImpHaulMove as mv
on mv.PoNo = rseg.ebeln
and mv.PoItem = rseg.ebelp
{
key rseg.belnr as InvoiceNo,
key rseg.gjahr as InvoiceYear,
key rseg.buzei as InvoiceItem,
rbkp.bukrs as Bukrs,
rbkp.budat as PostingDate,
mv.StorageDays as StorageDays,
mv.IsLate as IsLate,
ekko.lifnr as Supplier,
ekpo.matkl as MatGrp,
ekpo.werks as Plant,
rbkp.lifnr as Carrier,
map.cost_kind as CostKind,
@Semantics.amount.currencyCode: 'Waers'
rseg.wrbtr as Amount,
rbkp.waers as Waers,
@Semantics.quantity.unitOfMeasure: 'Meins'
rseg.menge as Qty,
rseg.meins as Meins
}
where map.valid_from <= rbkp.budat
and ( map.valid_to is null or map.valid_to >= rbkp.budat )
③ 차원 뷰 — 업체와 입항지에 이름을 붙인다
큐브가 가진 것은 코드뿐이므로 화면에 보이는 이름은 차원 뷰의 텍스트 연결에서 옵니다. 운송·보관 업체는 공급업체 마스터에서, 입항지·보관 방식·운송 거리 구간은 고객사가 정하는 매핑 테이블에서 옵니다. 이 값은 표준 필드에 없어서 확인 필요 항목으로 도입 때 출처를 정합니다.
" ───────────────────────────────────────────────────────────────
" 이름 : ZI_ImpHaulCarrier
" 역할 : 운송·보관 업체 차원(코드 + 이름)
" 이렇게 나눈 이유 : 이름 조인을 큐브 안에서 하면 집계 비용이 커진다.
" 차원 뷰로 빼서 association 으로만 잇는다.
" 확인 필요 : 입항지·보관 방식·운송 거리 구간 차원은 확장 필드 또는
" 매핑 테이블이 출처다. 같은 모양의 차원 뷰를 하나씩 둔다.
" ───────────────────────────────────────────────────────────────
@AbapCatalog.viewEnhancementCategory: [#NONE]
@Analytics.dataCategory: #DIMENSION
@ObjectModel.representativeKey: 'Carrier'
@EndUserText.label: '운송·보관 업체'
define view entity ZI_ImpHaulCarrier
as select from lfa1
{
@ObjectModel.text.element: ['CarrierName']
key lifnr as Carrier,
@Semantics.text: true
name1 as CarrierName
}
④ 큐브 — 비용 4종과 반출 지연·보관 일수를 한 줄에
큐브는 라인을 차원 조합으로 더한 뷰입니다. 하역·보관·운송·수수료를 case 로 갈라 합산하고, 반출 지연 건수와 보관 일수까지 같이 둡니다. 화면의 물류비율·입방미터당 물류비는 여기서 비율로 만들지 않고 분자와 분모를 따로 내려 화면이 합산한 뒤 나눕니다.
" ───────────────────────────────────────────────────────────────
" 이름 : ZI_ImpHaulCube
" 역할 : 입항월 × 업체 × 입항지 × 자재그룹 … 별 비용 4종 합계
" 이렇게 나눈 이유 : 비율·단가를 큐브에서 만들면 칸마다 평균이 되어
" 합계와 어긋난다. 합산 가능한 값만 둔다.
" ───────────────────────────────────────────────────────────────
@AbapCatalog.viewEnhancementCategory: [#NONE]
@Analytics.dataCategory: #CUBE
@EndUserText.label: '입항 후 물류비 큐브'
@VDM.viewType: #COMPOSITE
define view entity ZI_ImpHaulCube
as select from ZI_ImpHaulLine as l
association [0..1] to ZI_ImpHaulCarrier as _Carrier
on $projection.Carrier = _Carrier.Carrier
{
key l.Bukrs,
key substring( l.PostingDate, 1, 6 ) as Period,
key l.Carrier,
key l.Supplier,
key l.MatGrp,
key l.Plant,
@Semantics.amount.currencyCode: 'Waers'
@DefaultAggregation: #SUM
sum( case l.CostKind when 'HAND' then l.Amount else 0 end ) as HandAmt,
@Semantics.amount.currencyCode: 'Waers'
@DefaultAggregation: #SUM
sum( case l.CostKind when 'STORE' then l.Amount else 0 end ) as StoreAmt,
@Semantics.amount.currencyCode: 'Waers'
@DefaultAggregation: #SUM
sum( case l.CostKind when 'HAUL' then l.Amount else 0 end ) as HaulAmt,
@Semantics.amount.currencyCode: 'Waers'
@DefaultAggregation: #SUM
sum( case l.CostKind when 'MISC' then l.Amount else 0 end ) as MiscAmt,
@DefaultAggregation: #SUM
sum( cast( l.StorageDays as abap.int4 ) ) as StorageDays,
@DefaultAggregation: #SUM
sum( case when l.IsLate = 'X' then 1 else 0 end ) as LateCount,
l.Waers,
_Carrier
}
group by l.Bukrs, substring( l.PostingDate, 1, 6 ), l.Carrier, l.Supplier,
l.MatGrp, l.Plant, l.Waers
⑤ 예정 뷰 — 같은 차원 조합에 예정 금액을 얹는다
예정은 전표에서 나오지 않는 유일한 자료입니다. 구매오더 조건에서 예정 물량·단가·보관 일수를 읽어 같은 차원 조합으로 집계합니다. 예정에 없는 입항 라인은 이 뷰에 행이 없으므로 화면이 "미계획 입항" 요인으로 따로 세웁니다. 예정의 원천을 무엇으로 삼을지는 도입 때 가장 먼저 합의할 항목입니다.
" ───────────────────────────────────────────────────────────────
" 이름 : ZI_ImpHaulPlan
" 역할 : 구매오더 조건 기준 예정 물류비(물량 × 예정 단가 × 예정 일수)
" 이렇게 나눈 이유 : 실적 큐브와 키를 똑같이 맞추면 차이 계산이
" 조인 없이 같은 칸끼리의 뺄셈이 된다.
" 보조 테이블 : zimp_plancond 는 구매오더 품목별 예정 물량·단가·일수를
" 적재하는 매핑 테이블(① 과 같은 방식으로 정의).
" 확인 필요 : 예정 단가의 원천(조건 레코드, 계약 단가표)은 고객사 정책.
" ───────────────────────────────────────────────────────────────
@AbapCatalog.viewEnhancementCategory: [#NONE]
@Analytics.dataCategory: #CUBE
@EndUserText.label: '입항 후 물류비 예정'
define view entity ZI_ImpHaulPlan
as select from ekpo
inner join ekko on ekko.ebeln = ekpo.ebeln
inner join zimp_plancond as pc
on pc.ebeln = ekpo.ebeln
and pc.ebelp = ekpo.ebelp
{
key ekko.bukrs as Bukrs,
key pc.plan_period as Period,
key pc.carrier as Carrier,
key ekko.lifnr as Supplier,
key ekpo.matkl as MatGrp,
key ekpo.werks as Plant,
@Semantics.amount.currencyCode: 'Waers'
@DefaultAggregation: #SUM
sum( pc.plan_qty * pc.plan_rate * pc.plan_days ) as PlanAmt,
ekko.waers as Waers
}
group by ekko.bukrs, pc.plan_period, pc.carrier, ekko.lifnr,
ekpo.matkl, ekpo.werks, ekko.waers
⑥ 분석 쿼리 — 어떤 축을 기본으로 열 것인가
쿼리는 큐브 위에서 처음 열었을 때의 모습과 필터를 정합니다. 행에는 업체, 열에는 입항월을 두고 회사코드·기간을 필수 필터로 잡습니다. 화면에서 축을 끌어다 놓는 것은 이 기본값을 바꾸는 일이며 쿼리를 다시 만들지 않습니다.
" ───────────────────────────────────────────────────────────────
" 이름 : ZC_ImpHaulQuery
" 역할 : 기본 축 · 필수 필터 · 화면 노출 필드
" 이렇게 나눈 이유 : 큐브를 직접 노출하면 필터 없이 전체를 읽는 호출이
" 생긴다. 쿼리에서 회사코드·기간을 필수로 잡는다.
" ───────────────────────────────────────────────────────────────
@AbapCatalog.viewEnhancementCategory: [#NONE]
@Analytics.query: true
@EndUserText.label: '입항 후 물류비 분석'
@ObjectModel.usageType: { serviceQuality: #D, sizeCategory: #XL, dataClass: #TRANSACTIONAL }
define view entity ZC_ImpHaulQuery
as select from ZI_ImpHaulCube
{
@AnalyticsDetails.query.axis: #FREE
@Consumption.filter: { selectionType: #SINGLE, mandatory: true }
key Bukrs,
@AnalyticsDetails.query.axis: #COLUMNS
@Consumption.filter: { selectionType: #INTERVAL, mandatory: true }
key Period,
@AnalyticsDetails.query.axis: #ROWS
key Carrier,
@AnalyticsDetails.query.axis: #FREE
key Supplier,
@AnalyticsDetails.query.axis: #FREE
key MatGrp,
@AnalyticsDetails.query.axis: #FREE
key Plant,
@AnalyticsDetails.query.axis: #COLUMNS
HandAmt,
@AnalyticsDetails.query.axis: #COLUMNS
StoreAmt,
@AnalyticsDetails.query.axis: #COLUMNS
HaulAmt,
@AnalyticsDetails.query.axis: #COLUMNS
MiscAmt,
StorageDays,
LateCount,
Waers
}
⑦ 권한 — 집계 단계에서 플랜트 권한을 건다
권한은 드릴스루가 아니라 큐브 집계 단계에 겁니다. 드릴스루에만 걸면 전사 합계에서 허용된 몫을 빼는 방식으로 남의 플랜트 숫자를 알아낼 수 있습니다. 어떤 권한 객체와 필드를 쓸지는 고객사 역할 설계에 맞춰 확정해야 하므로 아래 예시는 확인 필요 상태의 출발점입니다.
" ───────────────────────────────────────────────────────────────
" 이름 : ZI_ImpHaulCube 용 DCL
" 역할 : 구매 오더 플랜트 권한이 있는 사용자만 해당 플랜트 행을 본다
" 이렇게 나눈 이유 : 집계 전에 행을 걸러야 합계가 새지 않는다.
" 확인 필요 : 권한 객체·필드·활동 값은 고객사 역할 설계에 맞춘다.
" ───────────────────────────────────────────────────────────────
@EndUserText.label: '입항 후 물류비 큐브 권한'
@MappingRole: true
define role ZI_ImpHaulCube {
grant select on ZI_ImpHaulCube
where ( Plant ) = aspect pfcg_auth( M_BEST_WRK, WERKS, ACTVT = '03' );
}
⑧ 서비스 정의와 바인딩 — 화면이 부르는 문
마지막으로 쿼리를 서비스로 노출합니다. 서비스 정의에서 무엇을 내보낼지 정하고, 바인딩에서 OData V2 로 게시합니다. 게시 후 화면의 서비스 주소만 바꾸면 샘플 서비스에서 운영 서비스로 옮겨 갑니다. 변동 사유·레이아웃처럼 화면이 쓰는 쪽 엔티티는 같은 서비스에 RAP 로 함께 둘 수 있습니다.
" ───────────────────────────────────────────────────────────────
" 이름 : ZUI_ImpHaul (서비스 정의) / ZUI_ImpHaul_O2 (바인딩)
" 역할 : 분석 쿼리를 OData V2 서비스로 노출
" 이렇게 나눈 이유 : 정의와 바인딩을 나누면 같은 정의를 V2 / V4 로
" 따로 게시할 수 있다.
" ───────────────────────────────────────────────────────────────
@EndUserText.label: '입항 후 물류비 분석 서비스'
define service ZUI_ImpHaul {
expose ZC_ImpHaulQuery as ImpHaulCube;
expose ZI_ImpHaulCarrier as Carrier;
}
" 바인딩(ADT : 서비스 바인딩 → 새로 만들기)
" 바인딩 유형 : OData V2 - UI (분석 화면용)
" 서비스 정의 : ZUI_ImpHaul
" 게시 후 확인 : /IWFND/MAINT_SERVICE 에서 활성화 상태
운영 시점에 해야 할 일
개발보다 정하는 일이 많습니다. 아래는 코드를 쓰기 전에 합의해야 하는 항목입니다.
| 해야 할 일 | 무엇을 정하나 | 정하지 않으면 | 누가 |
|---|---|---|---|
| 부대비용 조건 유형 매핑 | 어떤 조건 유형이 하역·보관·운송·수수료인지, 효력 시작일 | 비용 네 가지가 기존 보고서와 어긋남 | 회계 · 구매 |
| 예정 원천 확정 | 조건 레코드, 계약 단가표 중 예정 단가·일수의 출처 | "예정이 왜 이 숫자냐" 가 반복됨 | 구매 · 기획 |
| 차원 출처 확정 | 입항지·보관 방식·운송 거리 구간·화물 형태를 확장 필드 또는 매핑 테이블 중 어디서 읽을지 | 축 후보가 비어 핵심 질문에 답하지 못함 | 물류 · 구매 |
| 환율 유형 · 환산 시점 | 전기일 환율, 월말 환율 중 무엇으로 환산할지 | 통화가 여럿일 때 기간별 숫자가 흔들림 | 회계 · 자금 |
| 부호 규칙 | 청구 취소·역분개(대변)를 비용 감소로 볼지 | 합계가 표준 화면과 어긋남 | 회계 |
| 원천(실적·예정) 확정 | 송장 라인 기준인지 입고 기준인지, 예정에 없는 입항의 처리 | 미계획 입항 요인의 크기가 흔들림 | 회계 · 구매 |
| 권한 설계 | 플랜트·회사코드 권한 객체와 역할 | 남의 숫자가 드러남 | 보안 · 권한 |
| 성능 기준 | 조회 기간 상한, 필수 파라미터, 큐브 행 수 목표 | 대용량에서 브라우저가 먼저 한계에 닿음 | Basis · IT |
| 대사 체계 | ME23N · MIGO · MIRO · MB51 · FBL1N 와 맞출 항목과 주기 | 표준과 숫자가 다를 때 판단이 늦어짐 | 회계 · 구매 |
| 전송(TR) 순서 | 매핑 테이블 → 라인 → 차원 → 큐브 → 쿼리 → DCL → 서비스 | 활성화 오류와 빈 화면 | Basis |
| 서비스 활성화 | /IWFND/MAINT_SERVICE 에서 서비스 활성화 또는 바인딩 게시, 화면의 서비스 주소 교체 | 화면이 샘플 서비스를 계속 읽음 | Basis · IT |
| 배치 등록 | 에이전트를 사람이 열지 않아도 돌릴 주기와 받을 역할 | 사람이 화면을 열 때만 점검이 돕니다 | Basis · 구매 |
숫자를 믿을 수 있는가 — 검증 결과
만드는 쪽에서 먼저 대사식을 세워 샘플 데이터를 전수로 돌린 결과입니다. 사례로 든 총차이 +928.3 백만원(928,259,249원)과 요인 합의 검산도 여기에 들어 있습니다.
| 대사식 | 검사 건수 | 차이 건수 | 최대 차이 |
|---|---|---|---|
| 원천 라인 금액 = 단가 산식 · 합계 = 구성 합 | 15,140 | 0 | 0원 |
| 큐브 합계 = 원천 라인 합계 (측정값 9종 × 입항월 6) | 54 | 0 | 0원 |
| 예정 큐브 합계 = 예정 라인 합계 (측정값 8종 × 입항월 6) | 48 | 0 | 0원 |
| 요인 합 = 총차이 (전체 범위 · 업체 단위 범위) | 2 | 0 | 0원 |
| 드릴스루 합계 = 칸 금액 (화면에서 칸 10개) | 10 | 0 | 0원 |
| 합계 | 15,254 | 0 | 0원 |
의도적 예외 0건. 화면에 표시되는 합계 5,515.9 백만원(5,515,865,626원)은 검증 스크립트의 원천 라인 합계와 같고, 총차이 +928.3 백만원은 요인 합과 같습니다. 화면 쪽은 기능 15개를 따로 실행해 축 전환 때 서버 호출 0회·총합 불변, 드릴스루 칸 10개 일치, 요인분해 검산 0, 변동 사유 새로 고침 후 유지, 에이전트 두 번째 실행 LIMITED 등을 확인했습니다.
운영 데이터로 갈 때
샘플은 큐브 행 14,216개와 예정 행 12,392개라 브라우저가 한 번에 읽어 묶습니다. 운영의 반출 라인이 수백만~수천만 건이면 집계는 CDS 에서 하고 브라우저에는 이미 묶인 큐브 행만 내려보내야 합니다. 조회 기간과 회사코드는 필수 파라미터로 두고, 차원 값 필터는 쿼리 단계로 올리며, 라인 단위 드릴스루는 지금처럼 나눠 읽습니다. 매핑 테이블과 조건 유형·구매오더 품목 키에는 조회 패턴에 맞춘 인덱스를 검토해야 합니다. 응답 시간 기준은 고객사 데이터로 측정해 정할 값이라 이 글에서 숫자로 약속하지 않습니다.
자주 묻는 질문
도입을 검토하는 분들이 자주 묻는 것을 주제별로 모았습니다.
도입 효과와 범위
누가 쓰면 가장 효과가 큽니까?
입항 후 물류비를 업체·입항지·보관 방식별로 다시 묶어 보고, 예정과 비교해 설명해야 하는 구매·물류·자금 담당입니다. CFO 에게는 물류비 합계와 물류비율이, 구매 책임자에게는 반출 지연율이, 자금 책임자에게는 업체별 지급 예정 감각이, 물류 책임자에게는 입항지별 보관 일수가 앞에 놓입니다.
같은 조회 결과를 역할만 바꿔 읽기 때문에 담당자마다 표를 따로 만들던 일이 줄어듭니다. 줄어드는 정도는 고객사 현재 방식에 따라 달라서 수치로 약속하지 않습니다.
적용 시기나 대상 기준서가 있습니까?
특정 기준서에 묶인 화면이 아닙니다. 관련 기준서는 없고(-), 대상 영역은 수입 입항 후 물류비입니다. 따라서 시행 시기에 맞춰 도입해야 하는 화면이 아니라, 필요한 시점에 붙이는 분석 도구입니다.
조회 기간은 고객사가 정하고, 샘플 데이터의 기간(2026.04~2026.09)은 화면을 설명하기 위한 값입니다.
표준 T-code 를 없애야 합니까?
아니요. 구매오더·입고·송장·공급업체 항목 같은 실행은 SAP 표준 T-code 가 계속 담당하고, 이 화면은 조회와 검증 관점을 더해 확장합니다. 법정·감사·세무 신고에 쓰는 자료는 표준 기능에 남겨 두는 것을 전제로 설계했습니다.
운영 전환 때 기존 리포트를 바로 내릴지는 대사 지점(ME23N·MIGO·MIRO·MB51·FBL1N)에서 두 화면 숫자가 한 분기 이상 맞는 것을 확인한 뒤 정하는 것을 권합니다.
입항 전 단계(해상 운임, 관세)도 보여 줍니까?
이 화면의 범위는 입항 후 하역·보관·내륙운송·수수료입니다. 해상 운임이나 관세는 대상 영역에 포함하지 않았습니다. 같은 큐브 구조를 쓰면 입항 전 비용 분석 화면을 별도로 둘 수 있지만, 이 화면에서 두 영역을 합산하지는 않습니다.
숫자와 산식
물류비 합계는 어떻게 계산됩니까?
원천 라인마다 하역비 = 물량 × 하역 단가, 보관료 = 물량 × 보관 요율 × 보관 일수, 내륙 운송비 = 물량 × 운송 단가, 수수료 = 건당 금액이고, 물류비 합계는 이 네 가지의 합입니다.
큐브는 이 라인을 차원 조합으로 더한 것이라 어느 축으로 묶어도 총합이 같습니다. 조회 때마다 큐브 합계와 원천 라인 합계의 차이를 검산 줄에 보여 줍니다.
물류비율과 입방미터당 물류비는 왜 합산이 아니라 다시 계산합니까?
비율과 단가는 칸마다 평균을 내면 칸 크기에 따라 틀어집니다. 그래서 분자(물류비 합계)와 분모(화물 가액, 반출 물량)를 각각 합한 뒤 나눕니다. 행을 접거나 펼쳐도, 축을 바꿔도 같은 방식입니다.
화면의 총계 칸 값과 하위 칸의 평균이 달라 보이는 것은 오류가 아니라 이 산식 때문입니다.
요인분해의 합이 정말 총차이와 같습니까?
같습니다. 예정 값에서 출발해 요인을 하나씩 실적 값으로 바꿔 가며 그 순서대로 차이를 계산하는 방식이라, 일곱 요인의 합이 구조적으로 총차이와 일치합니다. 화면 위의 검산 줄이 요인 합 − 총차이 = 0원을 매번 보여 줍니다.
순서(반출 물량 → 하역 단가 → 보관 요율 → 보관 일수 → 운송 단가 → 수수료 → 미계획 입항)가 바뀌면 요인별 금액은 달라질 수 있습니다. 합계는 달라지지 않으므로 요인별 금액은 이 순서로 봤을 때의 분해로 읽어 주세요.
백만원 단위로 보면 요인 합이 총차이와 0.1 어긋납니다.
표시를 백만원으로 반올림했기 때문입니다. 샘플 기준 요인 표시값의 합은 928.2이고 총차이 표시값은 928.3인데, 원 단위로 보면 차이는 0원입니다. 검산 줄은 원 단위로 계산해 0으로 표시합니다. 금액 단위를 원으로 바꾸면 반올림 차이가 사라집니다.
미계획 입항 요인은 무엇입니까?
구매오더 기준 예정에 없는 입항 라인의 물류비 전액입니다. 예정이 없으니 물량·단가·일수로 나눌 수 없어 따로 한 요인으로 세웠습니다. 샘플의 예정은 가정값이며, 예정에 없는 입항 라인을 일부 섞어 이 요인이 나오게 했습니다.
실제 환경에서는 예정의 원천(구매오더 조건, 계약 단가표 등)을 무엇으로 삼을지가 이 요인의 크기를 좌우하므로 도입 때 먼저 정해야 합니다.
셀 금액과 드릴스루한 라인 합계가 정말 같습니까?
같습니다. 칸이 라인을 더해 만든 값이기 때문입니다. 샘플에서 업체 K01 의 2026.04 칸(196.9 백만원)을 누르면 라인 101건이 열리고 합계가 같은 금액입니다. 라인 표 위에 칸 값과 읽은 라인 합, 읽은 건수를 같이 적어 눈으로 확인할 수 있게 했습니다.
만드는 쪽에서도 칸 10개를 골라 드릴스루 합계가 칸 금액과 같은지 검증했고 차이는 0건이었습니다.
화면과 조작
조회조건은 무엇을 넣어야 합니까?
회사코드(필수), 시작 기간·종료 기간(필수, 입항월 기준)입니다. 기본값은 회사코드 1000, 2026.04~2026.09입니다. 차원 값은 선택이며, 고르면 같은 차원 안에서는 또는, 차원 사이에서는 그리고로 묶여 브라우저에서 걸러 다시 묶습니다.
축을 바꾸면 서버를 다시 부릅니까?
부르지 않습니다. 조회 한 번에 큐브와 예정을 읽어 브라우저에 두고, 축 이동·접기·펼치기·다중 선택은 그 큐브를 다시 묶는 일입니다. 기능 검증에서 축 전환 시 서버 호출 0회, 총합 불변, 배치 7종을 확인했습니다.
열 조합이 너무 많으면 어떻게 됩니까?
열 조합이 36개를 넘으면 반쯤 그린 표 대신 열 축을 줄이거나 차원 값을 골라 범위를 좁히라는 안내를 띄웁니다. 샘플에서는 열에 두 차원을 놓아 조합이 72개가 되는 경우로 확인했습니다. 상한은 화면이 느려지거나 읽을 수 없는 표가 나오는 것을 막기 위한 값입니다.
휴대폰이나 좁은 화면에서도 쓸 수 있습니까?
쓸 수 있도록 배치를 바꿉니다. 390px 폭에서는 표가 위, 차트가 아래로 쌓이고 머리 영역 버튼은 더보기 메뉴로 접힙니다. 표는 가로로 넘겨 봅니다. 축을 끌어다 놓는 작업은 넓은 화면이 편하므로 좁은 화면은 읽는 용도로 보는 것을 권합니다.
CSV 는 무엇이 내려받아집니까?
피벗 도구 줄의 CSV 는 지금 보이는 표(현재 축·표시 항목·비교)를, 드릴스루 창의 CSV 는 읽은 원천 라인을 내려받습니다. 둘 다 브라우저에서 만들며 서버에 따로 저장하지 않습니다.
분석 기능과 AI
AI 분석이 숫자를 지어내지 않습니까?
숫자는 서비스가 큐브에서 계산한 값만 씁니다. 기본 해설은 규칙 기반이라 정해진 문장 틀에 그 숫자를 넣을 뿐이고, 해설에 쓴 근거를 표로 펼쳐 볼 수 있습니다. 해설 문장의 모든 숫자는 근거 표에서 확인됩니다.
생성형 모델을 연결하는 것은 서버 설정 하나로 켜는 선택 사항이며 기본은 꺼져 있습니다. 연결 키는 화면·설명서·이 글에 두지 않습니다.
차이가 났는데 사유가 없는 행은 어떻게 찾습니까?
AI 분석이 사유가 없는 차이를 큰 순서로 정렬해 주된 요인과 함께 점검 대상으로 보여 줍니다. 이미 사유가 적힌 차이는 건너뜁니다. 점검 대상은 판정이 아니라 사유를 먼저 확인해 볼 후보입니다.
색은 어떤 기준으로 칠해집니까?
차이 금액이 금액 임계(샘플 기본 1,000,000원) 이상이고 차이율도 비율 임계(기본 10%) 이상일 때만 칠합니다. 비용이 예정보다 늘어난 방향은 붉은색, 줄어든 방향은 초록색입니다. 작은 칸의 큰 비율이나 큰 칸의 작은 흔들림까지 칠하면 화면이 온통 빨개져 정작 볼 곳이 묻히기 때문입니다. 임계는 화면에서 조정합니다.
에이전트는 무엇을 하고 얼마나 자주 돕니까?
감시 규칙 여섯 가지(평균 보관 일수 상한, 공급사 예정 반출일 초과율 상한, 자재그룹별 물류비 예정 초과율, 보관 요율·보관 일수·운송 단가 요인 영향 임계 등)를 읽어 걸린 항목을 받을 역할 관점의 보고로 대기함에 올립니다. 하루 한 번 제한은 서버가 판정하며, 같은 날 두 번째 실행은 LIMITED 로 기록되고 새 보고를 올리지 않습니다. 화면을 열어 둔 동안 한 시간마다 자동 실행하는 옵션은 기본 꺼져 있습니다.
PowerPoint 보고서는 서버에서 만듭니까?
브라우저에서 만듭니다. 현재 범위의 요약·점검 대상·워터폴·요인표를 담아 외부 라이브러리 없이 zip 과 XML 로 파일을 짓고 바로 내려받습니다. 서버에 보고서 파일을 남기지 않습니다.
운영과 연결
외화·환율은 어떻게 처리합니까?
샘플의 모든 금액은 원화입니다. 운영에서는 청구 통화가 여럿일 수 있어 환율 유형(예: 전기일 환율, 월말 환율)과 환산 시점을 먼저 정해야 합니다. 환산은 큐브 집계 단계에서 한 번만 하고, 화면은 환산된 금액을 더하기만 하도록 두는 것을 권합니다. 어느 환율 유형을 쓸지는 회사 정책이라 확인 필요 항목입니다.
운영 환경에 연결하려면 무엇이 필요합니까?
크게 세 가지입니다. 첫째, 원천 테이블을 읽는 CDS 뷰(라인·차원·큐브·예정·쿼리·권한)를 만들고 서비스로 게시합니다. 둘째, 입항지·보관 방식·운송 거리 구간처럼 표준 필드에 없는 차원의 출처(확장 필드 또는 매핑 테이블)를 정합니다. 셋째, 앱의 서비스 주소를 게시된 서비스로 바꿉니다.
소요 기간은 고객사의 부대비용 조건 유형 정리 정도에 크게 좌우되어 이 글에서 숫자로 말하지 않습니다. 정해야 할 일의 목록은 CDS 구성 절의 "운영 시점에 해야 할 일" 에 있습니다.
권한과 보안은 어떻게 둡니까?
집계 단계(큐브)에 권한을 걸어야 합니다. 드릴스루에만 걸면 합계에서 뺄셈으로 다른 플랜트의 숫자가 새어 나올 수 있습니다. 이 글의 CDS 예시는 구매 오더 플랜트 권한을 큐브에 거는 DCL 을 포함합니다. 권한 객체와 필드는 고객사의 역할 설계에 맞춰 확정해야 하므로 확인 필요입니다.
화면은 SAP 표준 컨트롤과 직접 그린 SVG 차트만 써서 외부 라이브러리 반입 심사 대상이 줄어듭니다.
데이터가 아주 많으면(라인 수천만 건) 어떻게 됩니까?
지금 구조는 조회 때 큐브 행을 브라우저로 가져와 묶으므로, 큐브 행 수가 수십만 건을 넘으면 브라우저 쪽이 먼저 한계에 닿습니다. 운영 규모에서는 집계를 CDS(또는 분석 쿼리) 쪽에서 하고, 조회 기간·회사코드를 필수 파라미터로 두며, 화면에는 상한을 둡니다. 라인 단위 드릴스루는 이미 500행씩 나눠 읽습니다.
실제 응답 시간 기준은 고객사 데이터로 측정해 정해야 하는 값이라 이 글에서 약속하지 않습니다.
업체·입항지 같은 매핑이 바뀌면 어떻게 합니까?
매핑은 한 곳(조건 유형 매핑 테이블, 차원 매핑)에 모아 두었습니다. 새 부대비용 조건 유형이 생기면 어느 비용 묶음(하역·보관·운송·수수료)인지만 적어 주면 됩니다. 과거 기간의 숫자가 바뀌는지는 매핑 변경 시점 처리 방식을 정해 두어야 하므로, 효력 시작일을 두는 방식을 권합니다.
이 화면의 결과를 그대로 판단 근거로 써도 됩니까?
점검을 돕는 도구입니다. 화면의 '점검 대상' 과 '확인 필요' 는 판정이 아니라 먼저 살펴볼 후보이며, 최종 판단은 회사와 감사인이 합니다. 세무·관세 신고에 해당하는 사항은 회사와 세무 대리인·관세사가 판단합니다.
레이아웃은 어디에 저장됩니까?
축·조회조건·표시 항목·표시 행 수·접힘 상태를 이름 붙여 서비스에 저장합니다. 기본과 자동 조회를 함께 지정하면 화면을 새로 열 때 조회가 끝난 상태로 시작합니다. 사용자별 저장 범위는 운영에서 권한 설계와 함께 정합니다.
샘플 데이터는 실제 고객사 데이터입니까?
아닙니다. 회사코드 1000, 입항월 2026.04~2026.09의 가상 데이터이고 업체·공급사 이름도 모두 가상입니다. 반출 라인 3,028건에서 차원 조합 1,677칸의 큐브를 만들었고, 예정은 가정값입니다.