Files

272 lines
13 KiB
Markdown

---
type: abap-program
title: "ZFIRCLV0010"
description: "SM34 뷰 클러스터 ZFIV0070 의 저장 전 처리를 담당하는 Exit 프로그램이다. 뷰 클러스터 유지보수(테이블 설정값 관리) 화면에서 저장 시점에 호출되어 권한을 확인하고 클러스터 데이터를 저장한다. 업무 로직이 아니라 SAP 뷰 유지보수 프레임워크의 확장 지점이다."
resource: "abap://ZFIRCLV0010"
tags: ["설정", "권한관리", "마스터관리", "FI", "뷰클러스터", "변경이력", "생성자", "변경자", "감사필드", "뷰유지보수", "필드심볼", "뷰저장", "기능제외", "저장위임", "조회모드", "변경모드", "회사코드 권한체크", "뷰 클러스터 저장 검증", "저장 취소", "권한 오류"]
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: []
x-tables-write: []
x-calls: ["VIEW_MAINTENANCE_LOW_LEVEL"]
x-code-hash: "ece135d2e0a134034e8d09d78ea4e7840a150c7109b4af653cf92c54aa7c7383"
x-unit-count: 4
x-chunk-count: 3
x-declaration-count: 0
---
## 업무 목적
SM34 뷰 클러스터 ZFIV0070 의 저장 전 처리를 담당하는 Exit 프로그램이다. 뷰 클러스터 유지보수(테이블 설정값 관리) 화면에서 저장 시점에 호출되어 권한을 확인하고 클러스터 데이터를 저장한다. 업무 로직이 아니라 SAP 뷰 유지보수 프레임워크의 확장 지점이다.
## 주 흐름
1. 뷰 클러스터 저장 직전에 호출된다 (REASSIGN_CLUSTER_SAVE / BEFORE_VIEW_SAVE_DATA)
2. 저장 권한을 확인한다 (CHECK_AUTH)
3. 클러스터 데이터를 저장한다 (SAVE_CLUSTER_ZFIV0070)
## 테이블 / 외부 호출
- read: -
- write: -
- 외부 호출: VIEW_MAINTENANCE_LOW_LEVEL
## 로직 조각 (3건 / unit 2개)
LLM 이 코드에서 골라낸 업무 로직 단위다. **조각마다 소스 원문과 자연어 설명을 함께 싣는다** — 설명이 코드와 맞는지 바로 대조할 수 있어야 하기 때문이다.
테이블·호출은 LLM 이 쓴 값이 아니라 파서가 조각 범위에서 다시 뽑은 사실이다. 순서는 실행 순서다.
### FORM SAVE_CLUSTER_ZFIV0070 — `ZFIRCLV0010` L28-L152 (125줄)
*뷰 클러스터 ZFIV0070 저장 직전에 생성/변경 이력 필드를 채우고 저장 함수를 호출한다.*
> 이 unit 의 조각 2개가 68/125줄(54%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [aggregation] 뷰 유지보수 화면에서 변경된 행(ACTION 이 N 신규 또는 U 변경)만 골라, 신규 행에는 생성일시·생성자를, 모든 변경 행에는 변경일시·변경자를 채워 뷰 클러스터의 TOTAL·EXTRACT 버퍼에 되돌려 넣는다. 필드심볼 캐스팅으로 뷰 구조에 동적으로 접근한다.
```abap
78| LOOP AT <VCL_TOTAL> INTO LS_TOTAL.
79| LV_INDEX = SY-TABIX.
80| CHECK LS_TOTAL-ACTION IS NOT INITIAL. " U, N 등의 데이터만.
81|
82| MOVE LS_TOTAL TO LV_TOTAL. " View 구조만 복사 " VIEWKEY 접근용
83| READ TABLE <VCL_EXTRACT> INTO LV_EXTRACT
84| WITH KEY <VIEWKEY> BINARY SEARCH.
85|
86| IF SY-SUBRC = 0.
87|
88| ASSIGN : LV_EXTRACT TO <FS_RECORD> CASTING.
89|
90| " 신규 입력
91| IF LS_TOTAL-ACTION EQ 'N'.
92| <FS_RECORD>-CDATE = SY-DATUM.
93| <FS_RECORD>-CTIME = SY-UZEIT.
94| <FS_RECORD>-CNAME = SY-UNAME.
95| ENDIF.
96|
97| <FS_RECORD>-UDATE = SY-DATUM.
98| <FS_RECORD>-UTIME = SY-UZEIT.
99| <FS_RECORD>-UNAME = SY-UNAME.
100|
101| MODIFY <VCL_TOTAL> FROM <FS_RECORD> INDEX LV_INDEX.
102| MODIFY <VCL_EXTRACT> FROM <FS_RECORD> INDEX LV_INDEX.
103| CLEAR : LV_EXTRACT.
104| ENDIF.
105| ENDLOOP.
```
- **EN**: Stamps created-by/changed-by audit fields onto rows flagged as new or updated in the view-cluster buffers, using field-symbol casting for dynamic view access.
- SAP 객체: ZFIV0070, VIMFLAGTAB, VCL_STRUC_TAB, VIMDESC
- 업무 키워드: 뷰클러스터, 변경이력, 생성자, 변경자, 감사필드, 뷰유지보수, 필드심볼
- English: view cluster, audit fields, created by, changed by, view maintenance, field symbol
- 정의부(복사 시 함께 필요): [`T_RECORD`](#decl-zfirclv0010-30-t_record), [`LS_TOTAL`](#decl-zfirclv0010-43-ls_total), [`LV_INDEX`](#decl-zfirclv0010-36-lv_index), [`LV_TOTAL`](#decl-zfirclv0010-40-lv_total), [`LV_EXTRACT`](#decl-zfirclv0010-41-lv_extract), [`<VIEWKEY>`](#decl-zfirclv0010-48--viewkey-), [`<FS_RECORD>`](#decl-zfirclv0010-50--fs_record-)
- 선언을 못 찾은 이름: <VCL_TOTAL>, <VCL_EXTRACT> (수집 안 된 인클루드·함수 인터페이스일 수 있다)
- 위치: `abap://ZFIRCLV0010/ZFIRCLV0010#L78-L105` · confidence 0.82 · `ZFIRCLV0010#ZFIRCLV0010#FORM#SAVE_CLUSTER_ZFIV0070#C1`
#### [fm_call] 뷰 동작(S 조회 / U 변경)에 따라 화면에서 제외할 기능코드(조회·변경·신규·저장·종료)를 정하고, 표준 FM VIEW_MAINTENANCE_LOW_LEVEL 에 SAVE 를 지시해 실제 저장을 맡긴다.
```abap
107| IF VCL_ACTION = 'S'.
108| FU_TO_EXCL-FUNCTION = 'ANZG'.
109| APPEND FU_TO_EXCL.
110| FU_TO_EXCL-FUNCTION = 'AEND'.
111| APPEND FU_TO_EXCL.
112| FU_TO_EXCL-FUNCTION = 'NEWL'.
113| APPEND FU_TO_EXCL.
114| FU_TO_EXCL-FUNCTION = 'SAVE'.
115| APPEND FU_TO_EXCL.
116| FU_TO_EXCL-FUNCTION = 'ENDE'.
117| APPEND FU_TO_EXCL.
118| ELSEIF VCL_ACTION = 'U'.
119| FU_TO_EXCL-FUNCTION = 'SAVE'.
120| APPEND FU_TO_EXCL.
121| FU_TO_EXCL-FUNCTION = 'ENDE'.
122| APPEND FU_TO_EXCL.
123| ELSE.
124| EXIT.
125| ENDIF.
126|
127| CALL FUNCTION 'VIEW_MAINTENANCE_LOW_LEVEL'
128| EXPORTING
129| FCODE = 'SAVE'
130| VIEW_ACTION = VCL_ACTION
131| VIEW_NAME = LV_VIEWNAME
132| TABLES
133| CORR_KEYTAB = L_T_E071K
134| DBA_SELLIST = <VCL_DBA_SELLIST>
135| DPL_SELLIST = <VCL_DPL_SELLIST>
136| EXCL_CUA_FUNCT = FU_TO_EXCL
137| EXTRACT = <VCL_EXTRACT>
138| TOTAL = <VCL_TOTAL>
139| X_HEADER = <VCL_HEADER>
140| X_NAMTAB = <VCL_NAMTAB>
141| EXCEPTIONS
142| FUNCTION_NOT_FOUND = 1
143| MISSING_CORR_NUMBER = 2
144| NO_VALUE_FOR_SUBSET_IDENT = 3
145| SAVING_CORRECTION_FAILED = 4
146| OTHERS = 5.
```
- **EN**: Builds the excluded-function list per view action and delegates the actual save to the standard FM VIEW_MAINTENANCE_LOW_LEVEL.
- 호출(파서): VIEW_MAINTENANCE_LOW_LEVEL
- SAP 객체: VIEW_MAINTENANCE_LOW_LEVEL, ZFIV0070, VIMEXCLFUN, E071K
- 업무 키워드: 뷰저장, 기능제외, 뷰유지보수, 저장위임, 조회모드, 변경모드
- English: view save, excluded functions, view maintenance, SAVE fcode, display mode, change mode
- 정의부(복사 시 함께 필요): [`FU_TO_EXCL`](#decl-zfirclv0010-53-fu_to_excl), [`LV_VIEWNAME`](#decl-zfirclv0010-37-lv_viewname), [`L_T_E071K`](#decl-zfirclv0010-52-l_t_e071k)
- 선언을 못 찾은 이름: <VCL_DBA_SELLIST>, <VCL_DPL_SELLIST>, <VCL_EXTRACT>, <VCL_TOTAL>, <VCL_HEADER>, <VCL_NAMTAB> (수집 안 된 인클루드·함수 인터페이스일 수 있다)
- 위치: `abap://ZFIRCLV0010/ZFIRCLV0010#L107-L146` · confidence 0.84 · `ZFIRCLV0010#ZFIRCLV0010#FORM#SAVE_CLUSTER_ZFIV0070#C2`
### FORM CHECK_AUTH — `ZFIRCLV0010` L159-L185 (27줄)
*뷰 클러스터 ZFIV0070/ZFIV0080 저장 시 편집 중인 각 행의 회사코드에 대해 F_BKPF_BUK 권한을 검사하고 권한이 없으면 저장 기능을 취소하고 현재 뷰에 머무르게 하는 FORM이다.*
> 이 unit 의 조각 1개가 19/27줄(70%)을 덮는다. 나머지는 선언·화면설정 등 업무 의미가 없다고 판단해 버린 구간이다.
#### [validation] 대상 뷰 클러스터가 ZFIV0070/ZFIV0080이면 VCL_SET_TABLE_ACCESS_FOR_OBJ로 상위 객체 테이블 접근을 설정한 뒤 <VCL_TOTAL>의 각 행(ZFIT0081 구조)의 회사코드에 AUTHORITY-CHECK F_BKPF_BUK를 수행하고, 실패 시 FZ 240 메시지를 내고 VCL_NEXT_VIEW/VCL_AKT_VIEW를 이전 뷰로 되돌리며 VCL_FUNCTION을 지워 저장을 막는다.
```abap
165| IF VCL_STRUC_TAB-OBJECT EQ 'ZFIV0070' OR
166| VCL_STRUC_TAB-OBJECT EQ 'ZFIV0080'.
167|
168| PERFORM VCL_SET_TABLE_ACCESS_FOR_OBJ USING VCL_STRUC_TAB-PREDOBJECT
169| CHANGING LV_ERROR_FLAG.
170|
171| CHECK LV_ERROR_FLAG EQ SPACE.
172| LOOP AT <VCL_TOTAL> INTO LS_ZFIV0081.
173| * 회사코드 권한체크
174| AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
175| ID 'BUKRS' FIELD LS_ZFIV0081-BUKRS.
176| IF SY-SUBRC NE 0.
177| MESSAGE S240(FZ) WITH LS_ZFIV0081-BUKRS.
178| VCL_NEXT_VIEW = VCL_LAST_VIEW.
179| VCL_AKT_VIEW = VCL_LAST_VIEW.
180| CLEAR VCL_FUNCTION.
181| ENDIF.
182| ENDLOOP.
183| ENDIF.
```
- **EN**: For view clusters ZFIV0070/ZFIV0080, checks authorization object F_BKPF_BUK for the company code of every edited row in the view-cluster total table and cancels the save (resets current view and clears VCL_FUNCTION) when the check fails.
- 호출(파서): VCL_SET_TABLE_ACCESS_FOR_OBJ
- SAP 객체: F_BKPF_BUK, ZFIV0070, ZFIV0080, ZFIT0081, VCL_SET_TABLE_ACCESS_FOR_OBJ
- 업무 키워드: 회사코드 권한체크, 뷰 클러스터 저장 검증, 저장 취소, 권한 오류
- English: Authorization Check, F_BKPF_BUK, View Cluster, SM34, Company Code
- 정의부(복사 시 함께 필요): [`LV_ERROR_FLAG`](#decl-zfirclv0010-163-lv_error_flag), [`LS_ZFIV0081`](#decl-zfirclv0010-161-ls_zfiv0081)
- 선언을 못 찾은 이름: <VCL_TOTAL> (수집 안 된 인클루드·함수 인터페이스일 수 있다)
- 위치: `abap://ZFIRCLV0010/ZFIRCLV0010#L165-L183` · confidence 0.9 · `ZFIRCLV0010#ZFIRCLV0010#FORM#CHECK_AUTH#C1`
## 정의부 (12건)
로직 조각을 다른 프로그램으로 옮겨 붙일 때 **함께 가야 하는 선언**이다. 조각별로 무엇이 필요한지는 위 조각 항목의 `정의부` 줄에 있고(이름을 누르면 여기로 온다), 붙여넣기용으로 의존까지 묶은 코드는 `GET /chunks/<chunk_id>``declaration_code` 로 받는다.
### `ZFIRCLV0010` (12건)
#### T_RECORD — types · unit 로컬 · L30-L34 {#decl-zfirclv0010-30-t_record}
```abap
TYPES : BEGIN OF T_RECORD.
INCLUDE STRUCTURE ZFIV0070.
TYPES : ACTION LIKE VIMFLAGTAB-ACTION.
TYPES : MARK LIKE VIMFLAGTAB-ACTION,
END OF T_RECORD.
```
#### LV_INDEX — data · unit 로컬 · L36-L36 {#decl-zfirclv0010-36-lv_index}
```abap
DATA : LV_INDEX LIKE SY-TABIX.
```
#### LV_VIEWNAME — data · unit 로컬 · L37-L37 {#decl-zfirclv0010-37-lv_viewname}
```abap
DATA: LV_VIEWNAME TYPE VCLSTRUC-OBJECT.
```
#### LV_TOTAL — data · unit 로컬 · L40-L40 {#decl-zfirclv0010-40-lv_total}
```abap
DATA : LV_TOTAL(1000) TYPE C.
```
#### LV_EXTRACT — data · unit 로컬 · L41-L41 {#decl-zfirclv0010-41-lv_extract}
```abap
DATA : LV_EXTRACT(1000) TYPE C.
```
#### LS_TOTAL — data · unit 로컬 · L43-L43 {#decl-zfirclv0010-43-ls_total}
```abap
DATA : LS_TOTAL TYPE T_RECORD.
```
#### <VIEWKEY> — field-symbol · unit 로컬 · L48-L48 {#decl-zfirclv0010-48--viewkey-}
```abap
FIELD-SYMBOLS : <VIEWKEY> TYPE X.
```
#### <FS_RECORD> — field-symbol · unit 로컬 · L50-L50 {#decl-zfirclv0010-50--fs_record-}
```abap
FIELD-SYMBOLS : <FS_RECORD> TYPE T_RECORD.
```
#### L_T_E071K — data · unit 로컬 · L52-L52 {#decl-zfirclv0010-52-l_t_e071k}
```abap
DATA: L_T_E071K LIKE E071K OCCURS 0.
```
#### FU_TO_EXCL — data · unit 로컬 · L53-L55 {#decl-zfirclv0010-53-fu_to_excl}
```abap
DATA: BEGIN OF FU_TO_EXCL OCCURS 10.
INCLUDE STRUCTURE VIMEXCLFUN.
DATA: END OF FU_TO_EXCL.
```
#### LS_ZFIV0081 — data · unit 로컬 · L161-L161 {#decl-zfirclv0010-161-ls_zfiv0081}
```abap
DATA: LS_ZFIV0081 LIKE ZFIT0081.
```
#### LV_ERROR_FLAG — data · unit 로컬 · L163-L163 {#decl-zfirclv0010-163-lv_error_flag}
```abap
DATA: LV_ERROR_FLAG TYPE VCL_FLAG_TYPE.
```
## Unit 목록 (컨테이너)
| unit | 유형 | 위치 | 조각 | 한 줄 요약 |
|---|---|---|---|---|
| REASSIGN_CLUSTER_SAVE | FORM | ZFIRCLV0010 L18-20 | 0 | 뷰 클러스터 저장 직전(BEFORE_VIEW_SAVE_DATA) 이벤트에서 SAVE_CLUSTER_ZFIV0070을 호출해 클러스터 데이터를 저장하는 위임 FORM이다. |
| SAVE_CLUSTER_ZFIV0070 | FORM | ZFIRCLV0010 L28-152 | 2 | 뷰 클러스터 ZFIV0070 저장 직전에 생성/변경 이력 필드를 채우고 저장 함수를 호출한다. |
| CHECK_AUTH | FORM | ZFIRCLV0010 L159-185 | 1 | 뷰 클러스터 ZFIV0070/ZFIV0080 저장 시 편집 중인 각 행의 회사코드에 대해 F_BKPF_BUK 권한을 검사하고 권한이 없으면 저장 기능을 취소하고 현재 뷰에 머무르게 하는 FORM이다. |