Home 금액변환 WRITE TO CURRENCY
Post
Cancel

금액변환 WRITE TO CURRENCY

들어가기 전에

ABAP 개발하면서 가장 많이 구현하게 되는 기능 중 하나가 ALV데이터를 엑셀로 다운로드 하는 기능이다. SAP에서 이미 기본적으로 ALV를 스프레드 시트로 내보내는 기능을 제공하지만, 특별한 요구사항이 들어오면 다운로드 기능을 직접 구현해야 한다. 이때, 필드중에 금액 필드가 있다면 통화 단위에 맞는 소수점이 찍히도록 신경써주어야 하는데, 이를 위해 WRITE TO CURRENCY 구문을 사용할 수 있다.

ALV와 DB에서의 금액 필드 자릿수

SAP의 스탠다드 트랜잭션으로 발생하는 금액 데이터들은 통화가 무엇이든지 상관 없이 기본적으로 모두 소수점 두자리수로 DB에 저장된다. 즉, 1000원(KRW)은 10.00으로 저장되고, 23달러(USD)는 23.00으로 저장된다. 하지만 ALV 등을 이용하여 화면에 보여줄 때에는 통화에 따라 금액을 변환하며, 변환 기준은 IMG Configuration을 통해 설정할 수 있다. 테이블 TCURX를 통해서도 그 값을 확인할 수 있다.

여튼 DB값을 ALV로 보여줄 때에는 ALV에서 자체적으로 변환을 해주는데, 이 기능을 활용하기 위해서는 개발자가 신경써야 하는 부분들이 있다.

  1. 아웃풋 인터널 테이블에 화폐 단위를 저장하는 필드(ex. WAERK)가 있는지

  2. 필드 카탈로그에서 금액 필드(ex. NETWR) 의 CFIELDNAME 속성에 1번의 화폐 단위 필드가 입력 되어 있는지 (아니면 필드 카탈로그의 CURRENCY 속성에 바로 CURRENCY = 'KRW' ← 이런 식으로 통화를 입력해도 된다.)

이렇게 필드 카탈로그 세팅만 잘해두면 실제 DB상에는 1000원이 10.00으로 저장되어 있지만, ALV로 뿌려서 보여줄 때에는 x100이 되어서 1000원으로 보인다.

GUI_DOWNLOAD 사용 시 금액 필드 주의사항

하지만 CALL FUNCTION UI_DOWNLOAD'를 이용해서 엑셀로 데이터를 내보낼 때는 이와 같은 금액 변환 작업을 개발자가 직접 구현해야 한다. 이때 많이 사용하는 구문이 WRITE TO CURRENCY다. 문법은 간단하다.

1
WRITE db_amt TO display_amt CURRENCY currency_unit.
  • 변수 db_amt : DB에서 가져온 데이터. ALV Display시 사용하는 아웃풋 테이블의 금액필드.
  • 변수 display_amt : 엑셀 다운로드 때 던져줄 데이터. CALL FUNCTION 'GUI_DOWNLOAD'CHANGING 파라미터인 DATA_TAB에 넘겨줄 아웃풋 테이블이라고 보면 된다.
  • 변수 currency_unit : 화폐 단위

주의할 점은 이 구문을 사용하고 나면 금액 필드의 데이터 타입이 CURR에서 CHAR로 변환된다. 즉, display_amt에 들어갈 변수의 타입선언에 주의해야 한다. 만약 display_amt도 똑같이 (예를 들어) NETWR 타입으로 선언하면 덤프 난다.

아래 프로그램은 WRITE TO CURRENCY구문이 어떻게 작동하는지 간단하게 보여주는 프로그램이다. 테이블 VBRK에서 NETWR, WAERK값을 가져와서 ① DB에 저장된 값, ② WAERK에 담긴 통화가 적용된 금액, ③ ‘USD’를 적용한 값을 출력했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
REPORT Z_CURRTEST.

DATA : BEGIN OF LS_VBRK,
        NETWR TYPE VBRK-NETWR,
        WAERK TYPE VBRK-WAERK,
       END OF LS_VBRK,
       LV_NEW_AMT TYPE CHAR27.    "자리수는 임의로 적절하게 정하면 될 것 같다.

SELECT	SINGLE
        NETWR
        WAERL
  FROM	VBRK
  INTO  CORRESPONDING FIELDS OF LS_VBRK.

IF SY-SUBRC = 0.

  "① DB에 저장된 값
    WRITE : 'DB Value : ', LS_VBRK-NETWR.

  "②WAERK에 담긴 통화가 적용된 금액
    WRITE LS_VBRK-NETWR TO LV_NEW_AMT CURRENCY LS_VBRK-WAERK.
    WRITE :\ 'DB Currency : ', LS_VBRK-WAERK.
    WRITE :\ 'Changed Amt. : ', LV_NEW_AMT.

  "③USD를 적용한 값
    WRITE LS_VBRK-NETWR TO LV_NEW_AMT CURRENCY 'USD'.
    WRITE :\ 'Changed Amt.(USD) : ', LV_NEW_AMT.
ENDIF.

프로그램을 실행하면 아래와 같은 결과값이 나온다.

abap_wtc

결론

ALV용 아웃풋 테이블(ex. GT_OUTPUT[]) 1개와 엑셀 다운로드용 아웃풋 테이블(ex. GT_EXCEL[]) 1개를 따로 만든다. 엑셀 다운로드용은 금액 필드들의 필드 카탈로그 DATATYPE 필드 값을 CHAR로 바꾸고, WRITE TO CURRENCY구문을 이용해서 금액을 변환하고 엑셀 다운로드용 아웃풋 테이블에 APPEND한다. 그리고 CALL FUNCTION 'GUI_DOWNLOAD'에다가 엑셀 다운로드용 테이블을 전달한다.

This post is licensed under CC BY 4.0 by the author.
Trending Tags

-

-

Trending Tags