ZARCHIVE_WRITE(限制用于Z表)

来源:互联网 发布:linux 开启snmp 编辑:程序博客网 时间:2024/05/17 22:11



最好只用于Z表的归档

Code listing for: ZARCHIVE_WRITE

Description: Archive write program for ZTABLE

REPORT zarchive_write.

************************************************************************
*  Tables                                                       *
************************************************************************
TABLES: dd03l.

************************************************************************
*  Types                                                    *
************************************************************************
TYPES: BEGIN OF ty_tab,
         tabname TYPE zdvm_clearrule-tabname,
       END   OF ty_tab.

TYPES: BEGIN OF ty_cond,
         cond TYPE char72,
       END   OF ty_cond.

************************************************************************
*  Marco                                                           *
************************************************************************
DEFINE mac_format_error.
* set format for errors.
  format color col_negative.
END-OF-DEFINITION.

DEFINE mac_format_normal.
  format color col_normal.
END-OF-DEFINITION.

************************************************************************
*  变量定义                                                            *
************************************************************************
DATA:g_archive_handle TYPE sy-tabix,
     g_commit_count   TYPE arch_usr-arch_comit,
     g_maintain_index TYPE arch_usr-arch_index.

DATA:gt_dyn_itab TYPE REF TO data,
     gs_wa        TYPE REF TO data.
DATA:gv_string(18).

DATA:gt_tabrule TYPE TABLE OF zdvm_clearrule,
     gs_tabrule TYPE zdvm_clearrule.

FIELD-SYMBOLS: <fs_itab> TYPE STANDARD TABLE,
               <fs_wa>   TYPE any.

************************************************************************
* 常量定义                                                             *
************************************************************************
DATA con_object LIKE arch_obj-object VALUE 'ZTABLE'.

************************************************************************
* 选择屏幕参数                                                         *
************************************************************************
*PARAMETERS: P_TAB LIKE DD03L-TABNAME MEMORY ID TABNAME OBLIGATORY.
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 OBLIGATORY.
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 OBLIGATORY.
SELECT-OPTIONS: s_cv1 FOR gv_string OBLIGATORY.
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 END OF BLOCK b2.

SELECTION-SCREEN BEGIN OF BLOCK blk02 WITH FRAME TITLE mode.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_del AS CHECKBOX DEFAULT 'X'. " 仅在测试模式下删除
SELECTION-SCREEN COMMENT (50) pdel .
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN BEGIN OF LINE.
PARAMETERS:p_prod AS CHECKBOX. " 测试运行=不创建档案文件
SELECTION-SCREEN COMMENT (50) pprod.
SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK blk02.

* 3. archiving run memo
SELECTION-SCREEN BEGIN OF LINE.
SELECTION-SCREEN COMMENT (30) pcomment.
PARAMETERS: p_coment TYPE admi_run-comments.
SELECTION-SCREEN END OF LINE.
******************************************************************

*----------------------------------------------------------------------
* initialisation
*----------------------------------------------------------------------
INITIALIZATION.
  tblock1  = 'Table Name(Optional)'.
  tabname  = 'Table Name'.
  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'.
  mode     = 'Mode'.
  pdel     = 'Call delete program in Test mode'."仅在测试模式下删除
  pprod    = 'Productive mode : Create archive file'."
  pcomment = 'Archiving Session Note'.
  PERFORM frm_get_tablerul.

AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_tab.
  PERFORM frm_f4_help.

************************************************************************
* at selection screen
************************************************************************
AT SELECTION-SCREEN.
  PERFORM frm_check_input.

************************************************************************
* Event top of page
************************************************************************
TOP-OF-PAGE.

************************************************************************
* event Start of Selection
************************************************************************
START-OF-SELECTION.
  PERFORM frm_prepare_archive.   "  归档写入准备
  PERFORM frm_create_dynamic_table."


* Version 1.1
  PERFORM frm_archive_ztsde007a.  "  取准备归档掉的ztsde007a
  PERFORM frm_archive_multilist.  "  取准备归档掉的多表信息

  include zarchive_write_ztsde007a."特殊逻辑的表ztsde007a归档
  include zarchive_write_multilist."多表联动归档

