반응형

ABAP에서 서브루틴 내부에서 자주 사용되는 로컬 변수 선언 방식에는 STATICSDATA가 있다. 비슷해 보이지만 값의 초기화 시점과 메모리 유지 방식에서 큰 차이가 있다.

이번 글에서는 STATICSDATA를 각각 선언한 예제 코드를 보며 차이점을 비교하고 어떤 선언 방식을 사용하는 것이 적절한지 알아보자.

🧩 변수 선언이 중요한 이유

ABAP에서 변수 선언은 단순히 데이터 저장 수단을 넘어서 프로그램의 동작 방식과 밀접한 연관이 있다. 특히 서브루틴 안에서 선언되는 변수는 호출 시마다 값이 초기화되는지, 유지되는지에 따라 프로그램의 흐름이 완전히 달라질 수 있다.

🔍 STATICS와 DATA 뭐가 다를까?

  • STATICS는 선언된 서브루틴 또는 메서드 내에서만 유효하지만, 프로그램 실행 중 값이 유지된다.
  • 반면 DATA는 서브루틴이 호출될 때마다 새로 생성되고 초기화된다.

🛠️ 예제1. STATICS 선언

DO 3 TIMES.
  PERFORM call_subr.
ENDDO.

FORM call_subr.
  STATICS lv_val TYPE i.
  lv_val = lv_val + 1.
  WRITE :/ 'STATIC Variable:', lv_val.
ENDFORM.

* 결과
* STATIC: 1  
* STATIC: 2  
* STATIC: 3

💡 상태 유지가 필요한 경우에는 STATICS를 선언하는 것이 유리하다.

🛠️ 예제2. DATA 선언

DO 3 TIMES.
  PERFORM call_data.
ENDDO.

FORM call_data.
  DATA lv_cnt TYPE i.
  lv_cnt = lv_cnt + 1.
  WRITE: / 'DATA:', lv_cnt.
ENDFORM.

* 결과
* DATA: 1  
* DATA: 1  
* DATA: 1

💡 매번 새로운 값으로 계산해야 하는 로직에는 DATA를 선언하는 것이 유리하다.

🔍 기본 개념 및 코드 분석

1. PERFORM call_subr. : 서브루틴 호출

  • STATICS : 루프가 도는 동안 한 번 설정한 값이 유지된다. (1 → 2 → 3)
  • DATA : DATA 구문으로 변수를 선언하게 되면 Local 변수는 서브루틴이 호출될 때마다 값이 초기화된다. (1 → 1 → 1)

2. 서브루틴: 함수와 유사하며 모듈형 프로그래밍을 위해 사용

  • 서브루틴은 ABAP에서 자주 반복되는 코드를 모듈화할 수 있도록 해주는 구조이다. FORM ... ENDFORM. 구문으로 감싸서 정의하며 호출 시 PERFORM을 사용한다.

3. STATICS lv_val TYPE i. : 정적변수 선언

  • STATICS는 서브루틴 내부에서만 유지되는 정적 변수이다. 한 번 선언되면 프로그램이 끝날 때까지 값이 유지되며, 서브루틴이 다시 호출되더라도 초기화되지 않는다.
  • 명시적인 초기화 없이 기본값으로 초기화된다.
반응형
반응형

SAP ABAP에서는 날짜와 시간 정보를 처리할 때 시스템 변수(System Field)를 자주 사용한다. 특히 실시간 프로세스나 로깅, 시간 기반 조건 분기 등에 있어 정확한 일시 처리 방식은 매우 중요하다.

이번 글에서는 sy-datum, sy-datlo, sy-datar, sy-uzeit, sy-timlo 각각의 활용 방법과 차이점을 정리했다. 글로벌 환경에서의 시간대 설정하는 방법도 함께 정리했다.

우선 시스템에서 시간을 설정하는 방법을 먼저 알아보자.

🤔 시스템에서 시간 설정하기

  1. T-CODE: SPRO
    SAP 시스템의 표준 시간대 시스템 세팅은 SPRO에서 TIMEZONE을 설정하게 된다.

2가지 Time Zone이 존재한다.

  • System TIme Zone: Application Server의 Time Zone 설정
  • User's Default Time Zone: 개별 사용자의 Time Zone 설정

