Invocación de TRFC en SAP mediante el modelo de servicio WCF
Las llamadas a funciones remotas transaccionales (TRFC) garantizan una ejecución única de un RFC en un sistema SAP. Puede invocar cualquiera de las RFC expuestas por el adaptador de SAP como tRFC. Invocar un tRFC en el modelo de servicio WCF es similar a invocar una RFC con las siguientes diferencias:
El adaptador de SAP muestra TRFC en un nodo diferente (TRFC) que rfC (RFC).
Las llamadas de cliente tRFC no devuelven valores para la exportación y el cambio de parámetros de SAP.
Las operaciones de tRFC incluyen un parámetro GUID que se asigna al identificador de transacción de SAP (TID) para el tRFC mediante el adaptador de SAP.
Después de invocar un tRFC, debe invocar la operación RfcConfirmTransID para confirmar (confirmar) el tRFC en el sistema SAP. Esta operación se muestra directamente bajo el nodo TRFC.
Para obtener más información sobre las operaciones tRFC y la operación RfcConfirmTransID, consulte Operaciones en TRFC en SAP.
En las secciones siguientes se muestra cómo invocar TRFC en el sistema SAP mediante el adaptador de SAP.
La clase de cliente WCF
El adaptador de SAP muestra todas las operaciones tRFC en un único contrato de servicio, "Trfc". Esto significa que se crea una única clase de cliente WCF, TrfcClient, para todas las operaciones de tRFC que desea invocar. Cada tRFC de destino se representa como un método de esta clase. Para cada método:
Los tipos de SAP complejos, como las estructuras, se muestran como clases de .NET con propiedades que corresponden a los campos del tipo sap. Estas clases se definen en el siguiente espacio de nombres: microsoft.lobservices.sap._2007._03.Types.Rfc.
El código siguiente muestra parte de la clase TrfcClient y el método que invoca BAPI_SALESORDER_CREATEFROMDAT2 (como tRFC) en el sistema SAP. El parámetro TransactionalRfcOperationIdentifier contiene el GUID asignado al TID de SAP. No se muestran todos los parámetros del método.
[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) { ... }
}
En el código siguiente se muestra el método generado para la operación RfcConfirmTransID. Debe asegurarse de que este método se genera como parte de TrfcClient. La operación RfcConfirmTransID se muestra directamente bajo el nodo TRFC.
public void RfcConfirmTransID(System.Guid TransactionalRfcOperationIdentifier) {…}
Creación de una aplicación cliente tRFC
Los pasos para crear una aplicación que invoca tRFC son similares a los pasos que se siguen para invocar RFC, con las excepciones siguientes:
Debe recuperar las operaciones de destino en el nodo TRFC.
Debe recuperar la operación RfcConfirmTransID. Esto se muestra directamente bajo el nodo TRFC.
Para confirmar (confirmar) una operación tRFC en el sistema SAP, debe invocar la operación RfcConfirmTransID con el GUID devuelto para esa operación tRFC.
Para crear una aplicación cliente tRFC
Genere una clase TrfcClient . 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 TrfcClient que tenga como destino las RFC con las que desea trabajar. 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 la solución SAP. Asegúrese de que la operación RfcConfirmTransID está incluida en la clase TrfcClient .
Cree una instancia de la clase TrfcClient generada en el paso 1 y especifique un enlace de cliente. Especificar un enlace de cliente implica especificar el enlace y la dirección del punto de conexión que usará TrfcClient . 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, vea Configurar un enlace de cliente para el sistema SAP. El código siguiente inicializa TrfcClient desde la configuración y establece las credenciales para el sistema SAP.
TrfcClient trfcClient = new TrfcClient("SAPBinding_Rfc"); trfcClient.ClientCredentials.UserName.UserName = "YourUserName"; trfcClient.ClientCredentials.UserName.Password = "YourPassword";
Abra TrfcClient.
trfcClient.Open();
Invoque el método adecuado en trfcClient creado en el paso 2 para invocar el tRFC de destino en el sistema SAP. Puede pasar una variable que contenga un GUID o que contenga un GUID vacío para el parámetro TransactionalRrcOperationIdentifier . Si pasa un GUID vacío, el adaptador de SAP genera uno automáticamente. El código siguiente invoca BAPI_SALESORDER_CREATEFROMDAT2 como tRFC en el sistema SAP (no se muestran todos los parámetros del método). Se especifica un GUID.
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);
Para confirmar el TID asociado al tRFC en el sistema SAP, invoque el método RfcConfirmTransID en TrfcClient. Especifique el GUID devuelto en el paso 4 para el parámetro TransactionRfcOperationIdentifier.
trfcClient.RfcConfirmTransID(transactionalRfcOperationIdentifier);
Cierre TrfcClient cuando haya terminado de usarlo (después de haber terminado de invocar todos los TRFC).
trfcClient.Close();
Ejemplo
En el ejemplo siguiente se muestra cómo invocar BAPI_SALESORDER_CREATE como 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();
}
}
}
}
}
Consulte también
Desarrollar aplicaciones con el modelo de servicio WCF
Operaciones en TRFC en SAP