************************************************************************
*EVENT End-of selection
************************************************************************
END-OF-SELECTION.
  PERFORM frm_archive_ztable.  "  取准备归档掉的Z表数据

************************************************************************
*EVENT  End-of page
************************************************************************
END-OF-PAGE.
************************************************************************

************************************************************************
** forms
************************************************************************

*&---------------------------------------------------------------------*
*&      Form  frm_prepare_archive
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_prepare_archive .
* 归档写入准备
  CALL FUNCTION 'ARCHIVE_OPEN_FOR_WRITE'
    EXPORTING
      call_delete_job_in_test_mode = p_del "
      create_archive_file          = p_prod "
      comments                     = p_coment
      object                       = con_object  " 归档对象名称
    IMPORTING
      archive_handle               = g_archive_handle
    EXCEPTIONS
      internal_error               = 1
      object_not_found             = 2
      open_error                   = 3
      not_authorized               = 4
      OTHERS                       = 5.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

* 获取归档对象的系统配置数据
  CALL FUNCTION 'ARCHIVE_GET_CUSTOMIZING_DATA'
    EXPORTING
      object                      = con_object
    IMPORTING
      commit_count_for_delete_prg = g_commit_count  " 提交数据库事务计数器
      maintain_index              = g_maintain_index  " 是否维护索引
    EXCEPTIONS
      object_not_found            = 1
      OTHERS                      = 2.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.
ENDFORM. " frm_prepare_archive

*&---------------------------------------------------------------------*
*&      Form  FRM_ARCHIVE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_archive .

  CALL FUNCTION 'ARCHIVE_NEW_OBJECT'
    EXPORTING
      archive_handle          = g_archive_handle
    EXCEPTIONS
      internal_error          = 1
      wrong_access_to_archive = 2
      OTHERS                  = 3.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

* 循环内表,插入归档数据
* ARCHIVE_PUT_RECORD用于归单条记录
* ARCHIVE_PUT_TABLE用于归整表记录
  CALL FUNCTION 'ARCHIVE_PUT_TABLE'
    EXPORTING
      archive_handle           = g_archive_handle
      record_flags             = 'X' " 标记该记录是要被删除程序删除的
      record_structure         = p_tab
    TABLES
      table                    = <fs_itab>
*     RECORD_FLAGS_TABLE       =
    EXCEPTIONS
      internal_error           = 1
      wrong_access_to_archive  = 2
      invalid_record_structure = 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.

* 根据归档处理号,保存数据到归档文件
  CALL FUNCTION 'ARCHIVE_SAVE_OBJECT'
    EXPORTING
      archive_handle          = g_archive_handle
* IMPORTING
*     OBJECT_OFFSET           =
*     ARCHIVE_NAME            =
    EXCEPTIONS
      file_io_error           = 1
      internal_error          = 2
      open_error              = 3
      termination_requested   = 4
      wrong_access_to_archive = 5
      OTHERS                  = 6.
  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

