Compartir a través de


Invocación de BAPIs en SAP mediante el modelo de servicio WCF

El adaptador de SAP muestra BAPIs como:

  • Operaciones RFC. Las BAPIs como cualquier otra RFC se muestran en el nodo RFC del complemento Agregar referencia de servicio de adaptador.

  • Métodos de objetos empresariales de SAP. Como métodos de objetos empresariales, los BAPIs se exponen mediante un objeto de negocio en el nodo BAPI del complemento Agregar referencia de servicio de adaptador.

    Tanto si invoca un BAPI como una operación RFC como un método de objeto de negocio, cada BAPI siempre forma parte de un LUW en el sistema SAP.

    Para obtener información general sobre cómo el adaptador de SAP admite BAPIs, consulte Operaciones en BAPIs en SAP.

    Cuando se usa el modelo de servicio WCF para invocar BAPIs como métodos de objeto de negocio, cada objeto de negocio de SAP se representa mediante una clase de cliente WCF y las BAPIs de ese objeto de negocio se representan como métodos en el cliente. Puede usar el complemento Agregar referencia de servicio de adaptador de Visual Studio para generar una clase de cliente WCF para objetos empresariales específicos que contengan métodos para cada BAPI que quiera invocar en el código. El complemento Agregar referencia de servicio de adaptador también genera tipos de .NET para encapsular los parámetros y los tipos de datos que usan cada BAPI. A continuación, puede crear una instancia de esta clase de cliente WCF y llamar a sus métodos para invocar los BAPIs de destino.

    En las secciones siguientes se muestra cómo invocar BAPIs como métodos de objetos empresariales y se describe cómo se admiten las transacciones bapi en el modelo de servicio WCF.

Clase de cliente WCF

El adaptador de SAP muestra un contrato de servicio diferente para cada objeto de negocio. Esto significa que para cada objeto de negocio se crea una clase de cliente WCF única. El nombre de esta clase se basa en el tipo de objeto de negocio. Por ejemplo, para el objeto de negocio Sales Order (tipo de objeto de negocio BUS2032), la clase de cliente WCF es BapiBUS2032Client. Cada BAPI de destino del objeto de negocio se representa como un método en la clase de cliente WCF generada. En cada método:

  • Los parámetros de exportación de SAP se muestran como parámetros out

  • Los parámetros de llamada de SAP se muestran como parámetros ref .

  • Los tipos de SAP complejos, como las estructuras, se muestran como clases de .NET con propiedades que corresponden a los campos del tipo de SAP. Estas clases se definen en el siguiente espacio de nombres: microsoft.lobservices.sap._2007._03.Types.Rfc.

    BAPI_TRANSACTION_COMMIT y BAPI_TRANSACTION_ROLLBACK se exponen para cada objeto de negocio y siempre debe incluirlos en el cliente WCF.

    El código siguiente muestra parte de una clase de cliente WCF generada para el objeto de negocio Sales Order. Este cliente contiene métodos para invocar CREATEFROMDAT2, BAPI_TRANSACTION_COMMIT y BAPI_TRANSACTION_ROLLBACK. Para mayor claridad, se han omitido los constructores y otro código.

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

Transacciones de BAPI en el modelo de servicio WCF

Cada BAPI, tanto si se invoca como RFC como un método de objeto de negocio, forma parte de una transacción (LUW) en el sistema SAP; y cada BAPI recibido a través de la misma conexión SAP forma parte de la misma transacción de BAPI en el sistema SAP. SAP confirma o revierte la transacción bapi cuando recibe un BAPI_TRANSACTION_COMMIT o un BAPI_TRANSACTION_ROLLBACK en la conexión. Una vez realizada una confirmación o reversión, el siguiente BAPI recibido a través de la conexión inicia una nueva transacción.

Para el adaptador, cada canal WCF tiene una conexión SAP dedicada. En el modelo de servicio WCF, cada cliente WCF tiene un canal interno que se usa para enviar mensajes al sistema SAP. Esto significa que los BAP Que se invocan mediante un cliente WCF específico forman parte de una transacción BAPI única en el sistema SAP. Esto impone una limitación significativa al usar el modelo de servicio WCF para invocar BAPIs como métodos de objeto de negocio. Dado que cada objeto de negocio de SAP está representado por una clase de cliente WCF dedicada, no puede invocar BAPIs desde dos objetos empresariales diferentes como parte de la misma transacción. La manera de hacerlo es invocar las BAPIs como operaciones RFC. Esto se debe a que el complemento Add Adapter Service Reference genera un único cliente WCF para las operaciones RFC y, por lo tanto, todas las operaciones invocadas mediante ese cliente se envían a través del mismo canal WCF.

