SAP FI · CO — 회계 전표 · 계정 · 채권 · 채무 · 원가
회계 전표(BKPF·BSEG)와 유니버설 저널, 계정 잔액과 손익, 채권·채무, 코스트 센터와 외화까지 재무 데이터를 읽습니다.
1. 회계 전표 — BKPF · BSEG
회계 전표는 헤더 BKPF 와 항목 BSEG 입니다. 키는 회사 코드 BUKRS + 전표 번호 BELNR + 회계 연도 GJAHR 세 개이고, 항목은 여기에 BUZEI 가 붙습니다.
SELECT H.BELNR, H.BUDAT, I.HKONT,
CASE WHEN I.SHKZG = 'S' THEN I.DMBTR ELSE -I.DMBTR END AS SIGNED_AMOUNT
FROM BKPF H
JOIN BSEG I ON I.BUKRS = H.BUKRS AND I.BELNR = H.BELNR AND I.GJAHR = H.GJAHR;
- BSEG 금액(DMBTR)은 항상 양수이고, SHKZG 가 S 면 차변, H 면 대변입니다. 잔액은 CASE 로 부호를 붙여 합칩니다.
- 헤더와 항목은 세 키를 모두 이어야 합니다. 전표 번호는 회사 코드·연도마다 다시 시작합니다.
- 전표 유형 BLART: SA 총계정원장, KR 공급업체 송장, DR 고객 송장 등입니다.
- 역분개는 BKPF.STBLG 에 상대 전표 번호가 있습니다. 원전표와 역분개 전표를 짝지어 상계 여부를 확인합니다.
문제
2. 계정 잔액과 손익 — ACDOCA · SKA1 · SKAT
S/4HANA 의 회계·원가 항목은 ACDOCA 한 테이블에 모입니다. 원장(RLDNR), 회사 코드(RBUKRS), 계정(RACCT), 회계 연도(GJAHR), 기간(POPER), 금액(HSL)이 한 행에 있습니다.
SELECT RACCT, SUM(HSL) AS BALANCE
FROM ACDOCA
WHERE RLDNR = '0L' AND RBUKRS = '1000' AND GJAHR = '2025'
GROUP BY RACCT;
- HSL 은 부호가 붙어 있습니다(차변 +, 대변 −). BSEG 처럼 SHKZG 로 부호를 붙이지 않습니다.
- 원장 조건(RLDNR)을 꼭 거세요. 병행 원장이 있으면 같은 전표가 원장마다 기록됩니다.
- 매출은 대변이라 음수입니다. 보고서에서는
-SUM(HSL)로 양수로 바꿉니다. - 계정 이름은 SKA1(계정과목표 KTOPL + 계정 SAKNR)과 SKAT 에서 가져옵니다. 손익 계정과 재무상태표 계정은 계정 유형으로 구분합니다.
- 매출총이익률 = (매출 − 매출원가) / 매출. 분모가 0 이 되지 않게 처리하세요.
문제
3. 채권과 연령 분석 — BSID · BSAD
고객 미결 항목은 BSID, 반제(정리)된 항목은 BSAD 에 있습니다. 고객(KUNNR), 전표(BELNR·GJAHR), 만기일(ZFBDT), 금액(DMBTR), 반제일(AUGDT)을 담습니다.
SELECT KUNNR,
SUM(CASE WHEN ZFBDT < '20251231' THEN DMBTR ELSE 0 END) AS OVERDUE,
SUM(DMBTR) AS OPEN_TOTAL
FROM BSID
GROUP BY KUNNR;
- 연체 일수 = 기준일 − 만기일. 구간(30일·60일·90일)은
CASE로 나눕니다. - 연령 분석은 기준일을 고정해야 재현됩니다. 오늘 날짜를 쓰면 실행할 때마다 결과가 달라집니다.
- 반제된 건의 지급 지연은 BSAD 의 반제일(AUGDT)과 만기일을 비교합니다.
- 특별 총계정원장 항목(UMSKZ)은 일반 채권과 섞지 말고 따로 보세요.
문제
4. 채무와 지급 — BSIK · BSAK
공급업체 미결 채무는 BSIK, 반제된 항목은 BSAK 에 있습니다. 구조는 채권(BSID·BSAD)과 같고, 키가 고객 KUNNR 대신 공급업체 LIFNR 입니다.
SELECT LIFNR,
SUM(CASE WHEN ZFBDT < '20251231' THEN DMBTR ELSE 0 END) AS OVERDUE,
SUM(DMBTR) AS OPEN_TOTAL
FROM BSIK
GROUP BY LIFNR;
- 지급 소요 일수 = 반제일(AUGDT) − 전기일(BUDAT) 또는 만기일. 어떤 기준을 쓰는지에 따라 해석이 달라집니다.
- 만기 도래·경과 금액은 기준일과 ZFBDT 를 비교해 나눕니다.
- 공급업체 이름과 국가는 LFA1 에서 가져옵니다.
- 미결 잔액과 지급 이력(BSAK)을 한 번에 보려면 지표별로 집계한 뒤 조인하세요.
문제
5. 코스트 센터 — CSKS · ACDOCA
CSKS 는 코스트 센터 마스터입니다. 키에 유효 시작일 DATAB 와 종료일 DATBI 가 있어 같은 코스트 센터가 기간별로 여러 행일 수 있습니다. 이름은 CSKT, 비용은 ACDOCA 의 코스트 센터(RCNTR)와 금액(HSL)에서 읽습니다.
SELECT K.KOSTL, K.VERAK, SUM(A.HSL) AS COST
FROM CSKS K
JOIN ACDOCA A
ON A.RCNTR = K.KOSTL
AND A.RBUKRS = K.BUKRS
AND A.GJAHR = '2025'
WHERE K.DATAB <= '20251231' AND K.DATBI >= '20251231'
GROUP BY K.KOSTL, K.VERAK;
- "지금 유효한 행"은
DATAB <= 기준일 AND DATBI >= 기준일로 고릅니다. 이 조건을 빠뜨리면 과거 책임자 행과 조인돼 비용이 중복됩니다. - 책임자 변경 이력은 같은 KOSTL 의 여러 유효 기간 행으로 확인합니다.
- 비중은 범주·회사 합계로 나눕니다. 분모를 윈도우 함수나 서브쿼리로 먼저 구하세요.
문제
6. 내부 오더와 외화 — AUFK · BKPF · BSEG
내부 오더는 AUFK(오더 번호 AUFNR, 범주 AUTYP 01)에 있고, 비용은 ACDOCA 에서 오더별로 집계합니다.
외화 거래는 BKPF(통화 WAERS, 환율)와 BSEG(문서 통화 금액 WRBTR, 원화 금액 DMBTR)로 읽습니다. 같은 금액을 문서 환율로 환산한 값과 평균·기준 환율로 환산한 값의 차이가 환차입니다.
SELECT H.WAERS, SUM(I.WRBTR) AS DOC_AMOUNT, SUM(I.DMBTR) AS LOCAL_AMOUNT
FROM BKPF H
JOIN BSEG I ON I.BUKRS = H.BUKRS AND I.BELNR = H.BELNR AND I.GJAHR = H.GJAHR
WHERE H.WAERS <> 'KRW'
GROUP BY H.WAERS;
- 원화 환산액은 이미 DMBTR 에 들어 있습니다. 다시 환율을 곱하면 이중 환산입니다.
- 통화별 평균 환율 = 원화 금액 합계 / 외화 금액 합계. 행별 환율의 단순 평균과 다릅니다.
- 환차는 문서 환율과 평가 환율의 차이에 금액을 곱해 구합니다. 어느 시점 환율인지(전기일·반기 말)를 명시하세요.