수출 부대비용 배부 점검 — 선적 한 건의 운임·보험료·수수료를 품목에 나눠 배부 후 공헌이익과 예정 대비 차이를 다시 구하는 수출 화면
인코텀즈별 부담 주체 · 용적·금액·중량·수량 기준 배부 · 배부 후 공헌이익 · 적자 전환 품목 · 예정 대비 차이 · 대사식 열 가지 — 소개 영상과 실제 화면 6종, 그리고 CDS 코드까지
소개 영상블로그 목차 순서대로 · 자막 포함8개 장면조건 조회 → 요약 카드 → 품목 배부 → 비용 내역 → 유형·월 집계 → 선적 상세 → 대사 결과 → 정리
도입 포인트 — 이 앱을 사용해야 하는 이유
수출 선적 한 건에는 해상·항공 운임, 적하보험료, 포워더 수수료, 국내 부대비용이 줄줄이 따라붙습니다. 이 비용을 누가 내는지(인코텀즈), 어느 품목이 얼마나 떠안는지(배부), 견적과 얼마나 달랐는지(예정 대비 차이)는 지금 청구서 · 엑셀 · 담당자의 기억으로 흩어져 있습니다. 이 앱은 세 답을 한 화면에 붙여, 선적 합계 뒤에 가려진 품목별 손익을 드러냅니다.
핵심 포인트 여덟 가지
| 포인트 | 고객이 얻는 것 | 지금 방식이라면 |
|---|---|---|
| ① 부담 주체를 먼저 가른 뒤 나눕니다 | 인코텀즈 조건에 따라 매도인이 부담하는 비용만 배부 대상으로 골라냅니다. 매수인 부담 비용은 비용 내역에는 남기되 배부에서 뺍니다. | 청구서 합계를 그대로 품목에 나누고, 매수인이 내야 할 몫까지 우리 원가에 실립니다. |
| ② 비용마다 맞는 기준으로 나눕니다 | 운임은 용적(CBM), 보험료는 금액, 포워더 수수료는 중량, 국내 부대비용은 수량으로 품목에 나눕니다. 기준값 합계가 분모가 됩니다. | 매출 비율 하나로 모두 나누어, 부피만 큰 저가 품목의 운임 부담이 가려집니다. |
| ③ 배부 후 공헌이익으로 적자 전환을 가립니다 | 배부 전에는 이익이 났는데 배부 후 음수로 바뀐 품목을 적자 전환으로 표시하고, 그 원인이 된 비용 유형을 같은 창에서 보여 줍니다. | 선적 단위 합계만 보면 흑자라 문제 품목이 묻힙니다. |
| ④ 예정 대비 차이를 비용 한 줄마다 | 견적(예정)과 포워더 청구서(실제)를 비용 내역 한 줄마다 견줍니다. ±10% 를 넘고 30만 원 이상일 때만 점검 필요로 표시합니다. | 월말에 청구서 총액만 맞춰 보고, 어느 줄이 어긋났는지는 엑셀로 다시 찾습니다. |
| ⑤ 청구서가 오지 않은 선적은 판정에서 뺍니다 | 실제 청구서를 받지 못해 예정액을 임시 실제액으로 둔 선적은 정상도 이상도 아닌 판정 제외로 따로 세워, 확인 대상이 섞이지 않게 합니다. | 임시값이 정상으로 보여 나중에 청구서가 오면 숫자가 조용히 바뀝니다. |
| ⑥ 나눈 합계가 원래 합계와 같습니다 | 원 단위 반올림 차이는 마지막 품목에서 조정하고 조정액을 따로 보여 줍니다. 배부 합계가 실제 비용과 1원도 어긋나지 않는지 대사식으로 매번 검산합니다. | 나눈 합계가 원래보다 몇 원씩 모자라거나 넘쳐도 눈에 띄지 않습니다. |
| ⑦ 선적 행에서 품목 배부까지 내려갑니다 | 선적 행을 누르면 비용 내역과 품목 배부가 한 창에 열립니다. 숫자를 의심할 때 다른 화면으로 옮겨 조건을 다시 넣을 필요가 없습니다. | 비용은 VI03, 매출은 VF03 에서 따로 열어 눈으로 맞춥니다. |
| ⑧ 읽기 전용 · 표준 컨트롤 · 상대 경로 | 조회·점검 화면이라 SAP 데이터를 바꾸지 않습니다. OpenUI5 표준 컨트롤과 OData V2 서비스를 상대 경로로 부릅니다. | 화면을 들이려면 쓰기 권한과 외부 라이브러리 심사부터 거칩니다. |
사례로 보는 효과 — 합계는 흑자인데 한 품목은 적자
선적 한 건의 합계만 보면 이상이 없는데 품목을 나누면 달라지는 일이 실제로 생깁니다. 이 샘플의 중국행 CFR 선적(XB-2607-06)이 그렇습니다. 품목은 두 가지입니다 — 정밀 베어링 세트(수량 800, 용적 73.05 CBM)와 냉각 팬 유닛(수량 61, 용적 0.49 CBM). 해상 운임 1,928,634원을 용적으로 나누면 베어링 세트가 1,915,732원, 곧 99.3% 를 떠안습니다.
그 결과 정밀 베어링 세트의 공헌이익은 배부 전 980,092원(6.53%) 에서 배부 후 −1,413,968원(−9.42%) 으로 바뀝니다. 선적 전체로는 이익이 남아 있어 선적 단위 리포트에는 문제가 드러나지 않지만, 품목 단위로 내려가면 이 품목은 팔수록 손해입니다. 냉각 팬 유닛은 같은 선적에서 배부 후에도 4,427,456원이 남습니다. 가격 조건을 다시 볼지, 부피 큰 품목은 FOB 로 돌릴지를 이야기할 근거가 숫자로 생깁니다.
배부 계산
운임 배부액 = 선적 운임 × 품목 용적 ÷ 선적 용적 합계 · 보험료 = 선적 보험료 × 품목 금액 ÷ 선적 금액 합계
배부 후 공헌이익 = 매출 − 변동비 − (운임 + 보험료 + 포워더 수수료 + 국내 부대비용 배부액). 매수인이 부담하는 비용은 분자에서 0 으로 둡니다.
위 숫자는 가상 고객 · 가상 품목으로 만든 샘플입니다. 환율과 인코텀즈별 부담 주체, 판정 기준값도 샘플 가정이며 실제 계약 조건으로 확인해야 합니다.
이 샘플로 본 전체 모습
| 지표 | 값 | 읽는 법 |
|---|---|---|
| 선적 · 비용 내역 · 품목 | 36건 · 144건 · 102건 | 가상 고객 6곳, 2026년 7~9월 선적입니다 |
| 매출 | 3,191,057,645원 | 송장 외화 금액에 가정 환율을 곱한 원화입니다 |
| 매도인 부담 부대비용 | 130,656,439원 (4.09%) | 매수인 부담분은 빠진 금액입니다 |
| 배부 후 공헌이익 | 784,310,737원 | 매출 − 변동비 − 배부 부대비용 |
| 점검 필요 선적 | 7건 | 적자 전환 4 · 예정 대비 차이 2 · 공헌이익률 낮음 1 |
| 판정 제외 선적 | 2건 | 청구서를 받지 못해 예정액을 임시 실제액으로 둔 건 |
| 대사식 8종 | 차이 0건 | 배부 합계와 실제 비용을 포함해 전수 검사 |
이 샘플에서 부대비용률이 가장 높은 달과 낮은 달의 차이, 인코텀즈별 비중은 유형·월 집계 탭에서 바로 확인할 수 있습니다. 요약 지표는 조회조건을 바꾸면 그 범위로 다시 계산됩니다.
실행 화면
실제로 돌아가는 화면 6종을 순서대로 싣습니다. 그림을 누르면 크게 볼 수 있고, 화면마다 무엇을 하는 자리이고 왜 그렇게 두었는지를 아래에 적었습니다. 숫자는 모두 같은 자료에서 나온 것이라 화면끼리 맞춰 보셔도 됩니다.
사용 방법
- 조회조건을 정합니다 — 회계연도는 필수, 선적월 · 인코텀즈 · 고객 · 판정은 선택입니다. 선택하지 않으면 전체가 조회됩니다.
- 조회 버튼을 누르거나 조건 칸에서 Enter 키를 누릅니다. 초기화 버튼은 같은 줄에 있습니다.
- 요약 카드에서 선적 건수 · 부대비용률 · 점검 필요 건수 · 적자 전환 품목 수를 먼저 봅니다.
- 탭은 선적 명세 → 품목 배부 → 비용 내역 → 유형·월 집계 → 대사 결과 순서로 봅니다.
- 궁금한 행을 누르면 그 선적의 비용 내역과 품목 배부가 한 창에 열립니다. ESC 키로 닫습니다.
- 현재 탭의 결과는 UTF-8 CSV 로 내려받을 수 있습니다. 유형·월 집계 탭은 두 표를 각각 받습니다.
처음 열었을 때와 탭별 화면

