abap 指定长度服务器上传数据,ABAP 动态备份自建表数据到新表(自建表有数据的情况下要改字段长度或者其他)...

当abaper开发好一个程序给用户使用一段时间后,发现某个字段的长度需要修改,但数据库表中已经存在很多数据,冒然直接改表字段可能会导致数据丢失,这种问题的后果可能非常严重。

所以我想到先复制出一个新表,在新表里改好字段长度,然后把旧表的数据插入到新表,这一步就是备份数据,再修改旧表的字段长度,如果旧表数据丢失,可以立马把新表的数据复制回旧表,这样就可以解决一些不能预见的的问题。

步骤:

1.第一步就是复制一个新表出来,改好字段。

2.创建一个程序,以下程序需要输入两个表名,一个旧表一个新表,不多说,上代码。

*&---------------------------------------------------------------------*

*& Report ZP_COPY_DATA

*&---------------------------------------------------------------------*

*& 程序功能:动态备份表数据至新表

*&---------------------------------------------------------------------*

REPORT zp_copy_data.

FIELD-SYMBOLS: TYPE table,

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 .

*****动态创建新内表******

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 .

*****把旧表数据拷贝到内表

SELECT * FROM (old_tab) INTO CORRESPONDING FIELDS OF TABLE .

*****内表数据插入到新表

IF lines( ) > 0.

MOVE-CORRESPONDING TO .

CHECK lines( ) > 0.

INSERT (new_tab) FROM TABLE .

IF sy-subrc = 0.

COMMIT WORK.

MESSAGE '备份成功' TYPE 'S'.

ELSE.

ROLLBACK WORK.

MESSAGE '备份失败' TYPE 'S' DISPLAY LIKE 'E'.

ENDIF.

ENDIF.

3.界面的效果做的比较简单,点击按钮后旧表数据自动备份到新表。

5.其实解决的方法有很多,新建一个表只是比较安全,如果各位有更好的方法可以一起交流。

作者:明光烁亮

出处:http://www.cnblogs.com/hezhongxun/

微信号:HEme922 欢迎加好友一起交流SAP! 视频资料共享。

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值