65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Microsoft BizTalk Server 与 SAP 基础设施进行 B2B 集成

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.14/5 (4投票s)

2004 年 11 月 19 日

CPOL

13分钟阅读

viewsIcon

69700

SAP - BizTalk 集成

主题

  • 摘要
  • 目标
  • 业务场景
  • 环境
  • 文档流
  • 集成步骤
  • .NET 支持
  • 摘要

摘要

在过去的几年里,开展业务的整个视角已经转向为市场营销、销售和制造运营等关键领域实施企业资源规划系统。如今,大多数与全球主要市场打交道的组织都严重依赖这些关键领域。

任何组织的运营系统都可以通过其全球营销团队以及制造和分销技术网络来实现。为了向客户提供真实的信息,这些系统中的每一个都需要作为更大企业的一部分进行集成。这最终会提高整个企业的效率,提供更可靠的信息和更好的客户服务。本文将探讨 Biztalk Server 和企业资源规划系统的集成,以及它们集成和在当前电子商务场景中的作用的必要性。

目标

为了实现成功的业务关系,客户和合作伙伴需要在不同的层面上进行沟通。为了实现这种沟通,需要集成各种系统,这有助于评估和开发 B2B 集成能力和电子商务战略。这提高了其业务信息的质量,从而缩短了交付时间、降低了成本,并为客户提供更高水平的整体服务。

为了提供 B2B 功能,需要提供对业务应用程序数据的访问,使合作伙伴能够执行全球业务交易。面对全球范围内的内部集成和企业间(B2B)挑战,组织需要寻找解决方案。为了集成基于核心 ERP 的全球营销、制造和分销设施以及各种信息系统,组织需要提出集成技术产品和集成服务能力的战略部署。

业务场景

现在以 ABC 制造公司为例:其成功在于其遍布欧洲的强大贸易关系。该公司认识到需要比以往更快、更高效地处理订单来加强这些关系。该公司需要一个新平台,该平台能够集成来自多个国家的订单,接受多种货币的付款,并根据每个国家的标准转换测量单位。现在,ABC 的电子商务战略的底线是加快订单处理速度。为了实现这一点:最基本的需求是消除重复收集数据和使用无效数据。通过使用更少的纸张,ABC 将降低处理成本并加快信息流。考虑到这一长期目标,ABC 制造公司现在可以考虑将其四个关键国家集成到一个新的企业间(B2B)平台中。

这里是 XYZ 营销公司的另一个例子。用户访问该公司的网站,为其全球数千名客户探索各种产品。现在,该公司一直认为,如果他们能够更有效地集成客户的后端系统,他们就能为客户提供更大的利益。通过这种集成,客户可以享受到高效电子商务网站的优势,用户可以在网站上下单,订单可以从网站顺畅地流向客户的订单录入系统。其中一些后端订单录入系统是基于市场上最新、最复杂的企业资源规划(ERP)系统构建的,而另一些则基于从未升级过的旧系统构建。不同的客户需要以不同的方式格式化信息,但 XYZ 没有优雅的方法来转换从网站传出的信息以满足客户的需求。通过传统方法:对于网站上的每个新电子商务客户,XYZ 的员工需要花费大量时间创建转换应用程序来促进信息交换。但通过更好的方法:XYZ 需要一个健壮的消息传递解决方案,该解决方案能够提供灵活性和敏捷性,以快速有效地满足各种客户需求。现在 XYZ 可以再次考虑通过企业间(B2B)平台集成客户后端系统。

环境

许多大型组织都将集中式的 SAP 环境作为其核心企业资源规划(ERP)系统。SAP 系统用于管理和处理所有全球业务流程和实践。B2B 集成主要依赖于异步消息传递、电子数据交换(EDI)和 XML 文档转换机制,以促进任何 ERP 系统与其他应用程序(包括遗留系统)之间的信息转换和交换。