처음 열면 조회조건 한 줄, 요약 카드, 선적 명세 탭이 한 화면에 세로로 쌓입니다. 요약 카드는 선적 건수 · 매출 · 부대비용 · 부대비용률 · 배부 후 공헌이익 · 점검 필요 건수 · 적자 전환 품목 수 일곱 개이며, 조회가 끝나면 조건에 맞춰 다시 채워집니다. 회계연도만 필수이고 나머지는 비워 두면 전체입니다. 조건 칸에서 Enter 키를 눌러도 조회됩니다.

배부 전과 배부 후 공헌이익을 같은 줄에 두었습니다. 두 숫자의 차이가 곧 그 품목이 떠안은 부대비용이고, 부호가 바뀐 줄이 적자 전환입니다. 배부액은 비용 유형별로 열이 나뉘어 있어 어느 비용이 이익을 깎았는지 바로 읽힙니다. 마지막 품목에서 조정한 단수 차이도 열로 따로 남깁니다.

비용 내역은 포워더 청구서 한 줄에 해당합니다. 부담 주체가 매수인이면 배부 대상에서 빠지고, 매도인이면 아래 배부 기준대로 품목에 나뉩니다. 차이율이 ±10% 를 넘고 차이액이 300,000원 이상인 줄만 점검 필요로 표시해, 작은 금액의 큰 비율 때문에 화면이 붉어지지 않게 했습니다.

위쪽은 유형별 집계입니다 — 해상·항공 운임, 적하보험료, 포워더 수수료, 국내 부대비용 네 줄에 예정·실제·매도인 부담·매수인 부담이 놓입니다. 아래쪽은 선적월별 집계로 월마다 부대비용률이 어떻게 움직이는지 보입니다. 두 표는 CSV 도 따로 내려받습니다.

대사식 여덟 가지의 검사 건수와 차이 건수, 최대 차이가 표로 나옵니다. 모두 차이 0건이어야 하고, 하나라도 0이 아니면 그 자체가 오류 신호입니다. 의도적으로 넣은 예외(청구서 미수신 선적, 단수 조정)는 차이 건수와 섞이지 않게 아래 따로 적습니다.

