在做项目时有时需要对标准表做增强,增加字段,但是如果增加的字段太长了想要改小,这时sap中SE11是不能直接激活的,需要SE14调整表才能改小,但是使用SE14风险太大了,稍微不注意就会导致被调整的表数据丢失。
以VBAP表为例,SE14调整表的逻辑是把数据先复制到临时表QCMVBAP,然后将VBAP整个干掉,然后把新的表结构给VBAP,然后把临时表数据给新的VBAP
所以千万注意注意,一定不要看着调整很久没有反应就自己强行断掉程序,这时基本都是在复制数据,你如果强行断掉了程序,那数据可不就是没有了嘛,如果运气好的话可能临时表QCMVBAP还有数据,那还有机会恢复
恢复代码如下,网上有个恢复MARC表的程序,但是在数据量大的情况下基本都会出现资源瓶颈,这里对那段代码做了优化,防止资源瓶颈
*&---------------------------------------------------------------------*
*& Report ZWEBAPI_TEST
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zwebapi_test NO STANDARD PAGE HEADING .
TABLES vbap .
DATA : itab TYPE TABLE OF vbap WITH HEADER LINE .
START-OF-SELECTION .
DATA: LV_VBELN TYPE VBAP-VBELN ,LV_POSNR TYPE VBAP-POSNR.
LV_VBELN = '9999999999'.
LV_POSNR = '9999'.
DATA: LV_FLAG(1).
CLEAR: LV_FLAG.
WHILE LV_FLAG <> 'X'.
EXEC SQL PERFORMING APPENDITAB .
SELECT TOP 100000 * INTO :ITAB FROM QCMVBAP WHERE VBELN < :LV_VBELN OR (VBELN = :LV_VBELN AND POSNR < :LV_POSNR) ORDER BY VBELN DESC , POSNR DESC
ENDEXEC .
DESCRIBE TABLE ITAB LINES DATA(LV_LINES).
IF LV_LINES < 100000.
LV_FLAG = 'X'.
ENDIF.
READ TABLE ITAB INTO DATA(LS_ITAB) INDEX LV_LINES.
LV_VBELN = LS_ITAB-VBELN.
LV_POSNR = LS_ITAB-POSNR.
CLEAR: LS_ITAB.
INSERT VBAP CLIENT SPECIFIED FROM TABLE ITAB .
COMMIT WORK.
REFRESH ITAB.
WRITE SY-DBCNT .
ENDWHILE.
FORM APPENDITAB .
APPEND ITAB TO ITAB .
ENDFORM .
" DATA: BEGIN OF wa,
" VBELN TYPE VBAP-VBELN,
" POSNR TYPE VBAP-POSNR,
" END OF wa.
"
" EXEC SQL.
" SELECT VBELN, POSNR
" INTO :wa
" FROM QCMVBAP
" WHERE mandt = '500' AND
" VBELN = '1000000016'
" ENDEXEC.
"
" IF wa IS NOT INITIAL.
"
" ENDIF.
如果临时表还有数据,运行上面的代码就能找回数据了,这个代码是数据库层面的,是跨client的,但是不跨环境。
数据量大的情况下可能出现time out 的情况,运行程序建议跑后台job。
如果是别的表,代码不适应,大家可以根据逻辑自己做修改。
总之,以后再SE14调整前大家都悠着点把,要我看,改小还不如新增个新字段,干脆就弃用原来的字段就好了。
最后 ,补充一个特别特别重要的问题,在改短字段前,一定要注意表里面的数据没有超长了,保证改短后的字段能存下所有数据,或者事先删除或修改数据,不然调整时必定报错,爆出超长的错,但是表又做不了调整了,数据也删不掉了,最后数据必定丢失,别问我为什么这么清楚,说出来都是泪