IDocs empfangen 
From Theobald Software
Das folgende Beispiel zeigt den Empfang und die Verarbeitung eines MATMAS-Idocs. Wie Sie ihr SAP-System so konfigurieren, dass es MATMAS-Idocs sendet, erfahren Sie hier.
Bei einem Idoc-Server handelt es sich in erster Linie um einen ganz normalen RFC-Server, nur mit dem Unterschied, dass die Eigenschaft CanRecieveIdocs auf true gesetzt werden muss. Darüber hinaus muss das Ereignis IncomingIdoc abgefangen werden. Der folgende Code zeigt die Initialisierungsarbeiten innerhalb der Main-Prozedur bis hin zum Starten des Servers.
[C#]
static void Main(string[] args) { // define server object and start RFCServer s = new RFCServer(); s.Logging = true; s.GatewayHost = "hamlet"; s.GatewayService = "sapgw11"; s.ProgramID = "ERPTEST"; s.CanReceiveIdocs = true; s.IncomingIdoc+=new ERPConnect.RFCServer.OnIncomingIdoc(s_IncomingIdoc); s.InternalException+=new ERPConnect.RFCServer.OnInternalException(s_InternalException); s.Start(); Console.WriteLine("Server is running. Press any key to exit."); Console.ReadLine(); s.Stop(); }
[VB]
Dim WithEvents s As RFCServer = New RFCServer Sub Main() ' define server object and start s.GatewayHost = "hamlet" s.GatewayService = "sapgw11" s.ProgramID = "ERPCONNECT" s.CanReceiveIdocs = True s.Start() Console.WriteLine("Server is running. Press any key to exit.") Console.ReadLine() s.Stop() End Sub
Tritt das Ereignis IncomingIdoc auf, wird eine Referenz auf das RFCServer-Objekt sowie ein Idoc-Objekt übergeben. Mit Hilfe der Segment-Collection kann nun der Inhalt der Idocs analysiert und ausgelesen werden. Im folgenden Fall besorgen wir uns zunächst das E2MARAM005-Segment. Es enthält beliebig viele E2MAKTM001-Segemente, die wiederum jeweils einen Kurztext des Materials in unterschieldichen Sprachen beeinhalten. Mit Hilfe von ReadData kann der Datenpuffer des Segemnts ausgelesen werden. Der eigentliche Text befindet sich an der Stelle 4 und ist 40 Zeichen lang (nachzulesen in der Idoc-Doku, z.B. Transaktion WE60). Alle Texte werden auf der Console ausgegeben.
[C#]
private static void s_IncomingIdoc(RFCServer Sender, Idoc idoc) { Console.WriteLine("Recieved Idoc " + idoc.IDOCTYP); IdocSegment e1maram = idoc.Segments["E2MARAM005",0]; for (int i=0; i < e1maram.ChildSegments.Count;i++) if (e1maram.ChildSegments[i].SegmentName == "E2MAKTM001") Console.WriteLine("Materialtext found: " + e1maram.ChildSegments[i].ReadDataBuffer(4,40)); }
[VB]
Private Sub s_IncomingIdoc(ByVal Sender As ERPConnect.RFCServer, ByVal idoc As ERPConnect.Idocs.Idoc) Handles s.IncomingIdoc Console.WriteLine("Recieved Idoc " + idoc.IDOCTYP) Dim e2maram As IdocSegment = idoc.Segments("E2MARAM005", 0) Dim i As Integer For i = 0 To e2maram.ChildSegments.Count - 1 If e2maram.ChildSegments(i).SegmentName = "E2MAKTM001" Then Console.WriteLine("Materialtext found: " & _ e2maram.ChildSegments(i).ReadDataBuffer(4, 40)) End If Next i End Sub
Der nachfolgende Screenshot zeigt das Beispielprogramm in Aktion. In diesem Fall werden die Texte aus insgesamt 7 Sprachen im Idoc übergeben. Daraus ergeben sich auch 7 E2MAKTM001-Segmente.



