📖 개요 및 이 글에서 다룰 것
SAP BTP ABAP CDS Analytics Query에서 통화 변환(Currency Conversion)은 글로벌 비즈니스 환경에서 필수적인 요구사항입니다. 이 글은 시리즈 2/5편으로, @Semantics.amount.currencyCode와 @Semantics.currencyCode 어노테이션 페어를 활용하여 별도의 변환 로직 없이 Fiori 분석 앱에서 통화 변환을 활성화하는 방법을 다룹니다.
- 금액 필드와 통화 코드 필드를 어노테이션으로 연결하는 패턴 이해
- 하나의 통화 코드 필드에 여러 금액 필드를 연결하는 실무 시나리오 구현
- Fiori 분석 런타임에서 통화 변환이 어떻게 동작하는지 파악
- TCURR/TCURF 환율 테이블과의 연계 및 트러블슈팅 능력 확보
- 프로덕션 환경에서 다중 통화 처리 시 권장되는 모델링 패턴 습득
📚 사전 가정
이 글을 따라가려면 CDS View 기본 문법(define view, select from)과 어노테이션 작성 방법을 알고 있어야 합니다. 또한 Analytics Query에서 @Analytics.query: true와 #ROWS, #COLUMNS, #FREE 축 개념에 대한 기본 이해가 필요합니다. SAP S/4HANA의 통화 환율 테이블(TCURR)과 환율 타입(예: M, B, G) 개념을 알고 있으면 트러블슈팅 단계에서 유용합니다.
🔧 환경 / 버전 / 준비물
실습 환경은 다음과 같이 준비하는 것을 권장합니다.
- 플랫폼: SAP BTP, ABAP Environment (Steampunk) 또는 S/4HANA Cloud Private Edition 2023 이상
- 개발 도구: ABAP Development Tools (ADT) for Eclipse 2024-03 릴리스 이상
- CDS 스택: ABAP CDS (DDIC 기반) 또는 ABAP CDS View Entity
- 샘플 데이터: 통화 코드(USD, EUR, KRW 등)가 포함된 매출 트랜잭션 테이블
- 환율 데이터: TCURR 테이블에 기준일 환율이 등록되어 있어야 함
- 역할 권한:
SAP_BR_DEVELOPER및 분석 미리보기를 위한SAP_BR_ANALYTICS_SPECIALIST
💡 핵심 개념
SAP의 분석 모델에서 금액(Amount)은 단순한 숫자가 아니라 "값 + 통화"의 쌍으로 이해해야 합니다. 1000이라는 값이 KRW인지 USD인지에 따라 의미가 완전히 달라지기 때문입니다. CDS는 이를 어노테이션 페어 패턴으로 표현합니다.
금액 필드는 "숫자가 적힌 가격표"이고 통화 코드 필드는 "가격표 옆에 붙은 통화 라벨"입니다. 둘 중 하나만 있으면 의미가 불완전하며, CDS 어노테이션은 이 두 라벨을 묶어주는 바인딩 역할을 합니다.
어노테이션 페어 구조
@Semantics.amount.currencyCode: 'FieldName'— 금액 필드에 적용하며, 같은 뷰 내 통화 코드 필드의 이름을 문자열로 지정합니다.@Semantics.currencyCode: true— 통화 코드 필드에 적용하며, 해당 필드가 ISO 4217 표준 통화 코드임을 분석 엔진에 알립니다.
동작 흐름
[Sales Cube]
NetAmount (DEC) ←── @Semantics.amount.currencyCode: 'Currency'
Currency (CUKY) ←── @Semantics.currencyCode: true
│
▼
[Analytics Query Layer]
│
▼
[Fiori Analytical App / Analysis for Office]
- "Display Currency" 설정 가능 (예: EUR로 통일)
- 런타임에 TCURR 환율 조회 → 자동 변환
- 변환 불가 시 "*" 표시 또는 원래 통화 유지
이 패턴의 핵심 가치는 "선언적 모델링"에 있습니다. 개발자는 어노테이션 두 줄만 추가하면 되고, AMDP나 변환 함수 호출 같은 절차적 코드는 작성하지 않습니다. Fiori UI 또는 Analysis for Office가 사용자의 표시 통화 설정을 읽어 런타임에 환산을 수행합니다.
💻 실전 코드 3단계
1단계: 기본 예제 — 단일 금액 + 통화 코드
@AbapCatalog.sqlViewName: 'ZQSALESBASE'
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'Sales Query - Basic Currency Binding'
@Analytics.query: true
define view ZQ_SalesQuery_Basic
as select from ZC_SalesCube
{
@AnalyticsDetails.query.axis: #ROWS
Country,
@AnalyticsDetails.query.axis: #COLUMNS
@DefaultAggregation: #SUM
@Semantics.amount.currencyCode: 'Currency'
NetAmount,
@AnalyticsDetails.query.axis: #FREE
@Semantics.currencyCode: true
Currency
}
NetAmount에 붙은 @Semantics.amount.currencyCode: 'Currency'는 동일 뷰의 Currency 필드를 참조합니다. 문자열로 지정하므로 오타에 주의해야 합니다. 두 어노테이션이 모두 존재할 때만 Fiori 분석 앱의 통화 변환 옵션이 활성화됩니다.
2단계: 실무 시나리오 — 다중 금액 필드
실무에서는 한 트랜잭션에 여러 금액 필드(순액, 세액, 총액)가 존재합니다. 모든 금액 필드가 같은 통화 코드를 공유한다면 하나의 Currency 필드로 묶을 수 있습니다.
@Analytics.query: true
define view ZQ_SalesQuery_Multi
as select from ZC_SalesCube
{
@AnalyticsDetails.query.axis: #ROWS
Country,
@AnalyticsDetails.query.axis: #COLUMNS
@DefaultAggregation: #SUM
@Semantics.amount.currencyCode: 'Currency'
NetAmount,
@AnalyticsDetails.query.axis: #COLUMNS
@DefaultAggregation: #SUM
@Semantics.amount.currencyCode: 'Currency'
TaxAmount,
@AnalyticsDetails.query.axis: #COLUMNS
@DefaultAggregation: #SUM
@Semantics.amount.currencyCode: 'Currency'
GrossAmount,
@AnalyticsDetails.query.axis: #FREE
@Semantics.currencyCode: true
Currency
}
사용자가 표시 통화를 EUR로 변경하면 NetAmount, TaxAmount, GrossAmount 모두 동일 환율 기준으로 변환되어 합산 무결성이 유지됩니다.
3단계: 프로덕션 패턴 — 파라미터 기반 통화 변환
@Analytics.query: true
@VDM.viewType: #CONSUMPTION
define view ZQ_SalesQuery_Prod
with parameters
P_DisplayCurrency : abap.cuky,
P_ExchangeRateType : kschl,
P_KeyDate : abap.dats
as select from ZC_SalesCube
{
@AnalyticsDetails.query.axis: #ROWS
Country,
@AnalyticsDetails.query.axis: #COLUMNS
@DefaultAggregation: #SUM
@Semantics.amount.currencyCode: 'Currency'
@AnalyticsDetails.query.decimals: 2
NetAmount,
@AnalyticsDetails.query.axis: #COLUMNS
@DefaultAggregation: #SUM
@Semantics.amount.currencyCode: 'Currency'
TaxAmount,
@AnalyticsDetails.query.axis: #FREE
@Semantics.currencyCode: true
Currency,
@AnalyticsDetails.query.variableSequence: 10
$parameters.P_DisplayCurrency as DisplayCurrency,
@AnalyticsDetails.query.variableSequence: 20
$parameters.P_KeyDate as KeyDate
}
파라미터 기반 패턴의 주요 강화점: 사용자가 변환 통화와 환율 기준일을 직접 선택할 수 있게 노출하며, @AnalyticsDetails.query.decimals: 2로 표시 일관성을 확보합니다.
⚠️ 흔한 실수 / 트러블슈팅
Fiori 앱에서 "*"로 표시되거나 변환이 되지 않을 때
TCURR 테이블에 해당 일자/환율 타입의 환율 레코드가 없는 경우가 가장 흔한 원인입니다. SE16N에서 TCURR을 조회하여 FROM/TO 통화 쌍과 기준일을 확인합니다. 환율 타입(KURST)이 파라미터 값과 일치하는지 점검해야 합니다.
어노테이션 추가 후 통화 변환 옵션이 보이지 않을 때
@Semantics.amount.currencyCode의 인용부호 내 필드명이 실제 필드명과 대소문자까지 일치하는가?- 참조하는 필드에
@Semantics.currencyCode: true가 함께 선언되어 있는가? - 통화 코드 필드의 데이터 타입이
CUKY또는abap.cuky인가? - Activation이 정상 완료되었고, Fiori 분석 미리보기를 새로고침했는가?
통화가 섞인 데이터를 SUM하면 결과가 이상할 때
표시 통화를 지정하지 않은 상태에서는 분석 엔진이 통화별로 라인을 분리하거나 "*"로 표시합니다. 이는 의도된 동작으로, 서로 다른 통화의 단순 합산을 방지하기 위함입니다. 사용자가 Fiori 앱에서 표시 통화를 선택하도록 안내하거나, 쿼리에 P_DisplayCurrency 파라미터를 노출하여 강제 변환하는 방식을 사용합니다.
기타 주의 사항
- JOIN으로 가져온 통화 필드: association으로 끌어온 필드를 통화 코드로 참조할 때는 SELECT 리스트에 명시적으로 노출시켜야 합니다.
- FORMULA 측정값: 계산 측정값에도 반드시
@Semantics.amount.currencyCode를 붙여야 합니다. 누락 시 활성화 오류가 발생합니다. - TCURX 정합성: JPY, KRW 등은 소수점 자릿수가 다르므로 TCURX 설정과 데이터 저장 방식을 사전에 확인해야 합니다.
🚀 다음 단계 / 관련 주제
- AQ 실전 3/5: Unit Conversion —
@Semantics.quantity.unitOfMeasure로 수량/단위 자동 변환 - Restricted & Calculated Measures: 조건부 측정값 및 수식 측정값 설계 패턴
- Currency Conversion Functions: CDS 내에서
CURRENCY_CONVERSION()함수를 직접 호출하여 영속화하는 방식과 어노테이션 방식 비교 - Hierarchical Reporting:
@Hierarchy.parentChild를 활용한 조직/지역 계층 보고서 모델링
📚 참고 자료
- SAP Help — ABAP CDS Annotations Reference (Semantics)
- SAP Help — Analytics CDS Views in S/4HANA
- SAP Help — Currency Conversion in CDS
- SAP Community — Analytics CDS & Currency Tag Posts
- SAP Help — TCURR/TCURF 환율 테이블 구조
댓글 0
아직 댓글이 없습니다.