CBO 테이블 아카이빙 방법을 설명합니다.
0. Archive Development KIT Package : SARC
1. 주요 Step
– 대상테이블 분석(TAANA/DB15) –> Archiving Object 생성(AOBJ) –> 아카이빙 프로그램 개발 –> 아카이빙 수행(SARA)
– SAP Archiving Introduction 문서 : Download
– DB15 관련 게시물 : http://itpe.me/414
– TAANA 관련 게시물 : http://itpe.me/415
2. Archiving Object 생성(Transaction : AOBJ)





3. 아카이빙 프로그램 샘플
– Read (Standard Program : RSAADMLE)
* Program : ZZELTUP01A_RED * * Author : leejhy * * Date : 2007.02.05 * * Functional description : ARCHIVE – READ Program * * OBJECT : Z_ZPA01A * ************************************************************************ REPORT zzeltup01a_red. *———————————————————————-* * data declaration *———————————————————————-* TABLES: zeltup01a. DATA: lt_zeltup01a TYPE TABLE OF zeltup01a, lt_zeltup01a_tmp TYPE TABLE OF zeltup01a. DATA: handle LIKE sy-tabix. FIELD-SYMBOLS: <ls_zeltup01a> TYPE zeltup01a. *———————————————————————-* * SELECT-OPTIONS / PARAMETER * *———————————————————————-* SELECTION-SCREEN BEGIN OF BLOCK arch_booking WITH FRAME TITLE text-101. PARAMETERS: p_ERKRS TYPE ERKRS. SELECT-OPTIONS: o_perio FOR zeltup01a-perio OBLIGATORY NO INTERVALS NO-EXTENSION, o_zck01 FOR zeltup01a-zck01, o_zck02 FOR zeltup01a-zck02. SELECTION-SCREEN END OF BLOCK arch_booking. *———————————————————————-* * START-OF-SELECTION * *———————————————————————-* * open existing archive files CALL FUNCTION ‘ARCHIVE_OPEN_FOR_READ’ EXPORTING object = ‘Z_ZPA01A’ IMPORTING archive_handle = handle EXCEPTIONS OTHERS = 1. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE ‘I’ NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. EXIT. ENDIF. * loop to get the next data object from the archive file(s) DO. CALL FUNCTION ‘ARCHIVE_GET_NEXT_OBJECT’ EXPORTING archive_handle = handle EXCEPTIONS end_of_file = 1. “nur die Ausnahmen, auf die man IF sy-subrc <> 0. “wirklich reagieren will EXIT. ENDIF. * get data records from the data container ZELTUP01a CALL FUNCTION ‘ARCHIVE_GET_TABLE’ EXPORTING archive_handle = handle record_structure = ‘ZELTUP01A’ all_records_of_object = ‘X’ TABLES table = lt_zeltup01a_tmp EXCEPTIONS end_of_object = 0. “not entries of this type * check lt_ZELTUP01a_tmp entries against selections. * Delete not requested entries LOOP AT lt_zeltup01a_tmp ASSIGNING <ls_zeltup01a> WHERE perio IN o_perio AND zck01 IN o_zck01 AND zck02 IN o_zck02. APPEND <ls_zeltup01a> TO lt_zeltup01a. ENDLOOP. REFRESH lt_zeltup01a_tmp. ENDDO. * Call ABAP List Viewer (ALV) CALL FUNCTION ‘REUSE_ALV_GRID_DISPLAY’ EXPORTING i_structure_name = ‘ZELTUP01A’ TABLES t_outtab = lt_zeltup01a. * close the archiving session CALL FUNCTION ‘ARCHIVE_CLOSE_FILE’ EXPORTING archive_handle = handle. *&———————————————————————* *& Form get_db *&———————————————————————* FORM get_db . SELECT * FROM zeltup01a APPENDING CORRESPONDING FIELDS OF TABLE lt_zeltup01a WHERE erkrs = P_ERKRS AND perio IN o_perio AND zck01 IN o_zck01 AND zck02 IN o_zck02. ENDFORM. ” get_db
– Write (Stanard Program : RSAADMAR)
************************************************************************ * Program : ZZELTUP01A_REL * * Author : leejhy * * Date : 2007.02.05 * * Functional description : ARCHIVE – WRITE Program * * OBJECT : Z_ZPA01A * ************************************************************************ report ZZELTUP01A_WRI. *———————————————————————-* * data declaration *———————————————————————-* tables: ZELTUP01a. data: button(1) type c, create(1) type c value ‘X’, no_delete(1) type c value ‘X’, handle like sy-tabix, ZELTUP01a_itab type table of ZELTUP01a with header line, data_object_id like arch_idx_s-obj_id. *———————————————————————-* * SELECT-OPTIONS / PARAMETER * *———————————————————————-* selection-screen begin of block arch_booking with frame title text-101. PARAMETERS: P_ERKRS TYPE ERKRS. select-options: o_perio for ZELTUP01a-perio obligatory no intervals no-extension, o_zck01 for ZELTUP01a-zck01, o_zck02 for ZELTUP01a-zck02. selection-screen end of block arch_booking. selection-screen begin of block arch_control with frame title text-102. parameters: no_file like button radiobutton group radi, del_test like button radiobutton group radi default ‘X’. selection-screen end of block arch_control. parameters comments type admi_text lower case. *default ‘Test data for archiving with Z_ZELTUP01A'(105). *———————————————————————-* * START-OF-SELECTION * *———————————————————————-* DATA: g_CURSOR TYPE CURSOR, g_package TYPE i VALUE 5000. * build ADK parameters from chosen button if no_file = ‘X’. create = ‘ ‘. no_delete = ‘ ‘. endif. if del_test = ‘X’. create = ‘X’. no_delete = ‘X’. endif. * open a new archive session to archive data call function ‘ARCHIVE_OPEN_FOR_WRITE’ exporting call_delete_job_in_test_mode = no_delete comments = comments create_archive_file = create object = ‘Z_ZPA01A’ importing archive_handle = handle. * select data from the database – 20070212 new -> OPEN CURSOR WITH HOLD g_CURSOR FOR select * from ZELTUP01A where erkrs = P_ERKRS and perio in o_perio and zck01 in o_zck01 and zck02 in o_zck02. DO. *” Package size ŭ о internal table ZELTUP01A_itab ִ´. FETCH NEXT CURSOR g_CURSOR INTO CORRESPONDING FIELDS OF TABLE ZELTUP01A_itab PACKAGE SIZE G_PACKAGE. IF SY-SUBRC = 4. EXIT. ENDIF. * select data from the database – 20070212 new <- loop at ZELTUP01A_itab. concatenate sy-mandt ZELTUP01A_itab-perio ZELTUP01A_itab-zck01 ZELTUP01A_itab-zck02 into data_object_id. * initialize a new data object call function ‘ARCHIVE_NEW_OBJECT’ exporting archive_handle = handle object_id = data_object_id. ” optional: ADK index * put data records into ADK’s data container call function ‘ARCHIVE_PUT_RECORD’ exporting archive_handle = handle record_structure = ‘ZELTUP01A’ record = ZELTUP01A_itab. * write data object into the archive file call function ‘ARCHIVE_SAVE_OBJECT’ exporting archive_handle = handle. endloop. clear: ZELTUP01A_itab[]. ENDDO. ” 20070212 new CLOSE CURSOR g_CURSOR. ” 20070212 new * create the default spool list call function ‘ARCHIVE_WRITE_STATISTICS’ exporting archive_handle = handle. * close the archive session call function ‘ARCHIVE_CLOSE_FILE’ exporting archive_handle = handle.
– Delete (Standard Program : RSAADMLO)
************************************************************************ * Program : ZZELTUP01A_DEL * * Author : leejhy * * Date : 2007.02.05 * * Functional description : ARCHIVE – DELETE Program * * OBJECT : Z_ZPA01A * ************************************************************************ REPORT ZZELTUP01A_DEL. CONSTANTS: OBJECT LIKE ARCH_OBJ-OBJECT VALUE ‘Z_ZPA01A’. DATA: HANDLE LIKE SY-TABIX, BUFFER TYPE ARC_BUFFER, SEL_FILES_ITAB TYPE TABLE OF ARCH_FILES, ZELTUP01A_WA LIKE ZELTUP01A, ZELTUP01A_TTAB TYPE TABLE OF ZELTUP01A, ZELTUP01A_ITAB TYPE TABLE OF ZELTUP01A, COMMIT_CNT LIKE ARCH_USR-ARCH_COMIT, OBJECT_CNT TYPE I, ARKEY LIKE ARCH_IDX_S-ARCHIVEKEY, OBJECT_ID LIKE ARCH_IDX_S-OBJ_ID, OFFSET LIKE ARCH_IDX_S-OBJ_OFFSET, INDEX_TAB TYPE TABLE OF ARCH_IDX_S WITH HEADER LINE, INDEX_FLAG LIKE ARCH_USR-ARCH_INDEX, SUM_OBJECTS TYPE I VALUE 0, STAT_ITAB TYPE TABLE OF ARCH_STAT, TABFIELD LIKE ARCH_STAT. DATA: ITABNAME(20) TYPE C. FIELD-SYMBOLS: <TS> TYPE TABLE. *———————————————————————-* * SELECT-OPTIONS / PARAMETER * *———————————————————————-* PARAMETERS: TESTRUN DEFAULT ‘X’ AS CHECKBOX. ” do not delete ” from database * open a new archive session to delete data CALL FUNCTION ‘ARCHIVE_OPEN_FOR_DELETE’ EXPORTING OBJECT = OBJECT TEST_MODE = TESTRUN IMPORTING ARCHIVE_HANDLE = HANDLE EXCEPTIONS OTHERSQ = 01. IF SY-SUBRC <> 0. WRITE / ‘No file can be accessed'(001). EXIT. ENDIF. * get customizing data from the archive object CALL FUNCTION ‘ARCHIVE_GET_CUSTOMIZING_DATA’ EXPORTING OBJECT = OBJECT IMPORTING COMMIT_COUNT_FOR_DELETE_PRG = COMMIT_CNT MAINTAIN_INDEX = INDEX_FLAG. * loop to get the next data object from the archive file(s) CLEAR: OBJECT_CNT, COMMIT_CNT. DO. ADD 1 TO OBJECT_CNT. ADD 1 TO COMMIT_CNT. CALL FUNCTION ‘ARCHIVE_GET_NEXT_OBJECT’ EXPORTING ARCHIVE_HANDLE = HANDLE IMPORTING OBJECT_ID = OBJECT_ID OBJECT_OFFSET = OFFSET ARCHIVE_NAME = ARKEY EXCEPTIONS END_OF_FILE = 01. IF SY-SUBRC = 1. EXIT. ENDIF. * build an index to allow for random access to data objects *** This index is optional. Try to use the Archive Information *** System SAP AS instead. IF INDEX_FLAG IS INITIAL. * no index is to be built according to customizing ELSEIF TESTRUN IS INITIAL. MOVE: OBJECT_ID TO INDEX_TAB-OBJ_ID, ARKEY TO INDEX_TAB-ARCHIVEKEY, OFFSET TO INDEX_TAB-OBJ_OFFSET. APPEND INDEX_TAB. PERFORM SAVE_INDEX_TAB ON COMMIT. ENDIF. * loop to get data records from ADK’s data container CALL FUNCTION ‘ARCHIVE_GET_NEXT_RECORD’ EXPORTING ARCHIVE_HANDLE = HANDLE IMPORTING RECORD = BUFFER-SEGMENT RECORD_STRUCTURE = BUFFER-RNAME EXCEPTIONS END_OF_OBJECT = 01. IF SY-SUBRC = 1. EXIT. ENDIF. * keep data records in mind; take their structure into account CASE BUFFER-RNAME. WHEN ‘ZELTUP01A’. CALL FUNCTION ‘ARCHIVE_GET_TABLE’ EXPORTING ARCHIVE_HANDLE = HANDLE RECORD_STRUCTURE = ‘ZELTUP01A’ ALL_RECORDS_OF_OBJECT = ‘X’ TABLES TABLE = ZELTUP01A_TTAB[]. IF NOT ZELTUP01A_TTAB[] IS INITIAL. LOOP AT ZELTUP01A_TTAB INTO ZELTUP01A_WA. APPEND ZELTUP01A_WA TO ZELTUP01A_ITAB. ENDLOOP. ENDIF. ENDCASE. CLEAR BUFFER-SEGMENT. IF TESTRUN IS INITIAL AND OBJECT_CNT = COMMIT_CNT. PERFORM DELETE_FROM_TABLE. ” actual delete from database CLEAR OBJECT_CNT. ” restart counting up to ENDIF. ” value of commit counter ENDDO. IF TESTRUN IS INITIAL AND OBJECT_CNT >= 1. PERFORM DELETE_FROM_TABLE. ” deleting last package ENDIF. * provide statistics TABFIELD-TABNAME = ‘ ‘. TABFIELD-COUNT = SUM_OBJECTS. APPEND TABFIELD TO STAT_ITAB. TABFIELD-TABNAME = ‘ZELTUP01A’. APPEND TABFIELD TO STAT_ITAB. CALL FUNCTION ‘ARCHIVE_GIVE_STATISTICS’ EXPORTING ARCHIVE_HANDLE = HANDLE TABLES TABLE = STAT_ITAB. * write statistics CALL FUNCTION ‘ARCHIVE_WRITE_STATISTICS’ EXPORTING ARCHIVE_HANDLE = HANDLE STATISTICS_ONLY_PER_FILE = ‘X’. * get all processed files for update of index status CALL FUNCTION ‘ARCHIVE_GET_ARCHIVE_FILES’ EXPORTING ARCHIVE_HANDLE = HANDLE TABLES ARCHIVE_FILES = SEL_FILES_ITAB. * close the archive session CALL FUNCTION ‘ARCHIVE_CLOSE_FILE’ EXPORTING ARCHIVE_HANDLE = HANDLE. * set status “index created? in SARA administration IF INDEX_FLAG IS INITIAL. * no index has been built according to customizing ELSEIF TESTRUN IS INITIAL. CALL FUNCTION ‘ARCHIVE_ADMIN_SET_STATUS’ EXPORTING FILES_ARE_CONVERTED = ‘ ‘ INDEX_CREATED = ‘X’ TABLES ARCHIVE_FILES = SEL_FILES_ITAB. ENDIF. * ———————————————- * * FORM DELETE_FROM_TABLE * * ———————————————- * FORM DELETE_FROM_TABLE. DATA: TABCOUNT TYPE I VALUE 0. DELETE ZELTUP01A FROM TABLE ZELTUP01A_ITAB. ” delete job restartable COMMIT WORK. DESCRIBE TABLE ZELTUP01A_ITAB LINES TABCOUNT. SUM_OBJECTS = SUM_OBJECTS + TABCOUNT. REFRESH ZELTUP01A_ITAB. ENDFORM. ” DELETE_FROM_TABLE * ———————————————- * * Form SAVE_INDEX_TAB * * ———————————————- * * global: index_tab * ———————————————- * FORM SAVE_INDEX_TAB. DELETE ARCH_IDX_S FROM TABLE INDEX_TAB. INSERT ARCH_IDX_S FROM TABLE INDEX_TAB. REFRESH INDEX_TAB. ENDFORM. ” SAVE_INDEX_TAB
– Reload (Standard Program : RSAADMRL)
************************************************************************ * Program : ZZELTUP01A_REL * * Author : leejhy * * Date : 2007.02.05 * * Functional description : ARCHIVE – RELOAD Program * * OBJECT : Z_ZPA01A * ************************************************************************ REPORT zzeltup01a_rel. *———————————————————————-* * data declaration *———————————————————————-* CONSTANTS: object LIKE arch_obj-object VALUE ‘Z_ZPA01A’. DATA: read_handle LIKE sy-tabix, sel_files_itab TYPE TABLE OF arch_files, record_type LIKE arc_buffer-rname, buffer_ref TYPE REF TO data, ” Unicode commit_cnt LIKE arch_usr-arch_comit, object_cnt TYPE i, read_cnt TYPE i, arkey LIKE arch_idx_s-archivekey, object_id LIKE arch_idx_s-obj_id, offset LIKE arch_idx_s-obj_offset, index_tab TYPE TABLE OF arch_idx_s WITH HEADER LINE, stat_itab TYPE TABLE OF arch_stat, tabfield LIKE arch_stat. DATA : BEGIN OF zeltup01a_itab OCCURS 0. INCLUDE STRUCTURE zeltup01a. DATA : END OF zeltup01a_itab. FIELD-SYMBOLS: <zeltup01a_ptr> TYPE zeltup01a. ” Unicode *———————————————————————-* * SELECT-OPTIONS / PARAMETER * *———————————————————————-* PARAMETERS testmode DEFAULT ‘X’ AS CHECKBOX. * open a new archiving session to reload data CALL FUNCTION ‘ARCHIVE_OPEN_FOR_MOVE’ EXPORTING object = object test_mode = testmode IMPORTING archive_read_handle = read_handle EXCEPTIONS OTHERS = 01. IF sy-subrc <> 0. WRITE / ‘No file can be accessed'(001). EXIT. ENDIF. * get Customizing data from the archiving object CALL FUNCTION ‘ARCHIVE_GET_CUSTOMIZING_DATA’ EXPORTING object = object IMPORTING commit_count_for_delete_prg = commit_cnt. * loop to get the next data object from the archive file(s) CLEAR object_cnt. DO. CALL FUNCTION ‘ARCHIVE_GET_NEXT_OBJECT’ EXPORTING archive_handle = read_handle IMPORTING object_id = object_id object_offset = offset archive_name = arkey EXCEPTIONS end_of_file = 01. IF sy-subrc = 1. EXIT. ENDIF. ADD 1 TO object_cnt. MOVE: object_id TO index_tab-obj_id, arkey TO index_tab-archivekey, offset TO index_tab-obj_offset. APPEND index_tab. PERFORM delete_index_tab ON COMMIT. * loop to get data records from ADK’s data container DO. CALL FUNCTION ‘ARCHIVE_GET_NEXT_RECORD’ EXPORTING archive_handle = read_handle IMPORTING record_structure = record_type record_ref = buffer_ref ” Unicode EXCEPTIONS end_of_object = 01. IF sy-subrc = 1. EXIT. ENDIF. * keep data records in mind; take their structure into account CASE record_type. WHEN ‘ZELTUP01A’. ASSIGN buffer_ref->* TO <zeltup01a_ptr>. ” Unicode APPEND <zeltup01a_ptr> TO zeltup01a_itab. ” will be reloaded to db ENDCASE. ENDDO. IF testmode IS INITIAL AND object_cnt EQ commit_cnt. PERFORM insert_from_table. ” reload to database CLEAR object_cnt. ” restart counting up to ENDIF. ” value of commit counter ENDDO. IF testmode IS INITIAL AND object_cnt GE 1. PERFORM insert_from_table. ” reloading records of last file ENDIF. * get all processed files for update of index status CALL FUNCTION ‘ARCHIVE_GET_ARCHIVE_FILES’ EXPORTING archive_handle = read_handle TABLES archive_files = sel_files_itab. * create statistics list when production mode IF testmode IS INITIAL. CALL FUNCTION ‘ARCHIVE_WRITE_STATISTICS’ EXPORTING archive_handle = read_handle. ENDIF. * close the archiving session CALL FUNCTION ‘ARCHIVE_CLOSE_FILE’ EXPORTING archive_handle = read_handle. * set status “index deleted” in SARA administration IF testmode IS INITIAL. CALL FUNCTION ‘ARCHIVE_ADMIN_SET_STATUS’ EXPORTING files_are_converted = ‘ ‘ index_deleted = ‘X’ TABLES archive_files = sel_files_itab. ENDIF. *———————————————————————* * FORM INSERT_FROM_TABLE * *———————————————————————* *global: ZELTUP01a_itab * *———————————————————————* FORM insert_from_table. REFRESH stat_itab. INSERT zeltup01a FROM TABLE zeltup01a_itab ACCEPTING DUPLICATE KEYS. tabfield-tabname = ‘ ‘. tabfield-count = object_cnt. APPEND tabfield TO stat_itab. tabfield-tabname = ‘ZELTUP01A’. tabfield-count = sy-dbcnt. APPEND tabfield TO stat_itab. CALL FUNCTION ‘ARCHIVE_GIVE_STATISTICS’ EXPORTING archive_handle = read_handle TABLES table = stat_itab. COMMIT WORK. REFRESH zeltup01a_itab. ENDFORM. “insert_from_table *———————————————————————* * Form DELETE_INDEX_TAB * *———————————————————————* * global: index_tab * *———————————————————————* FORM delete_index_tab. IF testmode IS INITIAL. DELETE arch_idx_s FROM TABLE index_tab. ENDIF. REFRESH index_tab. ENDFORM. ” DELETE_INDEX_TAB
–> 아카이빙 오브젝트에 Assign한 프로그램 ID로 생성합니다.
4. 아카이빙 수행(Transaction : SARA)

댓글