안녕하세요 오랜만에 글 쓰게 되었습니다.
오늘은 Conversion Exit를 직접 개발자가 만들어서 사용할 수 있는 방법을 알아보도록 하겠습니다.
먼저, Convertion Exit이 무엇이냐 SE11(ABAP Dictionary)에서 Domain에 "Routine" 이라는 필드 보신적 있으시죠

이것이 변환 루틴입니다. "5글자"로 이루어진 Routine은 ALV나 ABAP List를 통해 출력되어질 때
해당 "Function"를 거쳐서 데이터를 바꿔주는 것 입니다.
VBELN ( 판매 문서 번호 )를 기준으로 설명드린다면 ALPHA Conversion 다들 들어보셨죠?
모르신다면 이전 블로글이 있습니다.
https://abap-developer.tistory.com/7
[ABAP] CONVERSION_EXIT_ALPHA_OUTPUT / Leading Zero 제거
오늘도 간단한 Function를 다뤄보겠습니다. " CONVERSION_EXIT_ALPHA_OUTPUT" Function은 앞에 Leading Zero로 인해 생긴 0을 지워주는 Function입니다. 사실 해당 기능이 필요한 상황 대부분은 Domain이나 Screen Field Att
abap-developer.tistory.com
간단하게 설명드리면 앞에 0를 제거하는 Leading Zero 역할을 수행하는 Function이였습니다.
눈치 빠르신 분들은 눈치채셨겠지만!
위의 Function이 바로 Conversion Exit입니다.
이렇게 사용자가 이쁘게 조회하기 위해서 데이터를 잠깐 바꿔주는 역할을 하는 Function이 Conversion Exit의 역할인데
이런 것들이 SAP에서 만들어 놓은 Conversion Exit만 사용할 수 없으니 직접 만들어 볼 것 입니다!
도메인에서 변환 루틴(Routine)으로 사용되거나 ALV FieldCatalog에서 쓰이기 위해서는
아래와 같은 규칙를 지켜서 Function를 만들어야 합니다.
규칙
1. Function의 이름은 다음과 같은 이름으로 2개를 생성해야합니다.
CONVERSION_EXIT_XXXXX_INPUT
CONVERSION_EXIT_XXXXX_OUTPUT
(XXXXX 는 문자 5자리입니다. = ROUTINE에 들어갈 5자리)
2. Function의 Parameter ( Signature )
Import에 INPUT
+ Import에 REFVAL ( 회계 필드일 경우에만 )
Export에 OUTPUT
위의 모든 규칙을 만족해야합니다.
먼저, 저는 회계 필드의 - 부호를 앞으로 보내주는 Coversion Exit를 만들기 위해서
REFVAL 파라미터를 같이 사용하겠습니다.
(REFVAL 파라미터는 필드에 연결되어 있는 통화키 값이 들어옵니다.)


소스 코드 같은 경우에는 -부호를 앞으로 보내주면서 콤마( , )또한 통화키에 맞게 출력되도록 소스코드를 작성하였습니다.

DATA: lv_value TYPE char30,
lv_conv TYPE s_f_cur_pr. " 회계 필드 Type으로 선언
IF input < 0. " 음수 일때
lv_conv = input * -1.
WRITE lv_conv TO lv_value CURRENCY refval.
SHIFT lv_value LEFT DELETING LEADING space.
output = |-{ lv_value }|.
ELSE. " 양수 일때
WRITE input TO output CURRENCY refval.
ENDIF.
해당 소스코드 말고도 다른 형식의 Conversion이 필요하다면 Input으로 값을 전달받아서
Output로 전달하면 그 값 그대로 ALV에 출력하게 됩니다.
**INPUT으로 끝나는 Function은 원래 값으로 되돌리는 로직을 작성하시면 됩니다 **
(저는 귀찮아서 따로 INPUT로직을 작성하지는 않았습니다. 안해도 보이는건 잘보임)
⚠️주의⚠️
파라미터로 받은 값 그대로 내보내주기 때문에 원하는 Format으로 다 변환 이후에 OUTPUT에 넣어줘야합니다.
(통화필드에 넣었다고 콤마 알아서 찍히겠지 라는 오만한 생각을 하지 않도록합시다...[내 얘기임...])
자 이제 Coversion Exit를 전부 만들어 보았는데요.
이걸 ALV에 적용 시키기 위해서는 어떻게 해야하는지 알아보겠습니다.
#1. 도메인에 Coversion Routine 넣기
먼저, 당연히 아는 Routine에 넣어서 적용해보도록 하겠습니다.

위 사진처럼 Routine에 ZSIGN ( Exit 5글자 )를 넣으면 됩니다.
Function : CONVERSION_EXIT_XXXXX_OUTPUT
( X : 5글자가 Exit 이름입니다! )


(컬럼 이름 쓰기 귀찮아서 안쓴건 안비밀...)
#2. ALV FieldCatalog 이용하기
그런데 사실 Custom으로 Exit이 필요한 경우는 Domain를 못 건드는 경우가 많습니다.
이럴 때 FieldCatalog로 덮어 씌워주면 됩니다.
먼저, 알아야 할 지식이 있는데
FieldCatalog Structure Component에는
CONVEXIT과 EDIT_MASK가 있습니다
두 Component로 해당 Exit를 적용 할 수 있는데 규칙이 하나 있습니다.
EDIT_MASK가 나중에 로직이 돌아서 CONVEXIT에 다른 EXIT이 있어도
EDIT_MASK에 있는 Exit이 적용됩니다.
(그래서 Exit를 덮어 씌울 수 있음)
그리고, CONVEXIT에는 EXIT이름을 'ZSIGN' 처럼 그대로 넣어도 되지만
EDIT_MASK에는 '==ZSIGN'으로 앞에 "=="를 붙여야만 EXIT으로 인식됩니다.

이런 형식으로 적용하게 되면 ALV에서 출력하기 직전에 값이 변환되어 보여집니다!!

쓰다보니 진짜 길어졌는데요
다음에도 이런 Issue 통해서 배운 것이 있다면 공유하겠습니다.
참고로 제가 직접 겪은 상황을 토대로 글을 쓴 것이기 때문에 틀린 것이 있을 수 있습니다!
마무리...
마지막으로 그냥 디버깅하면서 찾은 사실인데
CL_SALV_GUI_UTILS 클래스의 CONV_EXIT_SUPPORTS_REFVAL 메소드로

이렇게 Function 이름을 조합해서 펑션을 실행하더라고요? 신기해서 공유해봅니다... ㅋㅋ