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

相关文章
相关标签/搜索