ENDFORM. " FRM_ARCHIVE
*&---------------------------------------------------------------------*
*&      Form  frm_archive_ztable
*&---------------------------------------------------------------------*
*       create itab by selection-screen info
*----------------------------------------------------------------------*
FORM frm_archive_ztable .
  DATA: lv_selection TYPE string.
  DATA: lv_condition TYPE string.
  DATA: l_cursor     TYPE cursor.

  CLEAR: lv_selection.

  lv_selection = ' * '.

  IF s_cf1 IS NOT INITIAL.
    IF lv_condition IS INITIAL.
      CONCATENATE lv_condition
                  s_cf1
                  ` IN s_cv1 `                              "#EC NOTEXT
        INTO lv_condition.
    ELSE.
      CONCATENATE lv_condition
                  ` AND `
                  s_cf1
                  ` IN s_cv1 `                              "#EC NOTEXT
        INTO lv_condition.
    ENDIF.
  ENDIF.

  IF s_cf2 IS NOT INITIAL.
    IF lv_condition IS INITIAL.
      CONCATENATE lv_condition
                  s_cf2
                  ` IN s_cv2 `                              "#EC NOTEXT
        INTO lv_condition.
    ELSE.
      CONCATENATE lv_condition
                  ` AND `
                  s_cf2
                  ` IN s_cv2 `                              "#EC NOTEXT
        INTO lv_condition.
    ENDIF.
  ENDIF.

  IF s_cf3 IS NOT INITIAL.
    IF lv_condition IS INITIAL.
      CONCATENATE lv_condition
                  s_cf3
                  ` IN s_cv3 `                              "#EC NOTEXT
        INTO lv_condition.
    ELSE.
      CONCATENATE lv_condition
                  ` AND `
                  s_cf3
                  ` IN s_cv3 `                              "#EC NOTEXT
        INTO lv_condition.
    ENDIF.
  ENDIF.

  IF s_cf4 IS NOT INITIAL.
    IF lv_condition IS INITIAL.
      CONCATENATE lv_condition
                  s_cf4
                  ` IN s_cv4 `                              "#EC NOTEXT
        INTO lv_condition.
    ELSE.
      CONCATENATE lv_condition
                  ` AND `
                  s_cf4
                  ` IN s_cv4 `                              "#EC NOTEXT
        INTO lv_condition.
    ENDIF.
  ENDIF.

  IF s_cf5 IS NOT INITIAL.
    IF lv_condition IS INITIAL.
      CONCATENATE lv_condition
                  s_cf5
                  ` IN s_cv5 `                              "#EC NOTEXT
        INTO lv_condition.
    ELSE.
      CONCATENATE lv_condition
                  ` AND `
                  s_cf5
                  ` IN s_cv5 `                              "#EC NOTEXT
        INTO lv_condition.
    ENDIF.
  ENDIF.

  IF s_cf6 IS NOT INITIAL.
    IF lv_condition IS INITIAL.
      CONCATENATE lv_condition
                  s_cf6
                  ` IN s_cv6 `                              "#EC NOTEXT
        INTO lv_condition.
    ELSE.
      CONCATENATE lv_condition
                  ` AND `
                  s_cf6
                  ` IN s_cv6 `                              "#EC NOTEXT
        INTO lv_condition.
    ENDIF.
  ENDIF.

  OPEN CURSOR WITH HOLD l_cursor FOR
    SELECT (lv_selection)  " all data download into 1 file
      FROM (p_tab)
      WHERE (lv_condition)
      ORDER BY PRIMARY KEY.

  DO.
    FETCH NEXT CURSOR l_cursor
          INTO TABLE <fs_itab>
          PACKAGE SIZE g_commit_count.

    IF sy-subrc = 0.
      PERFORM frm_archive.
      CLEAR:<fs_itab>.
    ELSE.
      " no more data to be archived
      EXIT.
    ENDIF.

  ENDDO.
  CLOSE CURSOR l_cursor.

* 当所有数据都写完后
* a)输出标准的归档信息,从而可在假脱机处查看
  CALL FUNCTION 'ARCHIVE_WRITE_STATISTICS'
    EXPORTING
      archive_handle = g_archive_handle
    EXCEPTIONS
*     internal_error = 1
      OTHERS         = 2.
  IF sy-subrc <> 0.
    PERFORM msg_write_error_with_msg USING 'Archiving statistics write error'.
  ENDIF.

* b)最后关闭并生成归档文件
  CALL FUNCTION 'ARCHIVE_CLOSE_FILE'
    EXPORTING
      archive_handle          = g_archive_handle
    EXCEPTIONS
      internal_error          = 1
      wrong_access_to_archive = 2
      OTHERS                  = 3.
  IF sy-subrc <> 0.
    PERFORM msg_write_error_with_msg USING 'Archive write error'.
  ENDIF.

ENDFORM.

