SAP oData扩展查询返回" XML-ABAP转换错误的意外文本"错误

2020-08-24 09:50发布

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

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


亲爱的朋友们!

我正在尝试在oData中创建Expand查询。 在测试时给了我错误" XML-ABAP转换错误的意外文本"。

我的方案是我有一个销售订单标题和交货明细的结构(两者都是自定义的,我没有使用bapi)。 我正在尝试获取销售订单标题信息以及对销售订单的交货,因此我收到错误消息。 在调试中,我发现在准备xml时它会给我数据,但会抛出该属性,我找不到它。

我已经清理了两个系统的缓存,也更改了基数。 对象生成! 仍然没有运气...此外,我还有一个问题。

当我在URL中使用$ filter选项时,它为我提供了不同的实体集名称,并且顺便说说是标题实体集;当我使用('1231231')时,它为我提供了项目实体集,有趣的是...选择选项表和 it_key_tab表都为空。 然后我对值进行了硬编码以获取数据。

请帮助我了解我在哪里做错了。

我的网址

/sap/opu/odata/sap/ZSD_LE_GPS_TRACKING_SRV/gps_delivery_detailsS​​et('0000014079')?$ expand = ToDelivery

这将返回空的key_tab。

/sap/opu/odata/sap/ZSD_LE_GPS_TRACKING_SRV/gps_delivery_detailsS​​et?$ filter = Vbeln eq'0000014079'&$ expand = ToDelivery

这将返回空的过滤器标签。

请参阅:我正在将此用于Get Method。

我的代码:

 SPAN {
 字体家族:" Courier New";
 字体大小:10pt;
 颜色:#000000;
 背景:#FFFFFF;
 }
 .L0S31 {
 字体样式:斜体;
 颜色:#808080;
 }
 .L0S32 {
 颜色:#3399FF;
 }
 .L0S33 {
 颜色:#4DA619;
 }
 .L0S52 {
 颜色:#0000FF;
 }
 .L0S55 {
 颜色:#800080;
 }
 .L0S70 {
 颜色:#808080;
 }
 方法/IWBEP/IF_MGW_APPL_SRV_RUNTIME〜GET_EXPANDED_ENTITYSET。
  数据lv_entityset_name类型字符串。
  数据:str_exp的开头。
        包括类型ZCL_ZSD_LE_GPS_TRACKIN_MPC_EXT => TS_GPS_DELIVERY_DETAILS。
  数据:ToDeliveryLog类型为ZCL_ZSD_LE_GPS_TRACKIN_MPC_EXT => TT_DELIVERYLOG。
  数据:str_exp的结尾。
  数据:WA_SO TYPE/IWBEP/S_MGW_SELECT_OPTION。
  数据WA_LO类型/IWBEP/S_COD_SELECT_OPTION。
  DATA lv_vdatu类型TIMESTAMP。
  数据:lt_expand如str_exp,
        ls_expand如str_exp,
        ls_item类型ZCL_ZSD_LE_GPS_TRACKIN_MPC_EXT => TS_DELIVERYLOG。
  数据:ZSDST_GPS_DELIVERY_HEADER的it_head类型表,
        wa_head像it_head的一行,
        ZSDST_GPS_LOCATION的it_item类型表,
        wa_delitem喜欢it_item的行。
  数据:ls_keytab/IWBEP/T_MGW_NAME_VALUE_PAIR的类型行。
  数据:LV_VBELN类型VBELN,
        DRIVER类型ZSDST_GPS_DRIVER_LIST,
        SALES_ORDER_DATA类型ZSDST_GPS_SO_HEADER,
        SHIPPING_ADDRESS类型ZSDST_GPS_SHIPPING_ADDRESS,
        DELIVERY_LOG类型ZSDTT_GPS_LOCATION。
  数据WA_KEY TYPE/IWBEP/S_MGW_NAME_VALUE_PAIR。
  DATA ob_del类型参考ZSDCL_GPS_TRACKING。
 *与ET_ENTITYSET相似的DATA WA_ENTITY。
     常量:lc_expand_tech_clause类型字符串值'ToDelivery'。
     lv_entityset_name = io_tech_request_context-> get_entity_set_name()。
        大小写lv_entityset_name。
            当'DeliveryLogSet''当我使用('12323123')像URL中的值时,我收到项目集
                  或'gps_delivery_detailsS​​et'。  "使用过滤器时,我会收到标题集
               使用键属性='Vbeln'将表IT_FILTER_SELECT_OPTIONS读入WA_SO。  "总是空的
               如果sy-subrc ='0'。
                 将表WA_SO-SELECT_OPTIONS读入WA_LO INDEX'1'。
                 如果SY-SUBRC ='0'。
 *将wa_so –属性转换为大写。
                        案例WA_SO-PROPERTY。
                           当" Vbeln"。
                             lv_vbeln = WA_LO-LOW。
                           当别人。
                          "在应用程序日志中记录消息
                            我->/iwbep/if_sb_dpc_comm_services〜log_message(
                                        出口
                                           iv_msg_type ='E'
                                           iv_msg_id ='/IWBEP/MC_SB_DPC_ADM'
                                           iv_msg_number = 020
                                           iv_msg_v1 = WA_SO-PROPERTY)。
                           引发例外
                            引发例外类型/iwbep/cx_mgw_tech_exception
                                         出口
                                            textid =/iwbep/cx_mgw_tech_exception =>内部错误。
                         结束。
                     万一。
                  万一。
                  如果IT_FILTER_SELECT_OPTIONS是初始的。
                     将表it_key_tab读入wa_key索引'1'。  "总是空的
                     如果sy-subrc ='0'。
                        lv_vbeln = wa_key-value。
                     万一。
                万一。
             
                  如果lv_vbeln是初始的。
                     lv_vbeln ='0000014079'。  " <-硬编码销售订单号
                 万一。
                 创建对象ob_del。
                   呼叫方法ob_del-> get_delivery_detail
                       出口
                         i_vbeln = LV_VBELN
                       输入
                         驱动程序=驱动程序
                         sales_order_data = sales_order_data
                         送货地址=送货地址
                         delivery_log = delivery_log。
             将lc_expand_tech_clause插入表et_expanded_tech_clauses中。
             将sales_order_data移动到ls_expand。
             将对应的shipping_address移动到ls_expand。
             ls_expand的MOVE-CORRESPONDING驱动程序。
             在delivery_log循环到wa_delitem。
                将对应的wa_delitem移动到ls_item。
                将ls_item附加到ls_expand-todeliverylog。
                清除wa_delitem。
             结束循环。
  尾箱。
   copy_data_to_ref(
            出口
              is_data = ls_expand
            改变
              cr_data = er_entityset)。
 方法。  "到目前为止,这里没有触发任何错误。此方法完成并准备好xml之后会出现错误。

