cancel
Showing results for 
Search instead for 
Did you mean: 

Need Help To Return Table With VB 2005

0 Kudos

Hello,

can anybody support me with the right code to retrieve a table from SAP with RFC

and .NET-Connector ? I can't use the wizard at the moment. So I have made the

following handy code, which runs with simple types and structures but not with a

table.

This ist the Structure :


<SAP.Connector.RfcStructure(AbapName:="BAPIRET2", Length:=552)> _
Public Class BAPIRET2

  Inherits SAP.Connector.SAPStructure

  Private mstrType As String
  Private mstrID As String
  Private mstrNumber As String
  Private mstrMessage As String
  Private mstrLogNumber As String
  Private mstrLogMessageNumber As String
  Private mstrMessageV1 As String
  Private mstrMessageV2 As String
  Private mstrMessageV3 As String
  Private mstrMessageV4 As String
  Private mstrParameter As String
  Private mintRow As Integer
  Private mstrField As String
  Private mstrSystem As String

  <SAP.Connector.RfcField(AbapName:="TYPE" _
                        , RfcType:=SAP.Connector.RfcType.RfcType_CHAR _
                        , Length:=1 _
                        , Offset:=0)> _
  Public Property Type() As String
    Get

      Return mstrType

    End Get

    Set(ByVal in_Value As String)

      mstrType = in_Value

    End Set
  End Property

  <SAP.Connector.RfcField(AbapName:="ID" _
                        , RfcType:=SAP.Connector.RfcType.RfcType_CHAR _
                        , Length:=20 _
                        , Offset:=1)> _
  Public Property ID() As String
    Get

      Return mstrID

    End Get

    Set(ByVal in_Value As String)

      mstrID = in_Value

    End Set
  End Property

  <SAP.Connector.RfcField(AbapName:="NUMBER" _
                        , RfcType:=SAP.Connector.RfcType.RfcType_CHAR _
                        , Length:=3 _
                        , Offset:=21)> _
  Public Property Code() As String
    Get

      Return mstrNumber

    End Get

    Set(ByVal in_Value As String)

      mstrNumber = in_Value

    End Set
  End Property

  <SAP.Connector.RfcField(AbapName:="MESSAGE" _
                        , RfcType:=SAP.Connector.RfcType.RfcType_CHAR _
                        , Length:=220 _
                        , Offset:=24)> _
  Public Property Message() As String
    Get

      Return mstrMessage

    End Get

    Set(ByVal in_Value As String)

      mstrMessage = in_Value

    End Set
  End Property


  <SAP.Connector.RfcField(AbapName:="LOG_NO" _
                        , RfcType:=SAP.Connector.RfcType.RfcType_CHAR _
                        , Length:=20 _
                        , Offset:=244)> _
  Public Property LogNumber() As String
    Get

      Return mstrLogNumber

    End Get

    Set(ByVal in_Value As String)

      mstrLogNumber = in_Value

    End Set
  End Property

  <SAP.Connector.RfcField(AbapName:="LOG_MSG_NO" _
                        , RfcType:=SAP.Connector.RfcType.RfcType_CHAR _
                        , Length:=6 _
                        , Offset:=264)> _
  Public Property LogMessageNumber() As String
    Get

      Return mstrLogMessageNumber

    End Get

    Set(ByVal in_Value As String)

      mstrLogMessageNumber = in_Value

    End Set
  End Property

  <SAP.Connector.RfcField(AbapName:="MESSAGE_V1" _
                        , RfcType:=SAP.Connector.RfcType.RfcType_CHAR _
                        , Length:=50 _
                        , Offset:=270)> _
  Public Property MessageV1() As String
    Get

      Return mstrMessageV1

    End Get

    Set(ByVal in_Value As String)

      mstrMessageV1 = in_Value

    End Set
  End Property

  <SAP.Connector.RfcField(AbapName:="MESSAGE_V2" _
                        , RfcType:=SAP.Connector.RfcType.RfcType_CHAR _
                        , Length:=50 _
                        , Offset:=320)> _
  Public Property MessageV2() As String
    Get

      Return mstrMessageV2

    End Get

    Set(ByVal in_Value As String)

      mstrMessageV2 = in_Value

    End Set
  End Property

  <SAP.Connector.RfcField(AbapName:="MESSAGE_V3" _
                        , RfcType:=SAP.Connector.RfcType.RfcType_CHAR _
                        , Length:=50 _
                        , Offset:=370)> _
  Public Property MessageV3() As String
    Get

      Return mstrMessageV3

    End Get

    Set(ByVal in_Value As String)

      mstrMessageV3 = in_Value

    End Set
  End Property

  <SAP.Connector.RfcField(AbapName:="MESSAGE_V4" _
                        , RfcType:=SAP.Connector.RfcType.RfcType_CHAR _
                        , Length:=50 _
                        , Offset:=420)> _
  Public Property MessageV4() As String
    Get

      Return mstrMessageV4

    End Get

    Set(ByVal in_Value As String)

      mstrMessageV4 = in_Value

    End Set
  End Property

  <SAP.Connector.RfcField(AbapName:="PARAMETER" _
                        , RfcType:=SAP.Connector.RfcType.RfcType_CHAR _
                        , Length:=32 _
                        , Offset:=470)> _
  Public Property Parameter() As String
    Get

      Return mstrParameter

    End Get

    Set(ByVal in_Value As String)

      mstrParameter = in_Value

    End Set
  End Property

  <SAP.Connector.RfcField(AbapName:="ROW" _
                        , RfcType:=SAP.Connector.RFCTYPE.RFCTYPE_INT _
                        , Length:=10 _
                        , Offset:=502)> _
  Public Property Row() As Integer
    Get

      Return mintRow

    End Get

    Set(ByVal in_Value As Integer)

      mintRow = in_Value

    End Set
  End Property

  <SAP.Connector.RfcField(AbapName:="FIELD" _
                        , RfcType:=SAP.Connector.RFCTYPE.RFCTYPE_CHAR _
                        , Length:=30 _
                        , Offset:=512)> _
  Public Property Field() As String
    Get

      Return mstrField

    End Get

    Set(ByVal in_Value As String)

      mstrField = in_Value

    End Set
  End Property

  <SAP.Connector.RfcField(AbapName:="SYSTEM" _
                        , RfcType:=SAP.Connector.RFCTYPE.RFCTYPE_CHAR _
                        , Length:=10 _
                        , Offset:=542)> _
  Public Property System() As String
    Get

      Return mstrSystem

    End Get

    Set(ByVal in_Value As String)

      mstrSystem = in_Value

    End Set
  End Property

