Loop in der Endroutine

Getting started ... Alles für einen gelungenen Start.
5 Beiträge • Seite 1 von 1
5 Beiträge Seite 1 von 1

Loop in der Endroutine

Beitrag von Mavi (ForumUser / 3 / 0 / 0 ) »
Hallo zusammen,

leider bin ich noch nich so fit in ABAP und benötige eure hilfe :D

Ich möchte jede einzelne Zeile die ich Loope in <result_filds> übergeben - das funktioniert auch ohne probleme wenn nur ein Schlüsselfeld vorhanden ist.
Es gibt aber auch Datensätze, wo für den Schlüsselfeld mehrere positionen gibt.
Das Problem ist, dass beim nächsten Durchlauf der vorherige Datensatz überschrieben wird.
Ich möchte, dass alle durchläufe in die nächste Zeile geschrieben wird.

Vereinfacht dargestellt:

Nr Position Wert
1 1 2
1 2 3
2 1 5

Derzeit ist es so in meinem Coding:

Nr Position Wert
1 1 3
1 2 3
2 1 5

Code: Alles auswählen.

Mein Coding:
    DATA : BEGIN OF line,
             doc_number    TYPE /bi0/oidoc_number,
             s_ord_item    TYPE /bi0/ois_ord_item,
             doc_categ     TYPE /bi0/oidoc_categ,
             item_categ    TYPE /bi0/oiitem_categ,
             refer_doc     TYPE /bi0/oirefer_doc,
             cml_cf_qty    TYPE /bi0/oicml_cf_qty,
             /bic/zcost_so TYPE /bic/oizcost_so,
           END OF line.

    DATA itab LIKE HASHED TABLE OF line WITH UNIQUE KEY doc_number
    s_ord_item.

    SELECT doc_number s_ord_item  doc_categ item_categ refer_doc
    cml_cf_qty cost
         FROM /bic/azsdsoo0600
         INTO line
          WHERE item_categ = 'ZTAS' OR item_categ = 'G2N' OR item_categ = 'G2NN'      OR item_categ = 'G2W'.

      INSERT line INTO TABLE itab.
    ENDSELECT.


    BREAK-POINT.
    SORT itab.

    LOOP AT RESULT_PACKAGE ASSIGNING <result_fields>.
      
         LOOP AT itab INTO line WHERE doc_number =
           <result_fields>-refer_doc OR refer_doc = <result_fields>-refer_doc.

        IF line-item_categ = 'ZTAS'.

          <result_fields>-cml_cf_qty = line-cml_cf_qty.
          <result_fields>-/bic/zcost_so = line-/bic/zcost_so.

          IF line-doc_categ = 'K'.
            <result_fields>-/bic/zcreditm = line-doc_number.
            <result_fields>-/bic/zitemcat = line-item_categ.

          ENDIF.
      ENDLOOP.
    ENDLOOP.
Was mache ich falsch? Danke euch im Voraus.


Re: Loop in der Endroutine

Beitrag von black_adept (Top Expert / 3462 / 68 / 681 ) »
Moin Mavi,

deine Frage ist sehr nebulös und anhand deiner beiden Tabellen kann ich eigentlich nur raten.
Tipp: In die WHERE-Bedingung des inneren Loops noch die Position mit aufnehmen.

Ansonsten: Dein treuester Freund und Gefährte heißt "Debugger". Du hast ihn ja schon mit "BREAK-POINT" heraufbeschworen und er möchte und kann dir gut helfen.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Loop in der Endroutine

Beitrag von DeathAndPain (Top Expert / 1492 / 165 / 336 ) »
Erst mal Anerkennung dafür, dass Du alle Typ- und Datenfelddeklarationen mitgeliefert hast. Das ist leider nicht die Regel, aber wichtig, um Frage wie diese vernünftig beantworten zu können.

