作者:明光爍亮
出處:http://www.cnblogs.com/hezhongxun/
微信號:HEme922 歡迎加好友一起交流SAP! 視頻資料共享。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
當abaper開發好一個程序給用戶使用一段時間后,發現某個字段的長度需要修改,但數據庫表中已經存在很多數據,冒然直接改表字段可能會導致數據丟失,這種問題的后果可能非常嚴重。
所以我想到先復制出一個新表,在新表里改好字段長度,然后把舊表的數據插入到新表,這一步就是備份數據,再修改舊表的字段長度,如果舊表數據丟失,可以立馬把新表的數據復制回舊表,這樣就可以解決一些不能預見的的問題。
步驟:
1.第一步就是復制一個新表出來,改好字段。
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.界面的效果做的比較簡單,點擊按鈕后舊表數據自動備份到新表。
3.1還原的就是舊表就填新的表名,新表填舊的表名即可。

5.其實解決的方法有很多,新建一個表只是比較安全,如果各位有更好的方法可以一起交流。
6.有一個地方要注意的是,程序和修改表需要放在不同的請求,先釋放程序備份好數據后,再傳修改表的請求。家里有礦的可以無視。嘻嘻!
作者:明光爍亮
出處:http://www.cnblogs.com/hezhongxun/
微信號:HEme922 歡迎加好友一起交流SAP! 視頻資料共享。
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
