RFC-Server mit Struktur 
From Theobald Software
Unser drittes Beispiel zeigt, wie an Hand von Strukturen mit dem RFC-Server Daten zwischen .NET und SAP getauscht werden können.
Das letzte Beispiel wird um eine Export-Struktur erweitert. Die Tabelle vom letzten Beispiel wird gelöscht. Die Struktur besteht aus zwei Feldern NUMB1 und NUMB2. Diese werden im ABAP gefüllt und im .NET zusammen addiert.
Der folgende Code zeigt die Initialisierung des RFCServer-Objekts. Als erstes werden zwei Spalten zu einer RFCTableColumnCollection ergänzt. Dann wird die Struktur NUMBERS der Imports-Collection zusammen mit der RFCTableColumnCollection hinzugefügt.
static RFCServer s = new RFCServer(); static void Main(string[] args) { s.GatewayHost = "hamlet"; s.GatewayService = "sapgw11"; s.ProgramID = "ERPTEST"; s.IncomingCall += new RFCServer.OnIncomingCall(s_IncomingCall); RFCServerFunction f = s.RegisteredFunctions.Add("Z_ADD_3"); RFCTableColumnCollection Columns = new RFCTableColumnCollection (); Columns.Add("NUMB", 10, 0, RFCTYPE.NUM); Columns.Add("NUMB2", 10, 0, RFCTYPE.NUM); f.Imports.Add("NUMBERS",Columns ); f.Exports.Add("RES", RFCTYPE.INT); s.Start(); Console.WriteLine("Press Enter to quit"); Console.ReadLine(); }
Die Behandlung der Tabelle erfolgt wie gewohnt über die Objekthierarchie des RFCServerFunction-Objektes. Die Werte der beiden Spalten werden addiert und zurückgegeben:
static void s_IncomingCall(RFCServer Sender, RFCServerFunction CalledFunction) { Console.WriteLine("Incoming call!!"); Int32 Res = 0; RFCStructure numberstruc = CalledFunction.Imports["NUMBERS"].ToStructure(); Int32 i1 = Convert.ToInt32(numberstruc["NUMB"].ToString()); Int32 i2 = Convert.ToInt32(numberstruc["NUMB2"].ToString()); Res = i1 + i2; CalledFunction.Exports["RES"].ParamValue = Res; }
Hier noch der Beispiel-ABAP-Code, der den Baustein in einer fremden Destination aufruft:
REPORT ZADDTEST3
DATA res TYPE i.
DATA numbs LIKE zaddstruc2.
numbs-numb1 = '1'.
numbs-numb2 = '2'.
CALL FUNCTION 'Z_ADD_3' DESTINATION 'ERPTEST'
EXPORTING
NUMBERS = numbs
IMPORTING
RES = res.
WRITE: / 'Result: ', res.
Das ganze Beispiel hier mit Import und Export Struktur. Das ABAP-Programm wird um eine Struktur EXNUMBERS in der EXPORTS-Collection erweitert.RES wird aus der Collection entfernt.
Im .NET Programm wird eine Struktur angelegt mit 2 Feldern und der EXPORT-Collection hinzugefügt.
static RFCServer s = new RFCServer(); static void Main(string[] args) { s.GatewayHost = "hamlet"; s.GatewayService = "sapgw11"; s.ProgramID = "ERPTEST"; s.IncomingCall += new RFCServer.OnIncomingCall(s_IncomingCall); RFCServerFunction f = s.RegisteredFunctions.Add("Z_ADD_4"); RFCTableColumnCollection Columns = new RFCTableColumnCollection (); Columns.Add("NUMB1", 10, 0, RFCTYPE.NUM); Columns.Add("NUMB2", 10, 0, RFCTYPE.NUM); RFCTableColumnCollection EXColumns = new RFCTableColumnCollection(); EXColumns.Add("NUMB1", 10, 0, RFCTYPE.NUM); EXColumns.Add("NUMB2", 10, 0, RFCTYPE.NUM); f.Imports.Add("NUMBERS",Columns ); f.Exports.Add("EXNUMBERS", EXColumns); s.Start(); Console.WriteLine("Press Enter to quit"); Console.ReadLine(); }
Die Werte aus der Struktur der Import-Collection werden dann in Variablen geschrieben , Werte hinzu addiert und wieder an die EXPORTS-Collection übergeben.
static void s_IncomingCall(RFCServer Sender, RFCServerFunction CalledFunction) { Console.WriteLine("Incoming call!!"); RFCTableColumnCollection EXColumns = new RFCTableColumnCollection(); EXColumns.Add("NUMB1", 10, 0, RFCTYPE.NUM); EXColumns.Add("NUMB2", 10, 0, RFCTYPE.NUM); CalledFunction.Exports.Add("EXNUMBER", EXColumns); RFCStructure numberstruc = CalledFunction.Imports["NUMBERS"].ToStructure(); Int32 i1 = Convert.ToInt32(numberstruc["NUMB1"].ToString()); Int32 i2 = Convert.ToInt32(numberstruc["NUMB2"].ToString()); RFCStructure EXnumbers = CalledFunction.Exports["EXNUMBERS"].ToStructure(); EXnumbers["NUMB1"] = i1 + 1; EXnumbers["NUMB2"] = i2 + 98; }
Und hier auch der leicht geänderte ABAP Code
REPORT ZADDTEST4 .
.
DATA numbs LIKE zaddstruc2.
DATA exnumbers like zaddstruc2.
numbs-numb1 = '1'.
numbs-numb2 = '2'.
CALL FUNCTION 'Z_ADD_4' DESTINATION 'ERPTEST'
EXPORTING
NUMBERS = numbs
IMPORTING
EXNUMBERS = exnumbers.
WRITE: / 'First result is (added 1): ', exnumbers-numb1 .
WRITE: / 'Second result is (added 98): ', exnumbers-numb2 .