Importante

Si desea incluir BAPIs de diferentes objetos empresariales de SAP en la misma transacción de BAPI, debe invocarlos como operaciones RFC (con el mismo cliente WCF). No se pueden invocar como métodos de objeto de negocio.

Llame a BAPI_TRANSACTION_COMMIT o BAPI_TRANSACTION_ROLLBACK para confirmar o revertir la transacción bapi en el sistema SAP. El adaptador muestra estas dos BAPIs:

  • En el nodo Base como operaciones RFC.

  • En cada objeto de negocio.

    Para obtener más información sobre cómo el adaptador admite transacciones BAPI en SAP, consulte Operaciones en BAPIs en SAP.

Cómo crear una aplicación que invoque BAPIs como métodos de objetos empresariales

En esta sección se proporciona información sobre cómo invocar BAPIs como métodos de objetos empresariales. Se debe seguir el mismo procedimiento básico para invocar BAPIs como operaciones RFC, excepto que se crea un cliente WCF que tiene como destino las BAPIs como operaciones RFC y usarlo para invocar cada BAPI.

Para crear una aplicación cliente bapi, realice los pasos siguientes.

Para crear una aplicación cliente BAPI

  1. Generar una clase de cliente WCF. Use el complemento Agregar referencia de servicio de adaptador de Visual Studio o la Herramienta de utilidad de metadatos serviceModel (svcutil.exe) para generar una clase de cliente WCF (o clases) que tenga como destino los objetos empresariales y BAPIs con los que desea trabajar. Asegúrese de incluir los BAPI_TRANSACTION_COMMIT y los métodos de BAPI_TRANSACTION_ROLLBACK (BAPIs) expuestos para cada objeto de negocio de destino. Para obtener más información sobre cómo generar un cliente WCF, vea Generar un cliente WCF o un contrato de servicio WCF para artefactos de solución de SAP.

  2. Cree una instancia de la clase de cliente WCF generada en el paso 1 y cree y configure un cliente WCF. La configuración del cliente WCF implica especificar el enlace y la dirección del punto de conexión que usará el cliente. Puede hacerlo de forma imperativa en el código o mediante declaración en la configuración. Para obtener más información sobre cómo especificar un enlace de cliente, consulte Configuración de un enlace de cliente para el sistema SAP. El código siguiente inicializa el cliente WCF para el objeto de negocio sap Sales Order (BUS2032) a partir de la configuración y establece las credenciales del sistema SAP.

    BapiBUS2032Client bapiClient = new BapiBUS2032Client("SAPBinding_BapiBUS2032");  
    
    bapiClient.ClientCredentials.UserName.UserName = "YourUserName";  
    bapiClient.ClientCredentials.UserName.Password = "YourPassword";  
    
  3. Abra el cliente WCF.

    bapiClient.Open();  
    
  4. Invoque métodos en el cliente WCF creado en el paso 2 para invocar las BAP adecuadas en el sistema SAP. Puede invocar varias BAP en el sistema SAP.

  5. Finalice la transacción por:

    1. Invocar el método BAPI_TRANSACTION_COMMIT para confirmar la transacción.

      bapiClient.BAPI_TRANSACTION_COMMIT("X");  
      
    2. Invocar el método BAPI_TRANSACTION_ROLLBACK para revertir la transacción.

      bapiClient.BAPI_TRANSACTION_ROLLBACK();  
      
  6. Cierre del cliente WCF.

    bapiClient.Close();   
    

Ejemplo

En el ejemplo siguiente se invoca el CREATEFROMDAT2 BAPI en el objeto de negocio Sales Order. Invoca el BAPI varias veces y, a continuación, invoca BAPI_TRANSACTION_COMMIT para confirmar la transacción. Si se produce un error al invocar el BAPI, se invoca BAPI_TRANSACTION_ROLLBACK en el controlador de excepciones para revertir la transacción.

El método CREATEFROMDAT2 toma muchos parámetros; se omiten en el ejemplo por motivos de brevedad. Puede encontrar un ejemplo que muestre las transacciones bapi en los ejemplos enviados con el paquete de adaptadores de Microsoft BizTalk. Para obtener más información, consulte Ejemplos para el adaptador de 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();  
                }  
            }  
        }  
    }  
}  

Consulte también

Desarrollar aplicaciones con el modelo de servicio WCF
Operaciones en BAPIs en SAP