Appeler des API dans SAP à l’aide du modèle de service WCF
L’adaptateur SAP fait apparaître les API BAPis comme suit :
Opérations RFC. Les BAPIs, comme tout autre RFC, sont exposés sous le nœud RFC dans le plug-in Add Adapter Reference Service.
Méthodes des objets métier SAP. En tant que méthodes d’objets métier, les BAPI sont exposés par l’objet métier sous le nœud BAPI dans le plug-in Add Adapter Service Reference.
Que vous appeliez une BAPI en tant qu’opération RFC ou en tant que méthode d’objet métier, chaque BAPI fait toujours partie d’une LUW sur le système SAP.
Pour obtenir une vue d’ensemble de la façon dont l’adaptateur SAP prend en charge les API, consultez Opérations sur les API dans SAP.
Lorsque vous utilisez le modèle de service WCF pour appeler des BAPIs en tant que méthodes d’objet métier, chaque objet métier SAP est représenté par une classe de client WCF et les BAPI de cet objet métier sont représentés en tant que méthodes sur le client. Vous pouvez utiliser le plug-in Visual Studio Add Adapter Service Reference pour générer une classe de client WCF pour des objets métier spécifiques qui contient des méthodes pour chaque BAPI que vous souhaitez appeler dans votre code. Le plug-in Add Adapter Service Reference génère également des types .NET pour encapsuler les paramètres et les types de données utilisés par chaque BAPI. Vous pouvez ensuite créer une instance de cette classe de client WCF et appeler ses méthodes pour appeler les api bAPIs cibles.
Les sections suivantes vous montrent comment appeler des BAPIs en tant que méthodes d’objets métier et expliquent comment les transactions BAPI sont prises en charge dans le modèle de service WCF.
Classe de client WCF
L’adaptateur SAP fait apparaître un contrat de service différent, pour chaque objet métier. Cela signifie que pour chaque objet métier, une classe de client WCF unique est créée. Le nom de cette classe est basé sur le type d’objet métier. Par exemple, pour l’objet métier Sales Order (type d’objet métier BUS2032), la classe de client WCF est BapiBUS2032Client. Chaque BAPI cible dans l’objet métier est représenté en tant que méthode dans la classe de client WCF générée. Dans chaque méthode :
Les paramètres d’exportation SAP sont exposés en tant que paramètres sortants
Les paramètres d’appel SAP sont exposés en tant que paramètres ref .
Les types SAP complexes tels que les structures sont exposés sous forme de classes .NET avec des propriétés qui correspondent aux champs du type SAP. Ces classes sont définies dans l’espace de noms suivant : microsoft.lobservices.sap._2007._03.Types.Rfc.
BAPI_TRANSACTION_COMMIT et BAPI_TRANSACTION_ROLLBACK sont exposés pour chaque objet métier et vous devez toujours les inclure dans votre client WCF.
Le code suivant montre une partie d’une classe de client WCF générée pour l’objet métier Sales Order. Ce client contient des méthodes pour appeler CREATEFROMDAT2, BAPI_TRANSACTION_COMMIT et BAPI_TRANSACTION_ROLLBACK. Pour plus de clarté, les constructeurs et les autres codes ont été omis.
[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() { ... }
}
Transactions BAPI dans le modèle de service WCF
Chaque BAPI, qu’il soit appelé en tant que RFC ou en tant que méthode d’objet métier, fait partie d’une transaction (LUW) sur le système SAP ; et chaque BAPI reçue via la même connexion SAP fait partie de la même transaction BAPI sur le système SAP. SAP valide ou restaure la transaction BAPI lorsqu’il reçoit un BAPI_TRANSACTION_COMMIT ou un BAPI_TRANSACTION_ROLLBACK sur la connexion. Une fois qu’une validation ou une restauration a été effectuée, l’API BAPI suivante reçue sur la connexion commence une nouvelle transaction.
Pour l’adaptateur, chaque canal WCF a une connexion SAP dédiée. Dans le modèle de service WCF, chaque client WCF a un canal interne qui est utilisé pour envoyer des messages au système SAP. Cela signifie que les BAPI qui sont appelées à l’aide d’un client WCF spécifique font partie d’une transaction BAPI unique sur le système SAP. Cela impose une limitation importante lorsque vous utilisez le modèle de service WCF pour appeler des BAPI en tant que méthodes d’objet métier. Étant donné que chaque objet métier SAP est représenté par une classe de client WCF dédiée, vous ne pouvez pas appeler de BAPI à partir de deux objets métier différents dans le cadre de la même transaction. Le moyen de contourner ce problème consiste à appeler les API BAP en tant qu’opérations RFC. En effet, le plug-in Add Adapter Service Reference génère un client WCF unique pour les opérations RFC et, par conséquent, toutes les opérations appelées à l’aide de ce client sont envoyées sur le même canal WCF.
Important
Si vous souhaitez inclure des BAPIs de différents objets métier SAP dans la même transaction BAPI, vous devez les appeler en tant qu’opérations RFC (à l’aide du même client WCF). Vous ne pouvez pas les appeler en tant que méthodes d’objet métier.
Vous appelez BAPI_TRANSACTION_COMMIT ou BAPI_TRANSACTION_ROLLBACK pour valider ou restaurer la transaction BAPI sur le système SAP. L’adaptateur fait apparaître ces deux api BAPIs :
Sous le nœud Base en tant qu’opérations RFC.
Sous chaque objet métier.
Pour plus d’informations sur la façon dont l’adaptateur prend en charge les transactions BAPI sur SAP, consultez Opérations sur les API BAPI dans SAP.
Guide pratique pour créer une application qui appelle des BAPIs en tant que méthodes d’objets métier
Cette section fournit des informations sur la façon d’appeler des API en tant que méthodes d’objets métier. La même procédure de base doit être suivie pour appeler des BAPIs en tant qu’opérations RFC, sauf que vous créez un client WCF qui cible les BAPIs en tant qu’opérations RFC et que vous l’utilisez pour appeler chaque BAPI.
Pour créer une application cliente BAPI, procédez comme suit.
Pour créer une application cliente BAPI
Générez une classe de client WCF. Utilisez le plug-in Visual Studio Add Adapter Service Reference ou l’outil Utilitaire de métadonnées ServiceModel (svcutil.exe) pour générer une classe de client WCF (ou des classes) qui cible les objets métier et les BAPI avec lesquels vous souhaitez travailler. Veillez à inclure les BAPI_TRANSACTION_COMMIT et les méthodes BAPI_TRANSACTION_ROLLBACK (BAPI) exposées pour chaque objet métier cible. Pour plus d’informations sur la génération d’un client WCF, consultez Génération d’un client WCF ou d’un contrat de service WCF pour les artefacts de solution SAP.
Créez un instance de la classe de client WCF générée à l’étape 1, puis créez et configurez un client WCF. La configuration du client WCF implique de spécifier la liaison et l’adresse de point de terminaison que le client utilisera. Vous pouvez le faire impérativement dans le code ou de manière déclarative dans la configuration. Pour plus d’informations sur la spécification d’une liaison de client, consultez Configurer une liaison cliente pour le système SAP. Le code suivant initialise le client WCF pour l’objet métier SAP Order (BUS2032) à partir de la configuration et définit les informations d’identification du système SAP.
BapiBUS2032Client bapiClient = new BapiBUS2032Client("SAPBinding_BapiBUS2032"); bapiClient.ClientCredentials.UserName.UserName = "YourUserName"; bapiClient.ClientCredentials.UserName.Password = "YourPassword";
Ouvrez le client WCF.
bapiClient.Open();
Appelez des méthodes sur le client WCF créé à l’étape 2 pour appeler les API BAP appropriées sur le système SAP. Vous pouvez appeler plusieurs API sur le système SAP.
Terminez la transaction par :
Appel de la méthode BAPI_TRANSACTION_COMMIT pour valider la transaction.
bapiClient.BAPI_TRANSACTION_COMMIT("X");
Appel de la méthode BAPI_TRANSACTION_ROLLBACK pour restaurer la transaction.
bapiClient.BAPI_TRANSACTION_ROLLBACK();
Fermez le client WCF.
bapiClient.Close();
Exemple
L’exemple suivant appelle le CREATEFROMDAT2 BAPI sur l’objet métier Sales Order. Il appelle l’API BAPI plusieurs fois, puis appelle BAPI_TRANSACTION_COMMIT pour valider la transaction. Si une erreur se produit lors de l’appel de l’API BAPI, BAPI_TRANSACTION_ROLLBACK est appelée dans le gestionnaire d’exceptions pour restaurer la transaction.
La méthode CREATEFROMDAT2 prend de nombreux paramètres ; ceux-ci sont omis dans l’exemple par souci de concision. Vous trouverez un exemple illustrant les transactions BAPI dans les exemples fournis avec microsoft BizTalk Adapter Pack. Pour plus d’informations, consultez Exemples pour l’adaptateur SAP.
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();
}
}
}
}
}
Voir aussi
Développer des applications en utilisant le modèle de service WCF
Opérations sur les BAPIs dans SAP