Freigeben über


Aufrufen von BAPIs in SAP mithilfe des WCF-Dienstmodells

Der SAP-Adapter zeigt BAPIs wie:

  • RFC-Vorgänge. BAPIs wie alle anderen RFC werden unter dem RFC-Knoten im Add Adapter Service Reference Plug-In angezeigt.

  • Methoden von SAP-Geschäftsobjekten. Als Methoden von Geschäftsobjekten werden BAPIs vom Geschäftsobjekt unter dem BAPI-Knoten im Add Adapter Service Reference Plug-In angezeigt.

    Unabhängig davon, ob Sie eine BAPI als RFC-Vorgang oder als Geschäftsobjektmethode aufrufen, ist jede BAPI immer Teil einer LUW im SAP-System.

    Eine Übersicht darüber, wie der SAP-Adapter BAPIs unterstützt, finden Sie unter Vorgänge für BAPIs in SAP.

    Wenn Sie das WCF-Dienstmodell verwenden, um BAPIs als Geschäftsobjektmethoden aufzurufen, wird jedes SAP-Geschäftsobjekt durch eine WCF-Clientklasse dargestellt, und die BAPIs dieses Geschäftsobjekts werden als Methoden auf dem Client dargestellt. Sie können das Visual Studio-Plug-In Adapterdienstverweis hinzufügen verwenden, um eine WCF-Clientklasse für bestimmte Geschäftsobjekte zu generieren, die Methoden für jede BAPI enthält, die Sie im Code aufrufen möchten. Das Add Adapter Service Reference Plug-In generiert auch .NET-Typen, um die Parameter und Datentypen zu kapseln, die von jeder BAPI verwendet werden. Anschließend können Sie eine instance dieser WCF-Clientklasse erstellen und deren Methoden aufrufen, um die Ziel-BAPIs aufzurufen.

    In den folgenden Abschnitten wird gezeigt, wie Sie BAPIs als Methoden von Geschäftsobjekten aufrufen und erläutern, wie BAPI-Transaktionen im WCF-Dienstmodell unterstützt werden.

Die WCF-Clientklasse

Der SAP-Adapter zeigt für jedes Geschäftsobjekt einen anderen Dienstvertrag an. Dies bedeutet, dass für jedes Geschäftsobjekt eine eindeutige WCF-Clientklasse erstellt wird. Der Name dieser Klasse basiert auf dem Geschäftsobjekttyp. Für das Geschäftsobjekt Sales Order (Geschäftsobjekttyp BUS2032) lautet die WCF-Clientklasse beispielsweise BapiBUS2032Client. Jede Ziel-BAPI im Geschäftsobjekt wird als Methode in der generierten WCF-Clientklasse dargestellt. In jeder Methode:

  • SAP-Exportparameter werden als out-Parameter angezeigt

  • SAP-Aufrufparameter werden als Ref-Parameter angezeigt.

  • 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.

    BAPI_TRANSACTION_COMMIT und BAPI_TRANSACTION_ROLLBACK werden für jedes Geschäftsobjekt angezeigt, und Sie sollten diese immer in Ihren WCF-Client einschließen.

    Der folgende Code zeigt einen Teil einer WCF-Clientklasse, die für das Geschäftsobjekt Sales Order generiert wurde. Dieser Client enthält Methoden zum Aufrufen von CREATEFROMDAT2, BAPI_TRANSACTION_COMMIT und BAPI_TRANSACTION_ROLLBACK. Aus Gründen der Übersichtlichkeit wurden die Konstruktoren und anderer Code weggelassen.

[System.Diagnostics.DebuggerStepThroughAttribute()]  
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]  
public partial class BapiBUS2032Client : System.ServiceModel.ClientBase<BapiBUS2032>, BapiBUS2032 {  
  
    // Code has been removed for clarity  
  
