如何使用数据源名称BAPI_EMP_SO_CHANGE映射SalesOrder的更新操作

2020-09-27 02:43发布

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

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


大家好,我正在尝试使用以下BAPI作为实体类型来提供OData服务:

-BAPI_SO_EMP_SO_GETLIST;
-BAPI_SO_EMP_SO_GETDETAIL;

我遵循了指南(非常有用!),但是,他仅映射了Read和Query操作。 我可以修改数据映射向导并映射"创建和删除"操作(我已按预期进行了测试和工作),但是,我无法映射"更新操作"。 我尝试了以下方法:

但是当我尝试更新/IWFND/GW_CLIENT事务中的条目时,出现以下错误:

我的逻辑解决方案是更改数据源参数,如下所示:

我遇到了一个新错误,我无法推断出任何解决方案:

我该如何解决? 我什至考虑过要去ABAP工作台重新定义UpdateEntity方法,但是我对ABAP的了解几乎为零。 令我更加困惑的是,我正在使用RFC模块创建oData服务,为什么它输出无效的BOR密钥?

预先感谢

威廉

attempt1.jpg (44.8 kB)

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

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


大家好,我正在尝试使用以下BAPI作为实体类型来提供OData服务:

-BAPI_SO_EMP_SO_GETLIST;
-BAPI_SO_EMP_SO_GETDETAIL;

我遵循了指南(非常有用!),但是,他仅映射了Read和Query操作。 我可以修改数据映射向导并映射"创建和删除"操作(我已按预期进行了测试和工作),但是,我无法映射"更新操作"。 我尝试了以下方法:

但是当我尝试更新/IWFND/GW_CLIENT事务中的条目时,出现以下错误:

我的逻辑解决方案是更改数据源参数,如下所示:

我遇到了一个新错误,我无法推断出任何解决方案:

我该如何解决? 我什至考虑过要去ABAP工作台重新定义UpdateEntity方法,但是我对ABAP的了解几乎为零。 令我更加困惑的是,我正在使用RFC模块创建oData服务,为什么它输出无效的BOR密钥?

预先感谢

威廉

attempt1.jpg (44.8 kB)
付费偷看设置
发送
4条回答
天桥码农
1楼 · 2020-09-27 03:36.采纳回答

嗨,

详细说明并添加Pavan的建议。

您应该使用过-BAPI_EPM_SO_CHANGE。 这些BAPI以某种方式运行。 它们有两种结构-一种用于实际数据,另一种称为" X"结构,用以表示哪些数据已更改。

根据您的情况,尝试按以下方式映射数据。

如果仅创建标题,则将数据传递到SOHEADERDATA并将键(即销售订单ID和true/false值)传递给SOHEADERDATAX。 无论您为SOHEADERDATAX中的相应属性在SOHEADERDATA中传递的数据是什么,都需要将其传递为true才能反映更改。 另外,请注意并使用PERSIST_TO_DB标志将更改提交到数据库。

BR。

闻人可可
2楼-- · 2020-09-27 03:27

谢谢您的回答! 最后,我在ABAP工作台中完成了所有工作,最终我了解了SOHEADERDATAX的用途。 如果有人偶然发现类似问题,这是我的ABAP代码:

 METHOD SALESORDER_UPDATE_ENTITY。
     数据:
           lwa_key_tab TYPE/iwbep/s_mgw_name_value_pair,
           lv_so_id类型bapi_epm_so_id,
           ls_salesorder像er_entity,
           ls_headerdata类型bapi_epm_so_header,
           ls_headerdatax类型bapi_epm_so_headerx,
           lt_return bapiret2的标准类型表,
           ld_persist_to_db类型BAPI_EPM_BOOLEAN。
 *将运行时请求映射到RFC-仅映射属性
 io_data_provider-> read_entry_data(IMPORTING es_data = ls_salesorder)。
     读取表it_​​key_tab并使用键名='SoId'进入lwa_key_tab。
     如果sy-subrc = 0。
       lv_so_id = lwa_key_tab值。
     万一。
 * Alpha转换
     通话功能" CONVERSION_EXIT_ALPHA_INPUT"
     出口
       输入= lv_so_id
     输入
       输出= lv_so_id。

 *从服务中读取需要更新的新数据io_data_provider-> read_entry_data
     通话功能'BAPI_EPM_SO_GET_DETAIL'
     出口
       so_id = lv_so_id
     输入
       headerdata = ls_headerdata。
 *更新数据
     ld_persist_to_db = ABAP_TRUE。
     ls_headerdata-Note = ls_salesorder-note。
     ls_headerdata-Buyer_Id = ls_salesorder-Buyer_Id。
     ls_headerdata-Buyer_Name = ls_salesorder-Buyer_Name。
     ls_headerdata-currency_code = ls_salesorder-currency_code。
     ls_headerdatax-so_id = lv_so_id。
     ls_headerdatax-currency_code ='X'。
     ls_headerdatax-note ='X'。
     ls_headerdatax-Buyer_Id ='X'。
     ls_headerdatax-Buyer_Name ='X'。
     通话功能'BAPI_EPM_SO_CHANGE'
       出口
         so_id = lv_so_id
         soheaderdata = ls_headerdata
         soheaderdatax = ls_headerdatax
 * PERSIST_TO_DB = ABAP_TRUE
         persist_to_db = ld_persist_to_db
       桌子
         return = lt_return。
       如果lt_return是INITIAL。
         er_entity = ls_salesorder。
       万一。
  终结法。
 **尝试。
 *呼叫方法SUPER-> SALESORDER_UPDATE_ENTITY
 *出口
 * IV_ENTITY_NAME =
 * IV_ENTITY_SET_NAME =
 * IV_SOURCE_NAME =
 * IT_KEY_TAB =
 ** IO_TECH_REQUEST_CONTEXT =
 * IT_NAVIGATION_PATH =
 ** IO_DATA_PROVIDER =
 **进口
 ** ER_ENTITY =
 *。
 **抓/IWBEP/CX_MGW_BUSI_EXCEPTION。
 ** CATCH/IWBEP/CX_MGW_TECH_EXCEPTION。
 ** ENDTRY。
 
d56caomao
3楼-- · 2020-09-27 03:43

嗨,

好吧,这通常发生在OData和Gateway的新手...

如果我是您,那么在进行OData开发之前要进行几点:

第一:通过BAPI BAPI_EMP_SO_CHANGE检查SO的更新。

如果成功完全,那么我将通过OData在其Import/Tables中将相同的参数传递给BAPI。 确保正确完成SEGW(网关生成器)中的映射。

2nd:完成上述步骤后,我将在odata DPC_EXT类上放置一个断点,并检查数据是否通过OData服务正确传递到BAPI。

谢谢

PG

CJones
4楼-- · 2020-09-27 03:47

P.S当我们说以下几行时,表示要在测试模式下检查SE37中的BAPI。 (带有提交)

 1st:通过BAPI检查SO的更新BAPI_EMP_SO_CHANGE
 

一周热门 更多>