从BAPI_BILLINGDOC_CREATEMULTIPLE返回的错误消息反映在BAPI_SALESORDER_CHANGE中。

2020-08-26 18:31发布

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

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


尊敬的专家,

美好的一天!

我们有一个用于豁免批准流程的自定义程序,其中有一组带有所需详细信息的SO,授权用户将选择任何SO或选择所有SO进行批准。

选择特定的SO并单击"批准"按钮后,系统将调用以下BAPI:

1。 首先,如果有帐单冻结,系统将触发 BAPI_SALESORDER_CHANGE 释放并返回相应的消息。 并提交(如果成功释放了块),否则将在发生任何错误时回滚

2。 稍后,系统将触发 BAPI_BILLINGDOC_CREATEMULTIPLE 创建帐单。

如果所选SO中的W​​BS存在诸如"超出预算"之类的问题,则BAPI将不会创建账单,但最终会返回适当的消息。 如果成功,那么帐单文档将创建其他回滚。

现在,问题是:

-如果一个SaleOrder在触发BAPI_BILLINGDOC_CREATEMULTIPLE时以任何错误结束,则在回滚后,当系统准备下一个SaleOrder并尝试从BAPI_SALESORDER_CHANGE释放任何块时,它将以相同的错误消息结尾,该错误消息从 BAPI_BILLINGDOC_CREATEMULTIPLE。,即使两个SalesOrder都有不同的WBS。

请提出任何解决方案或其他方法来解决所说明的问题。

下面,我简要地解释了逻辑:

将lt_final_table循环到lw_final_table

调用功能'BAPI_SALESORDER_CHANGE'
导出
salesdocument = -vbeln
order_header_in = lw_bapisdh1
order_header_inx = lw_bapisdh1x
表格
返回= lt。

阅读lt_baprret。

如果msg_type ='E'*错误

调用功能'BAPI_TRANSACTION_ROLLBACK'。

否则。

调用功能'BAPI_TRANSACTION_COMMIT'
导出
等待='X'。

*//第二,调用Bapi来创建帐单

呼叫功能'BAPI_BILLINGDOC_CREATEMULTIPLE'
表格
billingdatain = lt_billingdatain
return = lt_return
成功= lt_成功。

读取lt_return。

如果msg_type ='E'

调用功能'BAPI_TRANSACTION_ROLLBACK'。

否则。

通话功能'BAPI_TRANSACTION_COMMIT'

导出
wait ='X'。

endif。

Endloop。

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

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


尊敬的专家,

美好的一天!

我们有一个用于豁免批准流程的自定义程序,其中有一组带有所需详细信息的SO,授权用户将选择任何SO或选择所有SO进行批准。

选择特定的SO并单击"批准"按钮后,系统将调用以下BAPI:

1。 首先,如果有帐单冻结,系统将触发 BAPI_SALESORDER_CHANGE 释放并返回相应的消息。 并提交(如果成功释放了块),否则将在发生任何错误时回滚

2。 稍后,系统将触发 BAPI_BILLINGDOC_CREATEMULTIPLE 创建帐单。

如果所选SO中的W​​BS存在诸如"超出预算"之类的问题,则BAPI将不会创建账单,但最终会返回适当的消息。 如果成功,那么帐单文档将创建其他回滚。

现在,问题是:

-如果一个SaleOrder在触发BAPI_BILLINGDOC_CREATEMULTIPLE时以任何错误结束,则在回滚后,当系统准备下一个SaleOrder并尝试从BAPI_SALESORDER_CHANGE释放任何块时,它将以相同的错误消息结尾,该错误消息从 BAPI_BILLINGDOC_CREATEMULTIPLE。,即使两个SalesOrder都有不同的WBS。

请提出任何解决方案或其他方法来解决所说明的问题。

下面,我简要地解释了逻辑:

将lt_final_table循环到lw_final_table

调用功能'BAPI_SALESORDER_CHANGE'
导出
salesdocument = -vbeln
order_header_in = lw_bapisdh1
order_header_inx = lw_bapisdh1x
表格
返回= lt。

阅读lt_baprret。

如果msg_type ='E'*错误

调用功能'BAPI_TRANSACTION_ROLLBACK'。

否则。

调用功能'BAPI_TRANSACTION_COMMIT'
导出
等待='X'。

*//第二,调用Bapi来创建帐单

呼叫功能'BAPI_BILLINGDOC_CREATEMULTIPLE'
表格
billingdatain = lt_billingdatain
return = lt_return
成功= lt_成功。

读取lt_return。

如果msg_type ='E'

调用功能'BAPI_TRANSACTION_ROLLBACK'。

否则。

通话功能'BAPI_TRANSACTION_COMMIT'

导出
wait ='X'。

endif。

Endloop。

付费偷看设置
发送
5条回答
能不能别闹
1楼-- · 2020-08-26 18:38

检查是否可以按照OSS注释1784621中的建议进行代码更正

暮风yp
2楼-- · 2020-08-26 18:35

您好,Lakshmipathi Ganesan,

感谢您的回复。但是,由于我们处于升级版SAP_ALL软件组件中,因此该Snote不适用于我们的系统。

如果您有其他建议,...

Baoming ROSE
3楼-- · 2020-08-26 18:45

您是否尝试过调试并查看BAPI调用前后的变量内容?

伪代码而不是真正的伪代码,但要从头开始:在LOOP的开头,清除所有内部表和其他在循环内重复使用的变量。

葫芦娃快救爷爷
4楼-- · 2020-08-26 18:45

Mohammad Ismail -因此,您要说的是这段代码中的内容 在计费BAPI调用中发生错误,循环进入下一个迭代,然后在SO更改BAPI被调用之后,表lt_bapiret包含一些您认为与不同销售订单有关的消息? 假设主表GT_XFINAL具有重复项(这没有意义),我不知道如何发生并且希望看到它相信它。 您如何准确地检查消息以及这些消息是什么? 请发布一些屏幕截图。

一些与代码无关的注释。

  • REFRESH命令已过时,只需使用CLEAR。
  • 在循环中,这没有任何意义 清除变量只是在每次迭代中为其分配一些静态值(这与lw_bapisdh1和lw_bapisdh1sx一起发生)。
  • 通常,有很多不必要的CLEARing正在进行。 这会影响可读性并且令人困惑。 在某些情况下,明确的CLEAR是合理的,但是例如,在这里,为什么需要UNASSIGN? 您刚刚在此处声明了字段符号。
  • 不再建议使用匈牙利表示法(lt _...,ls _...等)。 相反,请使用描述性名称,例如 bapi_messages而不是lt_bapiret。 (实际上,也不需要为BAPI消息声明两个不同的表。)
  • 看来,计费BAPI可以一次处理多个SO,因此我将更新程序以在一个程序中进行所有SO更新。 循环,然后对迄今为止没有错误的SO进行一个计费BAPI调用。 这应该更快,更不容易出错。
  • 不确定在这里要实现什么INITIAL SIZE 0 ...根据文档,它与默认的内存分配相同。 似乎是不必要的添加。

请检查清洁ABAP 样式指南会在您有机会时提供。

huskylover
5楼-- · 2020-08-26 18:55

嗨,

请在两个BAPI调用BAPI_SALESORDER_CHANGE和BAPI_BILLINGDOC_CREATEMULTIPLE之前清除lt_bapiret []

谢谢

一周热门 更多>