对于业务文档的路由、转换和跟踪,现有的 SAP-XML/EDI 技术路线图需要 XML 服务引擎。这将允许开发从 SAP 到 SAP 以及从 SAP 到其他系统的复杂映射集,以满足内部和外部的 XML/EDI 技术和业务战略。Microsoft BizTalk Server 是处理数据交换和映射要求的最佳选择。BizTalk Server 在企业间平台中拥有最全面的开发和管理支持。Microsoft BizTalk Server 和 BizTalk XML Framework 2.0 结合 Simple Object Access Protocol (SOAP) 1.1 版本,提供了精确的消息传递解决方案,以经济高效的方式促进集成。

文档流

各位,现在我们来看看使用 BizTalk Server 从源系统到客户目标系统的实际文档流。当创建一个文档时,它会被发送到一个基于 TCP/IP 的应用程序链接和启用(ALE)端口——一个用于 XML 转换的基于 BizTalk 的接收函数。然后,文档会将 XML 传递给作为 BizTalk 应用程序集成组件(AIC)运行的处理脚本(VBScript)。*下图显示了 BizTalk Server 如何充当位于两个不同组织中的应用程序之间的中心:*

使用 BizTalk Mapper 生成的 Extensible Stylesheet Language Transformations (XSLT) 将数据序列化为客户/供应商 XML 格式,该 XSLT 通过 BizTalk 通道生成。XML 文档使用同步 Hypertext Transfer Protocol Secure (HTTPS) 或客户指定的其他请求的传输协议(如 Simple Mail Transfer Protocol (SMTP))发送。

下图显示了 XML 文档转换的步骤

所有序列化的 XML 结果被传回作为 BizTalk AIC 运行的处理脚本。然后创建一个 XML“回执”文档,并将其提交到另一个 BizTalk 通道,该通道将 XML 状态文档序列化为 SAP IDOC 状态消息。最后,使用编译的 C++/VB 程序触发一个远程函数调用(RFC)到 SAP 实例/客户端,以更新 SAP IDOC 状态记录。实现了完整的文档对账循环。如果状态不成功,则会创建一个电子邮件消息并发送给负责客户/供应商业务 XML/EDI 交易的支持团队之一,以便解决冲突。所有这些都在 SAP 和 BizTalk 之间完全事件驱动的基础设施中即时发生。

集成步骤

在接下来的集成讨论中,我们将讨论一个非常流行的订单录入和跟踪场景。以下各节描述了将订单信息从订单处理管道组件传输到 SAP/R3 应用程序以及从 SAP/R3 应用程序接收订单状态更新信息所需的高级步骤。

AFS 采购订单接收与 SAP 的集成使用 BizTalk Adapter for SAP (BTS-SAP) 实现。IDOC 处理程序由 BizTalk Adapter 使用,为将 tRFC(事务性远程函数调用)桥接到 MSMQ DTC(分布式事务协调器)提供事务支持。IDOC 处理程序是一个 COM 对象,它处理从 SAP 通过 Com4ABAP 服务发送的 IDOC 文档,并确保它们成功到达适当的 MSMQ 目标。该处理程序支持 SAP tRFC 协议定义的方法。当将采购订单接收与 SAP/R3 应用程序集成时,BizTalk Server (BTS) 提供转换和消息传递功能,而 BizTalk Adapter for SAP 提供传输和路由功能。

以下两个顺序步骤说明了整个集成过程

  • 采购订单接收集成
  • 订单状态更新集成

