在 Azure 逻辑应用中为 SAP 项目生成架构

适用范围:Azure 逻辑应用(消耗型 + 标准型)

本操作指南介绍如何创建生成 SAP 项目架构的示例逻辑应用工作流。 工作流的开头是可以接收来自 SAP 服务器的 HTTP POST 请求的请求触发器。 然后,工作流通过使用向 SAP 服务器发送请求的名为生成架构的 SAP 操作为指定 IDoc 和 BAPI 生成架构。 要发送此请求,可以使用名为向 SAP 发送消息的通用 SAP 托管连接器操作,也可以使用名为[BAPI] SAP 中的调用方法的特定 SAP 托管或内置操作。 此 SAP 操作返回 XML 架构,而不是 XML 文档本身的内容或数据。 使用 Azure 资源管理器连接器将响应中返回的架构上传到集成帐户。 架构包含以下部分:

组件 说明
请求消息结构 使用此信息形成你的 BAPI get 列表。
响应消息结构 使用此信息分析响应。

标准和消耗逻辑应用工作流都提供在多租户 Azure 中托管和运行的 SAP 托管连接器。 标准工作流还提供在单租户 Azure 逻辑应用中托管和运行的预览版 SAP 内置连接器,但此连接器目前为预览版,并受 Azure 预览版补充使用条款的约束。 如果在集成服务环境 (ISE) 中创建和托管消耗工作流,也可以使用 SAP 连接器的 ISE 原生版本。 有关详细信息,请参阅连接器技术参考

先决条件

为 SAP 项目生成架构

以下示例逻辑应用工作流会在工作流的 SAP 触发器收到来自 SAP 服务器的请求时触发。 然后,工作流将运行 SAP 操作,从而为指定的 SAP 项目生成架构。

添加“请求”触发器

要让工作流通过 HTTP 接收来自 SAP 服务器的请求,可以使用请求内置触发器。 此触发器会创建包含 URL 的终结点,SAP 服务器可在其中向工作流发送 HTTP POST 请求。 当工作流收到这些请求时,触发器会触发并运行工作流中的下一个步骤。

根据你在多租户 Azure 逻辑应用中具有消耗工作流还是在单租户 Azure 逻辑应用中具有标准工作流,执行相应的步骤:

  1. Azure 门户中,创建会在设计器中打开的消耗逻辑应用资源和空白工作流。

  2. 在设计器中,按照这些常规步骤查找并添加名为“收到 HTTP 请求时”的请求内置触发器

    屏幕截图显示消耗工作流的请求触发器。

  3. 保存工作流。 在设计器工具栏上选择“保存”。

    此步骤将生成终结点 URL,触发器可在其中接收来自 SAP 服务器的请求,例如:

    屏幕截图显示请求触发器的生成的终结点 URL,可用于接收消耗工作流中的请求。

添加 SAP 操作以生成架构

根据你在多租户 Azure 逻辑应用中具有消耗工作流还是在单租户 Azure 逻辑应用中具有标准工作流,执行相应的步骤:

  1. 在工作流设计器中“请求触发器”下,选择“新建步骤”。

  2. 在设计器中,按照这些常规步骤查找并添加名为“生成架构”的 SAP 托管操作

    有关此 SAP 托管操作的详细信息,请参阅生成架构

  3. 如果出现提示,请为本地 SAP 服务器提供连接信息。 完成操作后,选择“创建”。 否则,请继续执行下一步来设置 SAP 操作。

    默认情况下,在创建 SAP 托管操作的连接时,将使用强类型化通过对架构执行 XML 验证来检查无效值。 此行为可帮助提前检测问题。 详细了解“安全类型化”设置。 有关其他可选的可用连接参数,请参阅默认连接信息

    Azure 逻辑应用设置并测试连接后,将显示操作信息框。 有关可能发生的任何连接问题的详细信息,请参阅排查连接问题

    屏幕截图显示了消耗工作流和名为生成架构的 SAP 托管操作。

  4. 生成架构操作中,通过在 SAP 服务器上选择可用的 SAP 操作提供指向要为其生成架构的项目的路径。

    1. 在“正文 ActionUri”参数的编辑框中,选择文件夹图标。 从打开的列表中,选择“BAPI”、“IDOC”、“RFC”或 “TRFC”。 此示例选择了“IDOC”。 如果选择其他类型,则可用的 SAP 操作会根据你的选择而更改。

      备注

      如果收到 Bad Gateway (500) 错误或 Bad request (400) 错误,请参阅 500 Bad Gateway 或 400 Bad request 错误

      屏幕截图显示了消耗工作流、生成架构操作,以及选择“IDOC”。

    2. 使用箭头浏览 SAP 操作类型文件夹,以查找并选择要使用的 SAP 操作。

      此示例选择了“ORDERS”>“ORDERS05”>“720”>“发送”。

      屏幕截图显示了消耗工作流、生成架构操作,以及查找 Orders 操作。

      如果找不到所需的操作,可以手动输入路径,例如:

      屏幕截图显示了消耗工作流和手动输入 SAP 操作的路径。

      提示

      对于正文 ActionUri 参数,可以使用表达式编辑器提供参数值。 这样,可以对不同的消息类型使用相同的 SAP 操作。

      有关 SAP 操作的详细信息,请参阅 IDoc 操作的消息架构

    3. 要为多个项目生成架构,请在“正文 ActionUri”中选择“添加新项目”。

      屏幕截图显示选择用于添加新项目的选项。

    4. 为每个项目提供要用于架构生成的 SAP 操作,例如:

      屏幕截图显示要用于生成多个架构的多个 SAP 操作。

  5. 保存工作流。 在设计器工具栏上选择“保存”。

