WCF サービス モデルを使用して SAP で tRFC を呼び出す
トランザクション リモート関数呼び出し (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 アダプターは、1 つのサービス コントラクト "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 クライアントまたは WCF サービス コントラクト for SAP ソリューション成果物の生成」を参照してください。 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 を含む変数を渡すことができます。 空の 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.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();
}
}
}
}
}