본문 바로가기

ABAP 프로그래밍 개념/ABAP 프로그래밍 Concept

ABAP Programming Concept : Type Conversions

숫자적인 처리를 위해서는, 오직 Numeric 필드만을 사용합니다. 만약 숫자적인 처리에서 숫자이외의 필드들이 사용된다면, 시스템은 숫차 처리를 작동하기 전에 자동으로 숫자 타입으로 컨버팅을 시도할 것입니다. 이러한 작업은 Type Conversion이라고 불리우고, 각 data type은 구체적인 컨버젼 규칙이 존재합니다.

data objects간에 data를 옮길 때, 할당(assignment)에 관여된 data objects들은 유사해야 하거나(data objects들은 같은 type을 가지고 길이를 가지는 것이 좋습니다), source field의 데이터 타입이 target field로 변환이 가능해야합니다.

A = B 라는, B라는 data object에서 A라는 data Object로 데이터를 보낼 때, B가 source field, A가 target field 입니다.

만약 유사하지 않은 data objects 간에 데이터를 옮길 경우, 시스템은 source field에서 target field로 데이터를 옮길 때 자동으로 컨버젼 룰에 따라 데이터를 변환합니다.

예시
DATA f1 TYPE c LENGTH 2 VALUE 23.
DATA f2 TYPE i.
f2 = f1.

data object인 f1은 character 필드로서, 23이란 초기 값을 가지고 있습니다. f1은 TYPE c이기 때문에, 값은 시스템에 의해 integer보다는 character로서 해석될 것입니다. 위 f2는 다른 data object로서, intiger type으로 정의되었습니다.

data object인 f1의 값을 f2로 assign 하려고 할 때, 시스템은 데이터를 f2로 옮기기전에 적용가능한 컨버젼 룰( from c to i)를 사용하여 컨버젼을 수행합니다. 만약 컨버젼이 성공적으로 이뤄졌다면, 데이터는 옮겨집니다. 컨버젼이 실패했다면, 시스템은 runtime error를 발생시킬 것입니다. 왜냐하면, f1은 23이라는 값을 가졌기 때문에, 컨버젼은 23이 유효한 integer이기 때문에 성공적으로 수행될 것입니다.

또 다른 예시로, TYPE c필드에 문자 값을 Numeric Field로 할당하는 과정을 보겠습니다.

예시
DATA f1 TYPE c LENGTH 2 VALUE 'T1'.
DATA f2 TYPE i.
f2 = f1.

위 예시를 보면, field f1은 T3라는 값을 가지고 있고, 시스템은 이 값을 숫자로 변환할 수 없기 때문에, f2 = f1을 실행할 때,시스템은 CX_SY_CONVERSION_NO_NUMBER라는 exception을 발생기키며(raising exception이라고 부르는) 런타임 에러를 발생시킬 것입니다.  런타임 에러는 TRY ~ CATCH ~ ENDTRY 구문을 쓰면 피할 수 있습니다. 아래는 예시입니다.

DATA f1 TYPE LENGTH VALUE 'T1'.
DATA f2 TYPE i.

TRY.
  f2 f1.

  CATCH CX_SY_CONVERSION_NO_NUMBER.
    MESSAGE 'Conversion Rule에 어긋납니다' TYPE 'E'.

ENDTRY.

Runtime Error 예시

이러한 Exception에는 두가지가 있습니다. TYPE t의 data object는 TYPE d의 data object로 할당되지 않고 그 역도 마찬가지입니다. 추가적으로 거의 모든 data objects간의 할당은 가능합니다.

Converion Rules
Source Field에 TYPE c 와 TYPE i의 Target Field 간의 Conversion Rule은 상용(in commercial) 또는 수학적 표기법(mathematical notation)으로 숫자를 포함해야 한다는 것입니다. 그러나 아래와 같은 예외는 있습니다.

1) TYPE c에 빈칸은 0으로 해석됩니다.
2) 문법적으로 표기할 때 수학적 표기법으로 해석될 수 있는 경우에만 허용된다.
3) 소숫점 위치의 수는 전체 숫자로 반올림 됩니다.

이러한 예시는 SAP HELP website(http://help.sap.com 에서 확인할 수 있습니다.

자동 유형 변환(Automatic Type Conversion)을 통해 서로 다른 유형 간에 데이터를 쉽게 이동할 수 있지만, 너무 의지하면 안됩니다. 최대한의 컨버젼 규칙을 활용하는 것은 때로는 잘못된 데이터를 전달할 수도 있습니다. Source Field의 내용(값)이 Target Field에 유효하고 예상 결과를 생성하는 경우에만 데이터 개체를 서로 할당해야합니다.

예를 들어 아래 예시는, 문자를 담고있는 TYPE c가 Numeric Field에 할당이 되는 유효하지 않는 데이터 결과를 가져오는 코드입니다. 

예시
DATA f1 TYPE c LENGTH 2 VALUE 'T1'.
DATA f2 TYPE n LENGTH 2.
f2 = f1.

f2는 TYPE n으로서, 할당의 결과로 T가 무시되기 때문에 T1를 TYPE i의 변수에 할당하여 exception이 발생한 것과는 다르게 03이라는 값을 가지게 됩니다.

유형 변환(Type Converion)은 또한 데이터 객체 간에 값 할당을 수행하는 모든 ABAP 연산(예: 산술 연산)을 사용하여 자동으로 수행됩니다. 

항상, 처리하고자 하는 데이터를 위해 정확한 TYPE(유형)을 사용하는 것을 추천합니다. 이것은 Type Conversion을 수행하는 시간을 절약할 뿐만 아니라, ABAP 구문을 통해 data를 정확하게 해석하고 추가적인 기능을 제공하기 위해서 입니다. 예를 들어, YYYYMMDD의 내부 유형으로 나타내어지는 날짜를 처리하고 싶다고 해봅시다.

아래 예시는 어떻게 WRITE 구문이 이 데이터를 data type에 근거하여 나타내는지를 알려줍니다.

DATA date TYPE c LENGTH 8 VALUE '20151130'.
WRITE date.

위 구문에서 date는 TYPE c로 정의되었고, 내부 형식으로 날짜를 나타내기 위한 값으로 20151130이라는 값을 가지고 있습니다. 이 필드를 WRITE 구문을 통해 외부로 쓰여진다면, 값은 20151130 그 자체고 나타내어 질 것입니다. WRITE 구문은 이 값을 날짜로 해석할 수 없고, 대신에 이것을 text value로만 해석합니다.

DATA date TYPE d VALUE '20151130'.
WRITE date.

그렇지만, 위 구문대로 사용한다면, 결과는 contry specific system 세팅 혹은 개인 세팅에 따라서 적합한 날짜형식으로 포현될 것입니다.

SAP는 개인의 Personal date format을 허용합니다. 만약 USER 1이 MMDDYYYY로 세팅을 하였고, USER 2는 DDMMYYYY,로 세팅했다면, 20151130이라는 날짜가 USER 1은 '11302015'로 USER 2는 '30112015'로 외부로는 나타날 것입니다.

여기서 WRITE 구문은 개인의 시스템 세팅으로 값을 사용자에 맞게 외부로 해석하여 나타내어준다는 것을 알 수 있습니다. 그러나, 날짜의 값을 가지고있는 data object가 TYPE d어야지 잘 나타날 것이지, TYPE c와 같은 TYPE을 가지고 있다면 외부로는 그 값 그 자체로 형식없이 나타날 것입니다.

반응형