Abap 等待BAPI完成:是否可以启动新任务?

Abap 等待BAPI完成:是否可以启动新任务?,abap,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'. 在这里,我使用BA

我正在处理一个相当普遍的问题。考虑代码:

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\u TRANSACTION\u COMMIT
返回时,对象可能仍会被锁定一段时间,因此
BAPI\u CHANGE\u SOMETHING
将失败

到目前为止,我所看到的最推荐的选项是在第一次提交之后放置一个循环,该循环将检查对象是否已锁定(
最多等待…秒
以及
选择
/
排队

不过,还有一个建议:将对象创建代码包装到FM中,并使用
开始新任务
添加来调用它。所以,整个事情看起来是这样的:

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.
主要的一点是,当异步函数调用完成时,可以保证提交所有更改并释放所有锁。然而,我还没有找到任何证据,所以我的问题是:这有意义吗,或者
等待
+
排队
是最推荐的选择


谢谢。

您可能还想看看
设置本地更新任务
。因此,我只需运行
设置本地更新任务
,将所有更新打包到FMs中,并通过
调用功能调用这些FMs。。。在更新任务中
?就这样?这看起来很简单,为什么人们要为循环和等待而烦恼呢?如果它是那么简单,我会从中找到答案的。遗憾的是,事实并非如此。我只是想确保您也知道这一点。好的,据我所知,通常BAPI更新在单独的进程(更新任务)中运行,这可能与我的程序工作进程不同步。也就是说,当
BAPI\u TRANSACTION\u COMMIT
返回时,这并不保证所有更改都已提交给数据库。使用
SET UPDATE TASK LOCAL
时,所有更新都在程序工作过程中执行,因此不应存在同步问题。有什么问题吗?