한국은 그리니치 표준 시간보다 9시간 빠른 시간대를 이용하므로 'UTC+9'를 사용한다.

  1. T-CODE: SU3
    User's Default Time Zone은 사용자 프로파일의 Personal Time Zone과 연계되어 있다. 사용자 레벨에서 프로파일 Time Zone이 없으면, IMG 세팅 화면에서의 User's Default Time Zone을 기본으로 사용하게 된다.


🕑 시스템 변수로 날짜와 시간 출력하기

REPORT z02_07.

* 시스템 변수로 날짜, 시간 출력하기

WRITE: / 'SY-DATUM (시스템 표준 시간대 기준):', sy-datum,     "2025.05.30
       / 'SY-DATLO (사용자 로컬 시간대 기준):', sy-datlo,     "2025.05.30
       / 'SY-DATAR (Data Record의 날짜):', sy-datar,             "(빈 값)
       / 'SY-UZEIT (시스템 시간):', sy-uzeit,                   "13:40:20
       / 'SY-TIMLO (로컬 시간):', sy-timlo.                    "13:40:20
REPORT z02_07.

* 1. 날짜 계산 (sy-datum)

DATA : gv_date1 TYPE d.

gv_date1 = sy-datum.
WRITE : / 'gv_date1:', gv_date1. "20250530

gv_date1 = gv_date1 + 3.
WRITE : / 'gv_date1 + 3:', gv_date1. "20250602

* 1. 날짜 계산 (sy-datlo)

DATA : gv_date2 TYPE d.

gv_date2 = sy-datlo.
WRITE : / 'gv_date2:', gv_date2. "20250530

gv_date2 = gv_date2 + 3.
WRITE : / 'gv_date2 + 3:', gv_date2. "20250602

* 1. 날짜 계산 (sy-datar)

DATA : gv_date3 TYPE d.

gv_date3 = sy-datar.
WRITE : / 'gv_date3:', gv_date3." (빈 값)

gv_date3 = gv_date3 + 3.
WRITE : / 'gv_date3 + 3:', gv_date3. "00010104

* 2. 시간 계산 (sy-uzeit)

DATA : gv_time1 TYPE t.

gv_time1 = sy-uzeit.
WRITE : / 'gv_time1:', gv_time1. "130815

gv_time1 = gv_time1 - 60.
WRITE : / 'gv_time1 - 60:', gv_time1. "130715

* 2. 시간 계산 (sy-timlo)

DATA : gv_time2 TYPE t.

gv_time2 = sy-timlo.
WRITE : / 'gv_time2:', gv_time2. "130815

gv_time2 = gv_time2 - 60.
WRITE : / 'gv_time2 - 60:', gv_time2. "130715

 

🔍 시스템 변수의 종류와 활용 예시

  1. SY-DATUM: 시스템 기준 날짜
    • 설명: SAP 시스템 서버의 표준 시간대(System Time Zone) 기준으로 설정된 날짜
    • 설정 위치: T CODE: SPRO → General Settings → Time Zones → Maintain System Settings
    • 활용 예시:
      • 시스템 로그 시간 기록
      • 서버 기준 일자 처리
  2. SY-DATLO: 사용자 로컬 기준 날짜
    • 설명: SAP 사용자 프로파일에 설정된 개인 Time Zone 또는 기본 사용자 Time Zone 기준으로 설정된 날짜
    • 설정 위치: T-CODE: SU3 (User Parameters) → Personal Time Zone
    • 활용 예시:
      • 글로벌 사용자의 현지 시간 처리
      • 사용자의 로컬 보고서 출력 날짜
      • 🌍 예시: 한국 본사(SY-DATUM = 2025-05-30), 중국 공장 사용자(SY-DATLO = 2025-05-29)
  3. SY-DATAR: 데이터 기록 날짜
    • 설명: 일반적으로 테이블에서 읽어온 레코드의 날짜 필드를 참조하거나 배치 프로세스 중 지정된 날짜로 사용됩니다.
    • ⚠️ 주의: SY-DATAR는 대부분 내부 프로세스에서 사용되며, 명시적으로 지정하지 않으면 SY-DATUM과 동일한 값을 갖는 경우가 많습니다.
    • 활용 예시:
      • BDC (Batch Data Communication), IDOC 처리 등에서 입력 일자를 추적할 때 사용
  4. SY-UZEIT: 시스템 시간
    • 설명: Application Server 시간 (시, 분, 초)
    • 형식: hhmmss (예: 154305 → 오후 3시 43분 5초)
  5. SY-TIMLO: 로컬 시간
    • 설명: 사용자 Time Zone 기준 시간 (시, 분, 초)
    • 활용 예시:
      • 사용자 시간대 기반 업무 마감 시간 체크 등


