¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Como resolver a exceção System.InvalidOperationException ao publicar Movimentos de Mercadorias no SAP com um webservice em .Net e NCO 3.0

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


Olá Especialistas,

Tenho um webservice em .Net para publicar Movimentos de Mercadorias no SAP utilizando NCO 3.0, ele funciona bem e os dados são refletidos no SAP após a execução deste serviço.

Mas 10 a 15 minutos após a execução deste webservice, recebo uma exceção (uma janela de depuração Just in Time aparece se o Visual Studio estiver instalado na máquina onde este webservice está hospedado; caso contrário, posso vê-lo no log de eventos).

ocorreu uma exceção não tratada do Microsoft .NET Framework em w3wp.exe [8920]

abaixo está a rastreabilidade

Aplicação: w3wp.exe

Versão do Framework: v4.0.30319

Descrição: O processo foi encerrado devido a uma exceção não tratada.

Informações da Exceção: System.InvalidOperationException

Pilha:

em System.ThrowHelper.ThrowInvalidOperationException(System.ExceptionResource)

em 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()

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

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

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

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

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

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

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

Abaixo está meu trecho 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"); //receção 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", ""); //sem restrições X qualidade

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

RfcSessionManager.BeginContext(SapRfcDestination); //inicia a sessão pois é necessário chamar a confirmação e o bapi de movimento de mercadorias em uma sessão
function.Invoke(SapRfcDestination); //executa o bapi de movimento de mercadorias
bapiCommit.Invoke(SapRfcDestination); //executa o bapi de confirmação

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

//estabelece os parâmetros de retorno ao chamador
statuscode = "S";
statusmsg = materialDoc;
errormsg = "Publicado";

}
catch (Exception outerexp)
{
//estabelece os parâmetros de retorno ao chamador
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...

Uma das opções é

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

ou seja, não usar RegisterDestinationConfiguration(sapCfg) de forma alguma. Ou

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


Olá Hynek Petrak,

Obrigado pela sua sugestão.

No entanto, este é um código dentro de um método de serviço web SOAP para publicar GR (também tenho algo semelhante em WCF). Para simplificar o código, removi a assinatura da função e os parâmetros.

Então, como devo alterar o código de acordo com sua sugestão, já que este é um método da web chamado por dispositivos móveis com Windows?

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

É preferível evitar chamar esta seção mais de uma vez:


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

É preferível usar a outra variante de GetDestination ():


var par = new RfcConfigParameters();
//configurar parâmetros aqui
....
var dest = RfcDestinationManager.GetDestination(par);

Ou chame RfcDestinationManager.RegisterDestinationConfiguration(sapCfg); apenas uma vez quando sua aplicação começar. No entanto, SapRfcDestination = RfcDestinationManager.GetDestination(Destination); pode ser chamado quantas vezes desejar.

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

Alterei a referência de NCO 3.0.2.0 para 3.0.12.0 e não tive mais esse problema após essa alteração.

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?