{"id":244,"date":"2017-08-17T07:41:27","date_gmt":"2017-08-17T06:41:27","guid":{"rendered":"http:\/\/www.laufzeitfehler.net\/?p=244"},"modified":"2017-08-17T07:43:16","modified_gmt":"2017-08-17T06:43:16","slug":"verschachelte-loops-vermeiden","status":"publish","type":"post","link":"https:\/\/www.laufzeitfehler.net\/index.php\/2017\/08\/17\/verschachelte-loops-vermeiden\/","title":{"rendered":"Verschachelte Loops vermeiden"},"content":{"rendered":"<p>Im Rahmen einer Anpassung eines bestehenden Programms stand ich vor folgender Herausforderung: Ich habe eine interne Tabelle mit allen Positionen, f\u00fcr die ich einen Wareneingang buchen m\u00f6chte. Doch die Positionen k\u00f6nnen unterschiedliche externe Lieferscheinnummern enthalten. Nun sollen die Wareneing\u00e4nge je Lieferscheinnummer gebucht werden (weil das ein Kopffeld ist und sonst die Rechnungspr\u00fcfung durcheinander kommt). Mein erster Gedanke w\u00e4ren nun gewesen, mir eine Hilfstabelle mit allen externen Lieferscheinnummern aufzubauen ). Dann k\u00f6nnte ich \u00fcber die Hilfstabelle loopen und in dem Loop w\u00fcrde ich dann \u00fcber alle Positionen loopen mit der entsprechenden WHERE-Bedingung, damit ich im zweiten Loop nur die Positionen mit der aktuellen externen Lieferscheinnummer durchlaufe. Dies erschien mir doch irgendwie kompliziert und in mir str\u00e4ubte sich alles gegen die verschachtelte Loops . Also habe ich etwas recherchiert und Dank eines Tipps eines versierten Entwicklers wurde ich darauf aufmerksam gemacht, dass es mit ABAP 7.40 neue Funktionalit\u00e4ten gibt. Unter anderem eine GROUP-Funktion innerhalb interner Tabelle. Und in der Tat erf\u00fcllte der neue ABAP-Befehl LOOP AT GROUP genau meine Anforderung. Anbei mal ein vereinfachtes Beispiel: Es sollen die Kundenst\u00e4mme eines bestimmten Landes selektiert und nach dem Ort sortiert verarbeitet werden (in diesem Falle ist es eine simple Ausgabe der Datens\u00e4tze). Das entsprechende Coding sieht wie folgt aus:<\/p>\n<pre lang=\"ABAP\" line=\"1\"> \r\nDATA lt_kna1 TYPE TABLE OF kna1. \r\nDATA lt_ort LIKE lt_kna1.   \r\n\r\nPARAMETER p_land1 TYPE land1.   \r\n\r\nSELECT * FROM kna1 UP TO 100 ROWS INTO TABLE lt_kna1 \r\n         WHERE land1 EQ p_land1.   \r\nLOOP AT lt_kna1 INTO DATA(ls_kna1) GROUP BY ( ort01 = ls_kna1-ort01 ) \r\n                                   ASCENDING \r\n                                   ASSIGNING FIELD-SYMBOL(). \r\n CLEAR lt_ort. \r\n LOOP AT GROUP  ASSIGNING FIELD-SYMBOL(). \r\n   lt_ort = VALUE #( BASE lt_ort (   ) ). \r\n ENDLOOP. \r\n cl_demo_output=>write( lt_ort ). \r\nENDLOOP. \r\ncl_demo_output=>display( ).<\/pre>\n<p>Zun\u00e4chst k\u00f6nnte man meinen, dass es doch nur zwei geschachtelte Loops sind &#8211; aber ganz so einfach ist es nicht. Das erste LOOP-Statement wird auf die gesamte Tabelle <em>lt_kna1<\/em> angewandt und \u00fcber die Anweisung GROUP BY werden die Tabellenzeilen entsprechend der Gruppierungskriterien sortiert (im Beispiel nach dem Ort). Wichtig hierbei ist, dass zu diesem Zeitpunkt der Body des Loops noch nicht ausgewertet wurde. Das passiert nach der Sortierung &#8211; und dann wird der zweite (und vermeintlich verschachtelte) Loop durchlaufen. Durch den Verweis auf den Gruppierungsschl\u00fcssel <em>&lt;group&gt;<\/em>, der im ersten Loop zugeordnet wurde, arbeitet der zweite Loop nun die Tabelle <em>lt_kna1<\/em> Block f\u00fcr Block ab.<\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>Im Rahmen einer Anpassung eines bestehenden Programms stand ich vor folgender Herausforderung: Ich habe eine interne Tabelle mit allen Positionen, f\u00fcr die ich einen Wareneingang <a class=\"mh-excerpt-more\" href=\"https:\/\/www.laufzeitfehler.net\/index.php\/2017\/08\/17\/verschachelte-loops-vermeiden\/\" title=\"Verschachelte Loops vermeiden\">[&#8230;]<\/a><\/p>\n<\/div>","protected":false},"author":1,"featured_media":375,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[86,59],"tags":[87,131,88,130],"_links":{"self":[{"href":"https:\/\/www.laufzeitfehler.net\/index.php\/wp-json\/wp\/v2\/posts\/244"}],"collection":[{"href":"https:\/\/www.laufzeitfehler.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.laufzeitfehler.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.laufzeitfehler.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.laufzeitfehler.net\/index.php\/wp-json\/wp\/v2\/comments?post=244"}],"version-history":[{"count":3,"href":"https:\/\/www.laufzeitfehler.net\/index.php\/wp-json\/wp\/v2\/posts\/244\/revisions"}],"predecessor-version":[{"id":377,"href":"https:\/\/www.laufzeitfehler.net\/index.php\/wp-json\/wp\/v2\/posts\/244\/revisions\/377"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.laufzeitfehler.net\/index.php\/wp-json\/wp\/v2\/media\/375"}],"wp:attachment":[{"href":"https:\/\/www.laufzeitfehler.net\/index.php\/wp-json\/wp\/v2\/media?parent=244"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.laufzeitfehler.net\/index.php\/wp-json\/wp\/v2\/categories?post=244"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.laufzeitfehler.net\/index.php\/wp-json\/wp\/v2\/tags?post=244"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}