使用 WCF 服務模型在 SAP 中叫用 tRFC
交易遠端函式呼叫 (tRFC) 保證 SAP 系統上的 RFC 一次性 執行。 您可以將 SAP 配接器呈現的任何 RFC 叫用為 tRFC。 在 WCF 服務模型中叫用 tRFC 類似于叫用具有下列差異的 RFC:
SAP 配接器會在與 RFC (RFC) 不同的節點底下呈現 TRFC (TRFC) 。
tRFC 用戶端呼叫不會傳回 SAP 匯出和變更參數的值。
tRFC 作業包含 GUID 參數,該參數會對應至 SAP 配接器的 TRFC (TID) 。
叫用 tRFC 之後,您必須叫用 RfcConfirmTransID 作業,以確認 (認可) SAP 系統上的 tRFC。 此作業會直接顯示在 TRFC 節點底下。
如需 tRFC 作業和 RfcConfirmTransID 作業的詳細資訊,請參閱 SAP 中 tRFC 上的作業。
下列各節說明如何使用 SAP 配接器在 SAP 系統上叫用 tRFC。
WCF 用戶端類別
SAP 配接器會顯示單一服務合約 「Trfc」 下的所有 tRFC 作業。 這表示會針對您要叫用的所有 tRFC 作業建立單一 WCF 用戶端類別 TrfcClient。 每個目標 tRFC 都會以這個類別的方法表示。 針對每個方法:
結構之類的複雜 SAP 類型會以 .NET 類別呈現,其屬性會對應至 SAP 類型的欄位。 這些類別定義于下列命名空間: microsoft.lobservices.sap._2007._03.Types.Rfc。
下列程式碼顯示 TrfcClient 類別的一部分,以及叫用BAPI_SALESORDER_CREATEFROMDAT2 (作為 SAP 系統上 tRFC) 的方法。 TransactionalRfcOperationIdentifier參數包含對應至 SAP TID 的 GUID。 並非所有方法的參數都會顯示。
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class TrfcClient : System.ServiceModel.ClientBase<Trfc>, Trfc {
....
/// <summary>The Metadata for this RFC was generated using the RFC SDK.</summary>
public void BAPI_SALESORDER_CREATEFROMDAT2(
string BEHAVE_WHEN_ERROR,
string BINARY_RELATIONSHIPTYPE,
string CONVERT,
string INT_NUMBER_ASSIGNMENT,
microsoft.lobservices.sap._2007._03.Types.Rfc.BAPISDLS LOGIC_SWITCH,
microsoft.lobservices.sap._2007._03.Types.Rfc.BAPISDHD1 ORDER_HEADER_IN,
…
microsoft.lobservices.sap._2007._03.Types.Rfc.BAPIADDR1[] PARTNERADDRESSES,
microsoft.lobservices.sap._2007._03.Types.Rfc.BAPIRET2[] RETURN,
ref System.Guid TransactionalRfcOperationIdentifier) { ... }
}
下列程式碼顯示針對 RfcConfirmTransID 作業產生的 方法。 您必須確定此方法是 TrfcClient的一部分產生。 RfcConfirmTransID 作業會直接顯示在 TRFC 節點底下。
public void RfcConfirmTransID(System.Guid TransactionalRfcOperationIdentifier) {…}
如何建立 tRFC 用戶端應用程式
建立叫用 tRFC 之應用程式的步驟與您叫用 RFC 的步驟類似,但有下列例外狀況:
您必須擷取 TRFC 節點下的目標作業。
您必須擷取 RfcConfirmTransID 作業。 這會直接顯示在 TRFC 節點底下。
若要確認 (認可) SAP 系統上的 tRFC 作業,您必須使用針對該 tRFC 作業傳回的 GUID 叫用 RfcConfirmTransID 作業。
建立 tRFC 用戶端應用程式
產生 TrfcClient 類別。 使用新增配接器服務參考 Visual Studio 外掛程式或 ServiceModel 中繼資料公用程式工具 (svcutil.exe) ,產生以您想要運作之 RFC 為目標的 TrfcClient 類別。 如需如何產生 WCF 用戶端的詳細資訊,請參閱 產生 WCF 用戶端或 SAP 解決方案成品的 WCF 服務合約。 確定 TrfcClient 類別中包含 RfcConfirmTransID 作業。
建立步驟 1 中產生的 TrfcClient 類別實例,並指定用戶端系結。 指定用戶端系結牽涉到指定 TrfcClient 將使用的系結和端點位址。 您可以在程式碼中以命令方式執行此動作,或在組態中以宣告方式執行此動作。 如需如何指定用戶端系結的詳細資訊,請參閱 設定 SAP 系統的用戶端系結。 下列程式碼會從組態初始化 TrfcClient ,並設定 SAP 系統的認證。
TrfcClient trfcClient = new TrfcClient("SAPBinding_Rfc"); trfcClient.ClientCredentials.UserName.UserName = "YourUserName"; trfcClient.ClientCredentials.UserName.Password = "YourPassword";
開啟 TrfcClient。
trfcClient.Open();
在步驟 2 中建立 的 TrfcClient 上叫用適當的方法,以叫用 SAP 系統上的目標 tRFC。 您可以傳遞包含 GUID 的變數,或包含 交易式RrcOperationIdentifier 參數的空白 GUID。 如果您傳遞空的 GUID,SAP 配接器就會為您產生一個。 下列程式碼會叫用BAPI_SALESORDER_CREATEFROMDAT2作為 SAP 系統上的 tRFC, (不會顯示方法的所有參數) 。 指定 GUID。
transactionalRfcOperationIdentifier = Guid.NewGuid(); //invoke RFC_CUSTOMER_GET as a tRFC trfcClient.BAPI_SALESORDER_CREATEFROMDAT2( request.BEHAVE_WHEN_ERROR, request.BINARY_RELATIONSHIPTYPE, request.CONVERT, ... ref transactionalRfcOperationIdentifier);
若要確認與 SAP 系統上 tRFC 相關聯的 TID,請在TrfcClient上叫用RfcConfirmTransID方法。 針對 TransactionRfcOperationIdentifier參數,指定步驟 4 中所傳回的 GUID。
trfcClient.RfcConfirmTransID(transactionalRfcOperationIdentifier);
當您完成使用 TrfcClient 之後 (叫用所有 tRFC) 之後,請關閉 TrfcClient 。
trfcClient.Close();
範例
下列範例示範如何將BAPI_SALESORDER_CREATE叫用為 tRFC。
using System;
using System.Collections.Generic;
using System.Text;
// Add WCF, the 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;
using microsoft.lobservices.sap._2007._03.Types.Rfc;
// This example demonstrates sending BAPI_SALESORDER_CREATEFROMDAT2 as a tRFC. The client has
// methods to:
// send the BAPI (BAPI_SALESORDER_CREATEFROMDAT2)and to
// Confirm the transaction (RfcConfirmTransID)
// An instance of BAPI_SALESORDER_CREATEFROMDAT2Request (generated)
// is used to format the BAPI before invoking BAPI_SALESORDER_CREATEFROMDAT2. This
// is not necessary, but is done to make it easier to read the code.
// tRFC invocations always includes a ref parameter that contains a GUID. You can optionally
// set this parameter when you invoke the method; however, you must use the value returned by
// the adapter when you call RfcConfirmTransID to confirm the transaction on the SAP system.
// You can call the utility method, SAPAdapterUtilities.ConvertGuidToTid, to get the value
// of the SAP transaction Id from the GUID that the adapter returns.
namespace SapTrfcClientSM
{
class Program
{
static void Main(string[] args)
{
TrfcClient sapTrfcClient = null;
try
{
Console.WriteLine("SAP TRFC client sample started");
Console.WriteLine("Creating the TRFC client");
// Create the SAP Trfc Client from configuration
sapTrfcClient = new TrfcClient("SAPBinding_Trfc");
sapTrfcClient.ClientCredentials.UserName.UserName = "YourUserName";
sapTrfcClient.ClientCredentials.UserName.Password = "YourPassword";
Console.WriteLine("Opening the TRFC client");
// Open the Trfc Client
sapTrfcClient.Open();
// Create a GUID -- note: this is optional. If you do not pass a GUID,
// for the TransactionalRfcOperationIdentifier parameter, the SAP adapter will
// generate one, associate it with the SAP TID, and set the
// TransactionalRfcOperationIdentifier parameter.
Guid tidGuid = Guid.NewGuid();
BAPI_SALESORDER_CREATEFROMDAT2Request request = new BAPI_SALESORDER_CREATEFROMDAT2Request();
request.ORDER_HEADER_IN = new BAPISDHD1();
request.ORDER_HEADER_IN.DOC_TYPE = "TA";
request.ORDER_HEADER_IN.SALES_ORG = "1000";
request.ORDER_HEADER_IN.DISTR_CHAN = "10";
request.ORDER_HEADER_IN.DIVISION = "00";
request.ORDER_HEADER_IN.SALES_OFF = "1000";
request.ORDER_HEADER_IN.REQ_DATE_H = DateTime.Now;
request.ORDER_HEADER_IN.PURCH_DATE = DateTime.Now;
request.ORDER_HEADER_IN.PURCH_NO_C = "Cust PO";
request.ORDER_HEADER_IN.CURRENCY = "EUR";
BAPISDITM[] orderItems = new BAPISDITM[1];
orderItems[0] = new BAPISDITM();
orderItems[0].MATERIAL = "P-109";
orderItems[0].PLANT = "1000";
orderItems[0].TARGET_QU = "ST";
request.ORDER_ITEMS_IN = orderItems;
BAPIPARNR[] orderPartners = new BAPIPARNR[1];
orderPartners[0] = new microsoft.lobservices.sap._2007._03.Types.Rfc.BAPIPARNR();
orderPartners[0].PARTN_ROLE = "AG";
orderPartners[0].PARTN_NUMB = "0000001390";
request.ORDER_PARTNERS = orderPartners;
// Create a GUID -- note: this is optional. If you do not pass a GUID,
// for the TransactionalRfcOperationIdentifier parameter, the SAP adapter will
// generate one, associate it with the SAP TID, and set the
// TransactionalRfcOperationIdentifier parameter.
request.TransactionalRfcOperationIdentifier = Guid.NewGuid();
Console.WriteLine("Invoking BAPI_SALESORDER_CREATEFROMDAT2 as a tRFC");
//invoke RFC_CUSTOMER_GET as a tRFC
sapTrfcClient.BAPI_SALESORDER_CREATEFROMDAT2(request.BEHAVE_WHEN_ERROR,
request.BINARY_RELATIONSHIPTYPE,
request.CONVERT,
request.INT_NUMBER_ASSIGNMENT,
request.LOGIC_SWITCH,
request.ORDER_HEADER_IN,
request.ORDER_HEADER_INX,
request.SALESDOCUMENTIN,
request.SENDER,
request.TESTRUN,
request.EXTENSIONIN,
request.ORDER_CCARD,
request.ORDER_CFGS_BLOB,
request.ORDER_CFGS_INST,
request.ORDER_CFGS_PART_OF,
request.ORDER_CFGS_REF,
request.ORDER_CFGS_REFINST,
request.ORDER_CFGS_VALUE,
request.ORDER_CFGS_VK,
request.ORDER_CONDITIONS_IN,
request.ORDER_CONDITIONS_INX,
request.ORDER_ITEMS_IN,
request.ORDER_ITEMS_INX,
request.ORDER_KEYS,
request.ORDER_PARTNERS,
request.ORDER_SCHEDULES_IN,
request.ORDER_SCHEDULES_INX,
request.ORDER_TEXT,
request.PARTNERADDRESSES,
request.RETURN,
ref request.TransactionalRfcOperationIdentifier);
string sapTxId = null;
sapTxId = SAPAdapterUtilities.ConvertGuidToTid(request.TransactionalRfcOperationIdentifier);
Console.WriteLine("BAPI_SALESORDER_CREATEFROMDAT2 Sent");
Console.WriteLine("The SAP Transaction Id is " + sapTxId);
// Invoke the RfcConfirmTransID method to confirm (commit) the transaction on
// the SAP system. This step is required to complete the transaction. The SAP
// adapter will always return a TranactionalRfcOperationIdentifier, whether
// one was supplied in the call or not.
sapTrfcClient.RfcConfirmTransID(request.TransactionalRfcOperationIdentifier);
Console.WriteLine("SAP Transaction {0} has been committed", sapTxId);
Console.WriteLine("\nHit <RETURN> to end");
Console.ReadLine();
}
catch (ConnectionException cex)
{
Console.WriteLine("Exception occurred connecting to the SAP system");
Console.WriteLine(cex.InnerException.Message);
throw;
}
catch (Exception ex)
{
Console.WriteLine("Exception is: " + ex.Message);
if (ex.InnerException != null)
{
Console.WriteLine("Inner Exception is: " + ex.InnerException.Message);
}
throw;
}
finally
{
// Close the client
if (sapTrfcClient != null)
{
if (sapTrfcClient.State == CommunicationState.Opened)
sapTrfcClient.Close();
else
sapTrfcClient.Abort();
}
}
}
}
}