Freigeben über


Aufrufen von tRFCs in SAP mithilfe des WCF-Dienstmodells

Transaktionale Remotefunktionsaufrufe (tRFCs) garantieren eine einmalige Ausführung eines RFC auf einem SAP-System . Sie können alle vom SAP-Adapter angezeigten RFCs als tRFC aufrufen. Das Aufrufen eines tRFC im WCF-Dienstmodell ähnelt dem Aufrufen eines RFC mit den folgenden Unterschieden:

  • Der SAP-Adapter zeigt tRFCs unter einem anderen Knoten (TRFC) als RFCs (RFC) an.

  • tRFC-Clientaufrufe geben keine Werte für sap export and changing parameters zurück.

  • tRFC-Vorgänge enthalten einen GUID-Parameter, der der SAP-Transaktions-ID (TID) für tRFC vom SAP-Adapter zugeordnet wird.

  • Nachdem Sie einen tRFC aufgerufen haben, müssen Sie den RfcConfirmTransID-Vorgang aufrufen, um den tRFC im SAP-System zu bestätigen (committen). Dieser Vorgang wird direkt unter dem TRFC-Knoten angezeigt.

    Weitere Informationen zu tRFC-Vorgängen und zum RfcConfirmTransID-Vorgang finden Sie unter Vorgänge für tRFCs in SAP.

    In den folgenden Abschnitten wird gezeigt, wie Sie tRFCs im SAP-System mithilfe des SAP-Adapters aufrufen.

Die WCF-Clientklasse

Der SAP-Adapter zeigt alle tRFC-Vorgänge unter einem einzelnen Dienstvertrag an, "Trfc". Dies bedeutet, dass eine einzelne WCF-Clientklasse, TrfcClient, für alle tRFC-Vorgänge erstellt wird, die Sie aufrufen möchten. Jedes tRFC-Ziel wird als Methode dieser Klasse dargestellt. Für jede Methode:

  • Komplexe SAP-Typen wie Strukturen werden als .NET-Klassen mit Eigenschaften angezeigt, die den Feldern des SAP-Typs entsprechen. Diese Klassen werden im folgenden Namespace definiert: microsoft.lobservices.sap._2007._03.Types.Rfc.

    Der folgende Code zeigt einen Teil der TrfcClient-Klasse und die Methode, die BAPI_SALESORDER_CREATEFROMDAT2 (als tRFC) im SAP-System aufruft. Der Parameter TransactionalRfcOperationIdentifier enthält die GUID, die der SAP TID zugeordnet ist. Nicht alle Parameter für die -Methode werden angezeigt.

[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) { ...  }  
}  

Der folgende Code zeigt die Methode, die für den RfcConfirmTransID-Vorgang generiert wird. Sie müssen sicherstellen, dass diese Methode als Teil von TrfcClient generiert wird. Der RfcConfirmTransID-Vorgang wird direkt unter dem TRFC-Knoten angezeigt.

public void RfcConfirmTransID(System.Guid TransactionalRfcOperationIdentifier) {…}  

Erstellen einer tRFC-Clientanwendung

Die Schritte zum Erstellen einer Anwendung, die tRFCs aufruft, ähneln den Schritten, die Sie zum Aufrufen von RFCs ausführen, mit den folgenden Ausnahmen:

  • Sie müssen die Zielvorgänge unter dem TRFC-Knoten abrufen.

  • Sie müssen den RfcConfirmTransID-Vorgang abrufen. Dies wird direkt unter dem TRFC-Knoten angezeigt.

  • Um einen tRFC-Vorgang auf dem SAP-System zu bestätigen (committen), müssen Sie den RfcConfirmTransID-Vorgang mit der GUID aufrufen, die für diesen tRFC-Vorgang zurückgegeben wurde.

So erstellen Sie eine tRFC-Clientanwendung

  1. Generieren Sie eine TrfcClient-Klasse . Verwenden Sie das Visual Studio-Plug-In Adapterdienstverweis hinzufügen oder das ServiceModel Metadata Utility Tool (svcutil.exe), um eine TrfcClient-Klasse zu generieren, die auf die RFCs abzielt, mit denen Sie arbeiten möchten. Weitere Informationen zum Generieren eines WCF-Clients finden Sie unter Generieren eines WCF-Clients oder eines WCF-Dienstvertrags für SAP-Lösungsartefakte. Stellen Sie sicher, dass der RfcConfirmTransID-Vorgang in der TrfcClient-Klasse enthalten ist.

  2. Erstellen Sie eine instance der in Schritt 1 generierten TrfcClient-Klasse, und geben Sie eine Clientbindung an. Das Angeben einer Clientbindung umfasst die Angabe der Bindungs- und Endpunktadresse, die vom TrfcClient verwendet wird. Sie können dies entweder zwingend im Code oder deklarativ in der Konfiguration tun. Weitere Informationen zum Angeben einer Clientbindung finden Sie unter Konfigurieren einer Clientbindung für das SAP-System. Der folgende Code initialisiert den TrfcClient aus der Konfiguration und legt die Anmeldeinformationen für das SAP-System fest.

    TrfcClient trfcClient = new TrfcClient("SAPBinding_Rfc");  
    
    trfcClient.ClientCredentials.UserName.UserName = "YourUserName";  
    trfcClient.ClientCredentials.UserName.Password = "YourPassword";  
    
  3. Öffnen Sie trfcClient.

    trfcClient.Open();  
    
  4. Rufen Sie die entsprechende Methode auf dem in Schritt 2 erstellten TrfcClient auf, um den Ziel-tRFC im SAP-System aufzurufen. Sie können eine Variable übergeben, die eine GUID oder eine leere GUID für den Parameter TransactionalRrcOperationIdentifier enthält. Wenn Sie eine leere GUID übergeben, generiert der SAP-Adapter eine für Sie. Der folgende Code ruft BAPI_SALESORDER_CREATEFROMDAT2 als tRFC im SAP-System auf (es werden nicht alle Parameter für die -Methode angezeigt). Eine GUID wird angegeben.

    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. Um die TID zu bestätigen, die dem tRFC im SAP-System zugeordnet ist, rufen Sie die RfcConfirmTransID-Methode auf dem TrfcClient auf. Geben Sie die in Schritt 4 zurückgegebene GUID für den Parameter TransactionRfcOperationIdentifier an.

    trfcClient.RfcConfirmTransID(transactionalRfcOperationIdentifier);  
    
  6. Schließen Sie den TrfcClient , wenn Sie mit der Verwendung fertig sind (nachdem Sie den Aufruf aller tRFCs abgeschlossen haben).

    trfcClient.Close();   
    

Beispiel

Das folgende Beispiel zeigt, wie sie BAPI_SALESORDER_CREATE als tRFC aufrufen.

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();  
                }  
            }  
  
        }  
    }  
}  

Weitere Informationen

Entwickeln von Anwendungen mithilfe des WCF-Dienstmodells
Vorgänge für tRFCs in SAP