LOOP AT funktioniert nicht

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Getting started ... Alles für einen gelungenen Start.
18 Beiträge • Seite 1 von 2 (current) Nächste
18 Beiträge Seite 1 von 2 (current) Nächste

LOOP AT funktioniert nicht

Beitrag von abap_frischling (ForumUser / 31 / 12 / 0 ) »
Servus miteinander,
leider bin ich weiterhin hier auf diesem Forum am spamen, das tut mir wirklich leid, aber als blutiger Anfänger will ich die Sachen gerne verstehen, damit ich sie in Zukunft auch gelernt habe. Im folgenden Code versuche ich ausgelesene Datensätze in meine interne Tabelle einzufügen. Leider klappt es nicht. Sobald ich mir die Tabelle anzeigen lasse zeigt sie mir keine eingetragenen Datensätze. Kann mir jemand hier weiterhelfen?

Code: Alles auswählen.

*Start of Selection

SELECT matnr werks ekgrp FROM marc INTO ls_test
  WHERE matnr IN so_matnr
  AND werks IN so_werks.
  APPEND ls_test TO lt_test.
ENDSELECT.

LOOP AT lt_test INTO ls_test.
  SELECT * FROM mara INTO TABLE lt_mara
    WHERE matnr = ls_test-matnr.
MODIFY lt_test FROM ls_test.
ENDLOOP.

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: LOOP AT funktioniert nicht

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
1. sind denn Daten zu deiner Select-options in der Tabelle?
2. es wäre schöner, wenn du den ersten SELECT ebenfalls gleich mit INTO TABLE programmierst. SELECT - ENDSELECT macht man nur noch in Ausnahmefällen
3. wie sind ls_test und lt_test definiert?
4. in deinem LOOP machst du nix, was ein MODIFY rechtfertigen würde.
5. in MARA gibt es nur ein Schlüsselfeld: MATNR. das heißt, mit deinem SELECT ist immer nur EIN Datensatz in der Tabelle LT_MARA. deswegen: SELECT SINGLE * FROM MARA INTO ls_mara.
6. du brauchst noch eine Zuweisung ls_test-mara_feld = ls_mara-mara_feld.

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
abap_frischling


Re: LOOP AT funktioniert nicht

Beitrag von sap_enthusiast (ForumUser / 95 / 25 / 23 ) »
Hallo abap_frischling,

ein Beispiel für Ennos Hinweis bezüglich INTO TABLE wäre folgendes:
(noch aus deinem älteren Post habe ich das Beispiel genommen)

Code: Alles auswählen.

SELECT plumi FROM mdtb 
  WHERE dtnum = @ls_outtab-dtnum
  AND dat01 IN @so_pdate[]
  AND plumi = '+'.
INTO TABLE @DATA(lt_test).

SELECT plumi FROM mdtb
   WHERE dtnum = @ls_outtab-dtnum
  AND dat01 IN @so_pdate[]
  AND plumi = '-' 
 INTO TABLE @DATA(lt_test_2).
inline Deklarationen sind in dem Falle ganz geschickt, weil du nichts extra typisieren und deklarieren sollst. Natürlich je nach Code-Struktur kann sein, dass inline Deklarationen nicht vorteilhaft sind.

Folgende Benutzer bedankten sich beim Autor sap_enthusiast für den Beitrag:
abap_frischling


Re: LOOP AT funktioniert nicht

Beitrag von abap_frischling (ForumUser / 31 / 12 / 0 ) »
ewx hat geschrieben:
16.02.2022 18:42
1. sind denn Daten zu deiner Select-options in der Tabelle?
Wo sie sind oder ob sie da sind? Also in meinem Selection Screen habe ich zwei SELECT OPTIONS eingebaut, einmal zu Materialnummer und Werk. Beides funktioniert auch. In meiner Ausgabe kommen auch Daten zu meinem ersten Select in meine Tabelle rein.
ewx hat geschrieben:
16.02.2022 18:42
2. es wäre schöner, wenn du den ersten SELECT ebenfalls gleich mit INTO TABLE programmierst. SELECT - ENDSELECT macht man nur noch in Ausnahmefällen
Danke für den Tipp. Werde ich mir merken :)
ewx hat geschrieben:
16.02.2022 18:42
3. wie sind ls_test und lt_test definiert?

Code: Alles auswählen.

TYPES: BEGIN OF ty_test,
         matnr TYPE marc-matnr,
         werks TYPE marc-werks,
         ekgrp TYPE marc-ekgrp,
         matkl TYPE mara-matkl,
         mtart TYPE mara-mtart,
         meins TYPE mara-meins,
         maktx TYPE makt-maktx,
         lbkum TYPE mbew-lbkum,
         dtnum TYPE mdkp-dtnum,
       END OF ty_test.