采购订单接收集成

  1. 假设在订单处理管道中添加了一个新的管道组件。该组件创建一个等同于通过管道传递的 OrderForm 对象的 XML 文档。此 XML 采购订单采用 Commerce Server Order XML v1.0 格式,创建后,将发送到一个为此目的创建的特殊 Microsoft Message Queue (MSMQ) 队列。

    将订单从管道写入 MSMQ>

    将订单数据发送到 SAP/R3 应用程序的第一步是构建一个新的管道组件,在订单处理管道中运行。该组件必须执行以下两项任务:

    A] 创建正在通过订单处理管道的 OrderForm 对象的 XML 格式副本。使用 DictionaryXMLTransforms 对象的 GenerateXMLForDictionaryUsingSchema 方法创建副本。

    Private Function IPipelineComponent_Execute(ByVal objOrderForm As Object, _
    	ByVal objContext As Object, ByVal lFlags As Long) As Long
    
    On Error GoTo ERROR_Execute
    
    Dim oXMLTransforms As Object
    Dim oXMLSchema As Object
    Dim oOrderFormXML As Object
    
    ' Return 1 for Success.
    IPipelineComponent_Execute = 1
    
    ' Create a DictionaryXMLTransforms object.
    Set oXMLTransforms = CreateObject("Commerce.DictionaryXMLTransforms")
    
    ' Create a PO schema object.
    Set oXMLSchema = oXMLTransforms.GetXMLFromFile(sSchemaLocation)
    
    ' Create an XML version of the order form.
    Set oOrderFormXML = oXMLTransforms.GenerateXMLForDictionaryUsingSchema_
    	(objOrderForm, oXMLSchema)
    
    WritePO2MSMQ sQueueName, oOrderFormXML.xml, PO_TO_ERP_QUEUE_LABEL, _
    	sBTSServerName, AFS_PO_MAXTIMETOREACHQUEUE
    
    Exit Function
    
    ERROR_Execute:
    App.LogEvent "QueuePO.CQueuePO -> Execute Error: " & _
    vbCrLf & Err.Description, vbLogEventTypeError
    
    ' Set warning level.
    IPipelineComponent_Execute = 2
    Resume Next
    
    End Function

    B] 将新创建的 XML 订单文档发送到为此目的定义的 MSMQ 队列。

    Option Explicit
    
    ' MSMQ constants.
    
    ' Access modes.
    Const MQ_RECEIVE_ACCESS = 1
    Const MQ_SEND_ACCESS = 2
    Const MQ_PEEK_ACCESS = 32
    
    ' Sharing modes. Const MQ_DENY_NONE = 0
    Const MQ_DENY_RECEIVE_SHARE = 1
    
    ' Transaction options. Const MQ_NO_TRANSACTION = 0
    Const MQ_MTS_TRANSACTION = 1
    Const MQ_XA_TRANSACTION = 2
    Const MQ_SINGLE_MESSAGE = 3
    
    ' Error messages.
    Const MQ_ERROR_QUEUE_NOT_EXIST = -1072824317
    
    ' MQ Message ACKNOWLEDGEMENT.
    Const MQMSG_ACKNOWLEDGMENT_FULL_REACH_QUEUE = 5
    Const MQMSG_ACKNOWLEDGMENT_FULL_RECEIVE = 14
    Const DEFAULT_MAX_TIME_TO_REACH_QUEUE = 20
    ' MQ Message ACKNOWLEDGEMENT.
    Const MQMSG_ACKNOWLEDGMENT_FULL_REACH_QUEUE = 5
    Const MQMSG_ACKNOWLEDGMENT_FULL_RECEIVE = 14
    
    Function WritePO2MSMQ(sQueueName As String, sMsgBody As String, _
    	sMsgLabel As String, sServerName As String, _
    	Optional MaxTimeToReachQueue As Variant) As Long
    
    Dim lMaxTime As Long
    
    If IsMissing(MaxTimeToReachQueue) Then
    lMaxTime = DEFAULT_MAX_TIME_TO_REACH_QUEUE
    Else
    lMaxTime = MaxTimeToReachQueue
    End If
    
    Dim objQueueInfo As MSMQ.MSMQQueueInfo
    Dim objQueue As MSMQ.MSMQQueue, objAdminQueue As MSMQ.MSMQQueue
    Dim objQueueMsg As MSMQ.MSMQMessage
    
    On Error GoTo MSMQ_Error
    
    Set objQueueInfo = New MSMQ.MSMQQueueInfo
    objQueueInfo.FormatName = "DIRECT=OS:" & sServerName & "\PRIVATE$\" & sQueueName
    
    Set objQueue = objQueueInfo.Open(MQ_SEND_ACCESS, MQ_DENY_NONE)
    
    Set objQueueMsg = New MSMQ.MSMQMessage
    
    objQueueMsg.Label = sMsgLabel ' Set the message label property
    objQueueMsg.Body = sMsgBody ' Set the message body property
    objQueueMsg.Ack = MQMSG_ACKNOWLEDGMENT_FULL_REACH_QUEUE
    objQueueMsg.MaxTimeToReachQueue = lMaxTime
    
    objQueueMsg.send objQueue, MQ_SINGLE_MESSAGE
    
    objQueue.Close
    
    On Error Resume Next
    Set objQueueMsg = Nothing
    Set objQueue = Nothing
    Set objQueueInfo = Nothing
    
    Exit Function
    
    MSMQ_Error:
    App.LogEvent "Error in WritePO2MSMQ: " & Error
    Resume Next
    
    End Function
    
  2. BTS MSMQ 接收函数从 MSMQ 队列中拾取文档,并将其发送到一个已为此目的配置的 BTS 通道。从 MSMQ 接收 XML 订单:将订单数据发送到 SAP/R3 应用程序的第二步涉及 BTS 将订单数据从其在第一步末尾放置的 MSMQ 队列中接收。您必须配置一个 BTS MSMQ 接收函数来监视上一步中 XML 订单被发送到的 MSMQ 队列。此接收函数会将 XML 消息转发到配置的 BTS 通道进行转换。
  3. 将订单数据发送到 SAP/R3 应用程序的第三步涉及 BTS 将订单数据从 Commerce Server Order XML v1.0 格式转换为 ORDERS01 IDOC 格式。必须配置一个 BTS 通道来执行此转换。转换完成后,BTS 通道会将生成的 ORDERS01 IDOC 消息发送到相应的 BTS 消息端口。BTS 消息端口配置为将转换后的消息发送到名为 840 Queue 的 MSMQ 队列。一旦消息放入此队列,BizTalk Adapter for SAP 将负责进一步处理。
  4. BizTalk Adapter for SAP 将 ORDERS01 文档发送到 DCOM Connector(更多关于 DCOM Connector 的信息请访问 www.sap.com/bapi),该连接器将订单写入 SAP/R3 应用程序。DCOM Connector 是一个 SAP 软件产品,它提供了一个向 SAP 系统发送数据和从 SAP 系统接收数据的机制。当 IDOC 消息放入 840 Queue 时,DOM Connector 会检索消息并将其发送到 SAP 进行处理。虽然此处理属于 BizTalk Adapter for SAP 的领域,但在此回顾相关步骤作为背景信息:
    • 确定正在使用的 IDOC 架构版本并生成 BizTalk Server 文档规范。
    • 根据 IDOC 架构的控制记录内容创建路由键。
    • 根据构建的路由键从 Manager Data Store 请求 SAP Destination。
    • 使用 DCOM Connector 4.6D Submit 功能将 IDOC 消息提交到 SAP 系统。

