다음을 통해 공유


WCF 서비스 모델을 사용하여 SAP에서 tRFC 호출

TRFC(트랜잭션 원격 함수 호출)는 SAP 시스템에서 RFC의 일회성 실행을 보장합니다. SAP 어댑터에 의해 표시되는 RFC를 tRFC로 호출할 수 있습니다. WCF 서비스 모델에서 tRFC를 호출하는 것은 다음과 같은 차이점이 있는 RFC를 호출하는 것과 비슷합니다.

  • SAP 어댑터는 RFC(RFC)와 다른 노드(TRFC) 아래에 tRFC를 표시합니다.

  • tRFC 클라이언트 호출은 SAP 내보내기 및 변경 매개 변수에 대한 값을 반환하지 않습니다.

  • tRFC 작업에는 SAP 어댑터에서 tRFC에 대한 SAP TID(트랜잭션 ID)에 매핑되는 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 시스템에서 BAPI_SALESORDER_CREATEFROMDAT2(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 클라이언트 애플리케이션을 만들려면

  1. TrfcClient 클래스를 생성합니다. 어댑터 서비스 참조 Visual Studio 플러그 인 추가 또는 ServiceModel 메타데이터 유틸리티 도구(svcutil.exe)를 사용하여 작업하려는 RFC를 대상으로 하는 TrfcClient 클래스를 생성합니다. WCF 클라이언트를 생성하는 방법에 대한 자세한 내용은 SAP 솔루션 아티팩트용 WCF 클라이언트 또는 WCF 서비스 계약 생성을 참조하세요. RfcConfirmTransID 작업이 TrfcClient 클래스에 포함되어 있는지 확인합니다.

  2. 1단계에서 생성된 TrfcClient 클래스의 instance 만들고 클라이언트 바인딩을 지정합니다. 클라이언트 바인딩을 지정하려면 TrfcClient 에서 사용할 바인딩 및 엔드포인트 주소를 지정해야 합니다. 코드에서 명령적으로 또는 구성에서 선언적으로 이 작업을 수행할 수 있습니다. 클라이언트 바인딩을 지정하는 방법에 대한 자세한 내용은 SAP 시스템에 대한 클라이언트 바인딩 구성을 참조하세요. 다음 코드는 구성에서 TrfcClient 를 초기화하고 SAP 시스템의 자격 증명을 설정합니다.

    TrfcClient trfcClient = new TrfcClient("SAPBinding_Rfc");  
    
    trfcClient.ClientCredentials.UserName.UserName = "YourUserName";  
    trfcClient.ClientCredentials.UserName.Password = "YourPassword";  
    
  3. TrfcClient를 엽니다.

    trfcClient.Open();  
    
  4. 2단계에서 만든 TrfcClient 에서 적절한 메서드를 호출하여 SAP 시스템에서 대상 tRFC를 호출합니다. GUID를 포함하거나 TransactionalRrcOperationIdentifier 매개 변수에 대한 빈 GUID를 포함하는 변수를 전달할 수 있습니다. 빈 GUID를 전달하면 SAP 어댑터가 자동으로 GUID를 생성합니다. 다음 코드는 sap 시스템에서 BAPI_SALESORDER_CREATEFROMDAT2 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);  
    
  5. SAP 시스템의 tRFC와 연결된 TID를 확인하려면 TrfcClient에서 RfcConfirmTransID 메서드를 호출합니다. TransactionRfcOperationIdentifier매개 변수에 대해 4단계에서 반환된 GUID를 지정합니다.

    trfcClient.RfcConfirmTransID(transactionalRfcOperationIdentifier);  
    
  6. 모든 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();  
                }  
            }  
  
        }  
    }  
}  

참고 항목

WCF 서비스 모델을 사용하여 애플리케이션 개발
SAP의 tRFC에 대한 작업