问题
接口更新表或者BDC我提交更新不成功,偶尔掉了数据。自己比对数据无误,确认不是程序逻辑问题(大部分丢数据是程序代码问题)。我们该如何处理呢。
解决方案
1.记录更新前和更新后的数据,方便查找丢数据的位置。
2.更新不成功应该直接报错出来。
3.commit work之后等个0.01秒,查询一下底表的数据。
4.在一秒钟之内循环做更新提交的动作,降低丢数据的概率。
示例代码
"之前更新日志,或者返回接口消息"
DATA:ls_sflight TYPE sflight."航班表工作区"
DATA:lv_message TYPE string.
"1秒中执行重复动作"
GET TIME.
DATA(t1) = sy-timlo.
WHILE 1 = 1.
"执行 BDC BAPI 或者更新数据库的操作.此处只是作为示例。"
ls_sflight-carrid = 'CN'.
ls_sflight-connid = '1'.
ls_sflight-fldate = sy-datum.
MODIFY sflight FROM ls_sflight.
CLEAR:ls_sflight.
COMMIT WORK.
WAIT UP TO '0.01' SECONDS.
"查询数据库数据是否成功"
SELECT SINGLE *
FROM sflight
WHERE carrid = 'CN'
AND connid = '1'
AND fldate = @sy-datum
INTO @DATA(ls_sql).
IF sy-subrc = 0.
lv_message = '成功更新'.
EXIT.
ELSE.
lv_message = '更新失败'.
ENDIF.
"超过一秒,无论成功与否都会退出"
GET TIME.
DATA(t2) = sy-timlo.
IF t2 - t1 > 1."判断是否超过1秒
EXIT.
ENDIF.
ENDWHILE.
"之后更新日志,或者返回接口消息
w
WRITE:lv_message.
示例代码,是以更新航班表为例子,在一秒钟之内重复更新这条数据,成功更新,则退出。失败则继续更新,直到时间超过一秒,强制退出WHILE 1 = 1的死循环。
总结
提交更新丢数据百分之90%是代码逻辑问题,你需要仔细debug找代码的问题。如果实在找不到,才需要使用这个解决方案,不过它只能降低你丢数据的概率,不能彻底解决你丢数据的问题。
分享使我快乐,我是寒武青锋,大家记得点赞再走咯~