안녕하세요. 모델 와이입니다.
오늘은 유효성 점검 (ZRGGBR000) 과 유효성 대체(ZRGGBS000)에서 로직을 입력할 때 활용법에 대해서 말씀드리겠습니다.
SAP에서는 유효성 점검(Validation) 및 대체(Substitution)를 설정할 때, 특정한 조건과 로직을 적용하기 위해 EXIT을 활용할 수 있습니다. 이를 위해 SAP에서는 C_EXIT_PARAM_NONE, C_EXIT_PARAM_FIELD, C_EXIT_PARAM_CLASS 세 가지 주요 유형을 제공합니다.
점검 혹은 대체 로직을 들어가면 아래와 같은 설정을 확인하실 수 있습니다.
해당 설정에 PARAM의 값의 의미에 대해서 설명하며, 관련 로직으로 기입하는 방법을 설명드리겠습니다.
1. C_EXIT_PARAM_NONE
- 매개변수를 받지 않는 EXIT 유형입니다.
- 일반적으로 단순한 조건 검사를 수행할 때 사용됩니다. -> 유효성 점검 및 대체에서 사용 가능합니다.
( 전표 헤더, 아이템 , 완료 구분 없이 사용 가능합니다. ) - 입력값 없이 내부적으로 특정 로직을 수행한 후 결과를 반환하는 방식입니다.
활용 예시 (ABAP 코드)
"유효성 점검
FORM U100 USING B_RESULT.
"증빙일이 시스템 일자보다 클 경우 오류 발생
IF BKPF-BLDAT > SY-DATUM.
B_RESULT = B_FALSE.
"메시지 처리를 GGB0에서 하지 않을 경우
MESSAGE S001(ZTESTM01) WITH "증빙일이 현재일보다 미래입니다.".
ENDIF.
ENDFORM.
"유효성 대체
FORM U100.
"증빙일이 시스템 일자보다 클 경우 오류 발생
IF BKPF-BLDAT > SY-DATUM.
"메시지를 보여주고 내역을 대체할 경우
MESSAGE S001(ZTESTM01) DISPLAY LIKE 'W'
WITH "증빙일이 미래일입니다. 현재일로 변경됩니다.".
BKPF-BLDAT = SY-DATUM.
ENDIF.
ENDFORM.
- 특정한 입력값 없이 내부 로직을 수행하여 결과를 반환합니다.
결과에 대한 메시지는 GGB0에서 입력한 값으로 반환됩니다.
-> 유효성 점검의 경우 GGB0에서 메시지를 입력하지 않을 경우 내부에서 메시지를 입력할 수 있습니다.
※ 메시지 번호를 S000 과 같이 "000"으로 선언할 경우 메시지를 읽어오지 못하는 경우가 발생하므로,
메시지 클래스 내 값을 & 과 같이 선언하였어도, "000"이 아닌 다른 메시지 번호를 입력하여야 합니다.
-> 유효성 대체의 경우 메시지를 내부에서 입력할 수 있습니다.
2. C_EXIT_PARAM_FIELD
- 특정한 필드를 매개변수로 받는 EXIT 유형입니다.
- 필드 단위의 변경만 사용할 시 사용됩니다.
활용 예시 (ABAP 코드)
"유효성 대체
FORM U200 USING P_FIELD.
"P_FIELD = BKPF-BKTXT의 값으로 선언했다고 가정
IF BKPF-BLART EQ 'ZZ'.
P_FIELD = '예외 전표 생성'.
ENDIF.
ENDFORM.
- 특정 필드 값의 유효성 대체할 때 사용됩니다.
- 특정 필드에 대한 설정은 GGB1에서 아래의 체크박스를 선택 후 필드를 지정할 수 있습니다.
- 해당 내역은 유효성 점검에서는 사용할 수 없으며, 대체에서만 사용되어지지만 특정 필드를 세팅 및 대체를 하는 과정에 있어 번거로움이 존재하여 자주 사용되는 방법은 아닙니다.
해당 내역이 어떻게 선언되고 어떤 존재인지만 인식하면 될 것 같습니다.
3. C_EXIT_PARAM_CLASS
- 개별 필드가 아닌 구조체(Class 형태)의 데이터를 받는 EXIT 유형입니다.
- 여러 개의 필드를 동시에 검사하거나, 복잡한 로직이 필요한 경우 사용됩니다.
- 해당 내역에 대한 대체 로직 및 점검 로직으로 활용이 가능합니다.
-> 대체 로직의 경우 원하는 내역은 왠만하면 전부 다 가능하므로 생략하겠습니다.
( 아래의 점검 로직만으로도 충분히 모두 하실 수 있습니다 😊 ) - 유효성 점검/대체 모두 완료 시점에서만 사용하실 수 있습니다.
활용 예시 (ABAP 코드)
FORM U300 USING BOOL_DATA TYPE GB002_015
CHANGING B_RESULT.
DATA : LV_DATA TYPE REF TO DATA,
LT_BSEG TYPE TABLE OF BSEG.
FIELD-SYMBOLS : <LFS_T_BKPF> TYPE BKPF,
<LFS_T_BSEG> TYPE ANY TABLE.
B_RESULT = B_TRUE.
"BKPF의 구조체 내역 받음
ASSIGN COMPONENT 'BKPF' OF STRUCTURE BOOL_DATA TO <LFS_T_BKPF>.
"예시 ZZ 문서유형의 경우만 점검한다고 가정
IF <LFS_T_BKPF> IS ASSIGNED AND <LFS_T_BKPF>-BLART EQ 'ZZ'.
"BSEG 구조체 참조
CREATE DATA LV_DATA TYPE TABLE OF BSEG.
ASSIGN LV_DATA->* TO <LFS_T_BSEG>.
CHECK <LFS_T_BSEG> IS ASSIGNED.
"Bool_data에 속한 BSEG 데이터 입력
ASSIGN COMPONENT 'BSEG' OF STRUCTURE BOOL_DATA TO <LFS_T_BSEG>.
IF <LFS_T_BSEG> IS ASSIGNED AND <LFS_T_BSEG> IS NOT INITIAL.
CLEAR : LT_BSEG[].
LT_BSEG[] = <LFS_T_BSEG>[].
"예시 라인 수 제한으로 점검
SELECT COUNT( * )
FROM @LT_BSEG AS LTB
INTO @DATA(LV_CNT).
"라인이 30개 초과일 경우 오류
IF SY-SUBRC EQ 0 AND LV_CNT > 30.
B_RESULT = B_FALSE. " -> GGB0 설정 따라가기
"전표 라인의 수는 30라인이 초과될 수 없습니다. -> 프로그램 내 메시지 처리
MESSAGE E001(ZTESTM01).
EXIT.
ENDIF.
ENDIF.
ENDIF.
ENDFORM.
비교 및 활용 가이드
유형 설명 활용 시점
C_EXIT_PARAM_NONE | 매개변수 없이 실행되는 EXIT | 간단한 로직이나 공통 메시지 출력 |
C_EXIT_PARAM_FIELD | 특정 필드 값을 기반으로 검사 | 필드 단위의 유효성 검사 및 변환 |
C_EXIT_PARAM_CLASS | 구조체 전체를 기반으로 검사 | 복잡한 로직 적용 및 다중 필드 검토 |
마지막으로 해당 내역에 대한 수정이 종료되었을 경우 SE38에서 RGUGBR00 를 실행해 주어야 합니다.
상황에 마다 다르겠지만, 아래와 같은 내역들을 확인하시면서 체크해서 실행하시면 새롭게 설정한 내역들에 대해서 반영됩니다.
혹시 몰라 GPT에 검색하여 나온 내역 첨부합니다.
참조하실 분들은 참조하시면 좋을 것 같네요.
해당 내역 관련하여 궁금하신 사항이 있으시면 댓글에 남겨주세요.
감사합니다.
'SAP ABAP' 카테고리의 다른 글
SAP 배치 병렬 처리 (Parallel Processing)란? (0) | 2025.04.23 |
---|---|
SAP Background Job 관리와 SM37 분석 (0) | 2025.04.18 |
SAP Structure 및 Table 필드 정보 변경 후 ALV 반영되지 않는 경우 (0) | 2025.02.26 |
Selection-Screen 실행 버튼 제거 ( Screen 1000 ) (0) | 2025.02.12 |
ABAP Long Text 등록 및 사용 방법 (0) | 2025.02.11 |