    /// <summary>The Metadata for this RFC was generated using the RFC SDK.</summary>  
    /// <param name="SALESDOCUMENT">Number of Generated Document</param>  
    /// <param name="BEHAVE_WHEN_ERROR">Error Handling</param>  
    /// …  
    /// <param name="ORDER_TEXT">Texts</param>  
    /// <param name="PARTNERADDRESSES">BAPI Reference Structure for Addresses (Org./Company)</param>  
    /// <param name="RETURN">Return Messages</param>  
    /// <returns></returns>  
    public string 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.BAPISDHD1X ORDER_HEADER_INX,   
                string SALESDOCUMENTIN,   
                microsoft.lobservices.sap._2007._03.Types.Rfc.BAPI_SENDER SENDER,   
                string TESTRUN,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPIPAREX[] EXTENSIONIN,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPICCARD[] ORDER_CCARD,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPICUBLB[] ORDER_CFGS_BLOB,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPICUINS[] ORDER_CFGS_INST,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPICUPRT[] ORDER_CFGS_PART_OF,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPICUCFG[] ORDER_CFGS_REF,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPICUREF[] ORDER_CFGS_REFINST,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPICUVAL[] ORDER_CFGS_VALUE,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPICUVK[] ORDER_CFGS_VK,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPICOND[] ORDER_CONDITIONS_IN,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPICONDX[] ORDER_CONDITIONS_INX,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPISDITM[] ORDER_ITEMS_IN,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPISDITMX[] ORDER_ITEMS_INX,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPISDKEY[] ORDER_KEYS,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPIPARNR[] ORDER_PARTNERS,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPISCHDL[] ORDER_SCHEDULES_IN,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPISCHDLX[] ORDER_SCHEDULES_INX,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPISDTEXT[] ORDER_TEXT,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPIADDR1[] PARTNERADDRESSES,   
                ref microsoft.lobservices.sap._2007._03.Types.Rfc.BAPIRET2[] RETURN) { ...}  
  
    /// <summary>The Metadata for this RFC was generated using the RFC SDK.</summary>  
    /// <param name="RETURN">Confirmations</param>  
    /// <param name="WAIT">Using the command `COMMIT AND WAIT`</param>  
    /// <returns></returns>  
    public microsoft.lobservices.sap._2007._03.Types.Rfc.BAPIRET2 BAPI_TRANSACTION_COMMIT(string WAIT) { ... }  
  
    /// <summary>The Metadata for this RFC was generated using the RFC SDK.</summary>  
    /// <param name="RETURN">Confirmations</param>  
    /// <returns></returns>  
    public microsoft.lobservices.sap._2007._03.Types.Rfc.BAPIRET2 BAPI_TRANSACTION_ROLLBACK() { ... }  
}  

BAPI-Transaktionen im WCF-Dienstmodell

Jede BAPI, unabhängig davon, ob sie als RFC- oder als Geschäftsobjektmethode aufgerufen wird, ist Teil einer Transaktion (LUW) im SAP-System. und jede BAPI, die über dieselbe SAP-Verbindung empfangen wird, ist Teil derselben BAPI-Transaktion im SAP-System. SAP committet die BAPI-Transaktion oder führt ein Rollback aus, wenn ein BAPI_TRANSACTION_COMMIT oder ein BAPI_TRANSACTION_ROLLBACK für die Verbindung empfangen wird. Nachdem ein Commit oder Rollback ausgeführt wurde, beginnt die nächste über die Verbindung empfangene BAPI mit einer neuen Transaktion.

Für den Adapter verfügt jeder WCF-Kanal über eine dedizierte SAP-Verbindung. Im WCF-Dienstmodell verfügt jeder WCF-Client über einen internen Kanal, über den Nachrichten an das SAP-System gesendet werden. Dies bedeutet, dass die BAPIs, die mit einem bestimmten WCF-Client aufgerufen werden, Teil einer eindeutigen BAPI-Transaktion im SAP-System sind. Dies führt zu einer erheblichen Einschränkung, wenn Sie das WCF-Dienstmodell verwenden, um BAPIs als Geschäftsobjektmethoden aufzurufen. Da jedes SAP-Geschäftsobjekt durch eine dedizierte WCF-Clientklasse dargestellt wird, können Sie keine BAPIs aus zwei verschiedenen Geschäftsobjekten im Rahmen derselben Transaktion aufrufen. Der Weg, dies zu umgehen, besteht darin, die BAPIs als RFC-Vorgänge aufzurufen. Dies liegt daran, dass das Add Adapter Service Reference Plug-In einen einzelnen WCF-Client für RFC-Vorgänge generiert und daher alle Vorgänge, die mit diesem Client aufgerufen werden, über denselben WCF-Kanal gesendet werden.

Wichtig