FORM msg_write_error_with_msg
  USING txt TYPE c.

  DATA:
    len        TYPE i,
    flg_msg(1) TYPE c,
    buf(200)   TYPE c.

  IF sy-msgid <> space AND
     sy-msgty <> space AND
     sy-msgno <> space.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
            INTO buf.
    flg_msg = 'X'.
  ELSE.
    flg_msg = space.
  ENDIF.
  mac_format_error.
  len = strlen( txt ).
  WRITE: / txt(len).
  IF flg_msg = 'X'.
    len = strlen( buf ).
    WRITE: / buf(len).
  ENDIF.
  mac_format_normal.
ENDFORM.
*&---------------------------------------------------------------------*
*&      Form  FRM_CREATE_DYNAMIC_TABLE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_create_dynamic_table .

  CREATE DATA gt_dyn_itab TYPE TABLE OF (p_tab).
  ASSIGN gt_dyn_itab->* TO <fs_itab>.

  CREATE DATA gs_wa TYPE (p_tab).
  ASSIGN gs_wa->* TO <fs_wa>.

ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_GET_TABLERUL
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_get_tablerul .

  SELECT *
    INTO TABLE gt_tabrule
    FROM zdvm_clearrule
    WHERE type = 'A'.
  IF sy-subrc <> 0.
    MESSAGE s000(zsd_001) WITH text-m01.
    LEAVE LIST-PROCESSING.
  ENDIF.
  SORT gt_tabrule BY tabname fieldname.

ENDFORM. " FRM_GET_TABLERUL


*&---------------------------------------------------------------------*
*&      Form  FRM_F4_HELP
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_f4_help .
  DATA: lt_tab     TYPE TABLE OF ty_tab,
        ls_tab     TYPE ty_tab,
        lt_return  TYPE TABLE OF ddshretval,
        ls_return  TYPE ddshretval,
        lv_tabname TYPE zdvm_clearrule-tabname.

  SORT gt_tabrule BY tabname fieldname.

  IF gt_tabrule IS NOT INITIAL.
    LOOP AT gt_tabrule INTO gs_tabrule.
      ls_tab-tabname = gs_tabrule-tabname.
      APPEND ls_tab TO lt_tab.
    ENDLOOP.

    SORT lt_tab.
    DELETE ADJACENT DUPLICATES FROM lt_tab.

    CALL FUNCTION 'F4IF_INT_TABLE_VALUE_REQUEST'
      EXPORTING
        retfield        = 'TABNAME'
        dynpprog        = sy-repid
        dynpnr          = sy-dynnr
        dynprofield     = 'P_TAB'
        value_org       = 'S'
      TABLES
        value_tab       = lt_tab
        return_tab      = lt_return
      EXCEPTIONS
        parameter_error = 1
        no_values_found = 2
        OTHERS          = 3.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

  ELSE.

    MESSAGE s000(zsd_001) WITH text-m01.
    LEAVE LIST-PROCESSING.

  ENDIF.
ENDFORM. " FRM_F4_HELP
*&---------------------------------------------------------------------*
*&      Form  FRM_CHECK_INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_check_input .
  DATA: lv_message TYPE char50,
        lv_string  TYPE string.

  SORT gt_tabrule BY tabname.
  READ TABLE gt_tabrule INTO gs_tabrule WITH KEY tabname = p_tab BINARY SEARCH.
  IF sy-subrc = 0 .
    IF  p_tab+0(1) <> 'Z'.
      CONCATENATE text-m08 p_tab text-m10
            INTO lv_message SEPARATED BY space.
      MESSAGE e000(zsd_001) WITH lv_message.
    ENDIF.

    IF gs_tabrule-type = 'A'.
    ELSE.
      CONCATENATE text-m08 p_tab text-m11
            INTO lv_message SEPARATED BY space.
      MESSAGE e000(zsd_001) WITH lv_message.
    ENDIF.
  ELSE.
    CONCATENATE text-m08 p_tab text-m09
          INTO lv_message SEPARATED BY space.
    MESSAGE e000(zsd_001) WITH lv_message.
  ENDIF.

  SORT gt_tabrule BY tabname fieldname.
  DEFINE mac_check_fieldlist.
    IF &1 IS NOT INITIAL.
      READ TABLE  gt_tabrule INTO gs_tabrule WITH KEY tabname   = p_tab
                                                      fieldname = &1 BINARY SEARCH.
      IF sy-subrc <> 0.
        lv_string = &1.
        CONDENSE lv_string.
        CONCATENATE &2 lv_string text-m04 p_tab
              INTO lv_message SEPARATED BY space.
        MESSAGE e000(zsd_001) WITH lv_message.
      ENDIF.
    ENDIF.
  END-OF-DEFINITION.

  mac_check_fieldlist:s_cf1 scf1,
                      s_cf2 scf2,
                      s_cf3 scf3,
                      s_cf4 scf4,
                      s_cf5 scf5,
                      s_cf6 scf6.

