ABAP

ANLC vs I_AssetAcquisition 자산 조회 #shorts #SAP #ABAP

▶ YouTube에서 보기

개요 및 다루는 범위

이 글은 SAP S/4HANA의 표준 CDS View인 I_AssetAcquisition을 중심으로 자산 취득(Asset Acquisition) 거래 데이터가 어떻게 모델링되고, FI-AA(자산 회계)와 FI-GL(총계정원장)이 어떤 키로 연결되는지를 다룹니다. 단순한 필드 나열이 아니라, 취득 거래의 회계적 의미와 ABAP CDS 쿼리 패턴, 실무에서 자주 부딪히는 통화 변환·기간 필터링·승인 컬럼 관리 방법까지 단계적으로 살펴봅니다.

  • I_AssetAcquisition CDS View의 컬럼 구성과 키 구조 이해
  • 자산 마스터(I_FixedAsset) 및 회계 문서(I_JournalEntry)와의 조인 패턴 습득
  • 회계연도/기간 기준 취득가액 집계 쿼리 작성
  • RAP 기반 분석 서비스 노출 시 권한·통화 처리 고려사항 확인

읽기 전에 알아두면 좋은 것

본 글은 ABAP CDS의 기본 문법(define view, association, annotation)과 FI-AA의 기초 개념(자산 클래스, 평가 영역, 취득 유형)을 이미 한 번 접해본 독자를 대상으로 합니다. 또한 SE16/ADT(Eclipse ABAP Development Tools)에서 CDS View를 미리보기하고, SQL 콘솔에서 결과를 확인할 수 있는 환경을 가정합니다.

환경 및 버전 정보

I_AssetAcquisition은 S/4HANA의 가상 데이터 모델(VDM, Virtual Data Model) 중 Basic Interface View 계층에 속합니다. 버전·환경 정보는 일반적으로 다음과 같습니다.

  • SAP S/4HANA on-premise 2021 이상 또는 SAP S/4HANA Cloud (Private/Public Edition)
  • ABAP Platform 7.56 이상 권장, ADT(Eclipse) 3.30 이상
  • FI-AA 모듈 활성화, 신규 자산 회계(New Asset Accounting) 사용
  • 분석 권한: S_RS_AUTH, FI-AA 권한 객체 A_S_ANLKL, A_B_ANLKL
  • 테스트 클라이언트: 회사코드(BUKRS), 자산 클래스(ANLKL) 마스터가 사전 구성되어 있어야 함

이 글의 컬럼명·association명은 SAP 표준 명명 규칙을 따르며, 릴리스에 따라 일부 association이 추가/삭제될 수 있으므로 ADT의 Show Source 기능으로 실제 정의를 확인하는 것이 권장됩니다.

핵심 개념: 자산 취득 거래의 데이터 흐름

자산 취득이란 회사가 새로운 고정자산을 사들이거나, 기존 자산에 자본적 지출을 추가하여 장부가액을 증가시키는 거래입니다. SAP에서는 이런 거래가 발생하면 두 종류의 후속 데이터가 동시에 만들어집니다. 하나는 자산 거래(Asset Transaction) 라인이고, 다른 하나는 회계 문서(Journal Entry) 라인입니다. I_AssetAcquisition은 이 둘을 취득이라는 관점에서 결합·필터링해 보여주는 인터페이스 뷰입니다.

비유하자면, I_AssetAcquisition은 자산 거래 원장에서 취득 거래 유형(Transaction Type Category가 Acquisition)에 해당하는 행만 골라낸 색안경과 같습니다. 내부적으로는 ANLC(자산 가치), ACDOCA(Universal Journal), 그리고 자산 거래 유형 마스터(TABW, TABWT)가 결합되어 있습니다.

ACDOCA (회계라인)
ANLC   (자산가치)
  => I_AssetAcquisition => 분석/리포트
     I_FixedAsset (자산 마스터)
     I_CompanyCode
     I_AssetTransactionType

핵심 키 컬럼은 다음과 같이 묶입니다. 회사코드(CompanyCode) + 메인 자산번호(MasterFixedAsset) + 자산 서브번호(FixedAsset) + 회계연도(FiscalYear) + 자산 거래 유형(AssetTransactionType) + 참조 문서(ReferenceDocument) 조합으로 한 줄이 식별됩니다. 평가 영역(DepreciationArea)은 통상적으로 01(장부)에 한정되거나, 평가 영역별 멀티 라인을 노출하는 형태로 설계됩니다.

또한 취득 금액은 거래 통화(Transaction Currency), 회사코드 통화(Company Code Currency), 그리고 평가 영역 통화(Depreciation Area Currency) 등 다중 통화로 저장되는 경우가 많습니다. 통화 키 컬럼이 별도로 존재하므로, 쿼리에서 단순 SUM 하기 전에 통화 키를 GROUP BY에 포함해야 의미 있는 합계가 나옵니다.

