Partager via


Appeler des tRFC dans SAP à l’aide du modèle de service WCF

Les appels de fonction distante transactionnelle (tRFC) garantissent une exécution unique d’un RFC sur un système SAP. Vous pouvez appeler l’un des RFC exposés par l’adaptateur SAP en tant que tRFC. L’appel d’une tRFC dans le modèle de service WCF est similaire à l’appel d’une RFC avec les différences suivantes :

  • L’adaptateur SAP expose les TRFCs sous un nœud différent (TRFC) de celui des RFC (RFC).

  • Les appels clients tRFC ne retournent pas de valeurs pour l’exportation SAP et la modification des paramètres.

  • Les opérations tRFC incluent un paramètre GUID mappé à l’ID de transaction SAP (TID) pour le tRFC par l’adaptateur SAP.

  • Après avoir appelé une tRFC, vous devez appeler l’opération RfcConfirmTransID pour confirmer (valider) la tRFC sur le système SAP. Cette opération est exposée directement sous le nœud TRFC.

    Pour plus d’informations sur les opérations tRFC et l’opération RfcConfirmTransID, consultez Opérations sur les TRFC dans SAP.

    Les sections suivantes vous montrent comment appeler des tRFC sur le système SAP à l’aide de l’adaptateur SAP.

Classe de client WCF

L’adaptateur SAP expose toutes les opérations tRFC sous un seul contrat de service, « Trfc ». Cela signifie qu’une seule classe de client WCF, TrfcClient, est créée pour toutes les opérations tRFC que vous souhaitez appeler. Chaque tRFC cible est représenté en tant que méthode de cette classe. Pour chaque méthode :

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

    Le code suivant montre une partie de la classe TrfcClient et la méthode qui appelle BAPI_SALESORDER_CREATEFROMDAT2 (en tant que tRFC) sur le système SAP. Le paramètre TransactionalRfcOperationIdentifier contient le GUID mappé au TID SAP. Tous les paramètres de la méthode ne sont pas affichés.

[System.Diagnostics.DebuggerStepThroughAttribute()]  
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]  
public partial class TrfcClient : System.ServiceModel.ClientBase<Trfc>, Trfc {  
  
    ....  
  
    /// <summary>The Metadata for this RFC was generated using the RFC SDK.</summary>  
    public void BAPI_SALESORDER_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.BAPIADDR1[] PARTNERADDRESSES,   
                microsoft.lobservices.sap._2007._03.Types.Rfc.BAPIRET2[] RETURN,   
                ref System.Guid TransactionalRfcOperationIdentifier) { ...  }  
}  

Le code suivant montre la méthode générée pour l’opération RfcConfirmTransID. Vous devez vous assurer que cette méthode est générée dans le cadre de TrfcClient. L’opération RfcConfirmTransID est exposée directement sous le nœud TRFC.

public void RfcConfirmTransID(System.Guid TransactionalRfcOperationIdentifier) {…}  

Comment créer une application cliente tRFC

Les étapes de création d’une application qui appelle des tRFC sont similaires à celles que vous suivez pour appeler des RFC, avec les exceptions suivantes :

  • Vous devez récupérer les opérations cibles sous le nœud TRFC.

  • Vous devez récupérer l’opération RfcConfirmTransID. Celle-ci est exposée directement sous le nœud TRFC.

  • Pour confirmer (valider) une opération tRFC sur le système SAP, vous devez appeler l’opération RfcConfirmTransID avec le GUID retourné pour cette opération tRFC.

