Condividi tramite


Richiamare bapi in SAP usando il modello di servizio WCF

L'adattatore SAP presenta bapi come segue:

  • Operazioni RFC. I BAPI come qualsiasi altro RFC vengono visualizzati sotto il nodo RFC nel plug-in Aggiungi riferimento al servizio adapter.

  • Metodi degli oggetti business SAP. Come metodi di oggetti business, gli oggetti BAPI vengono visualizzati dall'oggetto business nel nodo BAPI nel plug-in Aggiungi riferimento al servizio adapter.

    Sia che si richiami un BAPI come operazione RFC o come metodo di oggetto business, ogni BAPI fa sempre parte di un LUW nel sistema SAP.

    Per una panoramica del modo in cui l'adattatore SAP supporta bapi, vedere Operazioni sui BAPI in SAP.

    Quando si usa il modello di servizio WCF per richiamare BAPI come metodi di oggetto business, ogni oggetto business SAP è rappresentato da una classe client WCF e i BAPI di tale oggetto business sono rappresentati come metodi nel client. È possibile usare il plug-in Add Adapter Service Reference di Visual Studio per generare una classe client WCF per oggetti business specifici che contiene metodi per ogni BAPI 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 BAPI. È quindi possibile creare un'istanza di questa classe client WCF e chiamare i relativi metodi per richiamare i BAPI di destinazione.

    Le sezioni seguenti illustrano come richiamare BAPI come metodi di oggetti business e illustrano come sono supportate le transazioni BAPI nel modello di servizio WCF.

Classe client WCF

L'adattatore SAP presenta un contratto di servizio diverso, per ogni oggetto business. Ciò significa che per ogni oggetto business viene creata una classe client WCF univoca. Il nome di questa classe è basato sul tipo di oggetto business. Ad esempio, per l'oggetto business Sales Order (tipo di oggetto business BUS2032), la classe client WCF è BapiBUS2032Client. Ogni BAPI di destinazione nell'oggetto business è rappresentato come metodo nella classe client WCF generata. In ogni metodo:

  • I parametri di esportazione SAP vengono visualizzati come parametri out

  • I parametri di chiamata 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.

    BAPI_TRANSACTION_COMMIT e BAPI_TRANSACTION_ROLLBACK vengono visualizzati per ogni oggetto business ed è consigliabile includerli sempre nel client WCF.

    Il codice seguente mostra parte di una classe client WCF generata per l'oggetto Business Sales Order. Questo client contiene metodi per richiamare CREATEFROMDAT2, BAPI_TRANSACTION_COMMIT e BAPI_TRANSACTION_ROLLBACK. Per maggiore chiarezza, i costruttori e altri codici sono stati omessi.

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

Transazioni BAPI nel modello di servizio WCF

Ogni BAPI, che venga richiamato come RFC o come metodo di oggetto business, fa parte di una transazione (LUW) nel sistema SAP; e ogni BAPI ricevuto tramite la stessa connessione SAP fa parte della stessa transazione BAPI nel sistema SAP. SAP esegue il commit o il rollback della transazione BAPI quando riceve un BAPI_TRANSACTION_COMMIT o un BAPI_TRANSACTION_ROLLBACK sulla connessione. Dopo aver eseguito un commit o un rollback, il bapi successivo ricevuto tramite la connessione avvia una nuova transazione.

Per l'adattatore ogni canale WCF ha una connessione SAP dedicata. Nel modello di servizio WCF ogni client WCF ha un canale interno che viene usato per inviare messaggi al sistema SAP. Ciò significa che i BAPI richiamati usando un client WCF specifico fanno parte di una transazione BAPI univoca nel sistema SAP. Ciò impone una limitazione significativa quando si usa il modello di servizio WCF per richiamare BAPI come metodi business object. Poiché ogni oggetto business SAP è rappresentato da una classe client WCF dedicata, non è possibile richiamare BAPI da due oggetti business diversi come parte della stessa transazione. In questo modo è possibile richiamare gli oggetti BAPI come operazioni RFC. Ciò avviee perché il plug-in aggiungi riferimento al servizio adapter genera un singolo client WCF per le operazioni RFC e, pertanto, tutte le operazioni richiamate usando tale client vengono inviate sullo stesso canale WCF.

