ABAP 動態備份自建表數據到新表(自建表有數據的狀況下要改字段長度或者其餘)

當abaper開發好一個程序給用戶使用一段時間後,發現某個字段的長度須要修改,但數據庫表中已經存在不少數據,冒然直接改表字段可能會致使數據丟失,這種問題的後果可能很是嚴重。數據庫

因此我想到先複製出一個新表,在新表裏改好字段長度,而後把舊錶的數據插入到新表,這一步就是備份數據,再修改舊錶的字段長度,若是舊錶數據丟失,能夠立馬把新表的數據複製回舊錶,這樣就能夠解決一些不能預見的的問題。安全

步驟:微信

1.第一步就是複製一個新表出來,改好字段。spa

2.建立一個程序,如下程序須要輸入兩個表名,一箇舊表一個新表,很少說,上代碼。視頻

*&---------------------------------------------------------------------*
*& Report ZP_COPY_DATA
*&---------------------------------------------------------------------*
*& 程序功能:動態備份表數據至新表
*&---------------------------------------------------------------------*
REPORT zp_copy_data.

FIELD-SYMBOLS: <fs_old> TYPE table,
               <fs_new> TYPE table.

DATA: dyn_table_old TYPE REF TO data,
      dyn_table_new TYPE REF TO data.

DATA: structure_name TYPE dd02l-tabname,
      ls_fieldcat    TYPE lvc_s_fcat,
      gt_fieldcat    TYPE lvc_t_fcat.

*&---------------------------------------------------------------------*
*& Selection Screen.
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001.
PARAMETERS: old_tab TYPE char16 OBLIGATORY.
SELECTION-SCREEN SKIP 1.
PARAMETERS: new_tab TYPE char16 OBLIGATORY.
SELECTION-SCREEN END OF BLOCK b1.


*&---------------------------------------------------------------------*
*& START-OF-SELECTION.
*&---------------------------------------------------------------------*
START-OF-SELECTION.
  IF old_tab+0(1) <> 'Z' OR new_tab+0(1) <> 'Z'.
    MESSAGE '請輸入自建表名' TYPE 'S' DISPLAY LIKE 'E'.
    EXIT.
  ENDIF.

*****動態建立舊內表********
  structure_name = old_tab.

  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name = structure_name
    CHANGING
      ct_fieldcat      = gt_fieldcat.

  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = gt_fieldcat
    IMPORTING
      ep_table        = dyn_table_old.

  ASSIGN dyn_table_old->* TO <fs_old>.

*****動態建立新內表******
  structure_name = new_tab.

  REFRESH gt_fieldcat.

  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_structure_name = structure_name
    CHANGING
      ct_fieldcat      = gt_fieldcat.

  CALL METHOD cl_alv_table_create=>create_dynamic_table
    EXPORTING
      it_fieldcatalog = gt_fieldcat
    IMPORTING
      ep_table        = dyn_table_new.

  ASSIGN dyn_table_new->* TO <fs_new>.

*****把舊錶數據拷貝到內表
  SELECT * FROM (old_tab) INTO CORRESPONDING FIELDS OF TABLE <fs_old>.

*****內表數據插入到新表
  IF lines( <fs_old> ) > 0.
    MOVE-CORRESPONDING <fs_old> TO <fs_new>.
    CHECK lines( <fs_new> ) > 0.
    INSERT (new_tab) FROM TABLE <fs_new>.
    IF sy-subrc = 0.
      COMMIT WORK.
      MESSAGE '備份成功' TYPE 'S'.
    ELSE.
      ROLLBACK WORK.
      MESSAGE '備份失敗' TYPE 'S' DISPLAY LIKE 'E'.
    ENDIF.
  ENDIF.

  

3.界面的效果作的比較簡單,點擊按鈕後舊錶數據自動備份到新表。blog

3.1還原的就是舊錶就填新的表名,新表填舊的表名便可。開發

 

5.其實解決的方法有不少,新建一個表只是比較安全,若是各位有更好的方法能夠一塊兒交流。get

6.有一個地方要注意的是,程序和修改表須要放在不一樣的請求,先釋放程序備份好數據後,再傳修改表的請求。家裏有礦的能夠無視。嘻嘻!博客

 

 

 

做者:明光爍亮
出處:http://www.cnblogs.com/hezhongxun/
微信號:HEme922 歡迎加好友一塊兒交流SAP! 視頻資料共享。
本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利。it

相關文章
相關標籤/搜索