선적 명세 · 품목 배부 · 비용 내역 어느 탭의 행을 눌러도 같은 창이 열립니다. 위에는 선적 요약, 가운데는 비용 내역, 아래는 품목 배부입니다. 창은 닫기 버튼이나 ESC 키로 닫습니다. 적자 전환 품목과 그 원인이 된 비용을 위아래로 맞춰 볼 수 있어서 설명 자료로도 그대로 쓰입니다.
SAP 표준 기능 확장 포인트
이 앱은 SAP 표준을 대체하지 않습니다. 표준이 이미 잘하는 일은 표준에 맡기고, 표준이 끊기는 자리만 이어 붙이는 쪽으로 만들었습니다. 어디까지가 표준이고 어디서부터 이 앱인지를 먼저 적습니다.
표준으로 되는 것과 안 되는 것
| 하고 싶은 일 | SAP 표준 | 표준에서 걸리는 자리 | 이 앱이 하는 일 |
|---|---|---|---|
| 수주·납품 기준 매출과 수량 | VA03 · VL03N | 선적 건 단위로 중량·용적을 품목에 묶어 보여 주는 표준 리포트가 없습니다 | 품목별 수량·중량·용적을 배부 기준값으로 씁니다 |
| 운송비 정산 확인 | VI03 | 운송비 정산 문서는 비용 한 줄 단위라 선적 전체의 부대비용률이 보이지 않습니다 | 비용 내역을 선적 단위로 묶어 부대비용률을 계산합니다 |
| 청구 문서와 매출 확정 | VF03 | 청구 문서와 운송비 문서가 따로 열려 한 선적의 이익을 한눈에 볼 수 없습니다 | 매출과 부대비용을 한 줄에 놓고 공헌이익을 다시 계산합니다 |
| 포워더 청구서 확인 | FBL1N · MIRO | 공급업체 미결 항목은 선적 번호 기준이 아니라 청구서 기준입니다 | 선적 번호로 비용 내역을 묶고 예정과 실제를 견줍니다 |
| 부대비용의 품목 배부 | — | 표준에 품목별 배부 후 공헌이익을 보여 주는 화면이 없습니다. 보통 엑셀로 나눕니다 | 비용 유형별 기준으로 나누고 단수 조정까지 남깁니다 |
| 적자 전환 품목 가려내기 | KE30(COPA) | COPA 를 운영하지 않거나 부대비용을 비용 요소로만 올리면 품목별 부담이 드러나지 않습니다 | 배부 전후 공헌이익의 부호 변화를 직접 판정합니다 |
| 예정 대비 차이 점검 | — | 견적과 청구서를 줄 단위로 견주는 표준 화면이 없습니다 | 비율과 금액 두 기준을 함께 넘을 때만 표시합니다 |
T-code 별 연계 지점
이 앱이 표준 거래의 어느 자리를 이어받는지를 적었습니다. 운영에 올릴 때 “기존 화면을 없애야 하느냐” 는 질문이 꼭 나오는데, 대부분 없애지 않고 둡니다 — 청구서 입력과 결제, 감사 대응은 표준 거래가 맡는 편이 안전합니다.
| T-code | 이름 | 연계 |
|---|---|---|
VA03 | 판매오더 조회 | 매출과 품목 수량의 원천입니다. 이 화면의 선적 한 건은 판매오더 몇 건에서 온 품목을 묶은 것이므로, 품목 수량이 판매오더와 맞는지가 첫 번째 대사입니다. |
VL03N | 납품 조회 | 배부 기준값(수량 · 중량 · 용적)의 원천입니다. 납품 단계에서 확정된 포장 중량과 용적을 쓰는 것이 원칙이며, 오더 단계의 예상값은 쓰지 않습니다. |
VT03N | 출하 조회 | 선적일과 인코텀즈를 확인하는 자리입니다. 선적월 조건은 여기 선적일에서 만들어집니다. |
VI03 | 운송비 정산 조회 | 비용 내역의 원천입니다. 비용 한 줄이 운송비 정산 문서의 한 줄에 해당하며, 예정 금액은 견적 단계의 값입니다. |
VF03 | 청구 문서 조회 | 매출 확정을 확인합니다. 청구가 아직 나가지 않은 선적은 매출이 잠정이므로 판정을 보류하는 편이 안전합니다. |
FBL1N | 공급업체 개별 항목 | 포워더 청구서의 미결·결제 상태를 확인합니다. 청구서를 받지 못해 예정액을 임시 실제액으로 둔 선적이 여기서 걸러집니다. |
MIRO | 송장 검증 | 포워더 청구서를 입력하는 자리입니다. 입력이 끝나면 이 화면의 실제 금액이 임시값에서 청구서 값으로 바뀝니다. |
FB03 | 전표 조회 | 비용 전표를 확인합니다. 숫자가 장부와 다를 때 마지막으로 열어 보는 자리입니다. |
부대비용 배부·판정 규칙
판정은 위에서부터 차례로 따져 처음 맞는 조건으로 정해집니다. 기준값은 샘플 가정이므로 운영에서는 회사 기준으로 바꿉니다.
| 판정 조건 | 결과 상태 | 사용자 조치 |
|---|---|---|
| 배부 전 공헌이익은 양수인데 배부 후 음수로 바뀐 품목이 1건 이상 | 점검 필요(적자 전환) | 품목 단가 · 운임 조건 · 배부 기준을 확인합니다 |
| 예정 대비 실제 부대비용 차이율이 ±10% 를 넘고 차이액이 300,000원 이상 | 점검 필요(예정 대비 차이) | 포워더 청구서와 견적을 대조합니다 |
| 배부 후 공헌이익률이 10% 미만(적자 전환은 아님) | 점검 필요(공헌이익률 낮음) | 가격 · 부대비용 조건을 확인합니다 |
| 포워더 청구서를 받지 못해 예정액을 임시 실제액으로 둔 선적 | 판정 제외 | 청구서 수신 후 다시 조회합니다 |
| 위 어디에도 해당하지 않음 | 정상 | 조치 없음 |
인코텀즈별 부담 주체와 배부 기준
누가 내는 비용인지가 먼저 갈리고, 매도인 몫만 비용 유형별 기준값 비율로 품목에 나뉩니다. 아래 표는 샘플 가정이며 실제 부담은 계약 조건으로 확인해야 합니다.
| 비용 유형 | 배부 기준 | FOB · FCA | CFR | CIF |
|---|---|---|---|---|
| 해상·항공 운임 | 용적(CBM) | 매수인 | 매도인 | 매도인 |
| 적하보험료 | 금액 | 매수인 | 매수인 | 매도인 |
| 포워더 수수료 | 중량(kg) | 매도인 | 매도인 | 매도인 |
| 국내 부대비용 | 수량 | 매도인 | 매도인 | 매도인 |
OData 서비스 구성
화면은 서비스를 expcost_srv 라는 이름의 OData V2 서비스로 부릅니다. 엔티티셋은 위 여섯 개이고, 펑션은 GetTotalActCost(선택한 선적월의 매도인 부담 실제 부대비용 합계) 와 GetMaxCostRate(매출 대비 부대비용률 최댓값) 두 개입니다. 조회조건은 $filter 로만 전달하고, 전체를 고르면 그 필터를 만들지 않습니다.
서비스 주소는 모두 상대 경로입니다. 화면이 실제로 부르는 요청은 앱 설명서의 9번 절에 엔티티셋별로 적혀 있고, 표의 행을 누르면 요청 문자열이 팝업으로 열려 복사할 수 있습니다. 보안 검토나 연계 설계에서는 이 절을 가장 먼저 보게 됩니다.
| 엔티티셋 | 용도 | 키 | 샘플 행 수 |
|---|---|---|---|
ShipSet | 선적(B/L) 단위 매출 · 변동비 · 부대비용 · 공헌이익과 판정 | Gjahr · BlNo | 36 |
CostSet | 선적별 비용 내역(운임 · 보험 · 포워더 · 국내비)과 예정 대비 차이 | Gjahr · BlNo · CostSeq | 144 |
ItemSet | 품목별 비용 배부액과 배부 전후 공헌이익 | Gjahr · BlNo · ItemNo | 102 |
TypeSet | 비용 유형별 예정 · 실제 · 부담 주체별 합계 | Gjahr · CostType | 4 |
MonSet | 선적월별 매출 · 부대비용률 · 점검 필요 건수 | Gjahr · YmCode | 3 |
ReconSet | 대사식별 검사 건수 · 차이 건수 · 최대 차이 | Gjahr · ReconNo | 10 |
숫자를 믿을 수 있는가 — 대사식 8종
점검 화면에서 가장 비싼 질문은 “이 숫자 맞아?” 입니다. 만드는 쪽에서 먼저 대사식을 세우고 전수로 돌렸습니다. 모두 차이 0건이며, 대사 결과 탭에서 같은 표를 볼 수 있습니다.
| 대사 | 내용 | 검사 건수 | 차이 건수 |
|---|---|---|---|
| R01 | 매도인 부담 실제 부대비용 = 품목 배부액 합계(선적별) | 36 | 0 |
| R02 | 예정 + 차이 = 실제(비용 내역별) | 144 | 0 |
| R03 | 매출 − 변동비 − 부대비용 = 배부 후 공헌이익(선적별) | 36 | 0 |
| R04 | 선적 단위 공헌이익 = 품목 단위 합계 | 36 | 0 |
| R05 | 인코텀즈 조건별 선적 건수 합계 = 전체 선적 건수 | 4 | 0 |
| R06 | 월별 매출 합계 = 선적 매출 합계 | 3 | 0 |
| R07 | 비용 유형별 합계 = 비용 내역 합계 | 4 | 0 |
| R08 | 매도인 부담 + 매수인 부담 = 비용 내역 합계(선적별) | 36 | 0 |
의도적 예외는 차이 건수와 섞지 않고 따로 둡니다 — 판정 제외 2건(포워더 청구서를 받지 못한 선적 XB-2607-08 · XB-2609-02)과 단수 조정 12건(조정액 절댓값 합계 13원)입니다. 계약 쪽 검사도 함께 합니다: 엔티티 여섯 개 모두에 키가 있는지, 서비스 경로에 동사 세그먼트가 없는지, 전체를 고를 때 필터를 보내지 않는지, 날짜 조건이 맞게 걸리는지를 확인했습니다.
CDS 구성
이 사례의 화면은 샘플 자료를 서비스가 읽어 배부를 계산해 주는 구조입니다. 데모라서 되는 일이고, 운영 데이터에서는 배부 계산을 CDS 로 내립니다. 아래는 그때 만드는 뷰들을 레이어 순서대로 적은 것입니다.
코드는 스케치입니다. 필드 이름과 표준 뷰 이름은 릴리스 · 환경에 따라 다르므로 그대로 붙여 넣지 말고 View Browser(F2170) 로 실제 이름을 확인해야 합니다. 확인이 필요한 자리는 주석에 확인 필요 로 적었습니다.
뷰 레이어 구성
| 레이어 | 뷰 | 하는 일 | 왜 나누나 |
|---|---|---|---|
| 기준 | ZEXC_BEARER | 인코텀즈 × 비용 유형 → 부담 주체 매핑 | 계약 조건이 바뀔 때 코드를 고치지 않고 표만 고치기 위해서입니다. |
| 베이스 | ZI_ShipCostBase | 운송비 정산 문서를 선적 · 비용 한 줄로 정리 | 원천 테이블 조인을 한 곳에서만 걸기 위해서입니다. |
| 베이스 | ZI_ShipItemBase | 납품 품목을 수량 · 중량 · 용적 · 금액과 함께 정리 | 배부 기준값을 한 뷰에서 읽게 하기 위해서입니다. |
| 배부 | ZI_ExportCostAlloc | 매도인 부담 비용을 품목에 비율로 나눔 | 화면이 하던 계산을 DB 로 내립니다. |
| 배부 | ZI_ExportCostAllocAdj | 반올림 차이를 마지막 품목에서 조정 | 합계가 1원도 어긋나지 않게 하는 자리입니다. |
| 쿼리 | ZC_ExportCostCheck | 배부 후 공헌이익과 판정 | 판정 규칙을 화면이 아니라 한 곳에서 정의합니다. |
| 권한 | ZI_EXPORTCOSTALLOC (DCL) | 회사코드 · 판매조직 | 집계를 읽는 자리에 걸어야 합계로 새지 않습니다. |
① 인코텀즈별 부담 주체 매핑 테이블
이 표 하나로 매도인이 내는 비용과 매수인이 내는 비용이 갈립니다. 샘플에서는 FOB · FCA · CFR · CIF 네 조건을 넣었지만, 실제 부담은 계약서의 조건으로 정해지므로 운영 전환에서 가장 먼저 합의해야 하는 항목입니다. 유효기간 열을 둔 이유는 조건이 바뀌어도 이미 닫은 선적의 숫자가 흔들리지 않게 하기 위해서입니다.
" ────────────────────────────────────────────────────────────────
" ZEXC_BEARER — 인코텀즈 × 비용 유형 → 부담 주체 (투명 테이블)
" 코드에 박지 않는 이유 : 조건은 계약마다 달라지고, 바뀔 때마다
" 개발자를 부르게 만들면 리포트가 금방 낡는다.
" ────────────────────────────────────────────────────────────────
@EndUserText.label : '수출 부대비용 부담 주체 매핑'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #C " 고객 유지 — 전송(TR)으로 옮긴다
@AbapCatalog.dataMaintenance : #ALLOWED " SM30 뷰를 함께 만들어 둔다
define table zexc_bearer {
key mandt : mandt not null;
key inco1 : inco1 not null; " 인코텀즈 (FOB · FCA · CFR · CIF …)
key cost_typ : abap.char(5) not null; " OCEAN · INS · FWD · DOM
bearer : abap.char(1); " S = 매도인 부담 · B = 매수인 부담
basis_code : abap.char(3); " CBM · VAL · WGT · QTY (배부 기준)
valid_from : abap.dats;
valid_to : abap.dats;
}
② 선적 · 비용 베이스 뷰
운송비 정산 문서(VFKK · VFKP)를 선적 번호 단위로 정리합니다. 원천 테이블의 필드 이름은 릴리스마다 다르므로 View Browser(F2170) 로 실제 이름을 확인해야 하는 자리를 주석에 적어 두었습니다.
@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '선적별 비용 내역 베이스'
define view entity ZI_ShipCostBase
as select from vfkp as p
inner join vfkk as k on k.fknum = p.fknum
left outer join zexc_bearer as b
on b.inco1 = k.inco1 " 확인 필요 : 인코텀즈 보유 필드
and b.cost_typ = p.cost_typ " 확인 필요 : 비용 유형 매핑 필드
{
key k.tknum as BlNo, " 확인 필요 : 선적 번호 연결 필드
key p.fkpos as CostSeq,
p.cost_typ as CostType,
k.waers as Currency,
@Semantics.amount.currencyCode: 'Currency'
p.netwr as ActAmt,
@Semantics.amount.currencyCode: 'Currency'
p.plan_netwr as PlanAmt, " 확인 필요 : 예정(견적) 금액 필드
coalesce( b.bearer, 'S' ) as Bearer, " 매핑이 없으면 매도인으로 본다
b.basis_code as BasisCode
}
③ 품목 기준값 뷰
배부 기준이 되는 네 가지 값을 한 뷰에서 읽게 합니다. 용적과 중량은 납품 품목에, 금액은 청구 품목에 있어서 선적 번호와 품목 번호로 맞붙입니다.
@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '선적 품목 배부 기준값'
define view entity ZI_ShipItemBase
as select from lips as l
inner join vbrp as r
on r.vgbel = l.vbeln
and r.vgpos = l.posnr
{
key l.vbeln as DeliveryNo,
key l.posnr as ItemNo,
l.matnr as Material,
l.lfimg as Qty, " 수량 기준
l.brgew as GrossKg, " 중량 기준
l.volum as Cbm, " 용적 기준
r.netwr as SalesAmt, " 금액 기준
r.wavwr as VarAmt " 확인 필요 : 변동비로 쓸 원가 필드
}
④ 배부 뷰
화면이 하던 계산을 DB 로 내리는 자리입니다. 선적 안에서 비용 유형별 기준값 ÷ 기준값 합계를 비율로 곱합니다. 합계는 윈도우 함수가 아니라 선적 단위 서브 집계로 구해 두면 실행 계획이 예측 가능합니다.
@AbapCatalog.viewEnhancementCategory: [#NONE]
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: '수출 부대비용 품목 배부'
define view entity ZI_ExportCostAlloc
as select from ZI_ShipCostBase as c
inner join ZI_ShipItemBase as i on i.DeliveryNo = c.BlNo " 확인 필요 : 선적-납품 연결
inner join ZI_ItemBasisSum as s on s.BlNo = c.BlNo
and s.BasisCode = c.BasisCode
{
key c.BlNo,
key c.CostSeq,
key i.ItemNo,
c.CostType,
c.BasisCode,
/* 매도인 부담 비용만 배부 대상 — 매수인 부담은 0 */
case c.Bearer
when 'S' then
cast( round(
c.ActAmt * case c.BasisCode
when 'CBM' then i.Cbm / s.SumCbm
when 'VAL' then i.SalesAmt / s.SumSales
when 'WGT' then i.GrossKg / s.SumKg
else i.Qty / s.SumQty
end, 0 ) as abap.dec(17,0) )
else 0
end as AllocRaw
}
⑤ 단수 조정
품목마다 원 단위로 반올림하면 합계가 실제 비용과 몇 원씩 어긋납니다. 어긋난 만큼을 마지막 품목 한 곳에서 조정하고, 조정액을 별도 필드로 남겨 화면이 숨기지 않고 보여 주게 합니다. 이 샘플에서는 12개 선적에서 조정이 일어났고 조정액 절댓값 합계는 13원입니다.
@EndUserText.label: '배부 단수 조정'
define view entity ZI_ExportCostAllocAdj
as select from ZI_ExportCostAlloc as a
inner join ZI_ShipCostSum as t on t.BlNo = a.BlNo and t.CostSeq = a.CostSeq
{
key a.BlNo,
key a.CostSeq,
key a.ItemNo,
a.AllocRaw,
/* 선적 안의 마지막 품목에만 합계 차이를 얹는다 */
case when a.ItemNo = t.LastItemNo
then t.ActSeller - t.SumAllocRaw
else 0 end as AllocAdj,
a.AllocRaw
+ case when a.ItemNo = t.LastItemNo
then t.ActSeller - t.SumAllocRaw
else 0 end as AllocFinal
}
⑥ 판정 쿼리
판정 규칙은 화면이 아니라 여기 한 곳에서 정의합니다. 기준값(±10% · 300,000원 · 공헌이익률 10%)은 상수로 박지 않고 파라미터로 받아 운영에서 조정할 수 있게 했습니다.
@EndUserText.label: '수출 부대비용 배부 판정'
@Analytics.query: true
define view entity ZC_ExportCostCheck
with parameters
p_diff_pct : abap.dec(5,2), " 기본 10
p_diff_amt : abap.dec(17,0), " 기본 300000
p_cm_rate : abap.dec(5,2) " 기본 10
as select from ZI_ShipSummary as s
{
key s.BlNo,
s.SalesKrw,
s.ActCost,
s.CmBefore,
s.CmAfter,
s.TurnLossCnt,
case
when s.InvoicePending = 'X' then 'EXC' " 판정 제외
when s.TurnLossCnt > 0 then 'LOSS' " 적자 전환
when abs( s.PlanDiffPct ) > $parameters.p_diff_pct
and abs( s.PlanDiff ) >= $parameters.p_diff_amt then 'DIFF' " 예정 대비 차이
when s.CmRateAfter < $parameters.p_cm_rate then 'THIN' " 공헌이익률 낮음
else 'OK'
end as CheckCode
}
⑦ 권한 (DCL)
권한은 집계를 읽는 자리에 걸어야 합니다. 드릴다운 화면에만 걸면 선적 합계와 자기 몫의 차이로 남의 숫자를 유추할 수 있습니다.
@EndUserText.label: '수출 부대비용 배부 권한'
@MappingRole: true
define role ZI_EXPORTCOSTALLOC {
grant select on ZI_ExportCostAlloc
where ( BlNo ) = aspect pfcg_auth( V_VBRK_VKO, VKORG, ACTVT = '03' );
" 확인 필요 : 권한 오브젝트와 필드는 환경의 권한 설계에 따른다
}
도입 시 정해야 할 것
위 여섯 가지는 코딩이 아니라 합의입니다. 합의가 끝나기 전에 뷰부터 만들면 나중에 다시 이송해야 합니다.
| 정해야 할 것 | 무엇을 정하나 | 결정 주체 |
|---|---|---|
| 부담 주체 매핑 | 인코텀즈별 · 비용 유형별로 누가 내는지 계약 조건으로 확정 | 계약 · 수출영업 |
| 배부 기준 | 비용 유형마다 용적 · 금액 · 중량 · 수량 중 무엇을 쓸지 | 원가회계 |
| 예정(견적) 원천 | 예정 금액을 어느 문서에서 가져올지, 견적이 없는 선적은 어떻게 볼지 | 물류 · 수출영업 |
| 판정 기준값 | ±10% · 300,000원 · 공헌이익률 10% 를 회사 기준으로 다시 정함 | 원가회계 · 경영지원 |
| 청구서 미수신 처리 | 임시 실제액으로 둘지, 아예 비울지, 며칠을 기다릴지 | 구매 · 채무회계 |
| 권한 기준 | 판매조직 · 회사코드 중 무엇으로 자를지 | 보안 · 권한 |
자주 묻는 질문
도입 상담과 데모에서 자주 받는 질문들입니다. 네 묶음으로 나눠 적었습니다.
배부의 기본
왜 부대비용을 품목에 나눠야 합니까? 선적 단위로 보면 안 됩니까?
선적 단위 공헌이익은 흑자인데 그 안의 한 품목이 적자인 일이 흔합니다. 한 선적에 부피가 큰 저가 품목과 부피가 작은 고가 품목이 섞여 있으면 운임은 부피가 큰 쪽이 대부분 떠안습니다.
이 샘플의 정밀 베어링 세트는 배부 전 공헌이익 980,092원이 배부 후 −1,413,968원으로 바뀌었습니다. 선적 합계만 보았다면 드러나지 않았을 일입니다. 가격을 다시 정하거나 인코텀즈를 바꾸는 판단은 품목 단위 숫자가 있어야 가능합니다.
배부 기준은 왜 비용마다 다릅니까?
비용이 생기는 이유가 다르기 때문입니다. 해상·항공 운임은 자리를 차지한 만큼 내므로 용적(CBM), 적하보험료는 물건 값에 비례하므로 금액, 포워더 수수료는 취급한 무게에 가까우므로 중량(kg), 국내 부대비용은 건수에 가까우므로 수량으로 나눕니다.
모두 매출 비율로 나누면 계산은 쉽지만 부피가 큰 저가 품목의 운임 부담이 가려집니다. 기준은 설명서의 규칙 표에 적혀 있고, 운영에서는 회사 기준으로 바꿉니다.
인코텀즈에 따라 무엇이 달라집니까?
누가 어떤 비용을 내는지가 달라집니다. 샘플 가정으로는 FOB · FCA 는 운임과 보험료를 매수인이, CFR 은 보험료를 매수인이, CIF 는 둘 다 매도인이 부담합니다. 포워더 수수료와 국내 부대비용은 모두 매도인 몫으로 두었습니다.
매수인 부담 비용은 비용 내역에는 남기되 배부에서는 뺍니다. 그래서 같은 청구서라도 FOB 선적과 CIF 선적의 부대비용률이 크게 다릅니다. 이 가정은 샘플이므로 실제 계약의 조건으로 확인해야 합니다.
매수인이 부담하는 비용은 왜 화면에 남깁니까?
청구서 합계와 맞춰 보기 위해서입니다. 매도인 부담과 매수인 부담을 더한 금액이 비용 내역 합계와 같아야 하는데(대사식 R08), 매수인 몫을 지워 버리면 이 등식을 확인할 수 없습니다. 유형·월 집계 탭에도 매도인 부담과 매수인 부담이 따로 열로 나옵니다.
배부 후 공헌이익은 어떻게 계산합니까?
배부 후 공헌이익 = 매출 − 변동비 − 배부 부대비용 입니다. 매출은 송장 외화 금액에 환율을 곱한 원화이고, 변동비는 품목의 원가에서 옵니다. 부대비용은 배부 기준으로 나눈 몫입니다.
이 샘플의 전체 합계는 매출 3,191,057,645원, 부대비용 130,656,439원(4.09%), 배부 후 공헌이익 784,310,737원입니다.
원 단위로 나누면 합계가 어긋나지 않습니까?
어긋납니다. 그래서 반올림 차이를 마지막 품목에서 조정하고 조정액을 별도 열로 보여 줍니다. 조정이 일어난 선적은 샘플에서 12개였고 조정액의 절댓값 합계는 13원이었습니다.
조정액을 숨기지 않는 이유가 있습니다. 합계를 억지로 맞춘 흔적이 보이지 않으면 나중에 다른 보고서와 대조할 때 원인을 찾을 수 없기 때문입니다. 대사 차이로 세지 않고 의도적 예외(R10)로 따로 세워 차이 건수와 섞지 않습니다.
판정과 점검
점검 필요는 어떤 기준으로 붙습니까?
세 가지 중 하나에 해당하면 붙습니다. 첫째, 배부 전에는 공헌이익이 양수였는데 배부 후 음수로 바뀐 품목이 있을 때(적자 전환). 둘째, 예정 대비 실제 차이율이 ±10% 를 넘고 차이액이 300,000원 이상일 때. 셋째, 배부 후 공헌이익률이 10% 미만일 때입니다.
샘플 36건 중 정상 27, 적자 전환 4, 예정 대비 차이 2, 공헌이익률 낮음 1, 판정 제외 2로 나뉩니다. 점검 필요는 앞의 세 가지를 합친 7건입니다.
차이율 10% 만 쓰지 않고 금액 기준을 함께 두는 이유가 있습니까?
작은 비용의 큰 비율이 화면을 붉게 만들기 때문입니다. 국내 부대비용 5만 원이 7만 원이 되면 40% 증가지만 확인할 가치는 거의 없습니다. 반대로 큰 비용의 3% 차이는 비율로는 작아도 금액이 큽니다.
그래서 비율과 금액을 둘 다 넘을 때만 표시합니다. 기준값은 샘플 가정이므로 운영에서는 회사 기준으로 다시 정하며, 설명서에 변경 위치가 적혀 있습니다.
판정 제외는 무엇이고 왜 따로 둡니까?
포워더 청구서를 아직 받지 못해 예정액을 임시 실제액으로 둔 선적입니다. 샘플에서는 XB-2607-08 과 XB-2609-02 두 건입니다.
임시값은 예정액과 같으니 차이가 0 이라 정상처럼 보입니다. 정상으로 두면 나중에 청구서가 와서 숫자가 바뀔 때 조용히 이상으로 넘어갑니다. 그래서 정상도 이상도 아닌 판정 제외로 세우고, 대사 차이 건수와도 분리해 보여 줍니다. 청구서를 받은 뒤 다시 조회하면 판정이 정해집니다.
적자 전환 품목을 찾으면 무엇을 합니까?
원인이 된 비용 유형부터 봅니다. 대개는 운임이 용적 기준으로 몰린 경우입니다. 선택지는 세 가지입니다 — 단가를 올린다, 인코텀즈를 FOB 쪽으로 바꿔 운임을 매수인에게 넘긴다, 부피를 줄이는 포장으로 바꾼다.
화면은 판단을 대신하지 않습니다. 어느 품목이 어느 비용 때문에 적자로 바뀌었는지를 근거와 함께 보여 줄 뿐이고, 최종 판단은 회사가 합니다.
숫자와 대사
배부한 합계가 실제 비용과 같다는 것을 어떻게 압니까?
대사식 R01 이 선적 36건 모두에서 매도인 부담 실제 부대비용 = 품목 배부액 합계를 검사하고, 차이 건수가 0 입니다. 단수 조정 때문에 같아지는 것이므로 조정액은 따로 보입니다.
R02 는 비용 내역 144건, R05 는 인코텀즈 4조건, R06 은 3개월을 각각 검사하는 식으로 단위가 다르며, 대사 결과 탭에서 한 표로 볼 수 있습니다.
대사식은 모두 몇 개이고 무엇을 검사합니까?
여덟 가지입니다. 매도인 부담 실제 비용과 품목 배부액 합계(R01), 예정과 차이와 실제(R02), 매출 − 변동비 − 부대비용과 배부 후 공헌이익(R03), 선적 단위와 품목 단위 공헌이익(R04), 인코텀즈별 건수 합계(R05), 월별 매출 합계(R06), 비용 유형별 합계(R07), 매도인 + 매수인 부담(R08)입니다.
여기에 의도적 예외 두 가지(R09 판정 제외, R10 단수 조정)를 차이 건수와 분리해 따로 둡니다.
환율은 어떻게 씁니까?
샘플에서는 USD · EUR · JPY · CNY 의 가정 환율을 씁니다. 실제 고시 환율이 아니므로 화면의 금액으로 신고나 결산을 하면 안 됩니다. 운영에서는 청구 문서의 환율과 비용 전표의 환율을 그대로 읽어 오며, 비용과 매출의 환율이 서로 다르면 그 차이가 공헌이익에 섞이므로 어느 환율을 기준으로 둘지 먼저 정해야 합니다.
표준 화면의 값과 숫자가 다르면 어떻게 확인합니까?
순서가 있습니다. ① 조회 범위가 같은지 봅니다 — 회계연도와 선적월, 인코텀즈. 가장 흔한 원인입니다. ② 청구서가 모두 들어왔는지 봅니다. 판정 제외 선적은 임시 실제액이라 표준 화면과 다를 수 있습니다. ③ 비용 내역의 한 줄을 VI03 문서와 맞춰 봅니다. ④ 매출은 VF03 청구 문서와 맞춰 봅니다.
그래도 다르면 원인을 단정하지 말고 점검 필요 항목으로 둡니다.
도입과 운영
SAP 표준만으로는 안 됩니까?
선적 단위 운송비는 VI03 로, 청구는 VF03 로 볼 수 있지만, 품목별로 나눈 배부 후 공헌이익을 보여 주는 표준 화면은 없습니다. KE30(COPA)으로 가능한 경우도 있지만 COPA 를 운영하지 않거나 부대비용이 비용 요소로만 올라가면 품목별 부담이 드러나지 않습니다.
그래서 보통 엑셀로 나누는데, 이 앱은 그 엑셀 작업을 화면과 대사식으로 옮긴 것입니다. 표준 거래는 그대로 두고 그 위에서 읽기만 합니다.
SAP 데이터를 바꾸는 기능이 있습니까?
없습니다. 조회와 점검 전용 화면이고 전기, 수정, 삭제를 하지 않습니다. 비용 정산이나 청구는 계속 표준 거래에서 하고, 이 화면은 그 결과를 읽어 다시 계산합니다. 그래서 운영에 올릴 때 쓰기 권한 검토가 필요 없습니다.
도입하려면 무엇부터 정해야 합니까?
코딩보다 합의가 먼저입니다. 부담 주체 매핑, 배부 기준, 예정 금액의 원천, 판정 기준값, 청구서 미수신 처리, 권한 기준 여섯 가지입니다. 앞의 CDS 절 끝에 담당 부서와 함께 표로 정리해 두었습니다.
이 여섯 가지가 정해지면 기술 작업은 CDS 뷰를 만들고 화면을 올리는 일이 됩니다.
선적 건수가 많아지면 느려지지 않습니까?
데모는 36건이라 화면에서 직접 읽습니다. 운영에서는 배부 계산을 CDS 로 내려 DB 가 하도록 하는 것이 전제입니다. 화면은 페이지 단위로 읽고, 조회조건은 모두 서버 필터로 보냅니다.
가장 먼저 무거워지는 곳은 품목 수가 많은 선적의 배부 계산입니다. 선적 안에서 기준값 합계를 미리 구해 두는 서브 집계를 따로 두면 선적 수가 늘어도 비용이 선형으로만 늘어납니다.
다른 통화나 다국어는 어떻게 됩니까?
화면 글자는 i18n 파일에 모여 있어 언어를 더하는 일은 파일 하나를 더하는 일입니다. 통화는 선적마다 달라서 외화 금액과 환율, 원화 금액을 함께 들고 있습니다. 서로 다른 통화는 더할 수 없으므로 합계는 원화로만 냅니다.
유지보수는 무엇을 하게 됩니까?
정기적으로 손이 가는 곳은 부담 주체 매핑 하나입니다. 새 인코텀즈 조건이나 새 비용 유형이 생기면 어느 쪽이 내는지 적어 주어야 하고, 적지 않으면 매도인 부담으로 간주되어 배부액이 늘어납니다. SM30 뷰를 함께 만들어 현업이 직접 고치게 하는 것이 보통입니다.
그 밖에는 판정 기준값을 조정할 때 정도이며, 이 값은 파라미터라 개발이 필요 없습니다.
결과를 파일로 받을 수 있습니까?
예. 현재 탭의 조회 결과를 UTF-8 CSV 로 내려받습니다. 한글 머리글과 BOM 이 들어 있어 엑셀에서 바로 열립니다. 유형·월 집계 탭은 두 표를 각각 받습니다. 검토용 자료(PowerPoint)는 이 글의 왼쪽 메뉴에서 바로 만들어 내려받을 수 있습니다.
설명서에는 무엇이 있습니까?
앱과 함께 배포되는 설명서가 13개 절로 되어 있습니다. 실행 화면, 사용 방법, 배부 · 판정 규칙, 산출 · 대사 흐름, 조회조건과 결과 컬럼, 샘플 데이터, SAP 표준 연계, 원천 테이블과 CDS 스케치, OData 서비스 구성, UI5 모델 구성, 파일 구조, 검증 결과, 자주 묻는 질문입니다. 인수인계 문서를 따로 만들지 않아도 되도록 화면마다 설명을 붙였습니다.
샘플 데이터는 실제 고객 자료입니까?
아닙니다. 가상 고객 6곳, 선적 36건(2026년 7~9월), 비용 내역 144건, 품목 102건을 규칙에 따라 만든 값입니다. 일부러 넣은 예외는 청구서 미수신 선적 2건과 단수 조정 12건입니다. 환율과 인코텀즈별 부담 주체, 판정 기준값도 모두 샘플 가정이며, 실제 숫자로 결산이나 신고를 하면 안 됩니다.
수출 선적마다 부대비용이 어느 품목의 이익을 깎는지 보이지 않는다면, 합계를 더 맞추기보다 나누는 기준을 화면에 올리는 편이 낫습니다
선적 단위 합계는 이익이 남아 보이게 만들기 쉽습니다. 비용마다 맞는 기준으로 품목에 나누고, 배부 후 공헌이익이 음수로 바뀐 품목과 예정 대비 차이가 큰 비용을 같은 화면에서 가려내면, 가격 협상과 인코텀즈 조정의 근거가 숫자로 생깁니다. 현재 SAP 환경에서 어떻게 적용되는지 함께 확인해 드립니다.