Condividi tramite


Richiamare le RFC in SAP usando il modello di servizio WCF

L'adapter Microsoft BizTalk per mySAP Business Suite espone le RFC nel sistema SAP come operazioni che possono essere richiamate da un programma client. Nel modello di servizio WCF queste operazioni vengono richiamate come metodi di una classe client WCF generata. È possibile usare il plug-in Add Adapter Service Reference di Visual Studio per generare una classe client WCF contenente i metodi per ogni RFC che si desidera richiamare nel codice. Il plug-in Add Adapter Service Reference genera anche tipi .NET per incapsulare i parametri e i tipi di dati usati da ogni RFC. È quindi possibile creare un'istanza di questa classe client WCF e chiamare i relativi metodi per richiamare le RFC di destinazione.

Le sezioni seguenti illustrano come richiamare le RFC nel sistema SAP usando l'adattatore SAP.

Classe client WCF

L'adattatore SAP espone tutte le operazioni RFC in un singolo contratto di servizio, "Rfc". Ciò significa che viene creata una singola classe client WCF, RfcClient, per tutte le operazioni RFC che si desidera richiamare. Ogni RFC di destinazione è rappresentato come metodo di questa classe. In ogni metodo:

  • I parametri di esportazione SAP vengono visualizzati come parametri out

  • I parametri di modifica sap vengono visualizzati come parametri di riferimento .

  • I tipi SAP complessi, ad esempio le strutture, vengono visualizzati come classi .NET con proprietà che corrispondono ai campi del tipo SAP. Queste classi sono definite nello spazio dei nomi seguente: microsoft.lobservices.sap._2007._03.Types.Rfc.

    Il codice seguente mostra parte della classe RfcClient e del metodo che richiama SD_RFC_CUSTOMER_GET nel sistema SAP.

 [System.Diagnostics.DebuggerStepThroughAttribute()]  
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]  
public partial class RfcClient : System.ServiceModel.ClientBase<Rfc>, Rfc {  
  
    ...  
  
    /// <summary>The metadata for this RFC was generated using the RFC SDK.</summary>  
    /// <param name="KUNNR">Customer number</param>  
    /// <param name="NAME1">Name of the customer</param>  
    /// <param name="CUSTOMER_T">Table of the selected customers</param>  
    /// <returns></returns>  
    public void SD_RFC_CUSTOMER_GET(string KUNNR, string NAME1, ref microsoft.lobservices.sap._2007._03.Types.Rfc.RFCCUST[] CUSTOMER_T) {...}  
}  

Come creare un'applicazione client RFC

Per creare un'applicazione client RFC, seguire questa procedura.

Per creare un'applicazione client RFC

  1. Generare una classe RfcClient . Usare il plug-in Add Adapter Service Reference di Visual Studio o lo Strumento utilità metadati ServiceModel (svcutil.exe) per generare una classe RfcClient destinata alle RFC con cui si desidera funzionare. Per altre informazioni su come generare un client WCF, vedere Generare un client WCF o un contratto di servizio WCF per gli artefatti della soluzione SAP.

  2. Creare un'istanza della classe RfcClient generata nel passaggio 1 e specificare un'associazione client. La specifica di un'associazione client prevede la specifica dell'associazione e dell'indirizzo dell'endpoint che verrà usato da RfcClient . È possibile eseguire questa operazione in modo imperativo nel codice o in modo dichiarativo nella configurazione. Per altre informazioni su come specificare un'associazione client, vedere Configurare un'associazione client per il sistema SAP. Il codice seguente inizializza RfcClient dalla configurazione e imposta le credenziali per il sistema SAP.

    RfcClient rfcClient = new RfcClient("SAPBinding_Rfc");  
    
    rfcClient.ClientCredentials.UserName.UserName = "YourUserName";  
    rfcClient.ClientCredentials.UserName.Password = "YourPassword";  
    
  3. Aprire il client WCF.

    rfcClient.Open();  
    
  4. Richiamare i metodi in RfcClient creato nel passaggio 2 per eseguire operazioni sul sistema SAP. Il codice seguente richiama il metodo SD_RFC_CUSTOMER_GET di RfcClient per richiamare il RFC nel sistema SAP.

    microsoft.lobservices.sap._2007._03.Types.Rfc.RFCCUST[] customers =   
        new microsoft.lobservices.sap._2007._03.Types.Rfc.RFCCUST[0];  
    
    rfcClient.SD_RFC_CUSTOMER_GET(string.Empty, "AB*", ref customers);  
    
  5. Chiudere il client WCF.

    rfcClient.Close();   
    

Esempio

Di seguito è riportato un esempio di codice completo che richiama SD_RFC_CUSTOMER_GET per restituire un elenco di clienti con nomi che iniziano con "AB" e quindi scrive il nome e l'ID per ogni cliente nella console. In questo esempio viene creato RfcClient all'interno di un'istruzione using . Non è necessario chiudere in modo esplicito RfcClient; verrà chiuso quando il percorso di esecuzione esce dal contesto.

using System;  
using System.Collections.Generic;  
using System.Text;  
  
using System.ServiceModel;  
using Microsoft.ServiceModel.Channels;  
using Microsoft.Adapters.SAP;  
  
namespace SapRfcClientSM  
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
            try  
            {  
                // Create client from configuration  
                using (RfcClient rfcClient = new RfcClient("SAPBinding_Rfc"))  
                {  
  
                    rfcClient.ClientCredentials.UserName.UserName = "YourUserName";  
                    rfcClient.ClientCredentials.UserName.Password = "YourPassword";  
  
                    // Open client  
                    rfcClient.Open();  
  
                    microsoft.lobservices.sap._2007._03.Types.Rfc.RFCCUST[] customers = new microsoft.lobservices.sap._2007._03.Types.Rfc.RFCCUST[0];  
  
                    // Invoke SD_RFC_CUSTOMER_GET  
                    rfcClient.SD_RFC_CUSTOMER_GET(string.Empty, "AB*", ref customers);  
  
                    // Write the results to the console  
                    foreach (microsoft.lobservices.sap._2007._03.Types.Rfc.RFCCUST customer in customers)  
                    {  
                        Console.WriteLine("Customer Name = " + customer.NAME1);  
                        Console.WriteLine("         Id   = " + customer.KUNNR);  
                        Console.WriteLine();  
                    }  
                }  
            }  
            catch (Exception ex)  
            {  
                Console.WriteLine(ex.Message);  
                if (ex.InnerException != null)  
                    Console.WriteLine("Inner exception is :" + ex.InnerException);  
            }  
        }  
    }  
}  

Vedere anche

Sviluppare applicazioni tramite il modello di servizio WCF
Schemi di messaggio per operazioni RFC