Wenn Sie BAPIs aus verschiedenen SAP-Geschäftsobjekten in dieselbe BAPI-Transaktion einschließen möchten, müssen Sie sie als RFC-Vorgänge aufrufen (mit demselben WCF-Client). Sie können sie nicht als Geschäftsobjektmethoden aufrufen.

Sie rufen BAPI_TRANSACTION_COMMIT oder BAPI_TRANSACTION_ROLLBACK auf, um die BAPI-Transaktion auf dem SAP-System zu committen oder ein Rollback auszuführen. Der Adapter zeigt die folgenden beiden BAPIs an:

  • Unter dem Knoten Basis als RFC-Vorgänge.

  • Unter jedem Geschäftsobjekt.

    Weitere Informationen dazu, wie der Adapter BAPI-Transaktionen in SAP unterstützt, finden Sie unter Vorgänge für BAPIs in SAP.

Erstellen einer Anwendung, die BAPIs als Methoden von Geschäftsobjekten aufruft

Dieser Abschnitt enthält Informationen zum Aufrufen von BAPIs als Methoden von Geschäftsobjekten. Dasselbe grundlegende Verfahren sollte zum Aufrufen von BAPIs als RFC-Vorgänge befolgt werden, mit der Ausnahme, dass Sie einen WCF-Client erstellen, der die BAPIs als RFC-Vorgänge als Ziel verwendet und zum Aufrufen der einzelnen BAPI-Vorgänge verwendet.

Führen Sie zum Erstellen einer BAPI-Clientanwendung die folgenden Schritte aus.

So erstellen Sie eine BAPI-Clientanwendung

  1. Generieren Sie eine WCF-Clientklasse. Verwenden Sie das Visual Studio-Plug-In Adapterdienstverweis hinzufügen oder das ServiceModel Metadata Utility Tool (svcutil.exe), um eine WCF-Clientklasse (oder -klassen) zu generieren, die auf die Geschäftsobjekte und BAPIs ausgerichtet ist, mit denen Sie arbeiten möchten. Stellen Sie sicher, dass Sie die BAPI_TRANSACTION_COMMIT und die BAPI_TRANSACTION_ROLLBACK-Methoden (BAPIs) einschließen, die für jedes Zielgeschäftsobjekt verfügbar gemacht werden. Weitere Informationen zum Generieren eines WCF-Clients finden Sie unter Generieren eines WCF-Clients oder eines WCF-Dienstvertrags für SAP-Lösungsartefakte.

  2. Erstellen Sie eine instance der in Schritt 1 generierten WCF-Clientklasse, und erstellen und konfigurieren Sie einen WCF-Client. Das Konfigurieren des WCF-Clients umfasst die Angabe der Bindungs- und Endpunktadresse, die vom Client 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 WCF-Client für das SAP-Geschäftsobjekt Sales Order (BUS2032) aus der Konfiguration und legt die Anmeldeinformationen für das SAP-System fest.

    BapiBUS2032Client bapiClient = new BapiBUS2032Client("SAPBinding_BapiBUS2032");  
    
    bapiClient.ClientCredentials.UserName.UserName = "YourUserName";  
    bapiClient.ClientCredentials.UserName.Password = "YourPassword";  
    
  3. Öffnen Sie den WCF-Client.

    bapiClient.Open();  
    
  4. Rufen Sie Methoden auf dem WCF-Client auf, der in Schritt 2 erstellt wurde, um die entsprechenden BAPIs auf dem SAP-System aufzurufen. Sie können mehrere BAPIs im SAP-System aufrufen.

  5. Beenden Sie die Transaktion mit:

    1. Aufrufen der BAPI_TRANSACTION_COMMIT-Methode, um die Transaktion zu committen.

      bapiClient.BAPI_TRANSACTION_COMMIT("X");  
      
    2. Aufrufen der BAPI_TRANSACTION_ROLLBACK-Methode, um ein Rollback für die Transaktion auszuführen.

      bapiClient.BAPI_TRANSACTION_ROLLBACK();  
      
  6. Schließen Sie den WCF-Client.

    bapiClient.Close();   
    

Beispiel

