본문 바로가기

CDS View(Core Data Service)/Core Data Service 기초

CDS View 내장 함수 & 표현식 4. Conversion Function

전통적인 프로그래밍에서는, 통화(Currencyt_나 수량(Quantity) 값 변환(Conversion) 작업을 ABAP 레이어(Layer)에서 수행했습니다. 이 작업을 수행하기 위해 데이터 레코드를 먼저 데이터 소스에서 Internal Table로 검색한 다음, 비즈니스 요구에 따라 표준으로 제공되는 함수 모듈을 사용하여 원하는 통화나 단위 값으로 변환했습니다. 그러나 CDS 뷰를 사용할 때는 DDL 확장의 일부로 도입된 특별한 변환 함수의 도움으로 이러한 작업을 데이터베이스 레이어(Layer)에서 수행할 수 있습니다.

CDS 프레임워크는 SAP HANA 또는 다른 데이터베이스에서 작업할 때 코드 푸시다운 기능을 달성하기 위해 CDS 뷰 정의 내에서 사용할 수 있는 다음과 같은 변환 함수를 제공합니다:

통화 변환 함수 : CURRENCY_CONVERSION
단위 변환 함수 : UNIT_CONVERSION
십진수 이동 함수(Decimal shift function) :  DECIMAL_SHIFT


Currency Conversion


CURRENCY_CONVERSION 함수는 통화 환율에 기반하여 소스 값의 변환을 지원합니다. 관련 규칙은 TCURR 및 기타 TCUR* 테이블에 Transaction OB08을 사용하여 유지됩니다.

소스 통화 값을 변환하려면 소스 통화 금액, 소스 통화 키, 대상 통화 키 및 환율 날짜와 같은 특정 필수 매개변수가 필요합니다. 반면, 환율 유형, 클라이언트, 반올림, decimal_shift, decimal_shift_back 및 error_handling과 같은 다른 매개변수는 선택적이며 필요에 따라 사용할 수 있습니다.

문법은 다음과 같습니다.

CURRENCY_CONVERSION ( P1 => V1, P2 => V2, …... )

함수의 파라미터는 P1, P2 등은 연산자 =>를 사용하여 소스나 대상 값이 할당되어야 하는 매개변수 이름입니다. V1, V2 등은 데이터 소스에서 가져온 소스나 대상 값입니다.

아래 표는 통화 변환 함수를 사용할 때 고려해야 할 필수 및 선택적 매개변수를 보여주며, 이들의 목적과 연관된 데이터 타입을 설명합니다.

Parameter(P) Mandatory Purpose Data Type
amount Required 변환될 소스 금액 Curr
source_currency Required 소스 통화 키 CUKY
target_currnecy Required 대상 통화 키 CUKY
exchange_rate_date Required 변환에 고려되어야 할 TCURR 테이블의 환율 날짜입니다. DATS
exchange_rate_type Optional TCURR 테이블의 KURST 열로서 기본값은 'M'입니다 CHAR04
client Optional 해당 데이터 소스가 클라이언트별로 구분되고 변환에 클라이언트별 규칙을 고려해야 함을 나타냅니다. CLNR
round Optional 기본값은 Commercial Rounding을 사용하여 변환의 중간 결과를 반올림하는 데 사용되는 'X'입니다. 그렇지 않으면 결과가 절삭됩니다. CHAR
decimal_shift Optional 기본값은 'X'입니다. 이는 소스 값의 소수 자릿수를 소스 통화의 소수 자릿수에 따라 이동시킵니다. CHAR
decimal_shift_back Optional 기본값은 'X'입니다. 이는 결과의 소수 자릿수를 대상 통화의 소수 자릿수에 따라 이동시킵니 CHAR
error_handling Optional FAIL_ON_ERROR (기본값)인 경우, 오류가 예외를 발생시킵니다. SET_TO_NULL인 경우, 결과는 NULL 값으로 재설정됩니다. KEEP_UNCONVERTED인 경우, 소스 값은 변경되지 않습니다. CHAR20

아래 소스코드는 데이터 소스 SBOOK을 사용한 CDS 뷰 정의의 예제를 보여줍니다. 이 CDS 뷰는 소스 필드 금액 (SBOOK-FOCURAM)을 소스 통화 (SBOOK-CURKEY)에 기반하여 통화 변환 함수를 사용하여 변환합니다. 대상 통화는 그림 1에 표시된 대로 입력 매개변수로 CDS 뷰 정의에 제공됩니다. 이 CDS 뷰를 사용하면 새로운 SAP HANA 아키텍처와 관련 기능을 최대한 활용하여 코드를 데이터에 적용할 수 있습니다.

@AbapCatalog.sqlViewName: 'ZCDS_EX_SQL09'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'CDS using currency conversion function'
define view ZCDS_Example_09
with parameters
in_to_curr : abap.cuky( 5 )
as select from sbook
{
key carrid,
key connid,
key fldate,
key bookid,
case
when custtype = 'B' then 'Business Class'
when custtype = 'P' then 'Economy Class'
else 'Generic'
end as Cust_desc,
-- Original Amount and Currency
forcuram as srce_amt,
forcurkey as srce_curr,
-- Currency Conversion Function
currency_conversion(
//Source Amount
amount => forcuram,
//Source Currency
source_currency => forcurkey,
//Targer Currency
target_currency => :in_to_curr,
//Exchange rate date
exchange_rate_date => fldate,
//Converted Amount
error_handling => 'SET_TO_NULL' ) as targ_amt,
//Target Currency
:in_to_curr as targ_curr
}

그림 1


Unit Conversion


UNIT_CONVERSION 함수는 측정 단위와 관련된 규칙이 데이터베이스 테이블 T006 및 기타 T006* 테이블에 Transaction CUNI를 사용하여 유지되는 단위별 소스 값의 변환을 지원합니다.

소스 단위 값을 변환하려면 소스 수량, 소스 단위 및 대상 단위와 같은 특정 필수 매개변수가 필요합니다. 반면에 클라이언트 및 error_handling과 같은 일부 매개변수는 선택적이며 필요에 따라 사용할 수 있습니다.

함수의 문법은 다음과 같습니다.

UNIT_CONVERSION ( P1 => V1, P2 => V2, …... )

매개변수에서 P1, P2 등은 연산자 =>를 사용하여 소스나 대상 값이 할당되어야 하는 매개변수 이름이고 V1, V2 등은 데이터 소스에서 가져온 소스나 대상 값입니다.

아래 표는 단위 변환 함수에 전달할 때 고려해야 할 필수 및 선택적 매개변수, 그리고 그들의 목적과 관련된 데이터 타입을 보여줍니다.

Parameter(P) Mandatory Purpose Data Type
quantity Required 변환될 소스 금액 QUAN, DEC, INT1, INT2, INT4, FLTP
source_currency Required 소스 통화 키 UNIT
target_currnecy Required 대상 통화 키 UNIT
client Optional 변환에 고려되어야 할 TCURR 테이블의 환율 날짜입니다. CLNT
error_handling Optional 만약 FAIL_ON_ERROR (기본값)으로 설정되어 있다면, 오류가 발생하면 예외가 발생합니다.
만약 SET_TO_NULL로 설정되어 있다면, 결과는 null 값으로 재설정됩니다.
만약 KEEP_UNCONVERTED로 설정되어 있다면, 원본 값은 변경되지 않습니다.
CHAR20

결과의 컨버젼의 정확도는 사용되는 데이터베이스 시스템에 따라 달라집니다. 십진수의 부동 소수점 숫자를 지원하는 데이터베이스 시스템은 가장 높은 정확도를 제공합니다. 반올림으로 인해 ABAP 프로그램의 표준 함수 모듈을 사용한 단위 변환과 다른 결과가 발생할 수 있습니다.

아래 코드는 데이터 소스 SBOOK을 사용하는 CDS 뷰 정의의 예제를 보여줍니다. 이 뷰 정의는 뷰 정의에 입력 매개변수로 제공되는 대상 단위를 기반으로 원본 단위(SBOOK-WUNIT)에서 원본 수량 값(SBOOK-LUGGWEIGHT)을 변환하기 위해 UNIT_CONVERSION 함수를 사용합니다. 

@AbapCatalog.sqlViewName: 'ZCDS_EX_SQL_10'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'CDS using unit conversion function'
define view ZCDS_Example_10
with parameters
to_unit :abap.unit( 3 )
as select from sbook
key carrid,
key connid,
key fldate,
key bookid,
-- Original value and unit
luggweight as src_value,
wunit as src_unit,
-- Unit Conversion Function
unit_conversion(
//Source value
quantity => luggweight,
//Source value
source_unit => wunit, x
//Target unit
target_unit => :to_unit,
//Target value
error_handling => 'SET_TO_NULL' ) as con_value,
//Target unit
:to_unit as con_unit
}

 


