Pergunta

Meu aplicativo envia muitos e muitos dados para SAP. Para di isso, acumula-se um objeto de tabela SAP e envia-lo. Eu recebo este erro um pouco regularmente, mas não de forma confiável:

System exception thrown while marshaling .NET type 20081219 to RFCTYPE_BCD
   at SAP.Connector.Rfc.RfcMarshal.NetFieldToRfcField(Object src, RFCTYPE type, Encoding encoding, Byte[] dest, Int32 offset, Int32 len, Int32 charSize, Int32 decimals)
   at SAP.Connector.Rfc.RfcStructureUtil.ToRfcStructure(Object obj, Byte[] dest, Type t, Encoding encoding, Boolean isUnicode, PropertyInfo[] propinfos, RfcStructInfo structInfo)
   at SAP.Connector.Rfc.RfcStructureUtil.GetITabFromList(SAPConnection conn, Object list, Type t, RfcStructInfo structInfo, Int32 itab)
   at SAP.Connector.Rfc.RfcClient.PrepareClientParameters(Type classType, MethodInfo m, Boolean isTQRfc, Object[] MethodParamsIn, RFC_PARAMETER[]& paramsIn, RFC_PARAMETER[]& paramsOut, RFC_TABLE[]& tables, ParameterMap[]& paramMaps)
   at SAP.Connector.Rfc.RfcClient.RfcInvoke(SAPClient proxy, String method, Object[] methodParamsIn)
   at SAP.Connector.SAPClient.SAPInvoke(String method, Object[] methodParamsIn)

O que é estranho é que isso não acontece o tempo todo. Além disso, o tipo .NET que reclama, "20081219" é o dados eu estou passando (a data) - não um tipo. Eu acho que o tipo desse campo é RFCTYPE.RFCTYPE_TIME.

Todas as sugestões sobre como solucionar esse erro intermitente? Existe algum tipo de estado que eu deveria ser clearing entre chamadas para os RFCs SAP?


Update:

Como pedido, aqui está o código que chama SAP:

Using sapConnection As New MySapProxy(ConnectionString)
  sapConnection.Connection.Open()
  sapConnection.TheSapRfcICall(SapOpCode, Nothing, Nothing, sapTable, ResultTable)
End Using

Estou pensando que talvez vários segmentos estão usando a mesma conexão de alguma forma. Usando SAP.Connector.GetNewConnection vez não muda nada.


Update:

Parece que este problema ocorre mesmo quando eu executar um único segmento! Qual é o problema ??

Existe uma maneira de desativar o pool de conexão para ver se isso resolve o problema?


Update:

A resposta de @Igal Serban parece estar a trabalhar para mim. Vou verificar os logs amanhã de manhã e (espero) prêmio a recompensa! Muito obrigado.


Update:

Conforme solicitado, a minha versão do librfc32.dll é 6403.3.78.4732.

Foi útil?

Solução

Update 4: Em segundo pensamento, eu não acho que a versão librfc é importante. A exceção parece vir a partir do código gerenciado. As opções que eu posso pensar são:

  • Tente usar depurador na versão single threaded.
  • A forma mágica. Mesmo sem encontrar o bug (que está na seiva ou seu código). Apenas mudando a maneira de fazer negócios pode fazer isso ir embora. Seu feio, mas às vezes prático. De qualquer forma a maneira recomendada para o seu cenário parece ser a de usar pool de conexão, e não para criar novo objeto proxy para cada solicitação. Então, algo como este código (não testado) pode ser usado:

MySapProxy proxy = new MySapProxy(); // do this only once.

// and in you main loop:
using (proxy.Connection = Connection.GetConnection(connectionString))
{
    proxy.TheSapRfcICall(SapOpCode, Nothing, Nothing, sapTable, ResultTable)
}

Esta amostra é implicitamente utilizando o pool de conexão. O uso de pode ser controlado a partir do arquivo de configuração.

Update 3: Você pode por favor verifique a sua versão librfc32.dll e data? o seu deve estar no diretório system32 ou no diretório do aplicativo ou em algum lugar em sua% path%.

Update 2: notas SAP são como artigos kb. Eu não sei se há acesso gratuito à nota no sdn.sap.com então eu tenho enviá-lo para o seu e-mail.

Update 1: Nota SAP 1000057 estados:

De acordo com vários segmentos de carga pesada, excepções de tipo RfcMarshalException com referência à System.Xml.Xsl.XsltException como excepção interior pode ocorrer.

Embora não seja exatamente a exceção que você recebe. Vale a pena uma tentativa.

patch está disponível como anexo à presente nota.

** Atualização 0: ** Apenas um palpite. Mas gostaria de sugerir a olhar para problemas de segmentação. tudo é esta a pilha? Você pode postar a parte fora do código onde você chamar o código sap?

Outras dicas

Editar :

Eu ainda acho que é algo a ver com o mapeamento. Eu acredito que esse tipo RFCTYPE_BCD é decimal (Business Connector Decimal), por isso vai ter dificuldade em empurrar um valor de data para ele (e possivelmente poderia trabalhar, por vezes?). Eu sugeriria regenerar os proxies, ou registrar os dados que está sendo comandada quando você obter o erro. Algo como isso (desculpe - usamos a nossa própria camada proxy, então eu não estou familiarizado com o Business Connector):

Você poderia traduzir o seguinte em VB (e qualquer que seja o formato da estrutura sapTable é):

Using sapConnection As New MySapProxy(ConnectionString)
  sapConnection.Connection.Open()
  try {
    sapConnection.TheSapRfcICall(SapOpCode, Nothing, Nothing, sapTable, ResultTable)
  } catch (Exception e) {
    StringBuilder sb = new StringBuilder();
    foreach (Field f in sapTable.Fields) {
      sb.AppendLine(f.Name + "=" f.Value);
    }
    sb.AppendLine(e.StackTrace);
    File.AppendAllText("C:\\Exception_" + DateTime.Now.ToString("u") + ".txt", sb.ToString());
  }
End Using

Eu sei que é uma dor, mas apenas fazer uma rápida e suja para obter alguns dados para cuspir quando ocorre o erro.

========

A partir de apenas a descrição que você postou, o melhor que eu posso vir acima com é talvez você está tentando organizar um valor de data (20081219) em um campo de tempo?

Você pode quebrar essa chamada em um try / catch e log os valores da tabela que está sendo enviados para SAP e pós aqueles aqui? Eu estou esperando há uma pista nos dados.

Eu sei de fazer postagens de serviços web para SAP que a SAP é bastante particular sobre o formato de seu tempo e valores de data.

Parece que ele está tentando converter um inteiro ou uma string (não posso dizer devido à ToString ()) para a BCD (binary-coded decimal) tipo.

Apenas um palpite, espero que ajude.

UPDATE:

Acho que não.

Vários segmentos usando a mesma conexão? Isso provavelmente não é uma boa idéia, a menos que você usar o bloqueio, o que tornará o inútil fio. Eu tenho certeza que pools de conexão suportes SAP, assim que abrir a conexão em seu próprio thread (um por linha).

Que seja a questão formato de data? Você diz que não acontece toda vez.
Então, quando você passar 20081202 leva '12' como parte dia e 02 como parte mês. É ok.
Mas quando você passa 20081219 tentar analisar 19 como um mês e lança exceção?
Verifique com o administrador do SAP.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top