Envoyer des IDOC à SAP à l’aide du modèle de service WCF
En interne, l’adaptateur Microsoft BizTalk pour mySAP Business Suite envoie des IDOC au système SAP en appelant l’une des deux RFC suivantes :
IDOC_INBOUND_ASYNCHRONOUS pour les IIDO version 3.
INBOUND_IDOC_PROCESS pour les AIDO version 2.
Vous pouvez envoyer un IDOC à l’adaptateur en appelant la RFC (ou tRFC) appropriée ; Toutefois, vous pouvez également utiliser les deux opérations suivantes pour envoyer des IDOCs à l’adaptateur :
SendIdoc est exposé directement sous le nœud racine IDOC. L’opération SendIdoc envoie l’IDOC en tant que données de chaîne (faiblement typées) à l’adaptateur SAP.
L’envoi est exposé individuellement pour chaque IDOC. L’opération d’envoi envoie l’IDOC en tant que données fortement typées à l’adaptateur SAP.
Ces opérations déterminent comment les données IDOC sont envoyées à l’adaptateur, et non comment elles sont envoyées au système SAP. L’adaptateur envoie toujours l’IDOC au système SAP à l’aide du tRFC approprié.
Étant donné que l’adaptateur SAP envoie l’IDOC en tant que tRFC, les opérations Send et SendIdoc exposent un paramètre GUID que vous utilisez pour confirmer (valider) l’IDOC. L’adaptateur SAP mappe en interne ce GUID avec l’ID de transaction SAP (TID) associé au tRFC. Vous pouvez confirmer l’IDOC de deux manières :
À l’aide de la propriété de liaison AutoConfirmSentIdocs . Si cette propriété de liaison a la valeur true, l’adaptateur confirme automatiquement le tRFC utilisé pour envoyer l’IDOC.
En appelant RfcConfirmTransID. Vous appelez cette opération avec le GUID associé à l’IDOC.
Les sections suivantes vous montrent comment envoyer des IDOC à un système SAP à l’aide des opérations SendIdoc et Send. Pour plus d’informations pour vous aider à envoyer un IDOC en tant que tRFC, consultez Appeler des tRFC dans SAP à l’aide du modèle de service WCF.
Classe de client WCF
Opération SendIdoc
L’adaptateur SAP affiche une seule opération (et un contrat de service) pour envoyer un IDOC au format chaîne. Le nom du contrat de service est « Idoc » et la classe de client WCF est IdocClient.
Vous pouvez envoyer n’importe quel IDOC à SAP à l’aide de ce client. Il contient une méthode unique, SendIdoc, qui prend deux paramètres :
idocData est une chaîne qui contient les données IDOC
guid est le GUID mappé au TID SAP.
Le code suivant montre le client WCF qui est généré pour l’opération SendIdoc.
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class IdocClient : System.ServiceModel.ClientBase<Idoc>, Idoc {
public void SendIdoc(string idocData, ref System.Nullable\<System.Guid\> guid) {…}
}
Opération d’envoi
Étant donné que l’opération d’envoi utilise des données fortement typées, l’adaptateur SAP expose un contrat de service unique pour chaque IDOC. Le nom de l’interface (et de la classe de client WCF) générée pour ce contrat est basé sur le type DDOC, la version, le numéro de version et le type CIM (le cas échéant). Par exemple, pour l’IDOC ORDERS03.v3.620, l’interface est nommée « IdocORDERS03V3R620 » et la classe de client WCF est IdocORDERS03V3R620Client.
Vous devez générer un client unique pour chaque type d’IDOC différent. Ce client contient une méthode unique, Send, qui prend deux paramètres :
idocData est une classe qui représente les données IDOC fortement typées.
guid est une représentation sous forme de chaîne du GUID mappé au TID SAP.
Le code suivant montre le client WCF qui est généré pour l’opération Envoyer exposé pour l’IDOC ORDERS03.v3.620.
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
public partial class IdocORDERS03V3R620Client : System.ServiceModel.ClientBase<IdocORDERS03V3R620>, IdocORDERS03V3R620 {
...
public void Send(ORDERS03 idocData, ref string guid) { ... }
}
Comment créer une application pour envoyer des AIDOC
Pour envoyer un IDOC à un système SAP, procédez comme suit.
Pour envoyer un IDOC à un système SAP
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 la classe de client WCF qui cible les AIDO avec lesquelles vous souhaitez travailler. 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. Si vous souhaitez confirmer explicitement les IDOCs, veillez à générer le client WCF pour l’opération RfcConfirmTransID. Les opérations se trouvent sous les nœuds suivants :
Opération SendIdoc. Directement sous le nœud IDOC.
Opération d’envoi. Sous le nœud correspondant au type, à la version et au numéro de version de l’IDOC cible.
Opération RfcConfirmTransID. Directement sous le nœud TRFC.
Créez une instance de la classe de client WCF générée à l’étape 1, puis spécifiez une liaison de client. La spécification d’une liaison client implique de spécifier la liaison et l’adresse de point de terminaison que le client WCF 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 un IdocClient (pour l’opération Send) à partir de la configuration et définit les informations d’identification du système SAP.
SAPBinding binding = new SAPBinding(); // Set endpoint address EndpointAddress endpointAddress = new EndpointAddress("sap://CLIENT=800;LANG=EN;@a/YourSAPHost/00?RfcSdkTrace=False&AbapDebug=False&UseSapGui=Without"); // Create client and set credentials idocClient = new IdocClient(binding, endpointAddress); idocClient.ClientCredentials.UserName.UserName = "YourUserName"; idocClient.ClientCredentials.UserName.Password = "YourPassword";;
Si vous souhaitez que l’adaptateur confirme le tRFC sur le système SAP après l’envoi de l’IDOC, définissez la propriété de liaison AutoConfirmSentIdocs sur true. Vous devez le faire avant d’ouvrir le client WCF.
// Set AutoConfirmSentIdocs property to true binding.AutoConfirmSentIdocs = true;
Ouvrez le client WCF.
idocClient.Open();
Appelez la méthode appropriée sur le client WCF créé à l’étape 2 pour envoyer l’IDOC au système SAP. Vous pouvez passer une variable qui contient un GUID ou qui a la valeur null pour le paramètre GUID . Si vous ne spécifiez pas de GUID, l’adaptateur SAP en génère un pour l’opération (guid est un paramètre ref ). Le code suivant lit un IDOC (au format chaîne) à partir d’un fichier et l’envoie au système SAP à l’aide de l’opération SendIdoc.
// Read IDOC into string variable using (StreamReader reader = new StreamReader("ORDERS03.txt")) { idocData = reader.ReadToEnd(); } //Get a new GUID to pass to SendIdoc. You can also assign a null //value to have the adapter generate a GUID. adapterTxGuid = Guid.NewGuid(); //Invoke SendIdoc on the client to send the IDOC to the SAP system idocClient.SendIdoc(idocData, ref adapterTxGuid);
Si vous n’avez pas défini la propriété de liaison AutoConfirmSentIdocs sur true (à l’étape 3), vous devez confirmer la valeur tRFC sur le système SAP. Pour ce faire, vous devez appeler la méthode RfcConfirmTransID sur un TrfcClient (création non affichée). Spécifiez le GUID retourné à l’étape 4 pour le paramètre .
trfcClient.RfcConfirmTransID(adapterTxGuid);
Fermez le client WCF (et TrfcClient, le cas échéant) lorsque vous avez terminé de l’utiliser (une fois que vous avez terminé d’envoyer des AIDO).
idocClient.Close();
Exemple
L’exemple suivant envoie un IDOC à un système SAP à l’aide de la méthode SendIdoc. L’IDOC est lu à partir d’un fichier, ORDERS03.txt. Ce fichier contient un ORDERS03. V3.620 IDOC et est inclus dans les exemples ; Toutefois, l’opération SendIdoc peut être utilisée pour envoyer n’importe quel IDOC.
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
// Add WCF, 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;
// This example sends a flat IDOC to the SAP system by using the SendIdoc operation.
namespace SapIdocStringClientSM
{
class Program
{
static void Main(string[] args)
{
// variable for the IDOC client
IdocClient idocClient = null;
Console.WriteLine("IDOC string client sample started");
try
{
// Variable for the GUID
System.Nullable<System.Guid> adapterTxGuid;
// string to hold the Idoc data
string idocData;
// string to hold the SAP transaction ID (TID)
string sapTxId;
// The client can be configured from app.config, but it is
// explicitly configured here for demonstration.
// set AutoConfirmSentIdocs property to true
SAPBinding binding = new SAPBinding();
binding.AutoConfirmSentIdocs = true;
// Set endpoint address
EndpointAddress endpointAddress = new EndpointAddress("sap://CLIENT=800;LANG=EN;@a/YourSAPServer/00?RfcSdkTrace=False&AbapDebug=False&UseSapGui=Without");
// Create client and set credentials
idocClient = new IdocClient(binding, endpointAddress);
idocClient.ClientCredentials.UserName.UserName = "YourUserName";
idocClient.ClientCredentials.UserName.Password = "YourPassword";
// Open the client and send the Idoc
idocClient.Open();
// Read IDOC into string variable
using (StreamReader reader = new StreamReader("ORDERS03.txt"))
{
idocData = reader.ReadToEnd();
}
//Get a new GUID to pass to SendIdoc. You can also assign a null.
//value to have the adapter generate a GUID.
adapterTxGuid = Guid.NewGuid();
//Invoke SendIdoc on the client to send the IDOC to the SAP system.
idocClient.SendIdoc(idocData, ref adapterTxGuid);
// The AutoConfirmSentIdocs binding property is set to true, so there is no need to
// confirm the IDOC. If this property is not set to true, you must call the
// RfcConfirmTransID method of a TrfcClient with adapterTxGuid to
// confirm the transaction on the SAP system.
// Get SAP tx id from GUID
sapTxId = SAPAdapterUtilities.ConvertGuidToTid((Guid) adapterTxGuid);
Console.WriteLine("IDOC sent");
Console.WriteLine("The SAP Transaction Id is : " + sapTxId);
catch (Exception ex)
{
Console.WriteLine("Exception is: " + ex.Message);
if (ex.InnerException != null)
{
Console.WriteLine("Inner Exception is: " + ex.InnerException.Message);
}
}
finally
{
// Close the IDOC client
if (idocClient != null)
{
if (idocClient.State == CommunicationState.Opened)
idocClient.Close();
else
idocClient.Abort();
}
}
}
}
}
Voir aussi
Développer des applications en utilisant le modèle de service WCF