ENDFORM.

*Text elements
*----------------------------------------------------------
* M01 Please Maintain in Table ZDVM_CLEARRULE with Type A(Archive)!
* M02 Please input
* M03 value!
* M04 not exist in table
* M06 Table
* M07 not exist in system!
* M08 Table
* M09 not exist in table ZDVM_CLEARRULE with Type A(Archive)!
* M10 is not Z table!
* M11 is not Header Table!


*Messages
*----------------------------------------------------------
*
* Message class: ZSD_001
*000   &1&2&3&4
Extracted by Mass Download version 1.5.0 - E.G.Mellodew. 1998-2017. Sap Release 740

以下代码针对多表(抬头表+行项目+日志表等)联动归档;

Code listing for: ZARCHIVE_WRITE_MULTILIST

Description: Include ZARCHIVE_WRITE_MULTILIST

*&---------------------------------------------------------------------*
*&  Include           ZARCHIVE_WRITE_MULTILIST
*&---------------------------------------------------------------------*

*&---------------------------------------------------------------------*
*&      Form  frm_archive_MULTILIST
*&---------------------------------------------------------------------*
*       create itab by selection-screen info
*----------------------------------------------------------------------*
FORM frm_archive_multilist .
  DATA: lv_selection TYPE string.
  DATA: lv_condition TYPE string.
  DATA: lv_answer.
  DATA: l_cursor     TYPE cursor.
  DATA: lt_tabrule   TYPE TABLE OF zdvm_clearrule WITH HEADER LINE,
        lw_tabrule TYPE zdvm_clearrule.

  CHECK p_tab <> 'ZTSDE007A'.
  SELECT *
    INTO TABLE lt_tabrule
    FROM zdvm_clearrule
    WHERE type IN ('I','L')
      AND header = p_tab.
  CASE sy-dbcnt.
    WHEN 0.
      CHECK 0 = 1.
    WHEN 1.
      READ TABLE lt_tabrule INTO lw_tabrule INDEX 1.
      CONCATENATE 'Table'
                  p_tab
                  'has item table:'
                  lw_tabrule-tabname
                  ', Continue?'
                  INTO lv_selection SEPARATED BY space.
    WHEN OTHERS.

      LOOP AT lt_tabrule.
        lw_tabrule = lt_tabrule.
        AT FIRST.
          CONCATENATE 'Table'
                      p_tab
                      'has item/log table:'
                      lw_tabrule-tabname
                      INTO lv_selection SEPARATED BY space.
          CONTINUE.
        ENDAT.

        CONCATENATE lv_selection
                    '/'
                    lw_tabrule-tabname
                    INTO lv_selection.

        AT LAST.
          CONCATENATE lv_selection
                      ', Continue?'
                      INTO lv_selection.
        ENDAT.
      ENDLOOP.
  ENDCASE.

