BAPI_TRANSACTION_COMMIT问题

2020-09-09 19:36发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


在.net程序中,根据SAP返回的消息,我收到使用BAPI_PO_CREATE1创建的采购订单。 实际上,每次执行时,都会得到一个新的下一个更高的数字PO。 这似乎很好。

另外,在BAPI返回我的.net程序之后,我立即执行BAPI_TRANSACTION_COMMIT。

但是,当我查看SAP时,PO不存在。

BAPI_TRANSACTION_COMMIT中的RETURN结构是初始的。 因此那里没有错误。

对于WAIT = X和BAPI_TRANSACTION_COMMIT中的默认WAIT,我已经尝试了相同的结果。

在该过程中是否有特殊的地方应调用此BAPI_TRANSACTION_COMMIT? 在调用CREATE PO BAPI之后,我立即"假设"是正确的时间和地点。

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


在.net程序中,根据SAP返回的消息,我收到使用BAPI_PO_CREATE1创建的采购订单。 实际上,每次执行时,都会得到一个新的下一个更高的数字PO。 这似乎很好。

另外,在BAPI返回我的.net程序之后,我立即执行BAPI_TRANSACTION_COMMIT。

但是,当我查看SAP时,PO不存在。

BAPI_TRANSACTION_COMMIT中的RETURN结构是初始的。 因此那里没有错误。

对于WAIT = X和BAPI_TRANSACTION_COMMIT中的默认WAIT,我已经尝试了相同的结果。

在该过程中是否有特殊的地方应调用此BAPI_TRANSACTION_COMMIT? 在调用CREATE PO BAPI之后,我立即"假设"是正确的时间和地点。

付费偷看设置
发送
7条回答
小灯塔
1楼 · 2020-09-09 20:14.采纳回答

您好沃德,

如果我正确地提出了您的问题,则需要两个步骤。 首先,您调用bapi PO创建PO,然后

u调用BAPI_TRANSACTION_COMMIT提交工作。

第一步,当调用返回回到.net程序时,sap中的缓冲区数据 刷新后,当您在第二步中调用commit时,缓冲区中没有数据可写入数据库。

如果要实现此功能,则必须编写客户RFC,在该客户RFC中,先调用PO bapi,然后再调用BAPI_TRANSACTION_COMMIT。 现在,请在您的.net程序中调用此RFC。

非常感谢,

Jitendra

能不能别闹
2楼-- · 2020-09-09 20:20

没有来自COMMIT BAPI的返回消息,

落灬小鱼
3楼-- · 2020-09-09 20:20

嗨,

您在bapi'BAPI_PO_CREATE1'的返回表中收到什么消息?

检查导入参数'TESTRUN',此参数必须为空才能创建PO。

问候

Vijaymadhur。

四川大学会员
4楼-- · 2020-09-09 20:05
All, 感谢大家的答复。 但是我能够找到解决方案。 解决方案是将BAPI_PO_CREATE1函数对象包装到一个Transaction对象中,然后在调用BAPI创建PO后提交事务。 我最终没有调用Commit BAPI(至少没有明确地)。 C#代码段如下: ........... RfcTransaction transaction = new RfcTransaction(); //创建交易对象 transaction.AddFunction(function); //将BAPI_PO_CREATE添加到交易对象 ........... RfcSessionManager.BeginContext(destination); //开始交易 function.Invoke(目的地); //致电BAPI_PO_CREATE transaction.Commit(目的地); //交易对象 RfcSessionManager.EndContext(destination); //结束交易 ........
半个程序猿
5楼-- · 2020-09-09 20:08

嗨沃德尔,

从我使用外部调用到需要提交的BAPI的经验来看,这是我设法解决该问题的方法:

  1. 我创建了原始BAPI的Z副本;
  2. Z_BAPI最后调用原始的BAPI和BAPI_TRANSACTON_COMMIT;

就是这样! 当然,我对这种解决方案并不感到骄傲,但它确实有效。 另一个解决方案是使用原始BAPI的隐式增强点(最后)并测试会话参数(用户,用户类型等),以便决定是否调用BAPI_TRANSACTON_COMMIT-它也可以工作!

此致

João

hengyuye
6楼-- · 2020-09-09 20:02

使用RfcTransaction意味着它将作为异步请求执行,并且应用程序将不会获得响应参数。 因此,如果需要同步处理,则唯一有效的方法是使用RfcSessionManager.BeginContext/JCoContext.begin启动有状态序列,在该状态序列中调用BAPI和BAPI_TRANSACTION_COMMIT。 因此,您没错,但我没有考虑使用RfcSessionManager.EndContext/JCoContext.end,因为如果不使用它们,则会将后端资源的释放延迟到会话在连接器端完成的时间点, 释放与此会话关联的所有打开的连接。 好的编码风格将尽早释放资源。

最好的问候,
Markus

愤怒的猪头君
7楼-- · 2020-09-09 20:21

使用内置提交创建自定义RFC并不是正确的方法 问题:您正在进行服务器端ABAP更改,而C#客户端需要在与提交调用相同的上下文中调用有状态BAPI RFC,以便SAP能够理解正确的LUW来完成。 通常,客户端程序员没有开发人员访问SAP服务器的权限即可更改或添加RFC。 问题在于,默认情况下,连接是无状态的,BAPI RFC永远不会与提交匹配,反之亦然。 提交将返回虚拟成功,该成功仅表明SAP提交了默认的空事务。 相反,这两个调用需要绑定在一起。 为此使用RfcTransaction对象的方法是正确的。 另一种方法可能是使用BeginContext将上下文固定在RfcDestination上,然后调用BAPI RFC,然后显式调用BAPI COMMIT,然后可选地调用EndContext(将在不影响JCo/Nco的情况下工作,但对JCo/Nco更好,以允许清理其保留的上下文 的轨迹。

Markus Tolksdorf 我说对了吗?

一周热门 更多>