zoukankan      html  css  js  c++  java
  • ABAP 动态备份自建表数据到新表(自建表有数据的情况下要改字段长度或者其他)

    当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! 视频资料共享。
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    简介&目录
    Lucas 定理
    扩展欧几里得算法(exgcd)
    【做题记录】CF23B Party
    【做题记录】CF1375D Replace by MEX
    【做题记录】CF194B Square
    SPFA
    dijkstra
    CSP-J&S 2020 游记
    中国剩余定理(CRT)
  • 原文地址:https://www.cnblogs.com/hezhongxun/p/13413730.html
Copyright © 2011-2022 走看看