等待BAPI完成:正在开始新的任务选项吗?

时间:2014-12-08 13:54:47

标签: abap

我处理一个非常常见的问题。考虑一下代码:

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 ... SECONDSSELECT / {{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是最推荐的选项?

谢谢。

0 个答案:

没有答案