测试工作流以生成架构

根据你在多租户 Azure 逻辑应用中具有消耗工作流还是在单租户 Azure 逻辑应用中具有标准工作流,执行相应的步骤:

  1. 如果尚未启用消耗逻辑应用资源,请在逻辑应用菜单中选择“概述”。 在工具栏中选择“启用”。

  2. 在设计器工具栏中选择“运行”>“运行”以手动启动工作流。

  3. 若要模拟 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>
    
  4. 发送 HTTP 请求之后,等待工作流返回响应。

    备注

    如果未在请求超时限制所规定的时间内完成响应所需的所有步骤,则工作流可能已超时。 如果发生这种情况,请求可能会被阻止。 为帮助诊断问题,请了解如何检查和监视逻辑应用工作流

  5. 在逻辑应用的“概述”窗格的“运行历史记录”下,查找并打开工作流运行。

  6. 查找“生成架构”操作,并查看操作的输出。

    输出中会显示适用于指定消息的生成的架构。

有关查看工作流运行历史记录的详细信息,请参阅监视逻辑应用工作流

将架构上传到集成帐户

也可以选择下载或将生成的架构存储在集成帐户等存储库,或存储在 Blob 容器中,例如 Azure 存储账户。 集成帐户为 Azure 逻辑应用中的工作流提供一流的 XML 操作体验。 通过使用名为“创建或更新资源”的 Azure 资源管理器操作,可以选择将生成的架构上传到生成这些架构的同一工作流中的现有集成帐户。

注意

架构使用 base64 编码格式。 若要将架构上传到集成帐户,必须先使用 base64ToString() 函数将架构解码。 以下示例显示了 properties 元素的代码:

"properties": {
   "Content": "@base64ToString(items('For_each')?['Content'])",
   "ContentType": "application/xml",
   "SchemaType": "Xml"
}

对于此任务,如果还没有集成帐户,则需要创建一个。 根据你是在多租户 Azure 逻辑应用中拥有消耗工作流,还是在单租户 Azure 逻辑应用中拥有标准工作流,在架构生成后,按照相应的步骤将架构从工作流上传到集成帐户。

  1. 在工作流设计器中名为“生成架构”的 SAP 托管操作下,选择“新步骤”。

  2. 按照这些常规步骤查找并添加名为“创建或更新资源”的 Azure 资源管理器托管操作。 如果系统提示使用凭据登录,请继续。

    Azure 逻辑应用设置并测试连接后,将显示操作信息框。

    屏幕截图显示了消耗工作流,以及名为“创建或更新资源”的 Azure 资源管理器操作。

  3. 在“创建或更新资源”操作中,提供所需的信息

    1. 要在工作流中包含前面步骤的任何输出,请在要包含输出的参数内选择,打开动态内容列表,然后选择要包括的输出。

    2. 从“添加新参数”列表选择“位置”和“属性”参数。

    3. 为这些添加的参数提供值,例如:

      屏幕截图显示了消耗工作流,以及带有名为“位置”和“属性”的新增参数的 Azure 资源管理器操作。

    生成架构操作可将架构生成为集合,因此设计器可自动围绕 Azure 资源管理器添加“For each”循环,例如:

    屏幕截图显示了消耗工作流,以及带有包含的 Azure 资源管理器操作的 for each 循环。

  4. 保存工作流。 在设计器工具栏上选择“保存”。

测试工作流

  1. 根据你所拥有的消耗或标准逻辑应用工作流,执行常规步骤以手动测试和运行工作流

  2. 成功运行后,转到集成帐户,并检查生成的架构是否存在。

示例 XML 架构

如果要了解如何生成创建示例文档时使用的 XML 架构,请参阅以下示例。 这些示例演示了如何使用多种类型的有效负载,包括:

可以使用可选的 XML prolog 开始 XML 架构。 SAP 连接器可以使用 XML prolog,也可以不使用。

<?xml version="1.0" encoding="utf-8">

RFC 请求的 XML 示例

以下示例显示了其中 RFC 名称为 STFC_CONNECTION 的基本 RFC 调用。 此请求使用名为 xmlns= 的默认命名空间。 但你可以分配和使用命名空间别名,例如 xmmlns: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 数据类型 byteXString 的二进制数组进行编码。 二进制数组采用 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 的组父节点和多个子节点,包括 E2EDKT1002E2EDKT2001

<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>

后续步骤