--- type: abap-program title: "ZRGGBR000" description: "SAP 표준 검증 Exit 폼풀 RGGBR000 을 회사용으로 복사한 프로그램이다. GGB0(검증) 에서 정의한 검증 규칙이 호출하는 사용자 Exit(U100, US001, UM001, U200)을 담으며, 전표 전기 시 예산 체크(Z_CO_CHECK_BUDGET) 같은 회사 고유 검증 로직을 수행한다. GET_EXIT_TITLES 에 Exit 목록을 등록해야 GGB0 에서 선택할 수 있다." resource: "abap://ZRGGBR000" tags: ["검증", "예산관리", "전표", "설정", "FI", "예산통제", "코스트센터", "원가요소", "오더", "금액합산", "차대구분", "순증감", "전표아이템", "예산체크", "예산초과", "전기차단", "검증실패", "오류메시지", "검증 Exit 등록", "예산 통제"] generated: { by: "abap-indexing/z-ai/glm-5.2:free", at: "2026-09-20T15:36:23+00:00" } status: stable x-package: x-changed-on: x-tables-read: ["T001"] x-tables-write: [] x-calls: ["Z_CO_CHECK_BUDGET"] x-code-hash: "4e5035dfc2db296a35ee8167070a42538171448b19d9660acc745b40eb5bdd3d" x-unit-count: 7 x-chunk-count: 4 x-declaration-count: 0 --- ## 업무 목적 SAP 표준 검증 Exit 폼풀 RGGBR000 을 회사용으로 복사한 프로그램이다. GGB0(검증) 에서 정의한 검증 규칙이 호출하는 사용자 Exit(U100, US001, UM001, U200)을 담으며, 전표 전기 시 예산 체크(Z_CO_CHECK_BUDGET) 같은 회사 고유 검증 로직을 수행한다. GET_EXIT_TITLES 에 Exit 목록을 등록해야 GGB0 에서 선택할 수 있다. ## 주 흐름 1. GGB0 에서 검증 규칙이 Exit 를 선택할 수 있도록 Exit 목록을 등록한다 (GET_EXIT_TITLES) 2. 전표 전기 시 해당 검증 규칙이 등록된 Exit 를 호출한다 3. U200 에서 예산 체크 등 회사 고유 검증을 수행한다 (Z_CO_CHECK_BUDGET) ## 테이블 / 외부 호출 - read: T001 - write: - - 외부 호출: Z_CO_CHECK_BUDGET ## 로직 조각 (4건 / unit 2개) LLM 이 코드에서 골라낸 업무 로직 단위다. **조각마다 소스 원문과 자연어 설명을 함께 싣는다** — 설명이 코드와 맞는지 바로 대조할 수 있어야 하기 때문이다. 테이블·호출은 LLM 이 쓴 값이 아니라 파서가 조각 범위에서 다시 뽑은 사실이다. 순서는 실행 순서다. ### FORM GET_EXIT_TITLES — `ZRGGBR000` L47-L103 (57줄) *GGB0 검증 규칙에서 선택할 수 있는 사용자 Exit 목록(U100, US001, UM001, U200 예산통제)을 ETAB 에 등록하는 FORM 이다.* > 이 unit 의 조각 2개가 26/57줄(46%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다. #### [other] 검증 Exit U100(전기일자 체크), US001·UM001(EIS 예제), U200(코스트센터/오더 예산 통제 유효성 체크)을 이름·파라미터 유형·제목과 함께 EXITS 목록에 등록해 GGB0 검증 규칙에서 선택 가능하게 한다. ```abap 62| EXITS-NAME = 'U100'. 63| EXITS-PARAM = C_EXIT_PARAM_NONE. "Complete data used in exit. 64| EXITS-TITLE = TEXT-101. "Posting date check 65| APPEND EXITS. 66| 67| * forms for SAP_EIS 68| EXITS-NAME = 'US001'. "single validation: only one 69| EXITS-PARAM = C_EXIT_PARAM_NONE. "data record used 70| EXITS-TITLE = TEXT-102. "Example EIS 71| APPEND EXITS. 72| 73| EXITS-NAME = 'UM001'. "matrix validation: 74| EXITS-PARAM = C_EXIT_PARAM_CLASS. "complete data used in exit. 75| EXITS-TITLE = TEXT-103. "Example EIS 76| APPEND EXITS. 77| 78| " 예산 통제(코스트센터 / 오더 ) 79| EXITS-NAME = 'U200'. "유효성 체크 80| EXITS-PARAM = C_EXIT_PARAM_CLASS. 81| EXITS-TITLE = TEXT-200. 82| APPEND EXITS. ``` - **EN**: Registers the validation user exits U100, US001, UM001 and U200 (budget control for cost center/order) with their parameter type and title so they can be chosen in GGB0 validation rules. - SAP 객체: GGB0, RGGBR000, U200 - 업무 키워드: 검증 Exit 등록, 예산 통제, GGB0 검증, 유효성 체크 - English: Validation Exit, Budget Check, GGB0 - 정의부(복사 시 함께 필요): [`EXITS`](#decl-zrggbr000-49-exits) - 선언을 못 찾은 이름: C_EXIT_PARAM_NONE, C_EXIT_PARAM_CLASS (수집 안 된 인클루드·함수 인터페이스일 수 있다) - 위치: `abap://ZRGGBR000/ZRGGBR000#L62-L82` · confidence 0.9 · `ZRGGBR000#ZRGGBR000#FORM#GET_EXIT_TITLES#C1` #### [other] 등록한 EXITS 목록을 출력 파라미터 ETAB 로 복사해 검증 프레임워크에 돌려준다. ```abap 97| REFRESH ETAB. 98| LOOP AT EXITS. 99| ETAB = EXITS. 100| APPEND ETAB. 101| ENDLOOP. ``` - **EN**: Copies the registered exit list into the ETAB table parameter returned to the validation framework. - SAP 객체: RGGBR000 - 업무 키워드: Exit 목록 반환 - English: Exit Titles - 정의부(복사 시 함께 필요): [`EXITS`](#decl-zrggbr000-49-exits) - 위치: `abap://ZRGGBR000/ZRGGBR000#L97-L101` · confidence 0.85 · `ZRGGBR000#ZRGGBR000#FORM#GET_EXIT_TITLES#C2` ### FORM U200 — `ZRGGBR000` L256-L358 (103줄) *전표 전기 시 코스트센터·오더별 예산을 초과하는지 검증해 초과하면 전기를 막는다 (GGB0 검증 Exit).* > 이 unit 의 조각 2개가 74/103줄(72%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다. #### [aggregation] 전표 헤더에서 회사코드·전기일을 꺼내고 회사코드 통화를 조회한 뒤, 전표 아이템을 두 번 돌며 코스트센터-원가요소별과 오더별로 금액을 COLLECT 로 합산한다. 대변(SHKZG='H') 금액은 부호를 반전해 순증감으로 만든다. ```abap 284| LV_BUKRS = BOOL_DATA-BKPF-BUKRS. 285| LV_BUDAT = BOOL_DATA-BKPF-BUDAT. 286| SELECT SINGLE WAERS " 회사코드 통화 조회 287| INTO LV_WAERS 288| FROM T001 289| WHERE BUKRS = LV_BUKRS. 290| 291| " 코스트센터-원가요소별 기표 내역 Collect. 292| LOOP AT BOOL_DATA-BSEG INTO LS_BSEG 293| WHERE KOSTL IS NOT INITIAL. 294| LT_KOSTL_CHECK-KOSTL = LS_BSEG-KOSTL. 295| LT_KOSTL_CHECK-KSTAR = LS_BSEG-HKONT. 296| IF LS_BSEG-SHKZG = 'H'. 297| LT_KOSTL_CHECK-DMBTR = LS_BSEG-DMBTR * -1. 298| ELSE. 299| LT_KOSTL_CHECK-DMBTR = LS_BSEG-DMBTR. 300| ENDIF. 301| COLLECT LT_KOSTL_CHECK. 302| CLEAR : LS_BSEG, LT_KOSTL_CHECK. 303| ENDLOOP. 304| 305| " 오더별 기표 내역 Collect 306| LOOP AT BOOL_DATA-BSEG INTO LS_BSEG 307| WHERE AUFNR IS NOT INITIAL. 308| LT_AUNFR_CHECK-AUFNR = LS_BSEG-AUFNR. 309| IF LS_BSEG-SHKZG = 'H'. 310| LT_AUNFR_CHECK-DMBTR = LS_BSEG-DMBTR * -1. 311| ELSE. 312| LT_AUNFR_CHECK-DMBTR = LS_BSEG-DMBTR. 313| ENDIF. 314| COLLECT LT_AUNFR_CHECK. 315| CLEAR : LS_BSEG, LT_AUNFR_CHECK. 316| ENDLOOP. 317| ``` - **EN**: Extracts header company code/posting date and currency, then aggregates posted amounts per cost center + cost element and per order, negating credit lines to get net movement. - 테이블(파서): read [T001](/tables/T001.md) / write - - SAP 객체: BKPF, BSEG, T001, CSKS, CSKA, AUFK, KOSTL, KSTAR, AUFNR, SHKZG - 업무 키워드: 예산통제, 코스트센터, 원가요소, 오더, 금액합산, 차대구분, 순증감, 전표아이템 - English: budget control, cost center, cost element, internal order, amount aggregation, debit credit, net amount - 정의부(복사 시 함께 필요): [`LV_BUKRS`](#decl-zrggbr000-259-lv_bukrs), [`LV_BUDAT`](#decl-zrggbr000-260-lv_budat), [`LV_WAERS`](#decl-zrggbr000-261-lv_waers), [`LS_BSEG`](#decl-zrggbr000-262-ls_bseg), [`LT_KOSTL_CHECK`](#decl-zrggbr000-266-lt_kostl_check), [`LT_AUNFR_CHECK`](#decl-zrggbr000-272-lt_aunfr_check) - 위치: `abap://ZRGGBR000/ZRGGBR000#L284-L317` · confidence 0.88 · `ZRGGBR000#ZRGGBR000#FORM#U200#C1` #### [validation] 합산한 코스트센터-원가요소 건과 오더 건마다 커스텀 FM Z_CO_CHECK_BUDGET 으로 예산 잔액을 확인하고, 결과코드가 E(초과)면 검증 결과를 거짓으로 돌려 오류 메시지를 띄우고 전표 전기를 차단한다. ```abap 319| LOOP AT LT_KOSTL_CHECK. 320| CALL FUNCTION 'Z_CO_CHECK_BUDGET' 321| EXPORTING 322| I_BUKRS = LV_BUKRS 323| I_BUDAT = LV_BUDAT 324| I_KSTAR = LT_KOSTL_CHECK-KSTAR 325| I_KOSTL = LT_KOSTL_CHECK-KOSTL 326| I_DMBTR = LT_KOSTL_CHECK-DMBTR 327| I_WAERS = LV_WAERS 328| IMPORTING 329| E_RESULTCODE = LV_CODE 330| E_RESULTMSG = LV_MSG. 331| 332| IF LV_CODE = 'E'. 333| B_RESULT = B_FALSE. 334| MESSAGE E000(ZFIM2) WITH LV_MSG. 335| EXIT. 336| ENDIF. 337| ENDLOOP. 338| 339| " 오더 체크 340| LOOP AT LT_AUNFR_CHECK. 341| CALL FUNCTION 'Z_CO_CHECK_BUDGET' 342| EXPORTING 343| I_BUKRS = LV_BUKRS 344| I_BUDAT = LV_BUDAT 345| I_AUFNR = LT_AUNFR_CHECK-AUFNR 346| I_DMBTR = LT_AUNFR_CHECK-DMBTR 347| I_WAERS = LV_WAERS 348| IMPORTING 349| E_RESULTCODE = LV_CODE 350| E_RESULTMSG = LV_MSG. 351| 352| IF LV_CODE = 'E'. 353| B_RESULT = B_FALSE. 354| MESSAGE E000(ZFIM2) WITH LV_MSG. 355| EXIT. 356| ENDIF. 357| ENDLOOP. 358| ENDFORM. "U200 ``` - **EN**: Calls Z_CO_CHECK_BUDGET per aggregated cost center/order and fails the validation (blocking the posting) when the budget is exceeded. - 호출(파서): Z_CO_CHECK_BUDGET, Z_CO_CHECK_BUDGET - SAP 객체: Z_CO_CHECK_BUDGET, GB002_015, ZFIM2 - 업무 키워드: 예산체크, 예산초과, 전기차단, 검증실패, 예산관리, 오류메시지 - English: budget check, budget exceeded, posting block, validation failure, budget control - 정의부(복사 시 함께 필요): [`LT_KOSTL_CHECK`](#decl-zrggbr000-266-lt_kostl_check), [`LV_BUKRS`](#decl-zrggbr000-259-lv_bukrs), [`LV_BUDAT`](#decl-zrggbr000-260-lv_budat), [`LV_WAERS`](#decl-zrggbr000-261-lv_waers), [`LV_CODE`](#decl-zrggbr000-263-lv_code), [`LV_MSG`](#decl-zrggbr000-264-lv_msg), [`LT_AUNFR_CHECK`](#decl-zrggbr000-272-lt_aunfr_check) - 선언을 못 찾은 이름: B_FALSE (수집 안 된 인클루드·함수 인터페이스일 수 있다) - 위치: `abap://ZRGGBR000/ZRGGBR000#L319-L358` · confidence 0.9 · `ZRGGBR000#ZRGGBR000#FORM#U200#C2` ## 정의부 (9건) 로직 조각을 다른 프로그램으로 옮겨 붙일 때 **함께 가야 하는 선언**이다. 조각별로 무엇이 필요한지는 위 조각 항목의 `정의부` 줄에 있고(이름을 누르면 여기로 온다), 붙여넣기용으로 의존까지 묶은 코드는 `GET /chunks/` 의 `declaration_code` 로 받는다. ### `ZRGGBR000` (9건) #### EXITS — data · unit 로컬 · L49-L53 {#decl-zrggbr000-49-exits} ```abap DATA: BEGIN OF EXITS OCCURS 50, NAME(5) TYPE C, PARAM LIKE C_EXIT_PARAM_NONE, TITLE(60) TYPE C, END OF EXITS. ``` #### LV_BUKRS — data · unit 로컬 · L259-L259 {#decl-zrggbr000-259-lv_bukrs} ```abap DATA : LV_BUKRS LIKE BKPF-BUKRS. ``` #### LV_BUDAT — data · unit 로컬 · L260-L260 {#decl-zrggbr000-260-lv_budat} ```abap DATA : LV_BUDAT LIKE BKPF-BUDAT. ``` #### LV_WAERS — data · unit 로컬 · L261-L261 {#decl-zrggbr000-261-lv_waers} ```abap DATA : LV_WAERS LIKE BKPF-WAERS. ``` #### LS_BSEG — data · unit 로컬 · L262-L262 {#decl-zrggbr000-262-ls_bseg} ```abap DATA : LS_BSEG LIKE BSEG. ``` #### LV_CODE — data · unit 로컬 · L263-L263 {#decl-zrggbr000-263-lv_code} ```abap DATA : LV_CODE TYPE ZEIFFG. ``` #### LV_MSG — data · unit 로컬 · L264-L264 {#decl-zrggbr000-264-lv_msg} ```abap DATA : LV_MSG TYPE ZEERRDESC. ``` #### LT_KOSTL_CHECK — data · unit 로컬 · L266-L270 {#decl-zrggbr000-266-lt_kostl_check} ```abap DATA : BEGIN OF LT_KOSTL_CHECK OCCURS 0, KOSTL LIKE CSKS-KOSTL, KSTAR LIKE CSKA-KSTAR, DMBTR LIKE BSEG-DMBTR, END OF LT_KOSTL_CHECK. ``` #### LT_AUNFR_CHECK — data · unit 로컬 · L272-L275 {#decl-zrggbr000-272-lt_aunfr_check} ```abap DATA : BEGIN OF LT_AUNFR_CHECK OCCURS 0, AUFNR LIKE AUFK-AUFNR, DMBTR LIKE BSEG-DMBTR, END OF LT_AUNFR_CHECK. ``` ## Unit 목록 (컨테이너) | unit | 유형 | 위치 | 조각 | 한 줄 요약 | |---|---|---|---|---| | GET_EXIT_TITLES | FORM | ZRGGBR000 L47-103 | 2 | GGB0 검증 규칙에서 선택할 수 있는 사용자 Exit 목록(U100, US001, UM001, U200 예산통제)을 ETAB 에 등록하는 FORM 이다. | | U100 | FORM | ZRGGBR000 L114-131 | 0 | 전기일자 검증 예제 Exit(U100)로 본문이 주석 처리되어 실제 로직이 없는 FORM 이다. | | US001 | FORM | ZRGGBR000 L188-206 | 0 | SAP-EIS 단일 레코드 검증용 예제 Exit 로 본문이 모두 주석 처리된 빈 FORM 이다. | | UM001 | FORM | ZRGGBR000 L222-245 | 0 | SAP-EIS 매트릭스 검증용 예제 Exit 로 본문이 모두 주석 처리된 빈 FORM 이다. | | U200 | FORM | ZRGGBR000 L256-358 | 2 | 전표 전기 시 코스트센터·오더별 예산을 초과하는지 검증해 초과하면 전기를 막는다 (GGB0 검증 Exit). |