我已将关联,导航属性和此消息一起附加。

请帮助我了解我在哪里做错了。 非常感谢您在这方面的帮助。

致谢
Naim

(5.8 kB)

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

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


亲爱的朋友们!

我正在尝试在oData中创建Expand查询。 在测试时给了我错误" XML-ABAP转换错误的意外文本"。

我的方案是我有一个销售订单标题和交货明细的结构(两者都是自定义的,我没有使用bapi)。 我正在尝试获取销售订单标题信息以及对销售订单的交货,因此我收到错误消息。 在调试中,我发现在准备xml时它会给我数据,但会抛出该属性,我找不到它。

我已经清理了两个系统的缓存,也更改了基数。 对象生成! 仍然没有运气...此外,我还有一个问题。

当我在URL中使用$ filter选项时,它为我提供了不同的实体集名称,并且顺便说说是标题实体集;当我使用('1231231')时,它为我提供了项目实体集,有趣的是...选择选项表和 it_key_tab表都为空。 然后我对值进行了硬编码以获取数据。

请帮助我了解我在哪里做错了。

我的网址

/sap/opu/odata/sap/ZSD_LE_GPS_TRACKING_SRV/gps_delivery_detailsS​​et('0000014079')?$ expand = ToDelivery

这将返回空的key_tab。

/sap/opu/odata/sap/ZSD_LE_GPS_TRACKING_SRV/gps_delivery_detailsS​​et?$ filter = Vbeln eq'0000014079'&$ expand = ToDelivery

这将返回空的过滤器标签。

请参阅:我正在将此用于Get Method。