Importante

Se si desidera includere BAPI da oggetti business SAP diversi nella stessa transazione BAPI, è necessario richiamarli come operazioni RFC (usando lo stesso client WCF). Non è possibile richiamarli come metodi oggetto business.

Si chiama BAPI_TRANSACTION_COMMIT o BAPI_TRANSACTION_ROLLBACK per eseguire il commit o il rollback della transazione BAPI nel sistema SAP. L'adattatore presenta questi due BAPI:

  • Nel nodo Base come operazioni RFC.

  • In ogni oggetto business.

    Per altre informazioni sul modo in cui l'adapter supporta le transazioni BAPI in SAP, vedere Operazioni su BAPI in SAP.

Come creare un'applicazione che richiama bapi come metodi di oggetti business

Questa sezione fornisce informazioni su come richiamare bapi come metodi di oggetti business. È necessario seguire la stessa procedura di base per richiamare BAPI come operazioni RFC, ad eccezione del fatto che si crea un client WCF destinato alle BAPI come operazioni RFC e usarlo per richiamare ogni BAPI.

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

Per creare un'applicazione client BAPI

  1. Generare una classe client WCF. Usare il plug-in Add Adapter Service Reference di Visual Studio o lo Strumento utilità metadati ServiceModel (svcutil.exe) per generare una classe client WCF (o classi) destinata agli oggetti business e ai BAP con cui si desidera funzionare. Assicurarsi di includere il BAPI_TRANSACTION_COMMIT e i metodi BAPI_TRANSACTION_ROLLBACK (BAPI) esposti per ogni oggetto business di destinazione. Per altre informazioni su come generare un client WCF, vedere Generazione di un client WCF o di un contratto di servizio WCF per gli artefatti della soluzione SAP.

  2. Creare un'istanza della classe client WCF generata nel passaggio 1 e creare e configurare un client WCF. La configurazione del client WCF prevede la specifica dell'associazione e dell'indirizzo dell'endpoint che verrà usato dal client. È 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 il client WCF per l'oggetto business SAP Sales Order (BUS2032) dalla configurazione e imposta le credenziali per il sistema SAP.

    BapiBUS2032Client bapiClient = new BapiBUS2032Client("SAPBinding_BapiBUS2032");  
    
    bapiClient.ClientCredentials.UserName.UserName = "YourUserName";  
    bapiClient.ClientCredentials.UserName.Password = "YourPassword";  
    
  3. Aprire il client WCF.

    bapiClient.Open();  
    
  4. Richiamare i metodi nel client WCF creato nel passaggio 2 per richiamare gli oggetti BAPI appropriati nel sistema SAP. È possibile richiamare più BAPI nel sistema SAP.

  5. Terminare la transazione in base a:

    1. Richiamare il metodo BAPI_TRANSACTION_COMMIT per eseguire il commit della transazione.

      bapiClient.BAPI_TRANSACTION_COMMIT("X");  
      
    2. Richiamare il metodo BAPI_TRANSACTION_ROLLBACK per eseguire il rollback della transazione.

      bapiClient.BAPI_TRANSACTION_ROLLBACK();  
      
  6. Chiudere il client WCF.

    bapiClient.Close();   
    

Esempio

Nell'esempio seguente viene richiamato il CREATEFROMDAT2 BAPI nell'oggetto Business Sales Order. Richiama il BAPI più volte e quindi richiama BAPI_TRANSACTION_COMMIT per eseguire il commit della transazione. Se si verifica un errore quando si richiama bapi, BAPI_TRANSACTION_ROLLBACK viene richiamato nel gestore eccezioni per eseguire il rollback della transazione.

Il metodo CREATEFROMDAT2 accetta molti parametri; questi vengono omessi nell'esempio per motivi di brevità. È possibile trovare un esempio che illustra le transazioni BAPI negli esempi forniti con Microsoft BizTalk Adapter Pack. Per altre informazioni, vedere Esempi per l'adapter 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();  
                }  
            }  
        }  
    }  
}  

Vedere anche

Sviluppare applicazioni tramite il modello di servizio WCF
Operazioni su BAPI in SAP