REPORT zarchive_construct_index.
TABLES: dd03l,aind_statu,admi_files,arch_txt.
TYPE-POOLS: slis.
DATA:it_files TYPE TABLE OF admi_files WITH HEADER LINE,
it_statu TYPE TABLE OF aind_statu WITH HEADER LINE,
it_str1 TYPE TABLE OF aind_str1 WITH HEADER LINE,
it_str2 TYPE TABLE OF aind_str2 WITH HEADER LINE.
DATA:gt_dyn_itab TYPE REF TO data,
gt_dyn_index TYPE REF TO data,
gt_dyn_swap TYPE REF TO data,
gs_index TYPE REF TO data,
gs_wa TYPE REF TO data.
DATA:gv_string(18).
FIELD-SYMBOLS: TYPE STANDARD TABLE,
TYPE STANDARD TABLE,
TYPE STANDARD TABLE,
TYPE any,
TYPE any,
.
DATA:g_archive_handle TYPE sy-tabix.
SELECTION-SCREEN BEGIN OF BLOCK tb1 WITH FRAME TITLE tblock1. " TableN
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(14) tabname.
PARAMETERS: p_tab LIKE dd03l-tabname MEMORY ID p_tab OBLIGATORY.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT 1(11) inxname.
SELECT-OPTIONS: s_inx FOR dd03l-tabname NO-EXTENSION NO INTERVALS.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK tb1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE condit.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (10) scf1 .
PARAMETERS: s_cf1 LIKE dd03l-fieldname.
SELECT-OPTIONS: s_cv1 FOR gv_string.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (10) scf2 .
PARAMETERS: s_cf2 LIKE dd03l-fieldname.
SELECT-OPTIONS: s_cv2 FOR gv_string.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (10) scf3 .
PARAMETERS: s_cf3 LIKE dd03l-fieldname.
SELECT-OPTIONS: s_cv3 FOR gv_string.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (10) scf4 .
PARAMETERS: s_cf4 LIKE dd03l-fieldname.
SELECT-OPTIONS: s_cv4 FOR gv_string.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (10) scf5 .
PARAMETERS: s_cf5 LIKE dd03l-fieldname.
SELECT-OPTIONS: s_cv5 FOR gv_string.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (10) scf6 .
PARAMETERS: s_cf6 LIKE dd03l-fieldname.
SELECT-OPTIONS: s_cv6 FOR gv_string.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (41) object.
SELECT-OPTIONS:s_object FOR arch_txt-object OBLIGATORY NO-EXTENSION NO INTERVALS.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (41) session.
SELECT-OPTIONS:s_asion FOR admi_files-document OBLIGATORY.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (41) sarkey.
SELECT-OPTIONS:s_arkey FOR aind_statu-archivekey.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (41) sarinx.
SELECT-OPTIONS:s_arinx FOR aind_statu-archindex.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN BEGIN OF BLOCK blk02 WITH FRAME TITLE mode.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_test RADIOBUTTON GROUP gp1 DEFAULT 'X'. " 测试运行
SELECTION-SCREEN COMMENT (50) ptest.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_prod RADIOBUTTON GROUP gp1. "正式运行
SELECTION-SCREEN COMMENT (50) pprod .
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK blk02.
INITIALIZATION.
tblock1 = 'Table Name(Optional)'.
tabname = 'Archive Table'.
inxname = 'Index table'.
condit = 'SelectCondition'.
scf1 = 'Sel.Cond.1'.
scf2 = 'Sel.Cond.2'.
scf3 = 'Sel.Cond.3'.
scf4 = 'Sel.Cond.4'.
scf5 = 'Sel.Cond.5'.
scf6 = 'Sel.Cond.6'.
sarinx = 'Archive Information Structure'.
object = 'Archiving Object'.
session = 'Archiving Session'.
sarkey = 'Key for Archive File'.
mode = 'Mode'.
pprod = 'Rebuild'.
ptest = 'Test Rebuild'.
AT SELECTION-SCREEN.
PERFORM frm_check_input.
START-OF-SELECTION.
PERFORM frm_reload_ztable. "
END-OF-SELECTION.
PERFORM frm_process_status.
FORM frm_reload_ztable .
DATA: lv_selection TYPE string.
DATA: lv_condition TYPE string.
DATA: l_no TYPE i.
DATA: it_dd03l TYPE TABLE OF dd03l WITH HEADER LINE.
STATICS s_dbcur TYPE cursor.
RANGES:lr_object FOR admi_files-archiv_key.
LOOP AT s_object.
CLEAR:lr_object.
lr_object-sign = 'I'.
lr_object-option = 'CP'.
CONCATENATE '*' s_object-low INTO lr_object-low.
APPEND lr_object.
ENDLOOP.
SELECT *
INTO TABLE it_files
FROM admi_files
WHERE document IN s_asion
AND archiv_key IN lr_object
AND archiv_key IN s_arkey.
IF it_files[] IS NOT INITIAL.
SELECT *
INTO TABLE it_statu
FROM aind_statu
FOR ALL ENTRIES IN it_files
WHERE archindex IN s_arinx
AND archivekey IN s_arkey
AND archivekey = it_files-archiv_key.
ENDIF.
SELECT *
INTO TABLE it_str1
FROM aind_str1
WHERE object IN s_object
AND itype = 'I'.
IF it_str1[] IS NOT INITIAL.
SELECT *
INTO TABLE it_str2
FROM aind_str2
FOR ALL ENTRIES IN it_str1
WHERE archindex = it_str1-archindex
AND active = 'X'
AND gentab IN s_inx.
ENDIF.
PERFORM frm_fetch_from_files.
ENDFORM.
FORM frm_process_status .
MODIFY aind_statu FROM TABLE it_statu.
IF sy-subrc = 0.
IF p_test = 'X'.
ROLLBACK WORK.
NEW-LINE.
WRITE:AT 4 'Test is OK'.
ELSE.
COMMIT WORK.
NEW-LINE.
WRITE:AT 4 'INSERT AIND_STATU records :', sy-dbcnt.
ENDIF.
ENDIF.
ENDFORM.
FORM frm_check_input .
RANGES:lr_object FOR admi_files-archiv_key.
LOOP AT s_object.
CLEAR:lr_object.
lr_object-sign = 'I'.
lr_object-option = 'CP'.
CONCATENATE '*' s_object-low INTO lr_object-low.
APPEND lr_object.
ENDLOOP.
SELECT *
INTO TABLE it_files
FROM admi_files
WHERE document IN s_asion
AND archiv_key IN lr_object
AND archiv_key IN s_arkey.
IF it_files[] IS NOT INITIAL.
SELECT *
INTO TABLE it_statu
FROM aind_statu
FOR ALL ENTRIES IN it_files
WHERE archindex IN s_arinx
AND archivekey IN s_arkey
AND archivekey = it_files-archiv_key.
ELSE.
PERFORM frm_error_output USING 'The Archive Session and Key has no file.'.
ENDIF.
SELECT *
INTO TABLE it_str1
FROM aind_str1
WHERE object IN s_object
AND itype = 'I'.
IF it_str1[] IS NOT INITIAL.
SELECT *
INTO TABLE it_str2
FROM aind_str2
FOR ALL ENTRIES IN it_str1
WHERE archindex = it_str1-archindex
AND active = 'X'
AND gentab IN s_inx.
ENDIF.
DESCRIBE TABLE it_str2.
IF sy-tfill = 0.
PERFORM frm_error_output USING 'The Archive Key has no Index Table.'.
ENDIF.
IF s_inx[] IS NOT INITIAL.
DESCRIBE TABLE it_str2.
IF sy-tfill = 1.
READ TABLE it_str2.
IF s_inx-low <> it_str2-gentab.
PERFORM frm_error_output USING 'Index Table Name does not match Archive Key.'.
ENDIF.
ELSE.
PERFORM frm_error_output USING 'Please clear tabname Because The Archive Key have few index tables.'.
ENDIF.
ENDIF.
ENDFORM.
FORM frm_error_output USING VALUE(p_mess).
MESSAGE p_mess TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDFORM. " FRM_ERROR_OUTPUT
FORM frm_create_dynamic_table .
CREATE DATA gt_dyn_index TYPE TABLE OF (it_str2-gentab).
ASSIGN gt_dyn_index->* TO .
CREATE DATA gs_index LIKE LINE OF .
ASSIGN gs_index->* TO .
CREATE DATA gt_dyn_itab TYPE TABLE OF (p_tab).
ASSIGN gt_dyn_itab->* TO .
CREATE DATA gs_wa LIKE LINE OF .
ASSIGN gs_wa->* TO .
CREATE DATA gt_dyn_swap LIKE .
ASSIGN gt_dyn_swap->* TO .
ENDFORM.
FORM frm_fetch_from_files .
DATA:l_object_id(10) TYPE c,
l_object_offset TYPE arch_idx-offset,
l_archive_name TYPE heada-arkey,
l_compr_object_length TYPE i,
l_session TYPE admi_run_d.
LOOP AT it_files.
LOOP AT it_str2.
PERFORM frm_create_dynamic_table.
CALL FUNCTION 'ARCHIVE_OPEN_FOR_READ'
EXPORTING
archive_document = it_files-document
archive_name = it_files-archiv_key
object = s_object-low
IMPORTING
archive_handle = g_archive_handle
EXCEPTIONS
file_already_open = 1
file_io_error = 2
internal_error = 3
no_files_available = 4
object_not_found = 5
open_error = 6
not_authorized = 7
archiving_standard_violation = 8
OTHERS = 9.
CASE sy-subrc.
WHEN 0.
WHEN 1.
MESSAGE 'Archive Files is Open Now.' TYPE 'S'.
CONTINUE.
WHEN 2 OR 3 OR 4 OR 6.
MESSAGE 'Some Archive Files Not Found.' TYPE 'S'.
CONTINUE.
WHEN 5.
MESSAGE 'Archive Object Not Found.' TYPE 'S'.
CONTINUE.
WHEN 7.
MESSAGE 'You have no authorization.' TYPE 'S'.
CONTINUE.
WHEN OTHERS.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDCASE.
DO.
CALL FUNCTION 'ARCHIVE_GET_NEXT_OBJECT'
EXPORTING
archive_handle = g_archive_handle
IMPORTING
object_id = l_object_id
object_offset = l_object_offset
archive_name = l_archive_name
compr_object_length = l_compr_object_length
session = l_session
EXCEPTIONS
end_of_file = 1
file_io_error = 2
internal_error = 3
open_error = 4
wrong_access_to_archive = 5
OTHERS = 6.
IF sy-subrc <> 0.
IF sy-subrc = 1.
EXIT.
ELSE.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
ENDIF.
REFRESH .
CALL FUNCTION 'ARCHIVE_GET_TABLE'
EXPORTING
archive_handle = g_archive_handle
record_structure = p_tab
all_records_of_object = 'X'
TABLES
table =
EXCEPTIONS
end_of_object = 1
internal_error = 2
wrong_access_to_archive = 3
OTHERS = 4.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
LOOP AT ASSIGNING .
IF s_cf1 IS NOT INITIAL.
ASSIGN COMPONENT s_cf1 OF STRUCTURE TO .
CHECK sy-subrc = 0.
CHECK IN s_cv1[].
ENDIF.
IF s_cf2 IS NOT INITIAL.
ASSIGN COMPONENT s_cf2 OF STRUCTURE TO .
CHECK sy-subrc = 0.
CHECK IN s_cv2[].
ENDIF.
IF s_cf3 IS NOT INITIAL.
ASSIGN COMPONENT s_cf3 OF STRUCTURE TO .
CHECK sy-subrc = 0.
CHECK IN s_cv3[].
ENDIF.
IF s_cf4 IS NOT INITIAL.
ASSIGN COMPONENT s_cf4 OF STRUCTURE TO .
CHECK sy-subrc = 0.
CHECK IN s_cv4[].
ENDIF.
IF s_cf5 IS NOT INITIAL.
ASSIGN COMPONENT s_cf5 OF STRUCTURE TO .
CHECK sy-subrc = 0.
CHECK IN s_cv5[].
ENDIF.
IF s_cf6 IS NOT INITIAL.
ASSIGN COMPONENT s_cf6 OF STRUCTURE TO .
CHECK sy-subrc = 0.
CHECK IN s_cv6[].
ENDIF.
MOVE-CORRESPONDING TO .
ASSIGN COMPONENT 'ARCHIVEKEY' OF STRUCTURE TO .
IF sy-subrc = 0.
= l_archive_name.
ENDIF.
ASSIGN COMPONENT 'ARCHIVEOFS' OF STRUCTURE TO .
IF sy-subrc = 0.
= l_object_offset.
ENDIF.
APPEND TO .
ENDLOOP.
DESCRIBE TABLE .
IF sy-tfill >= 10000.
PERFORM frm_update_db.
CLEAR:.
ENDIF.
ENDDO.
IF IS NOT INITIAL.
PERFORM frm_update_db.
CLEAR:.
ENDIF.
it_statu-archindex = it_str2-archindex.
it_statu-archivekey = l_archive_name.
it_statu-aind_statu = 'X'.
APPEND it_statu.
MODIFY it_statu TRANSPORTING aind_statu
WHERE archindex = it_str2-archindex
AND archivekey = l_archive_name.
ENDLOOP.
ENDLOOP.
CALL FUNCTION 'ARCHIVE_CLOSE_FILE'
EXPORTING
archive_handle = g_archive_handle.
ENDFORM.
FORM frm_update_db .
IF p_test = 'X'.
DESCRIBE TABLE .
NEW-LINE.
WRITE:AT 4 'Test INSERT ', it_str2-gentab, ' records :', sy-tfill.
ELSE.
MODIFY (it_str2-gentab) FROM TABLE .
IF sy-subrc = 0.
COMMIT WORK.
NEW-LINE.
WRITE:AT 4 'MODIFY ', it_str2-gentab, ' records success:', sy-dbcnt.
ELSE.
ROLLBACK WORK.
NEW-LINE.
WRITE:AT 4 'MODIFY ', it_str2-gentab, ' records failed.'.
ENDIF.
ENDIF.
ENDFORM.
|