* popup item table info
  CALL FUNCTION 'POPUP_TO_CONFIRM'
    EXPORTING
      text_question = lv_selection
    IMPORTING
      answer        = lv_answer.
  IF lv_answer <> '1'.
    LEAVE LIST-PROCESSING.
  ENDIF.

  CLEAR:lv_selection.
  lv_selection = ' * '.

  IF s_cf1 IS NOT INITIAL.
    IF lv_condition IS INITIAL.
      CONCATENATE lv_condition
                  s_cf1
                  ` IN s_cv1 `                              "#EC NOTEXT
        INTO lv_condition.
    ELSE.
      CONCATENATE lv_condition
                  ` AND `
                  s_cf1
                  ` IN s_cv1 `                              "#EC NOTEXT
        INTO lv_condition.
    ENDIF.
  ENDIF.

  IF s_cf2 IS NOT INITIAL.
    IF lv_condition IS INITIAL.
      CONCATENATE lv_condition
                  s_cf2
                  ` IN s_cv2 `                              "#EC NOTEXT
        INTO lv_condition.
    ELSE.
      CONCATENATE lv_condition
                  ` AND `
                  s_cf2
                  ` IN s_cv2 `                              "#EC NOTEXT
        INTO lv_condition.
    ENDIF.
  ENDIF.

  IF s_cf3 IS NOT INITIAL.
    IF lv_condition IS INITIAL.
      CONCATENATE lv_condition
                  s_cf3
                  ` IN s_cv3 `                              "#EC NOTEXT
        INTO lv_condition.
    ELSE.
      CONCATENATE lv_condition
                  ` AND `
                  s_cf3
                  ` IN s_cv3 `                              "#EC NOTEXT
        INTO lv_condition.
    ENDIF.
  ENDIF.

  IF s_cf4 IS NOT INITIAL.
    IF lv_condition IS INITIAL.
      CONCATENATE lv_condition
                  s_cf4
                  ` IN s_cv4 `                              "#EC NOTEXT
        INTO lv_condition.
    ELSE.
      CONCATENATE lv_condition
                  ` AND `
                  s_cf4
                  ` IN s_cv4 `                              "#EC NOTEXT
        INTO lv_condition.
    ENDIF.
  ENDIF.

  IF s_cf5 IS NOT INITIAL.
    IF lv_condition IS INITIAL.
      CONCATENATE lv_condition
                  s_cf5
                  ` IN s_cv5 `                              "#EC NOTEXT
        INTO lv_condition.
    ELSE.
      CONCATENATE lv_condition
                  ` AND `
                  s_cf5
                  ` IN s_cv5 `                              "#EC NOTEXT
        INTO lv_condition.
    ENDIF.
  ENDIF.

  IF s_cf6 IS NOT INITIAL.
    IF lv_condition IS INITIAL.
      CONCATENATE lv_condition
                  s_cf6
                  ` IN s_cv6 `                              "#EC NOTEXT
        INTO lv_condition.
    ELSE.
      CONCATENATE lv_condition
                  ` AND `
                  s_cf6
                  ` IN s_cv6 `                              "#EC NOTEXT
        INTO lv_condition.
    ENDIF.
  ENDIF.

  OPEN CURSOR WITH HOLD l_cursor FOR
    SELECT (lv_selection)  " all data download into 1 file
      FROM (p_tab)
      WHERE (lv_condition)
      ORDER BY PRIMARY KEY.

  g_commit_count = gs_tabrule-commitsize.

  DO.
    FETCH NEXT CURSOR l_cursor
          INTO TABLE <fs_itab>
          PACKAGE SIZE g_commit_count.

    IF sy-subrc = 0.
* 取item表信息归档
      PERFORM frm_archive_item TABLES lt_tabrule[].
      CLEAR:<fs_itab>.
    ELSE.
      " no more data to be archived
      EXIT.
    ENDIF.

  ENDDO.
  CLOSE CURSOR l_cursor.

* 当所有数据都写完后
* a)输出标准的归档信息,从而可在假脱机处查看
  CALL FUNCTION 'ARCHIVE_WRITE_STATISTICS'
    EXPORTING
      archive_handle = g_archive_handle
    EXCEPTIONS
*     internal_error = 1
      OTHERS         = 2.
  IF sy-subrc <> 0.
    PERFORM msg_write_error_with_msg USING 'Archiving statistics write error'.
  ENDIF.