订单状态更新集成

可以通过提供一种机制,将 SAP/R3 应用程序内进行的更新信息发送回 Commerce Server 订单系统,来实现订单状态更新集成。

以下一系列步骤描述了这样的机制:

  1. BizTalk Adapter for SAP 处理
    在用户使用 SAP 客户端更新采购订单并将 IDOC 提交到相应的 tRFC 端口后,BizTalk Adapter for SAP 使用 DCOM 连接器将结果信息发送到 840 Queue,打包为 ORDERS01 IDOC 消息。840 Queue 是一个 MSMQ 队列,BizTalk Adapter for SAP 将 IDOC 消息放入其中,以便相关方检索和处理。此过程属于 BizTalk Adapter for SAP 的领域,并用于此解决方案以实现订单更新集成。
  2. 从 MSMQ 接收 ORDERS01 IDOC 消息
    从 SAP/R3 应用程序更新订单状态的第二步涉及 BTS 从 MSMQ 队列(840 Queue)接收 ORDERS01 IDOC 消息,该消息是在第一步的末尾放入其中的。您必须配置一个 BTS MSMQ 接收函数来监视将 XML 订单状态消息放入其中的 840 Queue。此接收函数必须配置为将 XML 消息转发到配置的 BTS 通道进行转换。
  3. 将订单更新从 IDOC 格式转换
    使用 BTS MSMQ 接收函数,检索文档并将其传递给 BTS 转换通道。BTS 通道会将 ORDERS01 IDOC 消息转换为 Commerce Server Order XML v1.0 格式,然后将其转发到相应的 BTS 消息端口。您必须配置一个 BTS 通道来执行此转换。

    以下 BizTalk Server (BTS) 映射展示了该解决方案的原型,用于将 SAP ORDERS01 IDOC 消息转换为 Commerce Server Order XML v1.0 格式的 XML 文档。它允许 SAP/R3 应用程序中的订单更改反映在 Commerce Server 订单数据库中。

    原型中使用的此映射仅映射订单 ID,演示了 SAP/R3 应用程序中的订单如何与 Commerce Server 订单数据库同步。其他字段的映射特定于特定实现,并且未在原型中进行。

    < xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' 
    xmlns:msxsl='urn:schemas-microsoft-com:xslt' xmlns:var='urn:var' 
    xmlns:user='urn:user' exclude-result-prefixes='msxsl var user' 
    version='1.0'>
    < xsl:output method='xml' omit-xml-declaration='yes' />
    < xsl:template match='/'>
    < xsl:apply-templates select='ORDERS01'/>
    < /xsl:template>
    < xsl:template match='ORDERS01'>
    < orderform>
    
    'Connection from source node "BELNR" to destination node "OrderID"
    
    < xsl:if test='E2EDK02/@BELNR'>
    < xsl:attribute name='OrderID'>
    ; < xsl:value-of select='E2EDK02/@BELNR'/>
    < /xsl:attribute>
    < /xsl:if>
    < /orderform>
    < /xsl:template>
    < /xsl:stylesheet>

    BTS 消息端口将转换后的订单更新文档发布到配置的 ASP 页面以进行进一步处理。配置的 ASP 页面检索发布给它的消息,并使用 Commerce Server OrderGroupManager 和 OrderGroup 对象来更新 Commerce Server 订单数据库中的订单状态信息。

  4. 更新 Commerce Server 订单系统
    从 SAP/R3 应用程序更新订单状态的第四步涉及更新 Commerce Server 订单系统以反映状态更改。这是通过将页面 _OrderStatusUpdate.asp 添加到 AFS Solution Site 并配置 BTS 消息端口将转换后的 XML 文档发布到该页面来实现的。更新是使用 Commerce Server OrderGroupManager 和 OrderGroup 对象执行的。