📌 시스템 변수 직접 출력 vs 변수 저장 후 출력

SY-DATUM을 바로 WRITE 구문에 출력할 때와 SY-DATUM을 gv_date1이라는 변수에 담아 출력할 때 포맷이 다르게 출력된다. 앞서 사용한 예제 코드를 비교해 보자.

* 직접 출력
WRITE: / 'SY-DATUM 직접 출력:', sy-datum.     " → 2025.05.30 (형식화된 출력)

* 변수에 담아 출력
DATA(gv_date1) = sy-datum.
WRITE: / 'SY-DATUM 변수 출력:', gv_date1.     " → 20250530 (내부 형식 그대로 출력)

 

🔖 시스템 변수 및 출력 형식 차이 요약

🔖 시스템 변수 정리표 및 출력 형식 차이 요약

시스템 변수 정리

변수 설명 예시 값 특이사항
SY-DATUM 서버 기준 날짜 20250530 가장 일반적인 날짜 변수
SY-DATLO 사용자 기준 날짜 20250530 사용자 Time Zone 기준
SY-DATAR 데이터 레코드 날짜 없음 BDC/IDOC 등 특수한 경우만 값 존재
SY-UZEIT 서버 기준 시간 130815 hhmmss 형식
SY-TIMLO 사용자 기준 시간 130815 Time Zone 고려된 시간

 

출력 포맷 차이

  • WRITE 구문에서 시스템 변수는 SAP가 자동으로 보기 좋은 형식(YYYY.MM.DD)으로 포맷해서 출력한다.
  • DATA gv_date TYPE d. 형태의 일반 변수는 내부 형식(YYYYMMDD)을 포맷하지 않고 그대로 출력한다.
  • 시간 변수 (SY-UZEIT, SY-TIMLO)에도 동일하게 적용된다.
반응형
반응형

ABAP에서 숫자 연산을 처리할 때 TYPE P (Packed Number)는 매우 자주 사용된다. 이번 글에서는 Fixed Point Arithmetic 이 무엇인지, 해당 옵션의 체크 여부에 따라 어떻게 계산 결과가 달라지는지를 알아보자.

🔍 Fixed Point Arithmetic 정의

Fixed point arithmetic

If you mark this checkbox, all calculations in the program will use fixed point arithmetic.
If you do not, packed numbers (ABAP/4 type P, Dictionary types CURR, DEC or QUAN) will be treated as integers when they are used in assignments, comparisons, and calculations, irrespective of the number of decimal places defined. Intermediate results in arithmetic calculations will also be rounded to the next whole number. The number of decimal places defined is only taken into account when you output the answer using the WRITE statement.

✔️ Fixed point arithmetic 체크했을 때 (Default)

  • 모든 계산이 고정 소수점 방식으로 수행되며, DECIMALS 설정이 실제 연산에 반영

❌ Fixed point arithmetic 체크해제했을 때

  • TYPE P, CURR, DEC, QUAN과 같은 소수 타입들도 정수처럼 처리
  • 소수점 아래 자릿수(DECIMALS)는 무시되며, 연산 결과는 내부적으로 반올림된 정수로 처리

1️⃣ Fixed Point Arithmetic 옵션 활성화된 경우 (체크 O)

🔹 예제 코드 1

DATA gv_1 TYPE p VALUE '1.1'.  
DATA gv_2 TYPE p VALUE '2.1'.  
DATA gv_3 TYPE p.  

gv_3 = gv_1 * gv_2.  

WRITE gv_3.

*결과: 2

DECIMALS가 명시되지 않은 상태에서는 소수점 이하 숫자가 무시되어, 내부적으로 정수 1 * 2로 계산되어 2가 출력된다.

