トランザクション リモート関数呼び出し (tRFC) は、SAP システムでの RFC の 1 回 限りの実行を保証します。 SAP アダプターによって表示される任意の RFC を tRFC として呼び出すことができます。 WCF サービス モデルでの tRFC の呼び出しは、次の相違点を持つ RFC の呼び出しに似ています。
SAP アダプターは、RFC (RFC) とは異なるノード (TRFC) の下に TRFC を表示します。
tRFC クライアント呼び出しでは、SAP エクスポートおよび変更パラメーターの値は返されません。
tRFC 操作には、SAP アダプターによって tRFC の SAP トランザクション ID (TID) にマップされる GUID パラメーターが含まれます。
tRFC を呼び出した後、RfcConfirmTransID 操作を呼び出して、SAP システム上の tRFC を確認 (コミット) する必要があります。 この操作は、TRFC ノードのすぐ下に表示されます。
tRFC 操作と RfcConfirmTransID 操作の詳細については、 SAP の tRFC に対する操作を参照してください。
次のセクションでは、SAP アダプターを使用して SAP システムで tRFC を呼び出す方法について説明します。
WCF クライアント クラス
SAP アダプターは、すべての tRFC 操作を単一のサービス コントラクト "Trfc" で表示します。 つまり、呼び出すすべての tRFC 操作に対して、単一の WCF クライアント クラス TrfcClient が作成されます。 各ターゲット tRFC は、このクラスのメソッドとして表されます。 各メソッドについて:
構造などの複雑な SAP 型は、SAP 型のフィールドに対応するプロパティを持つ .NET クラスとして表示されます。 これらのクラスは、 microsoft.lobservices.sap._2007._03.Types.Rfc という名前空間で定義されています。
次のコードは、 TrfcClient クラスの一部と、SAP システムで (tRFC として) BAPI_SALESORDER_CREATEFROMDAT2を呼び出すメソッドを示しています。 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 サービス コントラクトを生成する」を参照してください。 RfcConfirmTransID 操作が TrfcClient クラスに含まれていることを確認します。
手順 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 を含む変数、または TransactionalRrcOperationIdentifier パラメーターの空の GUID を含む変数を渡すことができます。 SAP アダプターは、空の GUID を渡した場合、あなたのために新しい GUID を生成します。 次のコードでは、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();
例
次の例は、tRFC としてBAPI_SALESORDER_CREATEを呼び出す方法を示しています。
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();
}
}
}
}
}