¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Cómo solucionar la excepción System.InvalidOperationException al publicar Movimientos de Mercancías en SAP con un webservice en .Net y NCO 3.0

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 25 Vistas
0
Cargando...


Hola Expertos,

Tengo un webservice en .Net para publicar Movimientos de Mercancías en SAP utilizando NCO 3.0, funciona bien y los datos se reflejan en SAP después de la ejecución de este servicio.

Pero 10 a 15 minutos después de ejecutar este webservice, recibo una excepción (Aparece una ventana de depuración Just in Time si Visual Studio está instalado en la máquina donde se hospeda este webservice; de lo contrario, puedo verlo en el registro de eventos).

ocurrió una excepción no controlada de Microsoft .NET Framework en w3wp.exe [8920]

a continuación se muestra la traza de la pila

Aplicación: w3wp.exe

Versión del Framework: v4.0.30319

Descripción: El proceso se terminó debido a una excepción no controlada.

Información de la Excepción: System.InvalidOperationException

Pila:

en System.ThrowHelper.ThrowInvalidOperationException(System.ExceptionResource)

en System.Collections.Generic.Dictionary`2+KeyCollection+Enumerator[[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].MoveNext()

en SAP.Middleware.Connector.RfcSessionManager.UpdateSessions(System.Object)

en System.Threading._TimerCallback.TimerCallback_Context(System.Object)

en System.Threading.ExecutionContext.runTryCode(System.Object)

en System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object)

en System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)

en System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)

en System.Threading._TimerCallback.PerformTimerCallback(System.Object)

A continuación se muestra mi fragmento de código

SAPConfig sapCfg = new SAPConfig();
try
{

try
{
RfcDestinationManager.RegisterDestinationConfiguration(sapCfg);
}
catch { }

SapRfcDestination = RfcDestinationManager.GetDestination(Destination);
RfcRepository SapRfcRepository = null;
SapRfcRepository = SapRfcDestination.Repository;

IRfcFunction bapiCommit = SapRfcRepository.CreateFunction("BAPI_TRANSACTION_COMMIT");
IRfcFunction function = SapRfcRepository.CreateFunction("BAPI_GOODSMVT_CREATE");
string tempdate  = Utilities.ToSAPDateFormat(postingdate);
IRfcStructure MovHder = function.GetStructure("GOODSMVT_HEADER");
MovHder.SetValue("PSTNG_DATE", tempdate);
MovHder.SetValue("REF_DOC_NO", refDocNo);  //nota de entrega
IRfcStructure MovCode = function.GetStructure("GOODSMVT_CODE");
MovCode.SetValue("GM_CODE", "01");  //recepción contra pedido

IRfcTable tblitems = function.GetTable("GOODSMVT_ITEM");


tblitems.Append();
tblitems.SetValue("PO_ITEM", "10");
tblitems.SetValue("PLANT", "9000");
tblitems.SetValue("STGE_LOC", "0001");
tblitems.SetValue("ENTRY_QNT", "1");
tblitems.SetValue("STCK_TYPE", ""); //sin restricciones X calidad

tblitems.SetValue("MOVE_TYPE", "101");
tblitems.SetValue("MVT_IND", "B");  // para orden de compra
tblitems.SetValue("VENDOR", VendorCode);
tblitems.SetValue("PO_NUMBER", PoNo);

RfcSessionManager.BeginContext(SapRfcDestination);  //comienza la sesión ya que se debe llamar a la confirmación y al bapi de movimiento de mercancías en una sesión
function.Invoke(SapRfcDestination); //ejecuta el bapi de movimiento de mercancías
bapiCommit.Invoke(SapRfcDestination); //ejecuta el bapi de confirmación

IRfcStructure headRetorno = function.GetStructure("GOODSMVT_HEADRET");
IRfcTable rettable = function.GetTable("RETURN");
materialDoc = headRetorno.GetValue("MAT_DOC").ToString(); //headRetorno["MAT_DOC"].ToString();

//establece los parámetros de retorno al llamante
statuscode = "S";
statusmsg = materialDoc;
errormsg = "Publicado";

}
catch (Exception outerexp)
{
//establece los parámetros de retorno al llamante
statuscode = "E";
statusmsg = "";
errormsg = outerexp.Message;;

}
finally
{
try
{
R

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Una de las opciones es

  1. var par = new RfcConfigParameters();
  2. //config par here
  3. ....
  4. var dest = RfcDestinationManager.GetDestination(par);

es decir, no utilizar RegisterDestinationConfiguration(sapCfg) en absoluto. O

  1. RfcDestination getDestination(dest as string ) {
  2. if (RfcDestinationManager.TryGetDestination(dest) == null ) {
  3. IDestinationConfiguration _destConfig = new IDestinationConfigurationImplementation();
  4. RfcDestinationManager.RegisterDestinationConfiguration(_destConfig);
  5. }
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...


Hola Hynek Petrak,

Gracias por tu sugerencia.

Pero este es un código dentro de un método de servicio web SOAP para publicar GR (también tengo algo similar en WCF). Para simplificar el código, he eliminado la firma de la función y los parámetros.

Entonces, ¿cómo cambio el código según tu sugerencia ya que este es un método web llamado por dispositivos móviles con Windows?

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Es preferible evitar llamar a esta sección más de una vez:


SAPConfig sapCfg = new SAPConfig();try{    try    {        RfcDestinationManager.RegisterDestinationConfiguration(sapCfg);    }    catch { }
    SapRfcDestination = RfcDestinationManager.GetDestination(Destination);

Es preferible usar la otra variante de GetDestination ():


var par = new RfcConfigParameters();
//configurar parámetros aquí
....
var dest = RfcDestinationManager.GetDestination(par);

O llama al RfcDestinationManager.RegisterDestinationConfiguration(sapCfg); solo una vez cuando tu aplicación comience. Sin embargo, SapRfcDestination = RfcDestinationManager.GetDestination(Destination); se puede llamar tantas veces como desees.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Cambié la referencia de NCO 3.0.2.0 a 3.0.12.0 y no experimenté este problema después de este cambio.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?