SAP歸檔項目的歸檔對象的選擇方法一般是先從技術的角度找到最大的表(TOP50或TOP100),然後確定歸檔對象,最近被challenge了一個問題,如何保證這麼選擇的歸檔對象是最全的,即保證歸檔後在線數據的完整性,所以從另一個角度去考慮這件事情,先從系統中找到有數據存在的表然後再去找這些表所在的歸檔對象,得到初步的歸檔對象列表,這個列表應該涵蓋了目前系統中所有業務所具備的歸檔對象,然後對這些歸檔對象進行進一步篩選,即可得到完整的歸檔對象列表。其中完成第一步的程序源代碼如下:
REPORT ZGETTABLEHASENTRIES .
TYPE-POOLS: adk.
DATA: wa_segments TYPE segments_f,
it_segments TYPE TABLE OF segments_f.
DATA: BEGIN OF wa_count,
type(10) TYPE c,
count TYPE i,
END OF wa_count,
it_count LIKE TABLE OF wa_count,
BEGIN OF wa_table,
name TYPE DD02L-TABNAME,
END OF wa_table,
it_table LIKE TABLE OF wa_table.
DATA: it_arch_def TYPE TABLE OF arch_def,
wa_arch_def TYPE arch_def.
DATA: it_objects TYPE ADK_CCMS_OBJECTS,
wa_objects LIKE LINE OF it_objects.
************************************************************************
* TYPE-POOLS
************************************************************************
* ALV specific data definitions
TYPE-POOLS:
SLIS.
DATA:
* IT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV OCCURS 0 WITH HEADER LINE,
IT_FIELDCAT TYPE SLIS_FIELDCAT_ALV OCCURS 0 WITH HEADER LINE,
IT_SORTINFO TYPE SLIS_T_SORTINFO_ALV,
IT_EVENTS TYPE SLIS_T_EVENT,
WA_COMMENTS TYPE SLIS_T_LISTHEADER,
WA_LAYOUT TYPE SLIS_LAYOUT_ALV ,
WA_PRINT TYPE SLIS_PRINT_ALV,
WA_VARIANT TYPE DISVARIANT,
V_REPID TYPE SY-REPID,
V_SAVE VALUE 'A',
V_RPT TYPE I.
SELECTION-SCREEN BEGIN OF BLOCK blk01.
PARAMETERS: p_size TYPE i.
SELECTION-SCREEN END OF BLOCK blk01.
START-OF-SELECTION.
PERFORM frm_get_table.
END-OF-SELECTION.
PERFORM frm_output_alv.
*&---------------------------------------------------------------------*
*& Form frm_get_table
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_get_table.
CLEAR it_arch_def.
EXEC SQL PERFORMING frm_add_segments.
SELECT
owner, NVL(partition_name, segment_name), segment_type,
tablespace_name, header_file, header_block, bytes/1024,
blocks, extents, initial_extent/1024, next_extent/1024,
min_extents, max_extents, pct_increase, segment_name, 0
FROM dba_segments INTO :wa_segments
WHERE segment_type like :'TABLE'
ENDEXEC.
ENDFORM. " frm_get_table
*&---------------------------------------------------------------------*
*& Form frm_add_segments
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_add_segments.
APPEND wa_segments TO it_segments.
* count table count
wa_count-type = 'ALL'.
wa_count-count = 1.
COLLECT wa_count INTO it_count.
IF wa_segments-kbytes > 100.
wa_count-type = '100'.
wa_count-count = 1.
COLLECT wa_count INTO it_count.
ENDIF.
IF wa_segments-kbytes > p_size.
wa_count-type = '1000'.
wa_count-count = 1.
COLLECT wa_count INTO it_count.
wa_table-name = wa_segments-sn.
APPEND wa_table TO it_table.
DATA: lt_objects LIKE it_objects.
CALL FUNCTION 'ADK_CCMS_GET_OBJECTS'
EXPORTING
TABLE = wa_table-name
DELETE_OBJECTS_ONLY = 'X'
TABLES
OBJECTS = lt_objects
EXCEPTIONS
TABLE_NOT_FOUND = 1
POOL_OR_CLUSTER_NOT_IN_USE = 2
NO_OBJECT_FOUND = 3
TABLE_IS_NOT_TRANSPARENT = 4
OTHERS = 5
.
IF SY-SUBRC <> 0.
ENDIF.
APPEND LINES OF lt_objects TO it_objects.
* SELECT * APPENDING TABLE it_arch_def
* FROM arch_def
* WHERE son = wa_segments-sn AND
* delete_flg <> 'X'.
ENDIF.
ENDFORM. " frm_add_segments
*&---------------------------------------------------------------------*
*& Form frm_write_list
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_write_list.
ENDFORM. " frm_write_list
*&---------------------------------------------------------------------*
*& Form frm_output_alv
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_output_alv.
SORT it_objects BY object.
DELETE ADJACENT DUPLICATES FROM it_objects COMPARING object.
PERFORM FORM_BUILD_FIELDCAT.
* Call ABAP List Viewer (ALV)
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
i_callback_program = V_REPID
IT_FIELDCAT = IT_FIELDCAT[]
TABLES
T_OUTTAB = it_objects.
ENDFORM. " frm_output_alv
*&---------------------------------------------------------------------*
*& Form FORM_BUILD_FIELDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM FORM_BUILD_FIELDCAT.
CLEAR IT_FIELDCAT.
IT_FIELDCAT-FIELDNAME = 'OBJECT'.
IT_FIELDCAT-SELTEXT_M = TEXT-001.
APPEND IT_FIELDCAT.
IT_FIELDCAT-FIELDNAME = 'OBJTEXT'.
IT_FIELDCAT-SELTEXT_M = TEXT-002.
APPEND IT_FIELDCAT.
ENDFORM. " FORM_BUILD_FIELDCAT