실전 예제 1단계: 기본 조회

먼저 가장 기본적인 패턴부터 시작합니다. 특정 회사코드와 회계연도에서 발생한 모든 취득 거래를 자산번호·취득일자 순으로 정렬해 조회합니다.

SELECT FROM I_AssetAcquisition
  FIELDS CompanyCode,
         MasterFixedAsset,
         FixedAsset,
         FiscalYear,
         AssetTransactionType,
         AssetValueDate,
         ReferenceDocument,
         AcquisitionAmountInCoCodeCrcy,
         CompanyCodeCurrency
  WHERE  CompanyCode      = 1010
    AND  FiscalYear       = 2026
    AND  DepreciationArea = 01
  ORDER BY MasterFixedAsset, AssetValueDate
  INTO TABLE @DATA(lt_acquisitions).

LOOP AT lt_acquisitions INTO DATA(ls_row).
  WRITE: / ls_row-MasterFixedAsset,
           ls_row-AssetValueDate,
           ls_row-AcquisitionAmountInCoCodeCrcy
             CURRENCY ls_row-CompanyCodeCurrency.
ENDLOOP.

여기서 핵심은 DepreciationArea 조건입니다. 이 필터를 빼면 평가 영역 수만큼 동일 거래가 중복돼 나타나 합계가 부풀려집니다.

실전 예제 2단계: 자산 마스터·회계 문서 조인

실무에서는 자산번호만으로는 의미 파악이 어렵습니다. 자산명, 자산 클래스, 그리고 해당 거래의 회계 문서 번호까지 함께 보여주는 분석용 CDS View를 한 번 더 정의해 봅니다.

@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: Asset Acquisition Analytics
define view entity ZC_AssetAcqAnalytics
  as select from I_AssetAcquisition as Acq

  association [0..1] to I_FixedAsset  as _Asset
    on  Acq.CompanyCode      = _Asset.CompanyCode
    and Acq.MasterFixedAsset = _Asset.MasterFixedAsset
    and Acq.FixedAsset       = _Asset.FixedAsset

  association [0..1] to I_JournalEntry as _JE
    on  Acq.CompanyCode       = _JE.CompanyCode
    and Acq.ReferenceDocument = _JE.AccountingDocument
    and Acq.FiscalYear        = _JE.FiscalYear
{
  key Acq.CompanyCode,
  key Acq.MasterFixedAsset,
  key Acq.FixedAsset,
  key Acq.FiscalYear,
  key Acq.AssetTransactionType,
  key Acq.ReferenceDocument,
      _Asset.FixedAssetDescription as AssetName,
      _Asset.AssetClass            as AssetClass,
      _Asset.CapitalizationDate    as CapitalizedOn,
      Acq.AssetValueDate           as ValueDate,
      Acq.AcquisitionAmountInCoCodeCrcy,
      Acq.CompanyCodeCurrency      as CoCodeCrcy,
      _JE.DocumentReferenceID      as JEReference,
      _JE.AccountingDocumentType   as JEDocType,
      _Asset,
      _JE
}
where Acq.DepreciationArea = 01;

주의할 점은 I_FixedAsset과의 조인 키에 서브번호(FixedAsset)까지 포함해야 한다는 것입니다. 메인 자산 하나에 여러 서브번호가 매달려 있고, 취득 거래는 서브번호 단위로 기록되기 때문입니다. 또한 @AccessControl.authorizationCheck: #CHECK 어노테이션을 통해 DCL(Data Control Language)에 정의된 권한 객체가 자동 적용되도록 설정합니다.

실전 예제 3단계: 프로덕션용 집계와 통화·예외 처리

마지막으로 월별 취득가액 합계를 회사코드 통화로 집계해 분석 큐브에 노출하는 패턴을 보겠습니다. 통화 변환과 에러 처리, 그리고 권한·세션 변수 처리를 함께 다룹니다.

