从ABAP代理产生一个空的xml标签

2020-08-14 13:05发布

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

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


大家好,

我有一种情况,当某个字段(例如)包含来自ABAP代理的空白值时,XI输出不会产生空标记,因为代理无法发送空白值,这就是xml保持正常状态的方式 通过不产生一堆空标签。 但这是我们的目标是在为空白时产生一个空标签。 因此,我们决定在该字段中找不到值时将值" blank"传递给XI。 当值是'blank'时,如何在XI内部创建映射以产生一个空标签,如果值不是'blank',则如何产生一个空标签?

谢谢!

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

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


大家好,

我有一种情况,当某个字段(例如)包含来自ABAP代理的空白值时,XI输出不会产生空标记,因为代理无法发送空白值,这就是xml保持正常状态的方式 通过不产生一堆空标签。 但这是我们的目标是在为空白时产生一个空标签。 因此,我们决定在该字段中找不到值时将值" blank"传递给XI。 当值是'blank'时,如何在XI内部创建映射以产生一个空标签,如果值不是'blank',则如何产生一个空标签?

谢谢!

付费偷看设置
发送
5条回答
半个程序猿
1楼 · 2020-08-14 13:17.采纳回答

为什么不使用节点函数mapWithDefault? 当源字段丢失时,这将创建一个空标签。 因此,您无需在ABAP代理中传递值。

哎,真难
2楼-- · 2020-08-14 13:24

嗨,瑞安,

答案是肯定的。

关于

< p> Mark

追夢秋陽
3楼-- · 2020-08-14 13:08

嗨,

正如您所说的,空白字段不会传递给PI。 请求有效负载XML中没有空白值标签。

为此,我们需要使用if_wsprotocol_payloadinterface协议,

实际上,通过协议,您可以使用其他运行时服务。

不同的运行时支持不同的协议。

在我们的代理服务中。

每个结构都有一个类型为PRXCTRLTAB的额外字段。

我们需要在空白值字段中附加初始值。

您只需在现有代码中包括粗体字体代码,其余代码仅出于理解目的。

使用以下代码通过代理发送空白XML标签:-

********************************************代码开头* ************************************

DATA lo_service类型参考ZNAVCO_EMPLOYEE_DETAILS。 "代理ABAP对象的对象声明。
DATA lt_inputs TYPE ZNAVDT_DETAILS_OUTBOUND_TAB。"数据结构
数据ls_input TYPE ZNAVDT_DETAILS_OUTBOUND_STR的内部表。 "数据结构的工作区

数据ls_record类型ZNAVMT_DETAILS_OUTBOUND_STR。 "代理的输出参数

数据lo_payload_protocol类型参考if_wsprotocol_payload。 "有效负载界面

* DATA lt_controller类型PRXCTRLTAB。 "控制器选项卡
DATA ls_controller TYPE PRXCTRL。"控制器结构

创建对象lo_service。

lo_payload_protocol?= lo_service-> get_protocol(if_wsprotocol => payload)。 "获取代理协议

呼叫方法lo_payload_protocol-> set_extended_xml_handling(abap_true)。 "主动扩展XML处理。

ls_controller-field ='EMP_LOCATION'。 "字段具有空白值
ls_controller-value = sai_ctrl_initial。"这将发送初始值
将ls_controller附加到ls_input-controller。

ls_controller-field ='EMP_BANK_AC_NO'。 "字段具有空白值
ls_controller-value = sai_ctrl_initial。"这将发送初始值
将ls_controller附加到ls_input-controller。

ls_input-NAME ='NAVNEET'。 "具有数据的正常人

ls_input-DOJ = '10 .01.2019'。

将ls_input附加到lt_inputs。

清除ls_input。

ls_controller-field ='EMP_BANK_AC_NO'。 "字段具有空白值
ls_controller-value = sai_ctrl_initial。"这将发送初始值
将ls_controller附加到ls_input-controller。

ls_input-NAME ='Anand'

ls_input-DOJ = '12 .05.2016'。

ls_input-emp_location ='印度'。

将ls_input附加到lt_inputs上。

ls_record -mt_sender_emp_details_templ-record = lt_inputs。

TRY。
lo_service-> send_employee_data(output = ls_record)。

CATCH cx_root INTO数据(lr_excep)。

消息lr_excep-> get_text()类型'E'。
ENDTRY。

*************************************代码结尾**** ****************************************

记住一件事:-

  • 如果要在服务请求中包含空白XML标记,则仅包含字段在Controller表中具有空白值。
  • 如果在控制器表中包括任何字段,则无论它们是否有数据,它将作为空白XML标记发送。

感谢和问候

Navneet Anand。

打个大熊猫
4楼-- · 2020-08-14 13:12

嗨,谢谢您的回答。 发送请求时,它工作正常,但是我收到异常SOAP:1027 SRT:序列化/反序列化失败,并且来自服务的成功消息。 这是SRT_UTIL的屏幕截图:

在SE80中,字段" relationNumber"的服务定义数据类型为STRING。 应该是INT4还是INT8?

SC_Yao
5楼-- · 2020-08-14 13:21

嗨,瑞安,

您可以通过使用扩展的xml处理在ABAP代理中生成空白输出。

激活扩展XML处理-ABAP Web服务-SAP库

@Stefan Grube 的建议更容易????

此致

标记

一周热门 更多>