當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! 視訊資料共享。
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段宣告,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。