CBO Table Archiving 방법
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)
[#M_소소코드 보기|접기|
************************************************************************
* Program : ZZELTUP01A_RED *_M#]
* 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)
[#M_소스코드 보기|접기|
************************************************************************
* 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)
[#M_소스코드 보기|접기|
************************************************************************
* 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)
[#M_소스코드 보기|접기|
************************************************************************
* 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)
 
 

 
  