🔹 예제 코드 2

DATA gv_4 TYPE p DECIMALS 1 VALUE '1.1'.  
DATA gv_5 TYPE p DECIMALS 1 VALUE '2.1'.  
DATA gv_6 TYPE p.  

gv_6 = gv_4 * gv_5.  

WRITE gv_6.

*결과: 2

입력 변수에는 DECIMALS가 설정되어 있지만, 결과를 저장하는 gv_6에는 소수점 자릿수가 명시되지 않아 정수값 2만 출력된다.

🔹 예제 코드 3

DATA gv_4 TYPE p DECIMALS 1 VALUE '1.1'.  
DATA gv_5 TYPE p DECIMALS 1 VALUE '2.1'.  
*DATA gv_6 TYPE p DECIMALS 1.
DATA gv_6 TYPE p DECIMALS 2.

gv_6 = gv_4 * gv_5.  

WRITE gv_6.

*결과: 2.3 (DECIMALS 1일 때)
*결과: 2.31 (DECIMALS 2일 때)

모든 변수에 DECIMALS가 지정된 경우, 연산 과정과 출력 모두에서 소수점 자릿수가 정확하게 반영되어 2.31이 출력된다.

2️⃣ Fixed Point Arithmetic 옵션 비활성화된 경우 (체크 X)

결과 비교를 위해 Fixed Point Arithmetic 옵션에 체크했을 때 작성한 코드를 그대로 작성하여 결과를 비교해 보자.

🔹 예제 코드 1

DATA gv_1 TYPE p VALUE '1.1'.  
DATA gv_2 TYPE p VALUE '2.1'.  
DATA gv_3 TYPE p.  

gv_3 = gv_1 * gv_2.  

WRITE gv_3.

*결과: 231

Fixed Point Arithmetic 옵션이 꺼진 상태에서는 TYPE P 변수도 내부적으로 정수처럼 처리되며, '1.1'은 11, '2.1'은 21로 간주되어 곱셈 결과인 231이 출력된다.

🔹 예제 코드 2

DATA gv_4 TYPE p DECIMALS 1 VALUE '1.1'.  
DATA gv_5 TYPE p DECIMALS 1 VALUE '2.1'.  
DATA gv_6 TYPE p.  

gv_6 = gv_4 * gv_5.  

WRITE gv_6.

*결과: 231

입력 변수에 DECIMALS가 있어도, 옵션이 꺼진 상태에서는 무시되고 문자열 '1.1', '2.1'이 각각 11, 21로 처리되어 결과는 231이 된다.

🔹 예제 코드 3

DATA gv_4 TYPE p DECIMALS 1 VALUE '1.1'.  
DATA gv_5 TYPE p DECIMALS 1 VALUE '2.1'.  
*DATA gv_6 TYPE p DECIMALS 1.
DATA gv_6 TYPE p DECIMALS 2.

gv_6 = gv_4 * gv_5.  

WRITE gv_6.

*결과: 23.1 (DECIMALS 1일 때)
*결과: 2.31 (DECIMALS 2일 때)

결과 23.1
DECIMALS가 1로 선언된 gv_6 변수는 소수점 자리 수가 부족해 곱셈 결과가 부정확하게 표현되어 23.1이라는 값이 출력된다.

결과 2.31
Fixed Point Arithmetic 옵션이 꺼진 상태에서도 모든 변수에 DECIMALS가 명시되어 있을 경우, 소수점 정보를 활용한 계산이 가능하며 결과는 2.31로 정확하게 출력된다.

📌 기억할 것

3가지 예제를 통해 Fixed Point Arithmetic 옵션 활성화 여부와 각 변수에 지정된 DECIMALS 설정이 계산 방식과 결과 출력에 결정적인 영향을 준다는 것을 확인할 수 있었다. 특히, 옵션이 비활성화된 경우에도 출력 변수의 DECIMALS 설정에 따라 결과값이 소수점 위치를 달리해 출력되므로, 정확한 계산을 위해서는 옵션 설정과 함께 변수의 DECIMALS 지정 여부를 꼼꼼히 확인하는 것이 중요하다.

반응형

+ Recent posts