--- 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 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 INTO LV_EXTRACT 84| WITH KEY BINARY SEARCH. 85| 86| IF SY-SUBRC = 0. 87| 88| ASSIGN : LV_EXTRACT TO CASTING. 89| 90| " 신규 입력 91| IF LS_TOTAL-ACTION EQ 'N'. 92| -CDATE = SY-DATUM. 93| -CTIME = SY-UZEIT. 94| -CNAME = SY-UNAME. 95| ENDIF. 96| 97| -UDATE = SY-DATUM. 98| -UTIME = SY-UZEIT. 99| -UNAME = SY-UNAME. 100| 101| MODIFY FROM INDEX LV_INDEX. 102| MODIFY FROM 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), [``](#decl-zfirclv0010-48--viewkey-), [``](#decl-zfirclv0010-50--fs_record-) - 선언을 못 찾은 이름: , (수집 안 된 인클루드·함수 인터페이스일 수 있다) - 위치: `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 = 135| DPL_SELLIST = 136| EXCL_CUA_FUNCT = FU_TO_EXCL 137| EXTRACT = 138| TOTAL = 139| X_HEADER = 140| X_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) - 선언을 못 찾은 이름: , , , , , (수집 안 된 인클루드·함수 인터페이스일 수 있다) - 위치: `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로 상위 객체 테이블 접근을 설정한 뒤 의 각 행(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 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) - 선언을 못 찾은 이름: (수집 안 된 인클루드·함수 인터페이스일 수 있다) - 위치: `abap://ZFIRCLV0010/ZFIRCLV0010#L165-L183` · confidence 0.9 · `ZFIRCLV0010#ZFIRCLV0010#FORM#CHECK_AUTH#C1` ## 정의부 (12건) 로직 조각을 다른 프로그램으로 옮겨 붙일 때 **함께 가야 하는 선언**이다. 조각별로 무엇이 필요한지는 위 조각 항목의 `정의부` 줄에 있고(이름을 누르면 여기로 온다), 붙여넣기용으로 의존까지 묶은 코드는 `GET /chunks/` 의 `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. ``` #### — field-symbol · unit 로컬 · L48-L48 {#decl-zfirclv0010-48--viewkey-} ```abap FIELD-SYMBOLS : TYPE X. ``` #### — field-symbol · unit 로컬 · L50-L50 {#decl-zfirclv0010-50--fs_record-} ```abap FIELD-SYMBOLS : 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이다. |