Decimal Shift


DECIMAL_SHIFT 함수는 전달된 통화에 의해 소스 통화 값의 소수 자릿수를 설정합니다. 결과 표현식은 데이터 유형이 CURR이고 길이가 31이며 소수 자릿수가 14입니다. 그 값은 입력 매개변수를 소수점 두 자리에서 반올림하여, 10의 거듭제곱을 계산하여 구합니다. 여기서 거듭제곱은 통화에 정의된 소수 자릿수에서 두어진 소수 자릿수를 뺀 값입니다. 가능한 통화와 그들의 소수 자릿수는 TCUR* 테이블에 유지됩니다.

문법은 다음과 같습니다.

DECIMAL_SHIFT ( P1 => V1, P2 => V2, …... )

매개변수에서 P1, P2 등은 연산자 =>를 사용하여 소스나 대상 값이 할당되어야 하는 매개변수 이름이고 V1, V2 등은 데이터 소스에서 가져온 소스나 대상 값입니다.

아래 표는 필수(Mandatory) & 선택(Optional) 매개변수를 보여주며, Decimal Shift 함수를 사용할 때 고려해야 할 목적 및 관련 데이터 유형을 설명합니다.

Parameter(P) Mandatory Purpose Data Type
Amount Required 변환될 소스 금액 Curr
Currency Required 소스 통화 키 UNIT
error_handling Optional 만약 FAIL_ON_ERROR (기본값)으로 설정되어 있다면, 오류가 발생하면 예외가 발생합니다.
만약 SET_TO_NULL로 설정되어 있다면, 결과는 null 값으로 재설정됩니다.
만약 KEEP_UNCONVERTED로 설정되어 있다면, 원본 값은 변경되지 않습니다.
CHAR20


