Teilen über


Senden von IDOCs an SAP mithilfe des WCF-Dienstmodells

Intern sendet der Microsoft BizTalk-Adapter für mySAP Business Suite IDOCs an das SAP-System, indem eine der beiden folgenden RFCs aufgerufen wird:

  • IDOC_INBOUND_ASYNCHRONOUS für Version 3 IDOCs.

  • INBOUND_IDOC_PROCESS für Version 2 IDOCs.

    Sie können ein IDOC an den Adapter senden, indem Sie den entsprechenden RFC (oder tRFC) aufrufen. Sie können jedoch auch die beiden folgenden Vorgänge verwenden, um IDOCs an den Adapter zu senden:

  • SendIdoc wird direkt unter dem IDOC-Stammknoten angezeigt. Der SendIdoc-Vorgang sendet das IDOC als Zeichenfolgendaten (schwach typisiert) an den SAP-Adapter.

  • Senden wird für jedes IDOC einzeln angezeigt. Der Sendevorgang sendet das IDOC als stark typisierte Daten an den SAP-Adapter.

    Diese Vorgänge bestimmen, wie die IDOC-Daten an den Adapter gesendet werden, nicht wie sie an das SAP-System gesendet werden. Der Adapter sendet das IDOC immer mithilfe des entsprechenden tRFC an das SAP-System.

    Da der SAP-Adapter das IDOC als tRFC sendet, machen sowohl der Send- als auch der SendIdoc-Vorgang einen GUID-Parameter verfügbar, den Sie zum Bestätigen (Committen) des IDOC verwenden. Der SAP-Adapter ordnet diese GUID intern der SAP-Transaktions-ID (TID) zu, die dem tRFC zugeordnet ist. Sie können das IDOC auf zwei Arten bestätigen:

  • Mithilfe der AutoConfirmSentIdocs-Bindungseigenschaft . Wenn diese Bindungseigenschaft auf true festgelegt ist, bestätigt der Adapter automatisch den tRFC, der zum Senden des IDOC verwendet wird.

  • Durch Aufrufen von RfcConfirmTransID. Sie rufen diesen Vorgang mit der GUID auf, die dem IDOC zugeordnet ist.

    In den folgenden Abschnitten wird gezeigt, wie Sie IDOCs mithilfe der Vorgänge SendIdoc und Send an ein SAP-System senden. Weitere Informationen zum Senden eines IDOC als tRFC finden Sie unter Aufrufen von tRFCs in SAP mithilfe des WCF-Dienstmodells.

Die WCF-Clientklasse

Der SendIdoc-Vorgang

Der SAP-Adapter zeigt einen einzelnen Vorgang (und einen Dienstvertrag) an, um ein IDOC im Zeichenfolgenformat zu senden. Der Name des Dienstvertrags lautet "Idoc", und die WCF-Clientklasse ist IdocClient.

Sie können jedes IDOC mit diesem Client an SAP senden. Es enthält eine einzelne Methode, SendIdoc, die zwei Parameter akzeptiert:

  • idocData ist eine Zeichenfolge, die die IDOC-Daten enthält.

  • guid ist die GUID, die der SAP TID zugeordnet ist.

    Der folgende Code zeigt den WCF-Client, der für den SendIdoc-Vorgang generiert wird.

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

Der Sendevorgang

Da der Sendevorgang stark typisierte Daten verwendet, zeigt der SAP-Adapter einen eindeutigen Dienstvertrag für jedes IDOC an. Der Name der für diesen Vertrag generierten Schnittstelle (und der WCF-Clientklasse) basiert auf dem IDOC-Typ, der Version, der Releasenummer und dem CIM-Typ (falls relevant). Für das IDOC ORDERS03.v3.620 hat die Schnittstelle den Namen "IdocORDERS03V3R620" und die WCF-Clientklasse IdocORDERS03V3R620Client.

