使用 WCF 服務模型將IDOC 傳送至 SAP
在內部,Microsoft BizTalk Adapter for mySAP Business Suite 會叫用下列其中一個 RFC,將IDOC 傳送至 SAP 系統:
第 3 版IDOC IDOC_INBOUND_ASYNCHRONOUS。
第 2 版IDOC INBOUND_IDOC_PROCESS。
您可以叫用適當的 RFC (或 tRFC) ,將 IDOC 傳送至配接器;不過,您也可以使用下列兩個作業,將IDOC 傳送至配接器:
SendIdoc 會直接呈現在 IDOC 根節點底下。 SendIdoc 作業會將 IDOC 當做字串 (弱型別) 資料傳送至 SAP 配接器。
傳送 會針對每個 IDOC 個別呈現。 傳送作業會將 IDOC 當作強型別資料傳送至 SAP 配接器。
這些作業會決定如何將 IDOC 資料傳送至配接器,而不是傳送至 SAP 系統的方式。 配接器一律會使用適當的 tRFC 將 IDOC 傳送至 SAP 系統。
因為 SAP 配接器會將 IDOC 傳送為 tRFC,所以 Send 和 SendIdoc 作業都會公開 GUID 參數,讓您用來確認 (認可) IDOC。 SAP 配接器會在內部使用與 tRFC 相關聯的 SAP 交易識別碼 (TID) 對應此 GUID。 您可以使用下列兩種方式之一來確認 IDOC:
使用 AutoConfirmSentIdocs 系結屬性。 如果這個系結屬性設定為 true,配接器會自動確認用來傳送 IDOC 的 tRFC。
藉由叫用 RfcConfirmTransID。 您可以使用與 IDOC 相關聯的 GUID 叫用此作業。
下列各節說明如何使用 SendIdoc 和 Send 作業,將IDOC 傳送至 SAP 系統。 如需協助您以 tRFC 的形式傳送 IDOC 的詳細資訊,請參閱 使用 WCF 服務模型在 SAP 中叫用 tRFC。
WCF 用戶端類別
SendIdoc 作業
SAP 配接器會顯示單一作業 (和服務合約,) 以字串格式傳送 IDOC。 服務合約的名稱為 「Idoc」,WCF 用戶端類別為 IdocClient。
您可以使用此用戶端將任何 IDOC 傳送至 SAP。 它包含採用兩個參數的單一方法 SendIdoc:
idocData 是包含 IDOC 資料的字串
guid 是對應至 SAP TID 的 GUID。
下列程式碼顯示針對 SendIdoc 作業產生的 WCF 用戶端。
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class IdocClient : System.ServiceModel.ClientBase<Idoc>, Idoc {
public void SendIdoc(string idocData, ref System.Nullable\<System.Guid\> guid) {…}
}
傳送作業
因為傳送作業使用強型別的資料,所以 SAP 配接器會針對每個 IDOC 呈現唯一的服務合約。 針對此合約產生的介面名稱 (和 WCF 用戶端類別) 是根據 IDOC 類型、版本、版本號碼,以及 CIM 類型 (相關) 。 例如,ORDERS03.v3.620 IDOC,介面名為 「IdocORDERS03V3R620」,而 WCF 用戶端類別為 IdocORDERS03V3R620Client。
您必須為每個不同類型的 IDOC 產生唯一用戶端。 此用戶端包含採用兩個參數的單一方法 Send:
idocData 是代表強型別 IDOC 資料的類別。
guid 是對應至 SAP TID 之 GUID 的字串表示。
下列程式碼顯示針對 ORDERS03.v3.620 IDOC 所呈現之傳送作業所產生的 WCF 用戶端。
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class IdocORDERS03V3R620Client : System.ServiceModel.ClientBase<IdocORDERS03V3R620>, IdocORDERS03V3R620 {
...
public void Send(ORDERS03 idocData, ref string guid) { ... }
}
如何建立應用程式以傳送IDOC
若要將 IDOC 傳送至 SAP 系統,請執行下列步驟。
將 IDOC 傳送至 SAP 系統
產生 WCF 用戶端類別。 使用 [新增配接器服務參考 Visual Studio 外掛程式] 或 ServiceModel 中繼資料公用程式工具 (svcutil.exe) ,產生以您想要運作之 IDOC 為目標的 WCF 用戶端類別。 如需如何產生 WCF 用戶端的詳細資訊,請參閱 產生 WCF 用戶端或 SAP 解決方案成品的 WCF 服務合約。 如果您想要明確確認IDOC,請確定您為 RfcConfirmTransID 作業產生 WCF 用戶端。 您可以在下列節點下找到作業:
SendIdoc 作業。 直接在 IDOC 節點下。
傳送作業。 在對應至目標 IDOC 之型別、版本和版本號碼的節點下。
RfcConfirmTransID 作業。 直接在 TRFC 節點下。
建立步驟 1 中產生的 WCF 用戶端類別實例,並指定用戶端系結。 指定用戶端系結牽涉到指定 WCF 用戶端將使用的系結和端點位址。 您可以在程式碼中以命令方式執行此動作,或在組態中以宣告方式執行此動作。 如需如何指定用戶端系結的詳細資訊,請參閱 設定 SAP 系統的用戶端系結。 下列程式碼會從組態初始化 Send 作業) 的 IdocClient (,並設定 SAP 系統的認證。
SAPBinding binding = new SAPBinding(); // Set endpoint address EndpointAddress endpointAddress = new EndpointAddress("sap://CLIENT=800;LANG=EN;@a/YourSAPHost/00?RfcSdkTrace=False&AbapDebug=False&UseSapGui=Without"); // Create client and set credentials idocClient = new IdocClient(binding, endpointAddress); idocClient.ClientCredentials.UserName.UserName = "YourUserName"; idocClient.ClientCredentials.UserName.Password = "YourPassword";;
如果您想要配接器在傳送 IDOC 之後確認 SAP 系統上的 tRFC,請將 AutoConfirmSentIdocs 系結屬性設定為 true。 在開啟 WCF 用戶端之前,您必須先執行此動作。
// Set AutoConfirmSentIdocs property to true binding.AutoConfirmSentIdocs = true;
開啟 WCF 用戶端。
idocClient.Open();
在步驟 2 中建立的 WCF 用戶端上叫用適當的方法,以將 IDOC 傳送至 SAP 系統。 您可以傳遞包含 GUID 的變數,或針對guid參數設定為null的變數。 如果您未指定 GUID,SAP 配接器會產生作業的 GUID (guid 是 ref 參數) 。 下列程式碼會從檔案讀取字串格式的 IDOC () ,並使用 SendIdoc 作業將其傳送至 SAP 系統。
// Read IDOC into string variable using (StreamReader reader = new StreamReader("ORDERS03.txt")) { idocData = reader.ReadToEnd(); } //Get a new GUID to pass to SendIdoc. You can also assign a null //value to have the adapter generate a GUID. adapterTxGuid = Guid.NewGuid(); //Invoke SendIdoc on the client to send the IDOC to the SAP system idocClient.SendIdoc(idocData, ref adapterTxGuid);
如果您未將 AutoConfirmSentIdocs 系結屬性設定為 true (步驟 3) ,則必須確認 SAP 系統上的 tRFC。 若要這樣做,您必須在TrfcClient建立 (上叫用RfcConfirmTransID方法,而不會顯示) 。 為 參數指定步驟 4 中所傳回的 GUID。
trfcClient.RfcConfirmTransID(adapterTxGuid);
關閉 WCF 用戶端 (和 TrfcClient,如果您在完成傳送IDOC) 之後, (使用它時使用) 。
idocClient.Close();
範例
下列範例會使用 SendIdoc 方法,將 IDOC 傳送至 SAP 系統。 IDOC 會從檔案讀取,ORDERS03.txt。 此檔案包含ORDERS03。V3.620 IDOC,並隨附于範例中;不過,SendIdoc 作業可用來傳送任何 IDOC。
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
// Add WCF, WCF LOB Adapter SDK, and SAP adapter namepaces
using System.ServiceModel;
using Microsoft.Adapters.SAP;
using Microsoft.ServiceModel.Channels;
// Include this namespace for WCF LOB Adapter SDK and SAP exceptions
using Microsoft.ServiceModel.Channels.Common;
// This example sends a flat IDOC to the SAP system by using the SendIdoc operation.
namespace SapIdocStringClientSM
{
class Program
{
static void Main(string[] args)
{
// variable for the IDOC client
IdocClient idocClient = null;
Console.WriteLine("IDOC string client sample started");
try
{
// Variable for the GUID
System.Nullable<System.Guid> adapterTxGuid;
// string to hold the Idoc data
string idocData;
// string to hold the SAP transaction ID (TID)
string sapTxId;
// The client can be configured from app.config, but it is
// explicitly configured here for demonstration.
// set AutoConfirmSentIdocs property to true
SAPBinding binding = new SAPBinding();
binding.AutoConfirmSentIdocs = true;
// Set endpoint address
EndpointAddress endpointAddress = new EndpointAddress("sap://CLIENT=800;LANG=EN;@a/YourSAPServer/00?RfcSdkTrace=False&AbapDebug=False&UseSapGui=Without");
// Create client and set credentials
idocClient = new IdocClient(binding, endpointAddress);
idocClient.ClientCredentials.UserName.UserName = "YourUserName";
idocClient.ClientCredentials.UserName.Password = "YourPassword";
// Open the client and send the Idoc
idocClient.Open();
// Read IDOC into string variable
using (StreamReader reader = new StreamReader("ORDERS03.txt"))
{
idocData = reader.ReadToEnd();
}
//Get a new GUID to pass to SendIdoc. You can also assign a null.
//value to have the adapter generate a GUID.
adapterTxGuid = Guid.NewGuid();
//Invoke SendIdoc on the client to send the IDOC to the SAP system.
idocClient.SendIdoc(idocData, ref adapterTxGuid);
// The AutoConfirmSentIdocs binding property is set to true, so there is no need to
// confirm the IDOC. If this property is not set to true, you must call the
// RfcConfirmTransID method of a TrfcClient with adapterTxGuid to
// confirm the transaction on the SAP system.
// Get SAP tx id from GUID
sapTxId = SAPAdapterUtilities.ConvertGuidToTid((Guid) adapterTxGuid);
Console.WriteLine("IDOC sent");
Console.WriteLine("The SAP Transaction Id is : " + sapTxId);
catch (Exception ex)
{
Console.WriteLine("Exception is: " + ex.Message);
if (ex.InnerException != null)
{
Console.WriteLine("Inner Exception is: " + ex.InnerException.Message);
}
}
finally
{
// Close the IDOC client
if (idocClient != null)
{
if (idocClient.State == CommunicationState.Opened)
idocClient.Close();
else
idocClient.Abort();
}
}
}
}
}