* b)最后关闭并生成归档文件
  CALL FUNCTION 'ARCHIVE_CLOSE_FILE'
    EXPORTING
      archive_handle          = g_archive_handle
    EXCEPTIONS
      internal_error          = 1
      wrong_access_to_archive = 2
      OTHERS                  = 3.
  IF sy-subrc <> 0.
    PERFORM msg_write_error_with_msg USING 'Archive write error'.
  ENDIF.

  LEAVE LIST-PROCESSING.
ENDFORM.

*&---------------------------------------------------------------------*
*&      Form  FRM_ARCHIVE_ITEM
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM frm_archive_item TABLES pt_tabrule STRUCTURE zdvm_clearrule.

  DATA:lr_item    TYPE REF TO data,
       lw_tabrule TYPE zdvm_clearrule,
       lt_cond    TYPE TABLE OF ty_cond,
       ls_cond    TYPE ty_cond.
  FIELD-SYMBOLS:<fs_item> TYPE STANDARD TABLE.

  SORT:pt_tabrule BY tabname fieldname.
  LOOP AT <fs_itab> ASSIGNING <fs_wa>.
    CALL FUNCTION 'ARCHIVE_NEW_OBJECT'
      EXPORTING
        archive_handle          = g_archive_handle
      EXCEPTIONS
        internal_error          = 1
        wrong_access_to_archive = 2
        OTHERS                  = 3.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.

* 循环内表,插入归档数据
    CALL FUNCTION 'ARCHIVE_PUT_RECORD' "用于归单条记录
      EXPORTING
        archive_handle           = g_archive_handle
        record                   = <fs_wa>
        record_flags             = 'X' " 标记该记录是要被删除程序删除的
        record_structure         = p_tab
      EXCEPTIONS
        internal_error           = 1
        wrong_access_to_archive  = 2
        invalid_record_structure = 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 pt_tabrule.
      lw_tabrule = pt_tabrule.

      CLEAR:ls_cond.
      IF lt_cond IS NOT INITIAL.
        CONCATENATE 'AND' ls_cond INTO ls_cond RESPECTING BLANKS.
      ENDIF.

      CONCATENATE lw_tabrule-fieldname '= <FS_WA>-' lw_tabrule-fname_h INTO ls_cond RESPECTING BLANKS.
      APPEND ls_cond TO lt_cond.

      AT END OF tabname.
        CREATE DATA lr_item TYPE TABLE OF (lw_tabrule-tabname).
        ASSIGN lr_item->* TO <fs_item>.

        SELECT *
          INTO TABLE <fs_item>
          FROM (pt_tabrule-tabname)
          WHERE (lt_cond).
        IF sy-subrc = 0.
          CALL FUNCTION 'ARCHIVE_PUT_TABLE' "用于归整表记录
            EXPORTING
              archive_handle           = g_archive_handle
              record_flags             = 'X' " 标记该记录是要被删除程序删除的
              record_structure         = pt_tabrule-tabname
            TABLES
              table                    = <fs_item>
*             RECORD_FLAGS_TABLE       =
            EXCEPTIONS
              internal_error           = 1
              wrong_access_to_archive  = 2
              invalid_record_structure = 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.
        ENDIF.

        CLEAR:lt_cond.
      ENDAT.

    ENDLOOP.

* 根据归档处理号,保存数据到归档文件
    CALL FUNCTION 'ARCHIVE_SAVE_OBJECT'
      EXPORTING
        archive_handle          = g_archive_handle
* IMPORTING
*       OBJECT_OFFSET           =
*       ARCHIVE_NAME            =
      EXCEPTIONS
        file_io_error           = 1
        internal_error          = 2
        open_error              = 3
        termination_requested   = 4
        wrong_access_to_archive = 5
        OTHERS                  = 6.
    IF sy-subrc <> 0.
      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
              WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
    ENDIF.
  ENDLOOP.

ENDFORM.
Extracted by Mass Download version 1.5.0 - E.G.Mellodew. 1998-2017. Sap Release 740

0 0