ProcessOrderStatus 例程是页面中的主要例程。它使用 DOM 和 XPath 提取足够的信息,使用 OrderGroupManager 对象查找相应的订单。一旦找到正确的订单,它就会被加载到 OrderGroup 对象中,以便可以根据需要更新 OrderGroup 对象中的任何条目。

以下代码实现了页面 _OrderStatusUpdate.asp

< %@ Language=VBScript %>

< % 
const TEMPORARY_FOLDER = 2

call Main()

Sub Main()
call ProcessOrderStatus( ParseRequestForm() )
End Sub

Sub ProcessOrderStatus(sDocument)

Dim oOrderGroupMgr 
Dim oOrderGroup 
Dim rs
Dim sPONum
Dim oAttr 
Dim vResult
Dim vTracking 
Dim oXML
Dim dictConfig
Dim oElement

Set oOrderGroupMgr = Server.CreateObject("CS_Req.OrderGroupManager")
Set oOrderGroup = Server.CreateObject("CS_Req.OrderGroup")

Set oXML = Server.CreateObject("MSXML.DOMDocument")
oXML.async = False

If oXML.loadXML (sDocument) Then

' Get the orderform element.
Set oElement = oXML.selectSingleNode("/orderform")

' Get the poNum.
sPONum = oElement.getAttribute("OrderID")

Set dictConfig = Application("MSCSAppConfig").GetOptionsDictionary("")

' Use ordergroupmgr to find the order by OrderID.
oOrderGroupMgr.Initialize (dictConfig.s_CatalogConnectionString)
Set rs = oOrderGroupMgr.Find(Array("order_requisition_number='" sPONum & "'"), _
	Array(""), Array(""))

