SAP ABAP

SAP 유효성 점검 및 대체 로직 기입 방법

모델와이 2025. 3. 24. 17:54

안녕하세요. 모델 와이입니다.

 

오늘은 유효성 점검 (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에 검색하여 나온 내역 첨부합니다.

참조하실 분들은 참조하시면 좋을 것 같네요.

 

 

해당 내역 관련하여 궁금하신 사항이 있으시면 댓글에 남겨주세요.

감사합니다.