适用范围:Azure 逻辑应用(消耗型 + 标准型)
本操作指南介绍如何创建生成 SAP 项目架构的示例逻辑应用工作流。 工作流的开头是可以接收来自 SAP 服务器的 HTTP POST 请求的请求触发器。 然后,工作流通过使用向 SAP 服务器发送请求的名为生成架构的 SAP 操作为指定 IDoc 和 BAPI 生成架构。 要发送此请求,可以使用名为向 SAP 发送消息的通用 SAP 托管连接器操作,也可以使用名为[BAPI] SAP 中的调用方法的特定 SAP 托管或内置操作。 此 SAP作返回 XML 架构 ,而不返回 XML 文档本身中的内容或数据。 然后,工作流使用 Azure 资源管理器连接器操作将响应返回的模式上传到集成帐户。
架构包含以下部分:
组件 | 说明 |
---|---|
请求消息结构 | 使用此信息形成你的 BAPI get 列表。 |
响应消息结构 | 使用此信息分析响应。 |
标准和消耗逻辑应用工作流都提供 SAP 托管 连接器,该连接器在 Azure 多租户环境中托管并运行。 标准工作流还提供 SAP 内置 连接器,该连接器托管并在单租户 Azure 逻辑应用中运行。 有关详细信息,请参阅连接器技术参考。
先决条件
在开始之前,请确保查看并满足特定方案的 SAP 连接器要求。
如果您想将生成的架构上传到存储库(例如集成帐户),请确保该存储库已存在。
为 SAP 项目生成架构
以下示例逻辑应用工作流会在工作流的 SAP 触发器收到来自 SAP 服务器的请求时触发。 然后,工作流将运行 SAP 操作,从而为指定的 SAP 项目生成架构。
添加“请求”触发器
要让工作流通过 HTTP 接收来自 SAP 服务器的请求,可以使用请求内置触发器。 此触发器会创建包含 URL 的终结点,SAP 服务器可在其中向工作流发送 HTTP POST 请求。 当工作流收到这些请求时,触发器会触发并运行工作流中的下一个步骤。
根据您使用的是消耗型工作流还是标准型工作流,请执行相应的步骤。
在 Azure 门户的设计器中,打开消耗型逻辑应用资源和空白工作流。
在设计器中,按照以下常规步骤查找并添加名为“收到 HTTP 请求时的请求”内置触发器。
保存工作流。 在设计器工具栏上选择“保存”。
此步骤将生成终结点 URL,触发器可在其中接收来自 SAP 服务器的请求,例如:
添加 SAP 操作以生成架构
根据您的工作流类型是消耗型还是标准型,请执行相应的步骤。
在工作流设计器的“请求”触发器下,按照以下一般步骤查找并添加名为生成架构的 SAP 托管的动作。
有关此 SAP 托管操作的详细信息,请参阅生成架构。
如果出现提示,请为本地 SAP 服务器提供连接信息。 完成后,选择“ 新建”。 否则,请继续执行下一步来设置 SAP 操作。
默认情况下,在创建 SAP 托管操作的连接时,将使用强类型化通过对架构执行 XML 验证来检查无效值。 此行为可帮助提前检测问题。 有关强键入的详细信息,请参阅 “安全键入”设置。 有关其他可用的连接参数,请参阅 默认连接信息。
Azure 逻辑应用设置并测试连接后,将显示操作信息窗格。
备注
如果收到 Bad Gateway (500) 错误或 Bad request (400) 错误,请参阅 500 Bad Gateway 或 400 Bad request 错误。 有关可能发生的任何连接问题的详细信息,请参阅排查连接问题。
在“生成架构”动作中,提供要为其生成架构的 SAP 动作路径。
此示例使用以下示例路径来演示 SAP 动作 Send:
http://Microsoft.LobServices.Sap/2007/03/Idoc/3/ORDERS05//720/Send
提示
在 sapActionsUris 节中,可以使用表达式编辑器提供参数值。 此方法允许使用相同的SAP操作来处理不同的消息类型。
有关 发送 SAP 操作的详细信息,请参阅 IDoc 操作的消息架构。
如果可以选择浏览并选择此路径上的文件夹,请执行以下步骤:
从 sapActionUris 项 - 1 下拉列表中,选择 BAPI、 IDOC、 RFC 或 TRFC。
此示例选择了“IDOC”。 如果选择不同的操作类型,可用参数将根据所选内容更改。
使用箭头浏览 SAP 文件夹,查找并选择要使用的 SAP 操作。
此示例选择了“ORDERS”>“ORDERS05”>“720”>“发送”。
若要为多个作生成架构,请在 sapActionUris 部分选择“ 添加新项”。
对于每个要生成架构的 SAP 操作,请提供该操作的路径,例如:
保存工作流。 在设计器工具栏上选择“保存”。
测试工作流以生成架构
根据使用的是消耗工作流还是标准工作流,请执行相应的步骤。
如果尚未启用消耗逻辑应用资源,请在逻辑应用菜单中选择“概述”。 在工具栏中选择“启用”。
在设计器工具栏中选择“运行”“运行”以手动启动工作流。>
若要模拟 Webhook 触发器有效负载并触发工作流,请使用 HTTP 请求工具及其说明,将 HTTP 请求发送到工作流的“请求”触发器创建的终结点 URL,包括“请求”触发器预期的方法。 确保在请求中加入消息内容。
此示例使用“POST”方法和终结点 URL 发送 IDoc 文件,该文件必须采用 XML 格式,并包含所选 SAP 操作的命名空间,例如:
<?xml version="1.0" encoding="UTF-8" ?> <Send xmlns="http://Microsoft.LobServices.Sap/2007/03/Idoc/2/ORDERS05//720/Send"> <idocData> <...> </idocData> </Send>
发送 HTTP 请求之后,等待工作流返回响应。
备注
如果响应所需的所有步骤未在 请求超时限制内完成,工作流可能会超时。 如果发生这种情况,请求可能会被阻止。 若要帮助诊断问题,请了解如何 在 Azure 逻辑应用中检查工作流状态和查看运行历史记录。
在逻辑应用菜单中,选择“概述” 。 在“ 运行历史记录 ”选项卡上,选择工作流运行。
选择生成架构操作以查看该操作的输出。
输出中会显示适用于指定消息的生成的架构。
有关查看工作流运行历史记录的详细信息,请参阅 “检查工作流状态”,查看运行历史记录,并在 Azure 逻辑应用中设置警报。
将架构上传到集成帐户
(可选)可以在存储库中下载或存储生成的架构,例如 集成帐户 或 Azure 存储帐户(如 Blob 容器)。 集成帐户为 Azure 逻辑应用中的工作流提供一流的 XML 操作体验。 可以选择将生成的架构上传到同一工作流中的现有集成帐户,该工作流使用名为 创建或更新资源 的 Azure 资源管理器操作来生成这些架构。
备注
架构使用 base64 编码格式。 若要将架构上传到集成帐户,必须先使用 base64ToString()
函数将架构解码。 以下示例显示了 properties
元素的代码:
"properties": {
"Content": "@base64ToString(items('For_each')?['Content'])",
"ContentType": "application/xml",
"SchemaType": "Xml"
}
对于此任务,如果还没有集成帐户,则需要一个 集成帐户。 根据使用的是消耗工作流还是标准工作流,遵循相应的步骤。 该过程在生成架构后从工作流将架构上传到集成帐户。
在工作流设计器的“生成架构”操作下,按照以下常规步骤添加 Azure 资源管理器托管操作,名为“创建或更新资源”。
如果系统提示你登录,请立即继续登录。
在 Azure Logic Apps 设置并测试连接后,将显示动作信息窗格:
在“创建或更新资源”操作中,提供所需的信息。
可以在工作流中包含前面步骤中的任何输出。 在参数内部选择要包含输出的位置。 选择闪电图标以打开动态内容列表,然后选择要包括的输出。
如果 “位置 ”和 “属性” 参数未显示在“ 参数 ”选项卡上,请打开 “高级参数 ”列表,并添加这些参数。
为添加的参数提供值,例如:
生成架构操作可将架构生成为集合,因此设计器可自动围绕 Azure 资源管理器添加“For each”循环,例如:
保存工作流。 在设计器工具栏上选择“保存”。
测试工作流
按照 以下常规步骤手动测试和运行工作流。 使用与多租户 Azure 逻辑应用中的消耗工作流相对应的过程,或者在单租户 Azure 逻辑应用中使用标准工作流。
成功运行后,转到集成帐户,并确认生成的架构是否存在。
示例 XML 架构
如果要了解如何生成创建示例文档时使用的 XML 架构,请参阅以下示例。 这些示例演示了如何使用多种类型的有效负载,包括:
可以使用可选的 XML prolog 开始 XML 架构。 SAP 连接器可以使用 XML prolog,也可以不使用。
<?xml version="1.0" encoding="utf-8">
RFC 请求的 XML 示例
以下示例显示了其中 RFC 名称为 STFC_CONNECTION
的基本 RFC 调用。 此请求使用名为 xmlns=
的默认命名空间。 但你可以分配和使用命名空间别名,例如 xmlns:exampleAlias=
。 命名空间值是适用于 Microsoft 服务的 SAP 中所有 RFC 的命名空间。 请求具有名为 <REQUTEXT>
的简单输入参数。
<STFC_CONNECTION xmlns="http://Microsoft.LobServices.Sap/2007/03/Rfc/">
<REQUTEXT>exampleInput</REQUTEXT>
</STFC_CONNECTION>
下面的示例显示了带有表参数的 RFC 调用。 此示例调用和测试 RFC 组在所有 SAP 系统中可用。 表参数名为 TCPICDAT
。 表行类型为 ABAPTEXT
,这个元素在表中的每一行中重复出现。 此示例包含一个名为LINE
的单行。 带有表参数的请求可以包含任意数目的字段,其中数值为正整数 (n)。
<STFC_WRITE_TO_TCPIC xmlns="http://Microsoft.LobServices.Sap/2007/03/Rfc/">
<RESTART_QNAME>exampleQName</RESTART_QNAME>
<TCPICDAT>
<ABAPTEXT xmlns="http://Microsoft.LobServices.Sap/2007/03/Types/Rfc/">
<LINE>exampleFieldInput1</LINE>
</ABAPTEXT>
<ABAPTEXT xmlns="http://Microsoft.LobServices.Sap/2007/03/Types/Rfc/">
<LINE>exampleFieldInput2</LINE>
</ABAPTEXT>
<ABAPTEXT xmlns="http://Microsoft.LobServices.Sap/2007/03/Types/Rfc/">
<LINE>exampleFieldInput3</LINE>
</ABAPTEXT>
</TCPICDAT>
</STFC_WRITE_TO_TCPIC>
提示
要查看 RFC STFC_WRITE_TO_TCPIC 的结果,可使用 SAP 登录的数据浏览器 (T-Code SE16) 和名为 TCPIC 的表。
以下示例演示了一个包含具有匿名字段的表参数的 RFC 调用,该匿名字段是一个没有分配名称的字段。 复杂类型在单独的命名空间下声明,在该命名空间中,声明会为当前节点及其所有子元素设置新的默认值。 该示例使用十六进制代码 x002F
作为正斜杠符号 /
的转义字符,因为此符号保留在 SAP 字段名称中。
<RFC_XML_TEST_1 xmlns="http://Microsoft.LobServices.Sap/2007/03/Rfc/">
<IM_XML_TABLE>
<RFC_XMLCNT xmlns="http://Microsoft.LobServices.Sap/2007/03/Rfc/">
<_x002F_AnonymousField>AQIDBAU=</_x002F_AnonymousField>
</RFC_XMLCNT>
</IM_XML_TABLE>
</RFC_XML_TEST_1>
前面的示例还演示了如何对 SAP 数据类型 byte
和 XString
的二进制数组进行编码。 二进制数组采用 XML(XSD 二进制数据类型 xs:base64Binary
)进行 base64 编码。 在示例中,示例 base64 字符串值 AQIDBAU=
解码为二进制数组 [01][02][03][04]
。 此编码与底层 SAP .NET Connector 的十六进制编码不同,并且更节省空间。 使用十六进制编码时,相同的值被编码为字符串 01020304
。
谨慎
使用二进制数组编码时要小心,因为十六进制编码使用 base64 范围的子集,并且看起来像有效的 base64 值。 例如,字符串值 01020304
还解码为有效的 base64 编码值,但会导致不同的二进制数组 [d3][5d][36][d3][7d][38]
,而不是二进制数组 [01][02][03][04]
。
下面的示例包含命名空间的前缀。 一次可以声明所有前缀,也可以将任意数量的前缀声明为节点的属性。 名为 ns0
的 RFC 命名空间别名将用作基本类型的根和参数。
备注
复杂类型在别名为 ns3
的 RFC 类型的不同命名空间下声明,而不是在别名为 ns0
的常规 RFC 命名空间下声明。
<ns0:BBP_RFC_READ_TABLE xmlns:ns0="http://Microsoft.LobServices.Sap/2007/03/Rfc/" xmlns:ns3="http://Microsoft.LobServices.Sap/2007/03/Types/Rfc/">
<ns0:DELIMITER>0</ns0:DELIMITER>
<ns0:QUERY_TABLE>KNA1</ns0:QUERY_TABLE>
<ns0:ROWCOUNT>250</ns0:ROWCOUNT>
<ns0:ROWSKIPS>0</ns0:ROWSKIPS>
<ns0:FIELDS>
<ns3:RFC_DB_FLD>
<ns3:FIELDNAME>KUNNR</ns3:FIELDNAME>
</ns3:RFC_DB_FLD>
</ns0:FIELDS>
</ns0:BBP_RFC_READ_TABLE>
BAPI 请求的 XML 示例
以下 XML 示例是调用 BAPI 方法的示例请求。
备注
SAP 会通过描述业务对象来响应 Azure 逻辑应用在没有输入筛选器的情况下签发的 RFC RPY_BOR_TREE_INIT
,从而使业务对象可供外部系统使用。 Azure 逻辑应用会检查输出表 BOR_TREE
。
此 SHORT_TEXT
字段用于业务对象的名称。 Azure 逻辑应用无法访问输出表中 SAP 未返回的业务对象。
如果使用自定义业务对象,请确保在 SAP 中发布这些业务对象。 否则,SAP 不会在输出表 BOR_TREE
中列出自定义业务对象。 你必须先从 SAP 公开业务对象,然后才能在 Azure 逻辑应用中访问自定义业务对象。
以下示例使用 BAPI 方法 GETLIST
获取银行列表。 此示例包含名为 BUS1011
的银行的业务对象。
<GETLIST xmlns="http://Microsoft.LobServices.Sap/2007/03/Bapi/BUS1011">
<BANK_CTRY>US</BANK_CTRY>
<MAX_ROWS>10</MAX_ROWS>
</GETLIST>
以下示例使用 CREATE
该方法创建银行对象。 此示例使用了与上一个示例相同的业务对象 BUS1011
。 在使用 CREATE
方法创建银行时,请确保提交更改,因为默认情况下不会提交此方法。
提示
确保 XML 文档遵循在 SAP 系统中配置的任何验证规则。 例如对于此示例文档,在美国,银行密钥(<BANK_KEY>
)必须为银行路由号码,也称为 ABA 号码。
<CREATE xmlns="http://Microsoft.LobServices.Sap/2007/03/Bapi/BUS1011">
<BANK_ADDRESS>
<BANK_NAME xmlns="http://Microsoft.LobServices.Sap/2007/03/Types/Rfc">ExampleBankName</BANK_NAME>
<REGION xmlns="http://Microsoft.LobServices.Sap/2007/03/Types/Rfc">ExampleRegionName</REGION>
<STREET xmlns="http://Microsoft.LobServices.Sap/2007/03/Types/Rfc">ExampleStreetAddress</STREET>
<CITY xmlns="http://Microsoft.LobServices.Sap/2007/03/Types/Rfc">Redmond</CITY>
</BANK_ADDRESS>
<BANK_CTRY>US</BANK_CTRY>
<BANK_KEY>123456789</BANK_KEY>
</CREATE>
以下示例通过使用银行开户行号获取银行的详细信息,该号的值是 <BANK_KEY>
。
<GETDETAIL xmlns="http://Microsoft.LobServices.Sap/2007/03/Bapi/BUS1011">
<BANKCOUNTRY>US</BANKCOUNTRY>
<BANKKEY>123456789</BANKKEY>
</GETDETAIL>
IDoc 请求的 XML 示例
要生成纯文本 SAP IDoc XML 架构,请使用“SAP 登录”应用程序和 T-Code。 通过用户界面访问 SAP 文档,并为 IDoc 类型和扩展生成 XSD 格式的 XML 架构。 有关通用 SAP 格式和有效负载的详细信息机器内置对话框,请查看 SAP 文档。
此示例声明根节点和命名空间。 示例代码中的 URI http://Microsoft.LobServices.Sap/2007/03/Idoc/3/ORDERS05//700/Send
声明以下配置:
/IDoc
是所有 IDoc 的根节点。/3
是常见段定义的记录类型版本。/ORDERS05
是 IDoc 类型。//
为空段,因为没有 IDoc 扩展名。/700
为 SAP 版本。/Send
是将信息发送到 SAP 的操作。
<ns0:Send xmlns:ns0="http://Microsoft.LobServices.Sap/2007/03/Idoc/3/ORDERS05//700/Send" xmlns:ns3="http://schemas.microsoft.com/2003/10/Serialization" xmlns:ns1="http://Microsoft.LobServices.Sap/2007/03/Types/Idoc/Common/" xmlns:ns2="http://Microsoft.LobServices.Sap/2007/03/Idoc/3/ORDERS05//700">
<ns0:idocData>
可以重复 idocData
节点以在单个调用中发送一批 IDoc。 在以下示例中,存在一条名为 EDI_DC40
的控制记录以及多项数据记录。
<...>
<ns0:idocData>
<ns2:EDI_DC40>
<ns1:TABNAM>EDI_DC40</ns1:TABNAM>
<...>
<ns1:ARCKEY>Cor1908207-5</ns1:ARCKEY>
</ns2:EDI_DC40>
<ns2:E2EDK01005>
<ns2:DATAHEADERCOLUMN_SEGNAM>E23DK01005</ns2:DATAHEADERCOLUMN_SEGNAM>
<ns2:CURCY>USD</ns2:CURCY>
</ns2:E2EDK01005>
<ns2:E2EDK03>
<...>
</ns0:idocData>
以下示例显示了一条示例 IDoc 控制记录,它使用了名为 EDI_DC
的前缀。 必须更新值才能匹配 SAP 安装和 IDoc 类型。 例如,你的 IDoc 客户端代码可能不是 800
。 请与 SAP 团队联系,确保为 SAP 安装使用正确的值。
<ns2:EDI_DC40>
<ns:TABNAM>EDI_DC40</ns1:TABNAM>
<ns:MANDT>800</ns1:MANDT>
<ns:DIRECT>2</ns1:DIRECT>
<ns:IDOCTYP>ORDERS05</ns1:IDOCTYP>
<ns:CIMTYP></ns1:CIMTYP>
<ns:MESTYP>ORDERS</ns1:MESTYP>
<ns:STD>X</ns1:STD>
<ns:STDVRS>004010</ns1:STDVRS>
<ns:STDMES></ns1:STDMES>
<ns:SNDPOR>SAPENI</ns1:SNDPOR>
<ns:SNDPRT>LS</ns1:SNDPRT>
<ns:SNDPFC>AG</ns1:SNDPFC>
<ns:SNDPRN>ABAP1PXP1</ns1:SNDPRN>
<ns:SNDLAD></ns1:SNDLAD>
<ns:RCVPOR>BTSFILE</ns1:RCVPOR>
<ns:RCVPRT>LI</ns1:RCVPRT>
下面的示例显示了包含纯文本段的示例数据记录。 此示例使用 SAP 日期格式。 强类型文档可以使用本机 XML 日期格式,如 2020-12-31 23:59:59
。
<ns2:E2EDK01005>
<ns2:DATAHEADERCOLUMN_SEGNAM>E2EDK01005</ns2:DATAHEADERCOLUMN_SEGNAM>
<ns2:CURCY>USD</ns2:CURCY>
<ns2:BSART>OR</ns2:BSART>
<ns2:BELNR>1908207-5</ns2:BELNR>
<ns2:ABLAD>CC</ns2:ABLAD>
</ns2>
<ns2:E2EDK03>
<ns2:DATAHEADERCOLUMN_SEGNAM>E2EDK03</ns2:DATAHEADERCOLUMN_SEGNAM>
<ns2:IDDAT>002</ns2:IDDAT>
<ns2:DATUM>20160611</ns2:DATUM>
</ns2:E2EDK03>
下面的示例显示了包含分组段的数据记录。 该记录包括一个名为 E2EDKT1002GRP
的组父节点和多个子节点,包括 E2EDKT1002
和 E2EDKT2001
。
<ns2:E2EDKT1002GRP>
<ns2:E2EDKT1002>
<ns2:DATAHEADERCOLUMN_SEGNAM>E2EDKT1002</ns2:DATAHEADERCOLUMN_SEGNAM>
<ns2:TDID>ZONE</ns2:TDID>
</ns2:E2EDKT1002>
<ns2:E2EDKT2001>
<ns2:DATAHEADERCOLUMN_SEGNAM>E2EDKT2001</ns2:DATAHEADERCOLUMN_SEGNAM>
<ns2:TDLINE>CRSD</ns2:TDLINE>
</ns2:E2EDKT2001>
</ns2:E2EDKT1002GRP>
推荐的方法是创建 IDoc 标识符以用于 tRFC。 可以通过使用 SAP 托管连接器中的“发送 IDoc”操作来设置名为tid
的此事务标识符。
以下示例演示了设置事务标识符的备用方法,或 tid
。 在此示例中,最后一个数据记录段节点和 IDoc 数据节点处于关闭状态。 然后,GUID guid
用作检测重复项的 tRFC 标识符。
</E2STZUM002GRP>
</idocData>
<guid>8820ea40-5825-4b2f-ac3c-b83adc34321c</guid>
</Send>