If rs.EOF And rs.BOF Then
'Create a new one. - Not implemented in this version.
Else
' Edit the current one.
oOrderGroup.Initialize dictConfig.s_CatalogConnectionString, rs("User_ID")

' Load the found order.
oOrderGroup.LoadOrder rs("ordergroup_id")

' For the purposes of prototype, we only update the status
oOrderGroup.Value.order_status_code = 2 ' 2 = Saved order

' Save it
vResult = oOrderGroup.SaveAsOrder(vTracking)

End If
Else
WriteError "Unable to load received XML into DOM."
End If

End Sub Function ParseRequestForm()

Dim PostedDocument
Dim ContentType
Dim CharSet
Dim EntityBody
Dim Stream
Dim StartPos
Dim EndPos

ContentType = Request.ServerVariables( "CONTENT_TYPE" )

' Determine request entity body character set (default to us-ascii).
CharSet = "us-ascii"
StartPos = InStr( 1, ContentType, "CharSet=""", 1)
If (StartPos > 0 ) then
StartPos = StartPos + Len("CharSet=""")
EndPos = InStr( StartPos, ContentType, """",1 )
CharSet = Mid (ContentType, StartPos, EndPos - StartPos )
End If

' Check for multipart MIME message.
PostedDocument = ""

if ( ContentType = "" or Request.TotalBytes = 0) then

' Content-Type is required as well as an entity body.
Response.Status = "406 Not Acceptable"
Response.Write "Content-type or Entity body is missing" & VbCrlf
Response.Write "Message headers follow below:" & VbCrlf
Response.Write Request.ServerVariables("ALL_RAW") & VbCrlf
Response.End
Else
If ( InStr( 1,ContentType,"multipart/" ) > 0 ) then

' MIME multipart message. Build MIME header.
PostedDocument = "MIME-Version: 1.0" & vbCrLf & _
"Content-Type: " & ContentType & vbCrLf & _
vbCrLf
PostedDocument = PostedDocument & _
"This is a multi-part message in MIME 
format." & _
vbCrLf
End If

' Get the post entity body.
EntityBody = Request.BinaryRead (Request.TotalBytes )

' Convert to UNICODE.
Set Stream = Server.CreateObject("AdoDB.Stream")
Stream.Type = 1 ' adTypeBinary
stream.Open
Stream.Write EntityBody
Stream.Position = 0
Stream.Type = 2 ' adTypeText
Stream.Charset = CharSet
PostedDocument = PostedDocument & Stream.ReadText
Stream.Close
Set Stream = Nothing
End If

ParseRequestForm = PostedDocument

End Function

Sub WriteError(byVal sFriendlyError)
dim oEventLog
set oEventLog = Server.CreateObject("Commerce.AdminEventLog")
oEventLog.WriteErrorEvent "_OrderStatusUpdate.asp", sFriendlyError
End Sub

%> 

.NET 支持

此多层应用程序环境可以通过利用 Microsoft .NET Enterprise Server 模型进行 Web 门户的帮助成功实施。Microsoft BizTalk Server Toolkit for Microsoft .NET 提供了利用 XML Web 服务和 Visual Studio .NET 的强大功能来构建动态的、事务性的、容错的系统,并具有对现有应用程序的完全访问权限。

摘要

Microsoft BizTalk Server 可以帮助组织快速建立和管理与其他组织的 Internet 关系。它使他们能够自动化与任何其他组织进行文档交换,而不论其使用的转换要求和数据格式如何。这为集成大型企业资源规划系统中的业务流程提供了一种经济高效的方法。集成过程旨在促进协作式电子商务业务流程。该过程包括文档交换引擎、业务流程执行引擎以及一组业务文档和服务器管理工具。此外,还提供了业务文档编辑器和映射器工具,用于管理交易伙伴关系、管理服务器群集和跟踪事务。

参考文献

历史

  • 2004 年 11 月 19 日:首次发布
© . All rights reserved.