Pour créer une application cliente tRFC

  1. Générez une classe TrfcClient . 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 TrfcClient qui cible les RFC avec lesquelles vous souhaitez travailler. Pour plus d’informations sur la génération d’un client WCF, consultez Générer un client WCF ou un contrat de service WCF pour les artefacts de solution SAP. Vérifiez que l’opération RfcConfirmTransID est incluse dans la classe TrfcClient .

  2. Créez une instance de la classe TrfcClient générée à l’étape 1 et 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 TrfcClient 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 TrfcClient à partir de la configuration et définit les informations d’identification du système SAP.

    TrfcClient trfcClient = new TrfcClient("SAPBinding_Rfc");  
    
    trfcClient.ClientCredentials.UserName.UserName = "YourUserName";  
    trfcClient.ClientCredentials.UserName.Password = "YourPassword";  
    
  3. Ouvrez trfcClient.

    trfcClient.Open();  
    
  4. Appelez la méthode appropriée sur le TrfcClient créé à l’étape 2 pour appeler la tRFC cible sur le système SAP. Vous pouvez passer une variable qui contient un GUID ou un GUID vide pour le paramètre TransactionalRrcOperationIdentifier . Si vous passez un GUID vide, l’adaptateur SAP en génère un pour vous. Le code suivant appelle BAPI_SALESORDER_CREATEFROMDAT2 en tant que tRFC sur le système SAP (tous les paramètres de la méthode ne sont pas affichés). Un GUID est spécifié.

    transactionalRfcOperationIdentifier = Guid.NewGuid();  
    
    //invoke RFC_CUSTOMER_GET as a tRFC  
    trfcClient.BAPI_SALESORDER_CREATEFROMDAT2(  
                                    request.BEHAVE_WHEN_ERROR,  
                                    request.BINARY_RELATIONSHIPTYPE,  
                                    request.CONVERT,  
    
                                    ...  
    
                                    ref transactionalRfcOperationIdentifier);  
    
  5. Pour confirmer le TID associé à la tRFC sur le système SAP, appelez la méthode RfcConfirmTransID sur le TrfcClient. Spécifiez le GUID retourné à l’étape 4 pour le paramètre TransactionRfcOperationIdentifier.

    trfcClient.RfcConfirmTransID(transactionalRfcOperationIdentifier);  
    
  6. Fermez le TrfcClient lorsque vous avez terminé de l’utiliser (une fois que vous avez terminé d’appeler tous les TRFC).

    trfcClient.Close();   
    

Exemple

L’exemple suivant montre comment appeler BAPI_SALESORDER_CREATE en tant que tRFC.

using System;  
using System.Collections.Generic;  
using System.Text;  
  
// Add WCF, the 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;  
  
using microsoft.lobservices.sap._2007._03.Types.Rfc;  
  