아래 코드는 데이터 소스 SBOOK을 사용한 CDS 뷰 정의의 예제를 보여줍니다. CDS 뷰 정의는 전달된 입력 통화에 따라 필드 (SBOOK-FORCURAM)의 소수 자릿수를 이동하기 위해 십진 이동 함수를 사용합니다. 

@AbapCatalog.sqlViewName: 'ZCDS_EX_SQL_11'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'CDS using Decimal shift function'
define view ZCDS_Example_11
as select from sbook
{
key carrid,
key connid,
key fldate,
key bookid,
forcurkey,
forcuram,
decimal_shift( amount => forcuram,
currency => cast( '1 ' as abap.cuky(5) ),
error_handling => 'SET_TO_NULL' ) as shift_1,
decimal_shift( amount => forcuram,
currency => cast( '2 ' as abap.cuky(5) ),
error_handling => 'SET_TO_NULL' ) as shift_2,
decimal_shift( amount => forcuram,
currency => cast( '3 ' as abap.cuky(5) ),
error_handling => 'SET_TO_NULL' ) as shift_3,
decimal_shift( amount => forcuram,
currency => cast( '4 ' as abap.cuky(5) ),
error_handling => 'SET_TO_NULL' ) as shift_4
}

 


Type Conversion Functions


CDS 뷰에서 데이터 유형 간 변환을 수행하기 위해 특수한 타입 컨버젼 함수(Special type conversion functions)가 사용 가능합니다. 이러한 함수는 일반적으로 일반 CAST 표현식으로 처리할 수 없는 고유한 변환을 구현합니다. 이 섹션에서는 두 가지 특수한 타입 컨버젼 함수(Special type conversion functions)에 대해 설명하겠습니다.

■ FLTP_TO_DEC
■ BINTOEX or HEXTOBIN

■ FLTP_TO_DEC

이 함수는 유형이 float (FLTP)인 표현식을 DEC, CURR 또는 QUAN 데이터 유형의 팩드 넘버로 변환하는 데 사용됩니다. 표현식은 FLTP 유형의 소스 필드나 리터럴일 수 있습니다.

