SAP SD — 고객 · 판매 오더 · 가격 · 납품 · 청구
고객 마스터와 판매 오더에서 시작해 가격 조건, 납품, 청구, 문서 흐름, 판매 분석까지 오더 투 캐시를 따라갑니다.
1. 고객과 판매 오더 — KNA1 · KNVV · VBAK · VBAP
KNA1 은 고객 마스터(고객 번호 KUNNR, 이름 NAME1, 국가 LAND1, 오더 차단 AUFSD, 삭제 표시 LOEVM)입니다. KNVV 는 고객 × 판매 영역(KUNNR + 판매 조직 VKORG + 유통 경로 VTWEG + 제품군 SPART)마다 한 행입니다. VBAK 은 판매 문서 헤더, VBAP 은 품목입니다.
SELECT A.VBELN, A.AUART, A.ERDAT, K.NAME1, A.NETWR
FROM VBAK A
JOIN KNA1 K ON K.KUNNR = A.KUNNR
WHERE A.AUART = 'OR'
AND A.ERDAT BETWEEN '20250101' AND '20251231';
- 문서 유형 AUART(OR 표준 오더, RE 반품)와 문서 범주 VBTYP 로 문서 종류를 구분합니다.
- 판매 영역은 VKORG · VTWEG · SPART 세 필드의 조합입니다. 고객별 설정은 KNVV 에 있습니다.
- 헤더 금액 VBAK.NETWR 을 품목과 조인해 합치면 품목 수만큼 중복됩니다. 헤더는 헤더대로, 품목은 VBAP.NETWR 로 집계하세요.
- 화면으로는 VA03(오더 조회), VA05(오더 목록)입니다.
문제
2. 가격 조건 — PRCD_ELEMENTS
판매 문서의 가격 결정 결과는 조건 유형(KSCHL)별 금액으로 저장됩니다. S/4HANA 에서는 PRCD_ELEMENTS, ECC 에서는 KONV 이며 둘 다 VBAK 의 조건 문서 번호 KNUMV 로 잇습니다.
| 조건 유형 | 뜻 |
|---|---|
| PR00 | 정가 |
| K007 등 | 고객·자재별 할인 |
| KF00 | 운임 |
| MWST | 부가세 |
SELECT P.KNUMV, P.KPOSN, P.KSCHL, P.KWERT
FROM PRCD_ELEMENTS P
JOIN VBAK A ON A.KNUMV = P.KNUMV
WHERE A.VBELN = '0000000001';
- 같은 품목(KPOSN)에 여러 조건 행이 붙습니다. 정가·할인·운임·세금을 조건 유형별로 나눠 읽어야 분해가 됩니다.
- 할인은 음수이거나 별도 방향으로 기록될 수 있습니다. 합계를 낼 때 부호를 확인하세요.
- 실효 할인율은
할인 금액 / 정가입니다. 분모가 0 이 되지 않게 처리합니다.
문제
3. 납품과 출고 — LIKP · LIPS
판매 오더 다음 단계는 납품입니다. LIKP 는 납품 헤더(납품 번호 VBELN, 실제 출고일 WADAT_IST, 출하 지점 VSTEL), LIPS 는 품목(자재 MATNR, 납품 수량 LFIMG, 참조 판매 오더 VGBEL·VGPOS)입니다. 납품 일정은 VBEP 에 있습니다.
SELECT L.VBELN AS DELIVERY, L.VGBEL AS SALES_ORDER, L.MATNR, L.LFIMG
FROM LIKP H
JOIN LIPS L ON L.VBELN = H.VBELN
WHERE H.WADAT_IST IS NOT NULL;
- 미납 잔량 = 오더 수량 − 납품 수량. 여러 납품으로 나뉘면 품목별로 합산한 뒤 비교합니다.
- 납기 준수는 희망 납품일(VBEP)과 실제 출고일(LIKP.WADAT_IST)을 비교합니다.
- WADAT_IST 가 NULL 이면 아직 출고되지 않은 납품입니다.
- 문서 연결 전체는 VBFA 문서 흐름에 있지만, 한 단계만 볼 때는 LIPS 의 참조 필드로 충분합니다.
문제
4. 청구 — VBRK · VBRP
청구는 VBRK(헤더: 청구 번호 VBELN, 청구 유형 FKART, 청구일 FKDAT, 고객 KUNNR, 순금액 NETWR)와 VBRP(품목: 자재 MATNR, 수량 FKIMG, 금액 NETWR, 참조 오더 AUBEL)입니다.
SELECT K.KUNNR, SUM(P.NETWR) AS BILLED
FROM VBRK K
JOIN VBRP P ON P.VBELN = K.VBELN
WHERE K.FKART IN ('F1', 'F2')
AND K.FKDAT BETWEEN '20250101' AND '20251231'
GROUP BY K.KUNNR;
- 청구 유형 FKART 로 송장과 반품 대변 메모를 구분합니다. 취소 문서는
FKSTO표시가 있습니다. - 유효 매출을 낼 때는 취소된 청구를 빼야 합니다. 취소 문서의 원 문서 번호를 함께 보세요.
- 미청구 납품은 LIPS 가 VBRP 로 이어지지 않은 건입니다. 청구 참조 필드(VGBEL 등)로 확인합니다.
- 금액은 품목(VBRP.NETWR) 기준으로 합칩니다. 헤더와 품목을 함께 조인해 합치면 중복됩니다.
문제
5. 문서 흐름 — VBFA 와 상태 필드
오더 → 납품 → 출고 → 청구처럼 문서가 이어지는 전체 연결은 VBFA 에 있습니다. 선행 문서(VBTYP_V)와 후속 문서(VBTYP_N)의 범주로 관계를 읽습니다.
SELECT F.VBELN, F.VBTYP_V, F.VBTYP_N, F.VBELN_V
FROM VBFA F
JOIN VBAK A ON A.VBELN = F.VBELN
WHERE A.VKORG = '1000';
- 문서 범주 VBTYP: C 판매 오더, J 납품, M 청구 등입니다. 화면상의 문서 번호만 보지 말고 범주를 함께 확인하세요.
- 헤더 처리 상태는 ECC 의 VBUK, 품목 상태는 VBUP 에 있었습니다. S/4HANA 에서는 상태 필드가 VBAK·VBAP 로 옮겨졌습니다.
- 상태 코드(GBSTK·LFSTK·FKSTK 등)는 "완료 C", "처리 중 B" 같은 의미를 가집니다. 상태 필드와 실제 후속 문서 건수를 함께 보면 누락을 찾을 수 있습니다.
- 한 문서에서 후속 문서가 여러 개 나올 수 있으므로 VBFA 를 조인하면 행이 늘어납니다. 집계 단위를 먼저 정하세요.
문제
6. 판매 분석 — 추이 · 순위 · 반품률 · 신용
판매 분석은 집계 단위를 정하는 것에서 시작합니다. 월별 추이는 날짜를 월로 바꿔 묶고, 순위는 윈도우 함수로 매깁니다.
SELECT TO_VARCHAR(FKDAT, 'YYYY-MM') AS YM, SUM(NETWR) AS SALES
FROM VBRK
WHERE FKDAT BETWEEN '20250101' AND '20251231'
GROUP BY TO_VARCHAR(FKDAT, 'YYYY-MM');
- 반품률은 반품 문서 금액·수량을 전체(송장 + 반품)로 나눕니다. 수량 기준과 금액 기준이 다를 수 있습니다.
- 고객 순위는 매출 합계를 낸 뒤
RANK() OVER (ORDER BY …)로 매깁니다. 동점 처리 규칙을 정하세요. - 신용 노출은 미결 채권(BSID)과 신용 한도를 비교합니다. S/4HANA 신용 관리는 UKMBP_CMS_SGM 을 쓰고 KNKK 를 쓰지 않습니다.
- 반품 대변은 음수 매출로 잡히므로, 순매출을 볼 때 부호를 확인하세요.