Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
L'adattatore SAP presenta gli indicatori BAPI come segue:
Operazioni RFC. I BAPI, come qualsiasi altro RFC, vengono visualizzati sotto il nodo RFC nel plug-in Aggiungi riferimento al servizio adattatore.
Metodi degli oggetti aziendali di SAP. Come metodi degli oggetti aziendali, le BAPI vengono messe a disposizione dall'oggetto aziendale sotto il nodo BAPI nel plug-in Aggiungi riferimento al servizio adattatore.
Se si richiama 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'adapter SAP supporta le BAPI, vedere Operazioni sulle BAPI in SAP.
Quando si usa il modello di servizio WCF per richiamare le BAPIs come metodi di oggetti business, ogni oggetto business SAP è rappresentato da una classe client WCF e le BAPIs di quell'oggetto business sono rappresentate 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 contengono 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 le BAPI come metodi degli oggetti aziendali e descrivono come le transazioni BAPI sono supportate nel modello di servizio WCF.
Classe WCF client
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 di business viene rappresentato come un 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 nella connessione. Dopo l'esecuzione di un commit o un rollback, il BAPI successivo ricevuto attraverso la connessione avvia una nuova transazione.
Per l'adapter ogni canale WCF ha una connessione SAP dedicata. Nel modello di servizio WCF ogni client WCF ha un canale interno usato per l'invio di messaggi al sistema SAP. Ciò significa che i BAPI richiamati tramite 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 BAPIs come metodi degli oggetti business. Poiché ogni oggetto aziendale SAP è rappresentato da una classe client WCF dedicata, non è possibile invocare BAPIs da due oggetti aziendali diversi come parte della stessa transazione. Il modo in cui si esegue questa operazione consiste nel richiamare i BAPI come operazioni RFC.The way around this is to invoke the BAPIs as RFC operations. Questo è dovuto al fatto che il plug-in aggiungi riferimento al servizio adapter genera un singolo client WCF per le operazioni RFC e, pertanto, tutte le operazioni invocate 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 degli oggetti 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 elementi BAPI:
Nel nodo Base categorizzato come operazioni RFC.
Sotto ogni oggetto aziendale.
Per ulteriori informazioni su come l'adapter supporta le transazioni BAPI in SAP, vedere Operazioni sui BAPI in SAP.
Istruzioni su come creare un'applicazione che invoca BAPIs come metodi degli oggetti aziendali.
Questa sezione fornisce informazioni su come richiamare i BAPIs come metodi di oggetti aziendali. È necessario seguire la stessa procedura di base per richiamare le BAPI come operazioni RFC, eccetto che si crea un client WCF che indirizza le BAPI come operazioni RFC e lo si utilizza per richiamare ogni BAPI.
Per creare un'applicazione client BAPI, seguire questa procedura.
Per creare un'applicazione client BAPI
Generare una classe client WCF. Usare il plug-in Add Adapter Service Reference di Visual Studio o il ServiceModel Metadata Utility Tool (svcutil.exe) per generare una classe client WCF (o più classi) destinata agli oggetti business e alle BAPIs con cui si desidera lavorare. Assicurarsi di includere i metodi BAPI_TRANSACTION_COMMIT e BAPI_TRANSACTION_ROLLBACK (BAPIs) 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.
Creare un'istanza della classe client WCF generata nel passaggio 1 e creare e configurare un client WCF. La configurazione del client WCF implica 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";
Aprire il client WCF.
bapiClient.Open();
Invocare i metodi sul client WCF creato nel passaggio 2 per invocare le BAPI corrette nel sistema SAP. È possibile richiamare più BAPI nel sistema SAP.
Terminare la transazione in base a:
Richiamare il metodo BAPI_TRANSACTION_COMMIT per eseguire il commit della transazione.
bapiClient.BAPI_TRANSACTION_COMMIT("X");
Richiamo del metodo BAPI_TRANSACTION_ROLLBACK per eseguire il rollback della transazione.
bapiClient.BAPI_TRANSACTION_ROLLBACK();
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 delle eccezioni per annullare la 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 usando il modello di servizio WCF
Operazioni su BAPI in SAP