Im folgenden Beispiel wird die CREATEFROMDAT2 BAPI für das Geschäftsobjekt Sales Order aufgerufen. Sie ruft die BAPI mehrmals auf und ruft dann BAPI_TRANSACTION_COMMIT auf, um die Transaktion zu committen. Wenn beim Aufrufen der BAPI ein Fehler auftritt, wird BAPI_TRANSACTION_ROLLBACK im Ausnahmehandler aufgerufen, um ein Rollback für die Transaktion auszuführen.

Die CREATEFROMDAT2-Methode akzeptiert viele Parameter. diese werden im Beispiel aus Gründen der Kürze weggelassen. Ein Beispiel, das BAPI-Transaktionen veranschaulicht, finden Sie in den Beispielen, die mit dem Microsoft BizTalk-Adapterpaket ausgeliefert werden. Weitere Informationen finden Sie unter Beispiele für den SAP-Adapter.

using System;  
using System.Collections.Generic;  
using System.Text;  
  
// Add WCF, Adapter LOB SDK, and SAP Adapter namepaces  
using System.ServiceModel;  
using Microsoft.Adapters.SAP;  
using Microsoft.ServiceModel.Channels;  
  
// Include this namespace for Adapter LOB SDK and SAP exceptions  
using Microsoft.ServiceModel.Channels.Common;  
  
using microsoft.lobservices.sap._2007._03.Types.Rfc;  
  
// This Example demonstrates BAPI transactions. Two sales orders are  
// created using the CREATEFROMDAT2 method of a SAP Business Object.   
// After the orders are created, the BAPI transaction is committed.   
// If an exception occurs when sending the BAPIs, the BAPI transaction is   
// rolled back.  
//   
  
namespace SapBapiTxClientSM  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            // Create the BAPI client from the generated endpoint configuration.  
  
            BapiBUS2032Client bapiClient = null;  
  
            Console.WriteLine("BAPI transaction sample started");  
            Console.WriteLine("\nCreating business object client");  
  
            try  
            {  
                bapiClient = new BapiBUS2032Client("SAPBinding_BapiBUS2032");  
  
                bapiClient.ClientCredentials.UserName.UserName = "YourUserName";  
                bapiClient.ClientCredentials.UserName.Password = "YourPassword";  
  
                // Open the BAPI Client  
                bapiClient.Open();  
  
                ...  
  
                // send first BAPI  
                try  
                {  
                    string salesDocNumber1 = bapiClient.CREATEFROMDAT2(  
                        ...  
                        // parameters ommitted  
                        ...                          
                        );  
                }  
                catch (Exception ex)  
                {  
                    bapiClient.BAPI_TRANSACTION_ROLLBACK();  
                    throw;  
                }  
  
                ...  
  
                // send second BAPI  
                try  
                {  
                    string salesDocNumber1 = bapiClient.CREATEFROMDAT2(  
                        ...  
                        // parameters omitted  
                        ...                          
                        );  
                }  
                catch (Exception ex)  
                {  
                    bapiClient.BAPI_TRANSACTION_ROLLBACK();  
                    throw;  
                }  
  
                ...  
  
                // Commit BAPI Transaction  
                try  
                {  
                    bapiClient.BAPI_TRANSACTION.Commit();  
                }  
                catch (Exception ex)  
                {  
                    bapiClient.BAPI_TRANSACTION_ROLLBACK();  
                    throw;  
                }  
  
                ...  
  
            }  
            catch (ConnectionException cex)  
            {  
                // Get here if problem connecting to the SAP system   
  
                Console.WriteLine("Exception occurred connecting to the SAP system");  
                Console.WriteLine(cex.InnerException.Message);  
            }  
            catch (TargetSystemException tex)  
            {  
                // Get here if the SAP system returns an exception  
  
                Console.WriteLine("Exception occurred on the SAP System");  
                Console.WriteLine(tex.InnerException.Message);  
            }  
            catch (Exception ex)  
            {  
                Console.WriteLine("Exception is: " + ex.Message);  
                if (ex.InnerException != null)  
                {  
                    Console.WriteLine("Inner Exception is: " + ex.InnerException.Message);  
                }  
            }  
            finally  
            {  
            // Close the client when finished  
                if (bapiClient != null)  
                {  
                    if (bapiClient.State == CommunicationState.Opened)  
                        bapiClient.Close();  
                    else  
                        bapiClient.Abort();  
                }  
            }  
        }  
    }  
}  

Weitere Informationen

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