我处理一个非常常见的问题。考虑一下代码:
CALL FUNCTION 'BAPI_CREATE_SOMETHING' ... .
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTNG WAIT = 'X'.
CALL FUNCTION 'BAPI_CHANGE_SOMETHING' ... .
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTNG WAIT = 'X'.
这里我使用BAPI创建一些对象,并在创建后立即对其进行一些更改。问题是当BAPI_TRANSACTION_COMMIT
返回时,对象可能仍会被锁定一段时间,因此BAPI_CHANGE_SOMETHING
将失败。
我到目前为止看到的最推荐的选项是在第一次提交后立即进行循环,检查对象是否被锁定(WAIT UP TO ... SECONDS
和SELECT
/ {{1} })。
然而,还有一个建议:将对象创建代码包装到FM中并使用ENQUEUE
添加进行调用。所以,整件事情看起来像这样:
STARTING NEW TASK
重点是当异步函数调用完成时,它保证所有更改都已提交并且所有锁都被释放。但是,我还没有找到任何证明,所以我的问题是:这是否有意义,或FUNCTION 'Z_CREATE_SMTH'.
CALL FUNCTION 'BAPI_CREATE_SOMETHING' ... .
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTNG WAIT = 'X'.
ENDFUNCTION.
...
CALL FUNCTION 'Z_CREATE_SMTH' STARTING NEW TASK 'TSK' DESTINATION 'NONE'
PERFORMING on_done ON END OF TASK.
WAIT UNITL lv_done = abap_true.
CALL FUNCTION 'BAPI_CHANGE_SOMETHING' ... .
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTNG WAIT = 'X'.
...
FORM on_done USING p_task.
lv_done = abap_true.
...
ENDFORM.
+ WAIT
是最推荐的选项?
谢谢。