End Class

and this the Call :


  <SAP.Connector.RfcMethod("/VFE/IV_FB_STMS_MAILMELD_ANLEG")> _
  <System.Web.Services.Protocols.SoapDocumentMethod( _
    Action:="http://tempuri.org//VFE/IV_FB_STMS_MAILMELD_ANLEG", _
    RequestNamespace:="urn:sap-com:document:sap:rfc:functions", _
    RequestElementName:="/VFE/IV_FB_STMS_MAILMELD_ANLEG", _
    ResponseNamespace:="urn:sap-com:document:sap:rfc:functions", _
    ResponseElementName:="/VFE/IV_FB_STMS_MAILMELD_ANLEG.Response")> _
  Public Function ReturnStructure2(<SAP.Connector.RfcParameter(AbapName:="I_TEST" _
                                                             , RfcType:=SAP.Connector.RFCTYPE.RFCTYPE_INT _
                                                             , Direction:=SAP.Connector.RFCINOUT.IN)> _
                                   <System.Xml.Serialization.XmlElement("I_TEST" _
                                                                      , IsNullable:=False)> _
                                   Optional ByVal in_Test As Integer = -1 _
                                 , <SAP.Connector.RfcParameter(AbapName:="E_RETURN" _
                                                             , RfcType:=SAP.Connector.RFCTYPE.RFCTYPE_STRUCTURE _
                                                             , Direction:=SAP.Connector.RFCINOUT.OUT)> _
                                   <System.Xml.Serialization.XmlElement("E_RETURN" _
                                                                      , IsNullable:=False)> _
                                   Optional ByRef out_Test As BAPIRET2 = Nothing) As Object()

    Return Me.SAPInvoke("ReturnStructure2", New Object() {in_Test})

  End Function