@Analytics.dataCategory: #CUBE
@AccessControl.authorizationCheck: #CHECK
@VDM.viewType: #COMPOSITE
@EndUserText.label: Monthly Asset Acquisition Cube
define view entity ZC_AssetAcqMonthlyCube
  with parameters
    P_DisplayCurrency  : vdm_v_display_currency,
    P_ExchangeRateType : kurst,
    P_ConversionDate   : vdm_v_key_date

  as select from I_AssetAcquisition as Acq
  association [0..1] to I_FixedAsset as _Asset
    on  Acq.CompanyCode      = _Asset.CompanyCode
    and Acq.MasterFixedAsset = _Asset.MasterFixedAsset
    and Acq.FixedAsset       = _Asset.FixedAsset
{
  key Acq.CompanyCode,
  key Acq.FiscalYear,
  key Acq.FiscalPeriod,
  key _Asset.AssetClass,

      @Semantics.amount.currencyCode: DisplayCurrency
      currency_conversion(
        amount             => Acq.AcquisitionAmountInCoCodeCrcy,
        source_currency    => Acq.CompanyCodeCurrency,
        target_currency    => $parameters.P_DisplayCurrency,
        exchange_rate_type => $parameters.P_ExchangeRateType,
        exchange_rate_date => $parameters.P_ConversionDate,
        error_handling     => SET_TO_NULL
      ) as AcquisitionAmountInDispCrcy,

      $parameters.P_DisplayCurrency  as DisplayCurrency,
      cast( 1 as abap.int4 )         as AcquisitionCount
}
where Acq.DepreciationArea = 01
group by
  Acq.CompanyCode,
  Acq.FiscalYear,
  Acq.FiscalPeriod,
  _Asset.AssetClass;

실무 포인트 세 가지를 짚으면, 첫째 currency_conversion()의 error_handling: SET_TO_NULL 옵션은 환율이 없는 날짜에 대해 예외를 발생시키지 않고 NULL을 반환합니다. 둘째 @Analytics.dataCategory: #CUBE 어노테이션은 이 뷰를 분석 쿼리 위에 올릴 수 있도록 합니다. 셋째 집계 컬럼 AcquisitionCount는 단순 COUNT 대신 캐스팅으로 1을 부여하고 GROUP BY로 자연 합산되게 하는 패턴으로, 분석 쿼리에서 measure로 재사용하기 쉽습니다.

흔한 실수와 트러블슈팅

현장에서 자주 만나는 함정을 FAQ 형태로 정리합니다.

  • Q1. 취득가 합계가 회사 결산 보고서와 두 배 차이가 납니다.
    A. 평가 영역 필터 누락이 가장 흔한 원인입니다. DepreciationArea 단일 영역을 명시해야 합니다. 또한 I_AssetAcquisition은 취득 거래 유형(Transaction Type Category)을 이미 필터한 뷰지만, 일부 마이너스 보정 거래(취소·반품)도 포함되므로 부호를 고려해 SUM 해야 합니다.
  • Q2. 외화 거래의 합계가 이상합니다.
    A. AcquisitionAmountInTransactionCurrency를 GROUP BY 없이 합산하면 통화별 합이 뒤섞입니다. 항상 통화 키 컬럼을 GROUP BY에 포함하거나, 회사코드 통화 금액(AcquisitionAmountInCoCodeCrcy) 또는 currency_conversion()으로 표시 통화 변환 후 집계하는 것이 권장됩니다.
  • Q3. ADT 미리보기에서는 데이터가 보이는데, OData로 노출하면 0건이 됩니다.
    A. DCL(Data Control Language) 미적용 또는 권한 객체 누락 가능성이 큽니다. @AccessControl.authorizationCheck: #CHECK가 설정된 뷰는 호출 사용자의 회사코드·자산 클래스 권한이 없으면 결과가 비어버립니다. 테스트 계정에 A_S_ANLKL 권한 부여 여부를 확인하세요.
  • Q4. 자산 마스터 조인 후 라인이 갑자기 늘어났습니다.
    A. 메인 자산번호만으로 조인하면 다른 서브번호와 카티전 곱이 발생합니다. 반드시 MasterFixedAsset과 FixedAsset(서브번호) 둘 다 조인 조건에 넣어야 합니다.

이어서 살펴보면 좋은 주제

I_AssetAcquisition을 충분히 이해했다면, 자연스럽게 다음 영역으로 확장할 수 있습니다. 첫째, 자산 가치 흐름 전체를 다루는 I_FixedAssetValuation·I_AssetPeriodicValueChange로 감가상각·이전·폐기까지 분석 범위를 넓혀 보세요. 둘째, RAP(ABAP RESTful Application Programming Model)로 위 분석 큐브를 OData V4 서비스로 노출하고 SAP Fiori Elements 리스트 리포트를 생성하면, 자산 취득 모니터링 앱을 빠르게 제작할 수 있습니다. 셋째, SAP Analytics Cloud 또는 Embedded Analytics에서 위 큐브 위에 @Analytics.query: true인 분석 쿼리 뷰를 얹어 KPI 대시보드로 발전시킬 수 있습니다.

더 깊이 읽을 자료

  • SAP S/4HANA Cloud Help Portal — CDS Views for FI-AA
  • SAP S/4HANA on-premise Documentation — Asset Accounting
  • ABAP CDS Language Reference (help.sap.com)
  • SAP Community — ABAP CDS and FI-AA Tag
  • SAP API Business Hub — Asset Accounting OData Services
  • ABAP Platform — RAP and Analytical Annotations

댓글 0

아직 댓글이 없습니다.