Sie müssen einen eindeutigen Client für jeden IDOC-Typ generieren. Dieser Client enthält eine einzelne Methode, Send, die zwei Parameter akzeptiert:

  • idocData ist eine Klasse, die die stark typisierten IDOC-Daten darstellt.

  • guid ist eine Zeichenfolgendarstellung der GUID, die der SAP TID zugeordnet ist.

    Der folgende Code zeigt den WCF-Client, der für den Sendevorgang generiert wird, der für das IDOC ORDERS03.v3.620 angezeigt wird.

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

Erstellen einer Anwendung zum Senden von IDOCs

Führen Sie die folgenden Schritte aus, um ein IDOC an ein SAP-System zu senden.

So senden Sie ein IDOC an ein SAP-System

  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 die WCF-Clientklasse zu generieren, die auf die IDOCs 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. Wenn Sie IDOCs explizit bestätigen möchten, stellen Sie sicher, dass Sie den WCF-Client für den RfcConfirmTransID-Vorgang generieren. Vorgänge finden Sie unter den folgenden Knoten:

    • SendIdoc-Vorgang. Direkt unter dem IDOC-Knoten.

    • Sendevorgang. Unter dem Knoten, der dem Typ, der Version und der Releasenummer des Ziel-IDOC entspricht.

    • RfcConfirmTransID-Vorgang. Direkt unter dem TRFC-Knoten.

  2. Erstellen Sie eine instance der in Schritt 1 generierten WCF-Clientklasse, und geben Sie eine Clientbindung an. Das Angeben einer Clientbindung umfasst die Angabe der Bindungs- und Endpunktadresse, die vom WCF-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 einen IdocClient (für den Sendevorgang) aus der Konfiguration und legt die Anmeldeinformationen für das SAP-System fest.

    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";;  
    
  3. Wenn der Adapter den tRFC im SAP-System bestätigen soll, nachdem er das IDOC gesendet hat, legen Sie die AutoConfirmSentIdocs-Bindungseigenschaft auf true fest. Sie müssen dies tun, bevor Sie den WCF-Client öffnen.

    // Set AutoConfirmSentIdocs property to true  
    binding.AutoConfirmSentIdocs = true;  
    
  4. Öffnen Sie den WCF-Client.

    idocClient.Open();  
    
  5. Rufen Sie die entsprechende Methode auf dem WCF-Client auf, der in Schritt 2 erstellt wurde, um das IDOC an das SAP-System zu senden. Sie können eine Variable übergeben, die eine GUID enthält oder für den guid-Parameter auf NULL festgelegt ist. Wenn Sie keine GUID angeben, generiert der SAP-Adapter eine für den Vorgang (guid ist ein Ref-Parameter ). Der folgende Code liest ein IDOC (im Zeichenfolgenformat) aus einer Datei und sendet es mithilfe des SendIdoc-Vorgangs an das SAP-System.

    // 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);  
    
  6. Wenn Sie die AutoConfirmSentIdocs-Bindungseigenschaft nicht auf true festgelegt haben (in Schritt 3), müssen Sie den tRFC im SAP-System bestätigen. Dazu müssen Sie die RfcConfirmTransID-Methode auf einem TrfcClient aufrufen (Erstellung nicht angezeigt). Geben Sie die GUID an, die in Schritt 4 für den Parameter zurückgegeben wurde.

    trfcClient.RfcConfirmTransID(adapterTxGuid);  
    
  7. Schließen Sie den WCF-Client (und trfcClient, falls verwendet), wenn Sie ihn verwendet haben (nachdem Sie das Senden von IDOCs abgeschlossen haben).

    idocClient.Close();   
    

Beispiel

Im folgenden Beispiel wird mithilfe der SendIdoc-Methode ein IDOC an ein SAP-System gesendet. Das IDOC wird aus einer Datei gelesen, ORDERS03.txt. Diese Datei enthält eine ORDERS03. V3.620 IDOC und ist in den Beispielen enthalten; Der SendIdoc-Vorgang kann jedoch verwendet werden, um jedes IDOC zu senden.

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

Weitere Informationen

Entwickeln von Anwendungen mithilfe des WCF-Dienstmodells