ZARCHIVE_CONSTRUCT_INDEX

Code listing for: ZARCHIVE_CONSTRUCT_INDEX

Description: Archive construct index table for ZTABLE

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.
******************************************************************

*----------------------------------------------------------------------
* initialisation
*----------------------------------------------------------------------
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
************************************************************************
AT SELECTION-SCREEN.
  PERFORM frm_check_input.

************************************************************************
* event Start of Selection
************************************************************************
START-OF-SELECTION.
  PERFORM frm_reload_ztable.  "

************************************************************************
*EVENT End-of selection
************************************************************************
END-OF-SELECTION.
  PERFORM frm_process_status.

*&---------------------------------------------------------------------*
*&      Form  frm_reload_ztable
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
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.

* fetch
  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
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
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
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
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.
* fetch
  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.

* check
  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
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      -->P_0167   text
*----------------------------------------------------------------------*
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
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_create_dynamic_table .

* create index 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 archive table
  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
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
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
*         MAINTAIN_INDEX               = ' '
        IMPORTING
          archive_handle               = g_archive_handle
*   TABLES
*         ARCHIVE_FILES                =
*         SELECTED_FILES               =
        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                   = 
*           RECORD_FLAGS_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
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
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.


*Messages
*----------------------------------------------------------
*
* Message class: Hard coded
*   Archive Files is Open Now.

你可能感兴趣的:(SAP,ABAP,ABAP,ARCHIVE,BASIS)