Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Der SAP-Adapter zeigt BAPIs an:
RFC-Vorgänge. BAPIs wie jede andere 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 von Geschäftsobjekten unter dem Knoten BAPI im Add Adapter Service Reference Plugin dargestellt.
Unabhängig davon, ob Sie eine BAPI als RFC-Vorgang oder als Geschäftsobjektmethode aufrufen, ist jede BAPI immer Teil eines LUW im SAP-System.
Eine Übersicht darüber, wie der SAP-Adapter BAPIs unterstützt, finden Sie unter Operations on 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 Add Adapter Service Reference Visual Studio-Plug-In verwenden, um eine WCF-Clientklasse für bestimmte Geschäftsobjekte zu generieren, die Methoden für jede BAPI enthalten, die Sie in Ihrem Code aufrufen möchten. Das Add Adapter Service Reference Plug-In generiert auch .NET-Typen, um die Parameter und Datentypen zu kapseln, die von den einzelnen BAPI verwendet werden. Anschließend können Sie eine Instanz dieser WCF-Clientklasse erstellen und die zugehörigen Methoden aufrufen, um die Ziel-BAPIs aufzurufen.
In den folgenden Abschnitten wird gezeigt, wie Sie BAPIs als Geschäftsobjekte aufrufen und erläutern, wie BAPI-Transaktionen im WCF-Dienstmodell unterstützt werden.
Die WCF-Clientklasse
Der SAP-Adapter stellt für jedes Geschäftsobjekt einen anderen Servicevertrag dar. Dies bedeutet, dass für jedes Geschäftsobjekt eine eindeutige WCF-Clientklasse erstellt wird. Der Name dieser Klasse basiert auf dem Geschäftsobjekttyp. Zum Beispiel für das Geschäftsobjekt "Sales Order" (Geschäftsobjekttyp BUS2032) ist die WCF Client-Klasse BapiBUS2032Client. Jedes 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 Referenzparameter 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 Klarheit wurden die Konstruktoren und anderer Programmcode 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 über dieselbe SAP-Verbindung empfangene BAPI-Verbindung ist Teil derselben BAPI-Transaktion auf dem SAP-System. SAP setzt die BAPI-Transaktion fort oder bricht sie ab, wenn es eine BAPI_TRANSACTION_COMMIT oder eine BAPI_TRANSACTION_ROLLBACK auf der Verbindung erhält. Nachdem ein Commit oder Rollback ausgeführt wurde, beginnt die nächste BAPI, die über die Verbindung empfangen wird, eine neue 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, der zum Senden von Nachrichten an das SAP-System verwendet wird. Dies bedeutet, dass die BAPIs, die mit einem bestimmten WCF-Client aufgerufen werden, Teil einer eindeutigen BAPI-Transaktion im SAP-System sind. Dadurch wird eine erhebliche Einschränkung auferlegt, 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 als Teil 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 werden alle Vorgänge, die mit diesem Client aufgerufen werden, über denselben WCF-Kanal gesendet.
Von Bedeutung
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 im SAP-System zu übernehmen oder zurückzurufen. Der Adapter zeigt die folgenden beiden BAPIs an:
Unter dem Basisknoten als RFC-Operationen.
Unter jedem Geschäftsobjekt.
Weitere Informationen dazu, wie der Adapter BAPI-Transaktionen auf SAP unterstützt, finden Sie unter Operations on BAPIs in SAP.
So erstellen Sie eine Applikation, die BAPIs als Methoden von Geschäftsobjekten aufruft.
Dieser Abschnitt enthält Informationen zum Aufrufen von BAPIs als Methoden von Geschäftsobjekten. Die gleiche grundlegende Prozedur sollte befolgt werden, um BAPIs als RFC-Vorgänge aufzurufen, mit der Ausnahme, dass Sie einen WCF-Client erstellen, der auf die BAPIs als RFC-Vorgänge ausgerichtet ist und sie zum Aufrufen der einzelnen BAPI verwendet.
Führen Sie die folgenden Schritte aus, um eine BAPI-Clientanwendung zu erstellen.
So erstellen Sie eine BAPI-Clientanwendung
Generieren Sie eine WCF-Clientklasse. Verwenden Sie das Add Adapter Service Reference Visual Studio Plug-In oder das ServiceModel Metadata Utility Tool (svcutil.exe), um eine WCF-Clientklasse (oder -klassen) zu generieren, die auf geschäftsobjekte und BAPIs ausgerichtet ist, mit denen Sie arbeiten möchten. Achten Sie darauf, die BAPI_TRANSACTION_COMMIT und die BAPI_TRANSACTION_ROLLBACK Methoden (BAPIs) für jedes Zielgeschäftsobjekt verfügbar zu machen. Weitere Informationen zum Generieren eines WCF-Clients finden Sie unter Generieren eines WCF-Clients oder eines WCF-Dienstvertrags für SAP-Lösungsartefakte.
Erstellen Sie eine Instanz der wcf-Clientklasse, die in Schritt 1 generiert wurde, und erstellen und konfigurieren Sie einen WCF-Client. Das Konfigurieren des WCF-Clients umfasst die Angabe der Bindungs- und Endpunktadresse, die der Client verwendet. Sie können das entweder programmatisch im Code oder deklarativ in der Konfiguration umsetzen. 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 setzt die Anmeldeinformationen für das SAP-System.
BapiBUS2032Client bapiClient = new BapiBUS2032Client("SAPBinding_BapiBUS2032"); bapiClient.ClientCredentials.UserName.UserName = "YourUserName"; bapiClient.ClientCredentials.UserName.Password = "YourPassword";
Öffnen Sie den WCF-Client.
bapiClient.Open();
Rufen Sie Methoden auf dem wcf-Client auf, der in Schritt 2 erstellt wurde, um die entsprechenden BAPIs im SAP-System aufzurufen. Sie können mehrere BAPIs im SAP-System aufrufen.
Beenden Sie die Transaktion durch:
Aufrufen der BAPI_TRANSACTION_COMMIT-Methode zur Bestätigung der Transaktion.
bapiClient.BAPI_TRANSACTION_COMMIT("X");
Aufrufen der BAPI_TRANSACTION_ROLLBACK-Methode zum Zurücksetzen der Transaktion.
bapiClient.BAPI_TRANSACTION_ROLLBACK();
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 übernehmen. Wenn beim Aufrufen der BAPI ein Fehler auftritt, wird BAPI_TRANSACTION_ROLLBACK im Ausnahmehandler aufgerufen, um die Transaktion zurückzurufen.
Die CREATEFROMDAT2-Methode verwendet viele Parameter; diese werden im Beispiel aus Platzgründen weggelassen. Sie finden ein Beispiel, das BAPI-Transaktionen in den Beispielen veranschaulicht, die mit dem Microsoft BizTalk Adapter Pack ausgeliefert wurden. 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();
}
}
}
}
}
Siehe auch
Entwickeln von Anwendungen mithilfe des WCF-Dienstmodells
Operationen mit BAPIs in SAP