// This example demonstrates sending BAPI_SALESORDER_CREATEFROMDAT2 as a tRFC. The client has   
// methods to:  
//      send the BAPI (BAPI_SALESORDER_CREATEFROMDAT2)and to  
//      Confirm the transaction (RfcConfirmTransID)  
// An instance of BAPI_SALESORDER_CREATEFROMDAT2Request (generated)   
// is used to format the BAPI before invoking BAPI_SALESORDER_CREATEFROMDAT2. This   
// is not necessary, but is done to make it easier to read the code.  
// tRFC invocations always includes a ref parameter that contains a GUID. You can optionally   
// set this parameter when you invoke the method; however, you must use the value returned by  
// the adapter when you call RfcConfirmTransID to confirm the transaction on the SAP system.   
// You can call the utility method, SAPAdapterUtilities.ConvertGuidToTid, to get the value  
// of the SAP transaction Id from the GUID that the adapter returns.  
namespace SapTrfcClientSM  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            TrfcClient sapTrfcClient = null;  
  
            try  
            {  
                Console.WriteLine("SAP TRFC client sample started");  
                Console.WriteLine("Creating the TRFC client");  
                // Create the SAP Trfc Client from configuration  
                sapTrfcClient = new TrfcClient("SAPBinding_Trfc");  
                sapTrfcClient.ClientCredentials.UserName.UserName = "YourUserName";  
                sapTrfcClient.ClientCredentials.UserName.Password = "YourPassword";  
  
                Console.WriteLine("Opening the TRFC client");  
                // Open the Trfc Client  
                sapTrfcClient.Open();  
  
                // Create a GUID -- note: this is optional. If you do not pass a GUID,  
                // for the TransactionalRfcOperationIdentifier parameter, the SAP adapter will   
                // generate one, associate it with the SAP TID, and set the   
                // TransactionalRfcOperationIdentifier parameter.  
                Guid tidGuid = Guid.NewGuid();  
  
                BAPI_SALESORDER_CREATEFROMDAT2Request request = new BAPI_SALESORDER_CREATEFROMDAT2Request();  
  
                request.ORDER_HEADER_IN = new BAPISDHD1();  
                request.ORDER_HEADER_IN.DOC_TYPE = "TA";  
                request.ORDER_HEADER_IN.SALES_ORG = "1000";  
                request.ORDER_HEADER_IN.DISTR_CHAN = "10";  
                request.ORDER_HEADER_IN.DIVISION = "00";  
                request.ORDER_HEADER_IN.SALES_OFF = "1000";  
                request.ORDER_HEADER_IN.REQ_DATE_H = DateTime.Now;  
                request.ORDER_HEADER_IN.PURCH_DATE = DateTime.Now;  
                request.ORDER_HEADER_IN.PURCH_NO_C = "Cust PO";  
                request.ORDER_HEADER_IN.CURRENCY = "EUR";  
  
                BAPISDITM[] orderItems = new BAPISDITM[1];  
                orderItems[0] = new BAPISDITM();  
                orderItems[0].MATERIAL = "P-109";  
                orderItems[0].PLANT = "1000";  
                orderItems[0].TARGET_QU = "ST";  
                request.ORDER_ITEMS_IN = orderItems;  
  
                BAPIPARNR[] orderPartners = new BAPIPARNR[1];  
                orderPartners[0] = new microsoft.lobservices.sap._2007._03.Types.Rfc.BAPIPARNR();  
                orderPartners[0].PARTN_ROLE = "AG";  
                orderPartners[0].PARTN_NUMB = "0000001390";  
                request.ORDER_PARTNERS = orderPartners;  
  
                // Create a GUID -- note: this is optional. If you do not pass a GUID,  
                // for the TransactionalRfcOperationIdentifier parameter, the SAP adapter will   
                // generate one, associate it with the SAP TID, and set the   
                // TransactionalRfcOperationIdentifier parameter.  
                request.TransactionalRfcOperationIdentifier = Guid.NewGuid();  
  
                Console.WriteLine("Invoking BAPI_SALESORDER_CREATEFROMDAT2 as a tRFC");  
  
                //invoke RFC_CUSTOMER_GET as a tRFC  
                sapTrfcClient.BAPI_SALESORDER_CREATEFROMDAT2(request.BEHAVE_WHEN_ERROR,  
                                                                request.BINARY_RELATIONSHIPTYPE,  
                                                                request.CONVERT,  
                                                                request.INT_NUMBER_ASSIGNMENT,  
                                                                request.LOGIC_SWITCH,  
                                                                request.ORDER_HEADER_IN,  
                                                                request.ORDER_HEADER_INX,  
                                                                request.SALESDOCUMENTIN,  
                                                                request.SENDER,  
                                                                request.TESTRUN,  
                                                                request.EXTENSIONIN,  
                                                                request.ORDER_CCARD,  
                                                                request.ORDER_CFGS_BLOB,  
                                                                request.ORDER_CFGS_INST,  
                                                                request.ORDER_CFGS_PART_OF,  
                                                                request.ORDER_CFGS_REF,  
                                                                request.ORDER_CFGS_REFINST,  
                                                                request.ORDER_CFGS_VALUE,  
                                                                request.ORDER_CFGS_VK,  
                                                                request.ORDER_CONDITIONS_IN,  
                                                                request.ORDER_CONDITIONS_INX,  
                                                                request.ORDER_ITEMS_IN,  
                                                                request.ORDER_ITEMS_INX,  
                                                                request.ORDER_KEYS,  
                                                                request.ORDER_PARTNERS,  
                                                                request.ORDER_SCHEDULES_IN,  
                                                                request.ORDER_SCHEDULES_INX,  
                                                                request.ORDER_TEXT,  
                                                                request.PARTNERADDRESSES,  
                                                                request.RETURN,  
                                                                ref request.TransactionalRfcOperationIdentifier);  
  
                string sapTxId = null;  
                sapTxId = SAPAdapterUtilities.ConvertGuidToTid(request.TransactionalRfcOperationIdentifier);  
  
                Console.WriteLine("BAPI_SALESORDER_CREATEFROMDAT2 Sent");  
                Console.WriteLine("The SAP Transaction Id is " + sapTxId);  
  
                // Invoke the RfcConfirmTransID method to confirm (commit) the transaction on  
                // the SAP system. This step is required to complete the transaction. The SAP  
                // adapter will always return a TranactionalRfcOperationIdentifier, whether   
                // one was supplied in the call or not.  
                sapTrfcClient.RfcConfirmTransID(request.TransactionalRfcOperationIdentifier);  
  
                Console.WriteLine("SAP Transaction {0} has been committed", sapTxId);  
  
                Console.WriteLine("\nHit <RETURN> to end");  
                Console.ReadLine();  
  
            }  
            catch (ConnectionException cex)  
            {  
                Console.WriteLine("Exception occurred connecting to the SAP system");  
                Console.WriteLine(cex.InnerException.Message);  
                throw;  
            }  
            catch (Exception ex)  
            {  
                Console.WriteLine("Exception is: " + ex.Message);  
                if (ex.InnerException != null)  
                {  
                    Console.WriteLine("Inner Exception is: " + ex.InnerException.Message);  
                }  
                throw;  
            }  
            finally  
            {  
                // Close the client  
                if (sapTrfcClient != null)  
                {  
                    if (sapTrfcClient.State == CommunicationState.Opened)  
                        sapTrfcClient.Close();  
                    else  
                        sapTrfcClient.Abort();  
                }  
            }  
  
        }  
    }  
}  

Voir aussi

Développer des applications en utilisant le modèle de service WCF
Opérations sur les TRFC dans SAP