DATA:
  ls_test TYPE ty_test,
  lt_test TYPE TABLE OF ty_test.
ewx hat geschrieben:
16.02.2022 18:42
4. in deinem LOOP machst du nix, was ein MODIFY rechtfertigen würde.
Korregiere mich gerne, aber ich dachte dadurch dass ich im ersten SELECT schon Daten eingeholt habe, entsteht meine erste Zeile. Wenn ich dann einen LOOP drüber spiele muss ich ja die leeren Zeilenfelder modifizieren. Oder habe ich ein Verständnisproblem?
ewx hat geschrieben:
16.02.2022 18:42
5. in MARA gibt es nur ein Schlüsselfeld: MATNR. das heißt, mit deinem SELECT ist immer nur EIN Datensatz in der Tabelle LT_MARA. deswegen: SELECT SINGLE * FROM MARA INTO ls_mara.
Stimmt, wird sofort umgeändert. :)
ewx hat geschrieben:
16.02.2022 18:42
6. du brauchst noch eine Zuweisung ls_test-mara_feld = ls_mara-mara_feld.
Habe ich nachgetragen. :)

Re: LOOP AT funktioniert nicht

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
abap_frischling hat geschrieben:
17.02.2022 10:17
In meiner Ausgabe kommen auch Daten zu meinem ersten Select in meine Tabelle rein.
Ich dachte, die Tabelle ist leer...? Das hattest du in der Ausgangsfrage geschrieben.

Re: LOOP AT funktioniert nicht

Beitrag von abap_frischling (ForumUser / 31 / 12 / 0 ) »
ewx hat geschrieben:
17.02.2022 10:21
abap_frischling hat geschrieben:
17.02.2022 10:17
In meiner Ausgabe kommen auch Daten zu meinem ersten Select in meine Tabelle rein.
Ich dachte, die Tabelle ist leer...? Das hattest du in der Ausgangsfrage geschrieben.
Dann habe ich mich falsch ausgedrückt, tut mir leid. Die Tabelle ist mit dem ersten SELECT befüllt. Also matnr werks und ekgrp stehen in meiner Tabelle drinnen. Nur der LOOP funktioniert nicht.

Re: LOOP AT funktioniert nicht

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
ok. aber nachdem du den SELECT auf die MARA umgestellt und die Zuweisung ls_test gemacht hast, funktioniert es immer noch nicht? was genau? hast du im Debugger mal geprüft, was passiert?

Re: LOOP AT funktioniert nicht

Beitrag von abap_frischling (ForumUser / 31 / 12 / 0 ) »
ewx hat geschrieben:
17.02.2022 10:25
ok. aber nachdem du den SELECT auf die MARA umgestellt und die Zuweisung ls_test gemacht hast, funktioniert es immer noch nicht? was genau? hast du im Debugger mal geprüft, was passiert?
Ich habe mir es mal im Debugger angeschaut. Die Daten für ls_mara werden selektiert. Ich habe auch die Zuweisung gemacht. ls_test hat auch den Datensatz von ls_mara. Aber die Übertragung der Struktur in meine Tabelle funktioniert nicht. Ein APPEND der ls_test TO lt_test passt nicht, ich will ja die vorhandene Zeile nutzen. Deswegen habe ich ja das MODIFY verwendet.

Re: LOOP AT funktioniert nicht

Beitrag von abap_frischling (ForumUser / 31 / 12 / 0 ) »
Ok jetzt hat es funktioniert. Am Ende waren es Kleinigkeiten, ich habe jetzt das die Zuweisung und die SELECT verändert. Die Daten kommen in meine Tabelle.

Code: Alles auswählen.

*At Selection-screen
SELECTION-SCREEN BEGIN OF BLOCK start WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS: so_matnr FOR ls_marc-matnr DEFAULT '30660'.
  SELECT-OPTIONS: so_werks FOR ls_marc-werks DEFAULT '2200'.
SELECTION-SCREEN END OF BLOCK start.

*Start of Selection
SELECT matnr werks ekgrp FROM marc INTO TABLE lt_test
  WHERE matnr IN so_matnr
  AND werks IN so_werks.

LOOP AT lt_test INTO ls_test.
  SELECT SINGLE * FROM mara INTO ls_mara
    WHERE matnr = ls_test-matnr.
   ls_test-matkl = ls_mara-matkl.
   ls_test-mtart = ls_mara-mtart.
   ls_test-meins = ls_mara-meins.
MODIFY lt_test FROM ls_test.
ENDLOOP.
Danke für die Hilfe ewx. Sehr sehr nett und hilfreich. :)

Re: LOOP AT funktioniert nicht

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
Beim Programmieren sind es fast immer Kleinigkeiten... ;-)

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag:
abap_frischling


