반응형

아래 코드를 활성화하고 실행해 보니 ABAP programming error가 떴다. 발생한 에러는 CX_SY_CONVERSION_OVERFLOW로, TYPE P을 사용할 때 자릿수를 지정하지 않으면 기본 설정으로 인해 오버플로우가 발생할 수 있음을 보여주는 예시이다.

REPORT Z02_03.  

DATA gv_1 TYPE p.  
DATA gv_2 TYPE p DECIMALS 14.  
DATA gv_3 TYPE p.  

gv_1 = '123456789012345'.  
gv_2 = '0.12345678901234'.  
gv_3 = '12345678912345678912345678901'.  

WRITE :/ gv_1.  
WRITE :/ gv_2.  
WRITE :/ gv_3.

 

🚧 CX_SY_CONVERSION_OVERFLOW 에러 발생

ABAP programming error : CX_SY_CONVERSION_OVERFLOW

[확인할 메세지]
CX_SY_CONVERSION_OVERFLOW
Overflow when converting 12345678912345678912345678901
An overflow occurred while attempting to convert value 12345678912345678912345678901

 

🔍 CX_SY_CONVERSION_OVERFLOW 의미 해석

이름에서 알 수 있듯이 해석해 보면 다음과 같다.

  1. CX → Class Exception : 예외 클래스(exception class)를 나타내는 표준 접두사
  2. SY → System : 시스템 수준에서 발생한 예외 클래스
  3. CONVERSION : TYPE P는 패킹된 이진 숫자 형식으로 값을 저장하므로, 시스템은 숫자를 패킹 포맷으로 변환
  4. OVERFLOW : 값이 해당 타입의 표현 범위를 초과하여 저장 불가능한 상황

 

💡 CX_SY_CONVERSION_OVERFLOW 해결: TYPE P의 자릿수 지정하기

  • TYPE P는 Packed Number로, 정수와 소수를 표현할 수 있는 타입이다.
  • 길이를 따로 선언하지 않으면 기본값은 8byte로 15자리(부호 한자리 포함) 수 표현이 가능하다.
  • 입력한 값은 총 29자리이므로 변수에 숫자를 다 담지 못해서 오버플로우 에러가 발생한 것이다.

문제를 해결하기 위해 gv_3 변수의 길이를 선언해 보자.

DATA gv_3 TYPE p.DATA gv_3(16) TYPE p.

  • gv_3(16)은 16 bytes * 2 = 최대 31자리까지 숫자 저장이 가능하다.
  • 입력값(29자리)을 충분히 수용하므로 에러 없이 실행된다.

변수 gv_3 길이 선언
로케일에 따라 세 자리마다 쉼표가 자동 생성됨

그런데 출력된 결과가 조금 이상하다.

값이 출력되었지만, 출력 결과에 , 쉼표가 자동으로 들어갔다. 그 이유는 ABAP의 WRITE 문이 **사용자의 로케일(숫자 포맷 설정)**에 따라 세 자리마다 쉼표 또는 점을 자동 삽입하기 때문이다. 숫자 포맷에 따라 쉼표가 들어가는 것을 고려하여 숫자 자릿수를 줄이거나 NO-GROUPING 구문을 추가하여 쉼표를 출력하지 않도록 한다.

WRITE: / gv_3.             " 쉼표 추가됨
WRITE: / gv_3 NO-GROUPING. " 쉼표 없이 출력

숫자 길이를 줄여 ,가 함께 출력되도록 처리
NO-GROUPING 구문을 추가하여 쉼표가 출력되지 않도록 처리

 

📌 기억할 것

ABAP은 고정 길이를 가지는 8가지 기본 Data Type을 제공하고 있다. 모든 필드 길이는 byte 단위로 구분된다. 데이터 타입 D, F, I는 이미 기술적 속성이 정의되어 있어서 프로그램에서 필드 길이를 정의하지 않고 바로 사용할 수 있다. 반면에 일반적인 데이터 타입인 C, N, X를 사용할 때는 필드 길이를 정의해야 한다. 그리고 TYPE P는 DECIMALS를 명시하지 않으면 소수 자리를 인식하지 못한다.

TYPE P 필드 길이를 선언하지 않으면 기본으로 8byte=15자리(부호 한자리 포함) 수를 표현할 수 있다.

길이를 선언할 때 부호나 ,(쉼표)를 고려하여 오버플로우 에러가 나지 않도록 주의하자.

반응형

+ Recent posts