it goes very well. But if I use a table with this Call :


  <SAP.Connector.RfcMethod("/VFE/IV_FB_STMS_MAILMELD_ANLEG")> _
  <System.Web.Services.Protocols.SoapDocumentMethod( _
    Action:="http://tempuri.org//VFE/IV_FB_STMS_MAILMELD_ANLEG", _
    RequestNamespace:="urn:sap-com:document:sap:rfc:functions", _
    RequestElementName:="/VFE/IV_FB_STMS_MAILMELD_ANLEG", _
    ResponseNamespace:="urn:sap-com:document:sap:rfc:functions", _
    ResponseElementName:="/VFE/IV_FB_STMS_MAILMELD_ANLEG.Response")> _
  Public Function ReturnTable(<SAP.Connector.RfcParameter(AbapName:="I_TEST" _
                                                        , RfcType:=SAP.Connector.RFCTYPE.RFCTYPE_INT _
                                                        , Direction:=SAP.Connector.RFCINOUT.IN)> _
                              <System.Xml.Serialization.XmlElement("I_TEST" _
                                                                 , IsNullable:=False)> _
                              Optional ByVal in_Test As Integer = -1 _
                            , <SAP.Connector.RfcParameter(AbapName:="ET_RETURN" _
                                                        , RfcType:=SAP.Connector.RFCTYPE.RFCTYPE_ITAB _
                                                        , Direction:=SAP.Connector.RFCINOUT.OUT)> _
                              <System.Xml.Serialization.XmlArray("ET_RETURN" _
                                                               , IsNullable:=False)> _
                              <System.Xml.Serialization.XmlArrayItem("BAPIRET2" _
                                                                   , IsNullable:=False)> _
                              Optional ByRef out_Test As BAPIRET2Table = Nothing) As Object()

    Return Me.SAPInvoke("ReturnTable", New Object() {in_Test})

  End Function

I get the following Error :

System.NullReferenceException wurde nicht behandelt.

Message="Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."

Source="SAP.Connector"

StackTrace:

bei SAP.Connector.SAPStructure.GetRfcStructureInfo(SAPConnection conn, Type t)

bei SAP.Connector.SAPClient.PrepareClientParameters(Type classType, MethodInfo m, Boolean isTQRfc, Object[] MethodParamsIn, RFC_PARAMETER[]& paramsIn, RFC_PARAMETER[]& paramsOut, RFC_TABLE[]& tables, ParameterMap[]& paramMaps)

bei SAP.Connector.SAPClient.RfcInvoke(String method, Object[] methodParamsIn)

bei SAP.Connector.SAPClient.SAPInvoke(String method, Object[] methodParamsIn)

bei ConsoleApplication1.Class1.ReturnTable(Int32 in_Test, BAPIRET2Table& out_Test) in C:\Data\Tests\ConsoleApplication1\Class1.vb:Zeile 157.

bei ConsoleApplication1.Module1.Main() in C:\Data\Tests\ConsoleApplication1\Module1.vb:Zeile 37.

bei System.AppDomain.nExecuteAssembly(Assembly assembly, String[] args)

bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)

bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()

bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)

bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)

bei System.Threading.ThreadHelper.ThreadStart()

Can anybody give me a hint or solution for this or can provide a small full sample

(Proxy, Structure and Table in VB.NET or C#.NET) ? Best would be an example

based of a common structure like BAPIRETURN or my used BAPIRET2.

A note for the codes above : The used Structure is BAPIRET2 and is exported as

"E_RETURN". A table of BAPIRET2 structures is exported as "ET_RETURN" of the

same function.

Regards

Holger

Accepted Solutions (0)

Answers (1)

Answers (1)

0 Kudos

The problem is solved I got a working sample, additional question to this I've placed here : .

Regards

Holger