Zunächst einmal solltest Du Dein Coding etwas aufräumen. Anstelle Die Datenbanktabelle per SELECT-ENDSELECT-Schleife zeilenweise in Deine interne Tabelle einzulesen, kannst Du viel kürzer - und auch viel performanter - einfach schreiben:

Code: Alles auswählen.

SELECT doc_number s_ord_item  doc_categ item_categ refer_doc cml_cf_qty cost
  FROM /bic/azsdsoo0600
  INTO TABLE itab
  WHERE item_categ IN ('ZTAS','G2N','G2NN','G2W').
Der

Code: Alles auswählen.

SORT itab.
ist Quatsch und muss ersatzlos weg, denn was willst Du in einer gehashten Tabelle sortieren? Hashtabellen haben keine Reihenfolge; der Zugriff sollte immer über den Schlüssel erfolgen. Da Du in Deinem LOOP aber nur einen Teilschlüssel angibst, wäre eine SORTED TABLE wahrscheinlich besser als eine HASHED TABLE, da bei SORTED TABLES auch Teilschlüssel performancesteigernd genutzt werden können, solange sie von vorne nach hinten auf Gleichheit geprüft werden (das letzte Feld darf auch auf größer/kleiner geprüft werden). (Eine SORTED TABLE musst Du gleichfalls nicht mit SORT itab. sortieren, da sie von Hause aus stets nach ihrem Schlüssel sortiert ist.)

Soweit ich das verstanden habe, willst Du Deine Ergebnisse in der Tabelle RESULT_PACKAGE haben. Dort fügst Du aber gar keine Zeilen ein, sondern gehst nur die Tabellen durch und ergänzt Werte anhand Deiner ITAB. Das ist legitim, aber wenn es in ITAB mehrere Zeilen gibt, die die Bedingung WHERE doc_number = <result_fields>-refer_doc OR refer_doc = <result_fields>-refer_doc erfüllen (beispielsweise eine Zeile mit doc_number = <result_fields>-refer_doc und eine andere mit refer_doc = <result_fields>-refer_doc), dann wird er erst die Werte aus der ersten Zeile eintragen, dann mit dem LOOP AT itab weitermachen, die zweite Zeile finden und dann deren Werte in <result_fields> eintragen (wodurch die Werte aus der ersten gefundenen Zeile wieder überschrieben werden).

Von daher hat black_adept recht: Es ist nicht ganz klar, was Du überhaupt willst. Wenn Du in RESULT_PACKAGE beide passenden Ergebnisse aus ITAB haben möchtest, dann müsstest Du in RESULT_PACKAGE entsprechend zusätzliche Zeilen einfügen.

Es ist auch nicht klar, welchen Feldern aus Deinem Beispielcode die Spalten Nr, Position und Wert aus Deinen Beispieltabellen entsprechen.

Re: Loop in der Endroutine

Beitrag von Mephisto1986 (ForumUser / 5 / 1 / 0 ) »
Hallo Mavi,
schwierig zu sagen ohne Dateninhalt , aber würde innere Schleife ersetzen durch Read Table itab assigning .... With Key ... , vermutlich hast du 2 oder mehrmals Daten die die Bedingung erfüllen und es überschreibt dann andere...

Re: Loop in der Endroutine

Beitrag von Mavi (ForumUser / 3 / 0 / 0 ) »
tut mir leid, dass ich erst jetzt Antworte. Zunächst vielen lieben Dank für die Antworten. Die Aufgabe habe ich mit unterstützung einer externen Kollgenen lösen können.

VG
Mavi

Seite 1 von 1

Vergleichbare Themen

BW - Zeilen einfügen in Transformations-Endroutine
von Andre1986 » 12.12.2010 20:44
Löschen Daten aus Endroutine einer Transformation
von SirArthur » 13.12.2011 15:36
LOOP in einem LOOP
von Bjuti » 10.09.2013 15:18
ein loop
von user2008 » 19.07.2017 10:50