我的代码:

 SPAN {
 字体家族:" Courier New";
 字体大小:10pt;
 颜色:#000000;
 背景:#FFFFFF;
 }
 .L0S31 {
 字体样式:斜体;
 颜色:#808080;
 }
 .L0S32 {
 颜色:#3399FF;
 }
 .L0S33 {
 颜色:#4DA619;
 }
 .L0S52 {
 颜色:#0000FF;
 }
 .L0S55 {
 颜色:#800080;
 }
 .L0S70 {
 颜色:#808080;
 }
 方法/IWBEP/IF_MGW_APPL_SRV_RUNTIME〜GET_EXPANDED_ENTITYSET。
  数据lv_entityset_name类型字符串。
  数据:str_exp的开头。
        包括类型ZCL_ZSD_LE_GPS_TRACKIN_MPC_EXT => TS_GPS_DELIVERY_DETAILS。
  数据:ToDeliveryLog类型为ZCL_ZSD_LE_GPS_TRACKIN_MPC_EXT => TT_DELIVERYLOG。
  数据:str_exp的结尾。
  数据:WA_SO TYPE/IWBEP/S_MGW_SELECT_OPTION。
  数据WA_LO类型/IWBEP/S_COD_SELECT_OPTION。
  DATA lv_vdatu类型TIMESTAMP。
  数据:lt_expand如str_exp,
        ls_expand如str_exp,
        ls_item类型ZCL_ZSD_LE_GPS_TRACKIN_MPC_EXT => TS_DELIVERYLOG。
  数据:ZSDST_GPS_DELIVERY_HEADER的it_head类型表,
        wa_head像it_head的一行,
        ZSDST_GPS_LOCATION的it_item类型表,
        wa_delitem喜欢it_item的行。
  数据:ls_keytab/IWBEP/T_MGW_NAME_VALUE_PAIR的类型行。
  数据:LV_VBELN类型VBELN,
        DRIVER类型ZSDST_GPS_DRIVER_LIST,
        SALES_ORDER_DATA类型ZSDST_GPS_SO_HEADER,
        SHIPPING_ADDRESS类型ZSDST_GPS_SHIPPING_ADDRESS,
        DELIVERY_LOG类型ZSDTT_GPS_LOCATION。
  数据WA_KEY TYPE/IWBEP/S_MGW_NAME_VALUE_PAIR。
  DATA ob_del类型参考ZSDCL_GPS_TRACKING。
 *与ET_ENTITYSET相似的DATA WA_ENTITY。
     常量:lc_expand_tech_clause类型字符串值'ToDelivery'。
     lv_entityset_name = io_tech_request_context-> get_entity_set_name()。
        大小写lv_entityset_name。
            当'DeliveryLogSet''当我使用('12323123')像URL中的值时,我收到项目集
                  或'gps_delivery_detailsS​​et'。  "使用过滤器时,我会收到标题集
               使用键属性='Vbeln'将表IT_FILTER_SELECT_OPTIONS读入WA_SO。  "总是空的
               如果sy-subrc ='0'。
                 将表WA_SO-SELECT_OPTIONS读入WA_LO INDEX'1'。
                 如果SY-SUBRC ='0'。
 *将wa_so –属性转换为大写。
                        案例WA_SO-PROPERTY。
                           当" Vbeln"。
                             lv_vbeln = WA_LO-LOW。
                           当别人。
                          "在应用程序日志中记录消息
                            我->/iwbep/if_sb_dpc_comm_services〜log_message(
                                        出口
                                           iv_msg_type ='E'
                                           iv_msg_id ='/IWBEP/MC_SB_DPC_ADM'
                                           iv_msg_number = 020
                                           iv_msg_v1 = WA_SO-PROPERTY)。
                           引发例外
                            引发例外类型/iwbep/cx_mgw_tech_exception
                                         出口
                                            textid =/iwbep/cx_mgw_tech_exception =>内部错误。
                         结束。
                     万一。
                  万一。
                  如果IT_FILTER_SELECT_OPTIONS是初始的。
                     将表it_key_tab读入wa_key索引'1'。  "总是空的
                     如果sy-subrc ='0'。
                        lv_vbeln = wa_key-value。
                     万一。
                万一。
             
                  如果lv_vbeln是初始的。
                     lv_vbeln ='0000014079'。  " <-硬编码销售订单号
                 万一。
                 创建对象ob_del。
                   呼叫方法ob_del-> get_delivery_detail
                       出口
                         i_vbeln = LV_VBELN
                       输入
                         驱动程序=驱动程序
                         sales_order_data = sales_order_data
                         送货地址=送货地址
                         delivery_log = delivery_log。
             将lc_expand_tech_clause插入表et_expanded_tech_clauses中。
             将sales_order_data移动到ls_expand。
             将对应的shipping_address移动到ls_expand。
             ls_expand的MOVE-CORRESPONDING驱动程序。
             在delivery_log循环到wa_delitem。
                将对应的wa_delitem移动到ls_item。
                将ls_item附加到ls_expand-todeliverylog。
                清除wa_delitem。
             结束循环。
  尾箱。
   copy_data_to_ref(
            出口
              is_data = ls_expand
            改变
              cr_data = er_entityset)。
 方法。  "到目前为止,这里没有触发任何错误。此方法完成并准备好xml之后会出现错误。

我已将关联,导航属性和此消息一起附加。

请帮助我了解我在哪里做错了。 非常感谢您在这方面的帮助。

致谢
Naim

(5.8 kB)
付费偷看设置
发送
1条回答
大圣 - sap领域执行人,9年sap运营经验
1楼 · 2020-08-24 10:41.采纳回答

您不应使用参数IT _...,例如

IT_FILTER_SELECT_OPTIONS。 您应该使用

io_tech_request_context对象。

请参阅我的两个博客如何实现简单查询。

https://blogs.sap.com/2016/05/31/odata-service-development-with-sap-gateway-code-based-service-development /

https://blogs.sap.com/2016/05/31/odata-service-development-with-sap-gateway-code-based-service-development-part-ii /

在该博客的第二部分。

其中提到了如何处理导航,如果您使用$ expand并让SAP Gateway框架对其进行隐式处理。

 lt_nav_path = io_tech_request_context-> get_navigation_path()。可通过键nav_prop ='TOITEMS'将lt_nav_path读取到ls_nav_path中。

除了获取osql语句外,还可以将过滤器作为选择选项。

此致

安德烈

一周热门 更多>