Re: LOOP AT funktioniert nicht

Beitrag von ralf.wenzel (Top Expert / 3935 / 200 / 281 ) »
Ich würden den LOOP anders schreiben:

Code: Alles auswählen.

LOOP AT lt_test INTO FIELD-SYMBOL(<ls_test>).
   <ls_test>-matkl = ls_mara-matkl.
   <ls_test>-mtart = ls_mara-mtart.
   <ls_test>-meins = ls_mara-meins.
ENDLOOP.
Außerdem gehört der SELECT SINGLE vor den LOOP gezogen als SELECT INTO TABLE FOR ALL ENTRIES IN. In den LOOP gehört dann ein READ TABLE, z. B. als

ASSIGN lt_mara[ matnr = <ls_test>-matnr ] to FIELD-SYMBOL(<ls_mara>).

Schlechtes Coding sollte man sich gar nicht erst angewöhnen.... Und was es zur Ungarischen Notation zu wissen gibt, kann man nachlesen, z. B. im Link unten.

Ralf

Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
abap_frischling

Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: LOOP AT funktioniert nicht

Beitrag von qyurryus (Specialist / 112 / 85 / 45 ) »
Oder man bindet die MARA über einen INNER JOIN ein 🙂

@abap_frischling: kann dir empfehlen mal alle 3 Varianten zu testen und dann mal die Laufzeiten zu vergleichen wenn du >1000 Datensätze selektierst (zB mit Transaktion SAT oder du holst dir Zeitstempel und berechnest die Laufzeiten).
Dann lernst du mehre Varianten und merkst wie dadurch die Laufzeiten beeinflusst werden.

Folgende Benutzer bedankten sich beim Autor qyurryus für den Beitrag:
abap_frischling


Re: LOOP AT funktioniert nicht

Beitrag von ralf.wenzel (Top Expert / 3935 / 200 / 281 ) »
Richtig - und selbst wenn es keine signifikanten Laufzeitunterschiede gibt, gibt es guten und schlechten Stil. Und schlechten Stil, einmal angewöhnt, kann man sich schwer abgewöhnen.


Ralf

Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
abap_frischling

Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: LOOP AT funktioniert nicht

Beitrag von abap_frischling (ForumUser / 31 / 12 / 0 ) »
Dankeschön Ralf und qyurryus. Sehr nett. Ich werde alles probieren, danke für die Hilfe und die Tipps.

Re: LOOP AT funktioniert nicht

Beitrag von PeterPaletti (Specialist / 348 / 32 / 97 ) »
Und was es zur Ungarischen Notation zu wissen gibt, kann man nachlesen, z. B. im Link unten.(Ralf Wenzel)
Wobei man darüber diskutieren könnte, ob LT_TEST und LS_TEST überhaupt original ungarisch sind. Sie sind meines Erachtens eher so eine Art ABAP-Dialekt der ungarischen Notation. 😊

Vergleichbare Themen

6
Antw.
2477
Views
LOOP funktioniert nicht :(
von Trulchen » 12.03.2013 09:32 • Verfasst in ABAP® für Anfänger
1
Antw.
2397
Views
LOOP funktioniert nicht
von ostpower » 07.01.2011 14:23 • Verfasst in ABAP® für Anfänger
1
Antw.
1484
Views
4
Antw.
3786
Views
LOOP in einem LOOP
von Bjuti » 10.09.2013 15:18 • Verfasst in ABAP® für Anfänger
7
Antw.
3517
Views
Wie funktioniert der Z-Operator?
von DeathAndPain » 14.09.2017 18:10 • Verfasst in ABAP® für Anfänger

Über diesen Beitrag



Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Regex in where
vor 16 Minuten von edwin 1 / 1
Programm anlegen mit Vorlage
vor 4 Stunden von DeathAndPain 2 / 72
IT0024 Qualifikationen CP-ID
vor 4 Stunden von DeathAndPain 2 / 311
BUSOBJEKT zu CMIS PHIO ermitteln
vor 6 Stunden von snooga87 1 / 50

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Aktuelle Forenbeiträge

Regex in where
vor 16 Minuten von edwin 1 / 1
Programm anlegen mit Vorlage
vor 4 Stunden von DeathAndPain 2 / 72
IT0024 Qualifikationen CP-ID
vor 4 Stunden von DeathAndPain 2 / 311
BUSOBJEKT zu CMIS PHIO ermitteln
vor 6 Stunden von snooga87 1 / 50

Unbeantwortete Forenbeiträge

Regex in where
vor 16 Minuten von edwin 1 / 1
BUSOBJEKT zu CMIS PHIO ermitteln
vor 6 Stunden von snooga87 1 / 50
aRFC im OO-Kontext
vor 5 Wochen von ralf.wenzel 1 / 3227