표현 문법은 다음과 같습니다.

FLTP_TO_DEC ( expr as datatype)

함수 매개변수는 다음과 같습니다:

expr: FLTP 유형의 소스 필드나 리터럴일 수 있는 표현식입니다.
datatype: DEC, CURR 및 QUAN 데이터 타입의 대상 필드입니다.

아래 표는 Data Type을 구체화하기 위한 문법을 설명합니다.

Data Type
abap.dec(1en,decimals) 여기서 len은 데이터 타입의 길이를 나타내며, decimals은 Packed Number(Type P)의 소수 자릿수를 나타냅니다.
abap.curr(len,decimals)
abap.quan(len,decimals)

아래 소스 코드는 데이터 소스 AUSP를 사용하는 CDS 뷰 정의의 예제를 보여줍니다. 이 뷰 정의는 FLTP_TO_DEC 함수를 사용하여 AUSP-ATFLV 필드의 소수 자릿수를 함수에 지정된 길이와 소수 자릿수에 따라 이동합니다. 

@AbapCatalog.sqlViewName: 'ZCDS_EX_SQL_12'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'CDS using float to Decimal function'
define view ZCDS_EXAMPLE_12
as select from ausp
{
objek,
atinn,
atflv,
-- Converting floating field value to Decimal 10 with 0 decimals
fltp_to_dec(atflv as abap.dec(10,0)) as fltp_to_dec10_0,
-- Converting floating field value to Decimal 10 with 1 decimals
fltp_to_dec(atflv as abap.dec(10,1)) as fltp_to_dec10_1,
-- Converting floating field value to Decimal 10 with 3 decimals
fltp_to_dec(atflv as abap.dec(10,2)) as fltp_to_dec10_2,
-- Converting floating field value to Decimal 10 with 3 decimals
fltp_to_dec(atflv as abap.dec(10,3)) as fltp_to_dec10_3
}
Where objek = '000000000000001237'
and atinn = '0000000822'

■ BINTOEX or HEXTOBIN

이러한 특별한 Function는 바이트(Byte)를 문자열로 변환하거나 그 반대로 변환하는 데 사용됩니다.

BINTOHEX 함수는 expr의 반 바이트(half byte)를 0부터 9까지의 16진수 문자로 변환하여 좌측 정렬된 문자열로 변환합니다. 유효한 표현식 유형은 최대 길이가 255인 RAW입니다. 결과는 expr의 길이의 두 배인 CHAR 유형을 갖습니다. 표현식에서는 데이터 소스의 필드만 지정할 수 있습니다.

HEXTOBIN 함수는 expr의 16진수 문자로부터 반 바이트(half byte)가 결정된 바이트 문자열로 변환합니다. 변환하기 전에 앞부분의 공백은 제거되고, 모든 뒷부분의 공백은 0으로 대체됩니다. 유효한 표현식 유형은 최대 길이가 510인 CHAR 또는 NUMC입니다. 결과는 arg의 길이의 절반인 RAW 유형을 갖습니다. 표현식에서는 데이터 소스 및 리터럴 필드만 지정할 수 있습니다. 모든 문자의 총 개수는 짝수여야 하며, 소스 문자열에는 0부터 9까지의 16진수 문자 및 전/후 공백만 포함될 수 있습니다. 리터럴에는 앞부분에 공백이 포함될 수 없습니다.

문법은 다음과 같습니다.

BINTOHEX( expr ) or HEXTOBIN( expr )

아래 코드는 데이터 소스 BUT000를 사용한 CDS 뷰 정의의 예를 보여줍니다. 이 CDS 뷰는 데이터 소스 필드 PARTNER와 PARTNER_GUID에 대해 BITTOHEX 및 HEXTOBIN 변환 함수를 사용하여 데이터 형식을 변환합니다. 

@AbapCatalog.sqlViewName: 'ZCDS_EX_SQL_13'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #CHECK
@EndUserText.label: 'CDS using BTH and HTB function'
define view ZCDS_EXAMPLE_13
as select from but000
{
partner,
partner_guid,
bintohex(partner_guid) as trgt_bintohex,
hextobin(partner) as trgt_hextobin
}
where
 partner = '0000000118'

 

 

반응형