SAP 고정자산 이력명세서 — 기초에서 기말까지 무엇이 움직였나
자산별 기초 장부가액에서 취득·처분·이체·상각을 거쳐 기말 장부가액에 이르는 변동을 한 줄로 펼치는 명세서입니다.
자산 명세서에서 감사가 가장 먼저 보는 것은 기초와 기말의 차이입니다. 그 차이가 취득·처분·이체·상각으로 모두 설명되면 그 자산은 넘어갑니다.
설명되지 않는 금액이 남으면 거기서부터 질문이 시작됩니다. 표준 고정자산 변동 구조를 그대로 이어받아 기초에서 기말까지의 경로를 한 줄에 담고 검산이 되게 하도록 OpenUI5 화면으로 확장한 것이 이 앱입니다. 실제 구동 화면 2종을 함께 공개합니다.
SAP 표준 기능을 그대로 이어받은 부분
- 자산 키 — 자산번호(
anln1)와 자산등급(anlkl) - 기초·기말 장부가액 —
bvStart·bvEnd - 변동 — 취득(
acqAmount) · 처분(retireNbv) · 이체(transferNet) - 감가상각 — 당기 상각액(
deprYtd) - 처분 — 처분대가(
retireProceeds)와 처분손익(retireGainLoss)
| 항목 | 내용 |
|---|---|
| 대응 T-code | AR11N · S_ALR_87011990 |
| 업무 영역 | 재무회계(FI-AA) · 자산 변동 · 결산 |
| Namespace | zui5.assetmove |
| 셸 구조 | 조회조건 영역(우측 조회·초기화) + 변동 명세 테이블 |
| 화면 수 | 조회 화면 1개 |
| 데이터 | 자산 변동 72건 |
| 성격 | 조회형(Read-Only) — 취득·처분·상각은 표준이 담당 |
| UI 테마 | sap_horizon 단일 적용 |
실제 화면 2종 둘러보기
회사코드·회계연도·자산등급으로 조회하면 자산별 변동이 한 줄씩 나옵니다 → 기초에서 기말까지 검산하고 → 검증 표시가 걸린 자산을 확인합니다.
아래는 실제로 앱을 실행해 기능을 눌러 가며 캡처한 화면입니다. 이미지를 클릭하면 원본 크기로 확대됩니다.
조작 방법
- 회사코드와 회계연도를 고릅니다.
- 자산등급과 코스트센터로 범위를 좁힙니다.
- 조회조건 입력필드에서 값을 바꾸거나 Enter 를 누르면 즉시 조회됩니다.
- 왼쪽에서 오른쪽으로 읽으며 기초 + 변동 = 기말이 맞는지 봅니다.
- 검증 표시가 걸린 자산부터 확인합니다. 설명되지 않는 변동이 있다는 뜻입니다.
- 처분손익이 큰 자산은 손익 영향이 커 별도로 검토합니다.
- 결과는 CSV 다운로드로 내려받아 자산 명세서 조서에 씁니다.
변동 산식과 검증
한 줄에 담긴 여섯 숫자가 하나의 식으로 묶입니다.
기말 장부가액(bvEnd) = 기초 장부가액(bvStart)
+ 취득(acqAmount)
− 처분 장부가액(retireNbv)
± 이체(transferNet)
− 당기 상각(deprYtd)
처분손익 = 처분대가(retireProceeds) − 처분 장부가액(retireNbv)
식이 성립하지 않으면 → 검증 표시 (checkFlag)
검증을 행마다 두는 이유
합계만 맞추면 개별 자산의 오류가 서로 상쇄돼 보이지 않습니다. 한 자산에서 100만원이 남고 다른 자산에서 100만원이 모자라도 총계는 맞습니다. 행마다 검산하면 그런 상쇄가 드러나고, 문제 자산만 뽑아 볼 수 있습니다.
장부가액을 움직이는 네 가지
| 변동 | 내용 | 장부가액 영향 |
|---|---|---|
| 취득 | 새 자산 또는 자본적 지출 | 증가 |
| 처분 | 매각 · 폐기 | 감소 · 처분손익 발생 |
| 이체 | 부서 · 법인 간 이동 | 증감 (짝이 맞아야 함) |
| 감가상각 | 기간 경과에 따른 비용 인식 | 감소 |
조회조건
| 필드 | 필수 | 설명 |
|---|---|---|
회사코드 bukrs | 필수 | 대상 회사코드 |
회계연도 gjahr | 필수 | 변동 대상 연도 |
자산등급 anlkl | 선택 | 건물 · 기계 등 |
코스트센터 kostl | 선택 | 귀속 부서 |
상태 status | 선택 | 정상 / 검증 필요 |
결과 컬럼
| 컬럼 | 의미 · 표시 |
|---|---|
자산번호 anln1 · 자산명 txt50 | 자산 식별 |
자산등급 anlkl · anlklText | 등급 코드와 명칭 |
코스트센터 kostl · kostlText | 귀속 부서 |
기초 장부가액 bvStart | 연초 장부가액 |
취득 acqAmount · 취득일 acqDate | 기중 취득 |
처분 장부가액 retireNbv · 처분일 retireDate | 처분 시점 장부가액 |
처분대가 retireProceeds | 매각 대금 |
처분손익 retireGainLoss | 대가 − 장부가액 |
이체 transferNet | 이체 순증감 |
당기상각 deprYtd | 당해 연도 상각액 |
기말 장부가액 bvEnd | 기초 + 변동 |
검증 checkFlag | 식이 성립하지 않으면 표시 |
SAP 표준 기능 매핑
| 표준 | 역할 | 이 화면에서의 확장 |
|---|---|---|
AR11N | 자산 변동 명세서 | 행마다 검산을 붙여 설명되지 않는 변동 식별 |
S_ALR_87011990 | 자산 이력 리포트 | 취득·처분·이체·상각을 한 줄에 배치 |
ANLA · ANLC | 자산 마스터 · 가액 | 기초·기말 장부가액 |
ANEP | 자산 거래 — 취득 · 처분 · 이체 | 변동 원천 |
ANLP | 자산 상각 전기 | 당기 상각액 |
도입 시 확인이 필요한 부분
이체는 보내는 자산과 받는 자산이 짝을 이룹니다. 조회 범위가 한쪽만 포함하면 검산이 어긋난 것처럼 보이므로, 이체가 잦은 환경이면 전체 회사코드를 함께 조회하거나 이체 건을 별도로 대사해야 합니다. 감가상각영역이 여러 개인 경우 어느 영역 기준인지도 정해야 합니다.
참고 CDS 뷰
@AbapCatalog.sqlViewName: 'ZCASSETMOVE'
@EndUserText.label: '고정자산 변동 명세 (Z)'
define view Z_C_ASSET_MOVEMENT
as select from anla as Master
left outer join anlc as Value on Master.bukrs = Value.bukrs
and Master.anln1 = Value.anln1
and Master.anln2 = Value.anln2
left outer join anep as Trans on Master.bukrs = Trans.bukrs
and Master.anln1 = Trans.anln1
and Master.anln2 = Trans.anln2
{
key Master.bukrs,
key Value.gjahr,
key Master.anln1 as AssetNo,
Master.txt50 as Txt50,
Master.anlkl as Anlkl,
Master.kostl as Kostl,
// 기초 장부가액 = 전년도 기말 (누계 뷰에서 이월)
// 거래유형(bwasl)으로 취득·처분·이체를 갈라 집계
sum( case when Trans.bwasl like '1%' then Trans.anbtr else 0 end ) as AcqAmount,
sum( case when Trans.bwasl like '2%' then Trans.anbtr else 0 end ) as RetireAmount,
sum( case when Trans.bwasl like '3%' then Trans.anbtr else 0 end ) as TransferNet,
Value.knafa as AccumDep
// 당기 상각은 ANLP 에서 집계, 기말 = 기초 + 취득 − 처분 ± 이체 − 상각
}
group by Master.bukrs, Value.gjahr, Master.anln1, Master.txt50,
Master.anlkl, Master.kostl, Value.knafa
매핑 이해를 돕기 위한 참고용 설계입니다. 실제 도입 시에는 운영 환경 설정과 릴리즈에 맞춰 조정합니다.
OpenUI5 구성
| 기능 | 사용 컨트롤 |
|---|---|
| 화면 골격 | sap.m.Page + 조회조건 영역 · 변동 명세 테이블 |
| 조회조건 | sap.m.Select · sap.m.DatePicker · sap.m.Input — 우측 끝에 조회·초기화 |
| 이벤트 | 모든 버튼이 onPAI 단일 진입점, fcCode 로 분기 |
| 명세 테이블 | sap.m.Table — 기초→기말 순서로 열 배치 |
| 검증 표시 | sap.m.ObjectStatus — 검산 불일치 |
| 금액 | sap.m.ObjectNumber — 우측정렬, 감소는 음수 표기 |
열 순서를 식 순서와 맞춘 이유
기초·취득·처분·이체·상각·기말을 그 순서대로 배치하면 표를 왼쪽에서 오른쪽으로 읽는 것이 곧 검산이 됩니다. 순서가 뒤섞이면 계산기를 꺼내야 하고, 그러면 사람이 확인을 건너뜁니다.
파일 구성
| 경로 | 역할 |
|---|---|
manifest.json | 앱 디스크립터 — 앱 ID(zui5.assetmove) · ko 로케일 |
view/Main.view.xml | 조회조건과 변동 명세 테이블 |
controller/Main.controller.js | 조회 · 변동 검산 · CSV |
model/ModelMock.js | localdata JSON 읽기(Promise) |
js/formatter.js | 금액 · 일자 · 검증 상태 포맷터 |
localdata/assetmove.json | 자산 변동 72건 |
검증 결과
| 검증 항목 | 결과 |
|---|---|
| 기말 = 기초 + 취득 − 처분 ± 이체 − 상각 (전 건) | 통과 |
| 처분손익 = 처분대가 − 처분 장부가액 | 통과 |
| 취득 금액이 있으면 취득일도 존재 | 통과 |
| 처분 금액이 있으면 처분일도 존재 | 통과 |
| 자산등급·코스트센터 코드가 있으면 명칭도 존재 | 통과 |
| XML · JSON 전체 파싱 | 오류 0건 |
| 화면 렌더링 — 실브라우저 조회 후 캡처 | 2/2 |
| 테마 런타임 확인 | sap_horizon |
자주 묻는 질문
검증 표시가 걸리면 무엇부터 보나요?
이체가 있는지 먼저 봅니다. 상대 자산이 조회 범위 밖이면 짝이 보이지 않아 검산이 어긋납니다. 이체가 없는데도 어긋나면 거래유형 분류나 상각 전기를 확인합니다.
처분손익은 어디에 반영되나요?
손익계산서의 영업외손익으로 갑니다. 금액이 크면 당기 손익에 영향이 크므로 결산 검토 대상이 되고, 그래서 명세서에 별도 열로 둡니다.
기초 장부가액은 어떻게 구하나요?
전년도 기말 장부가액이 그대로 이월됩니다. 연도가 바뀔 때 이월이 제대로 되지 않으면 그 해 명세서 전체가 어긋나므로 연초에 한 번 확인하는 것이 좋습니다.
SAP 표준 기능과 어떻게 이어지나요?
취득·처분·이체·상각은 표준 FI-AA 트랜잭션이 만들고 자산 거래 테이블에 남습니다. 이 화면은 그 거래를 자산별로 접어 기초에서 기말까지 한 줄로 펼치고, 행마다 검산을 붙여 설명되지 않는 변동을 찾는 확장입니다.