LOOP "in kurz"?

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
19 Beiträge • Seite 1 von 2 (current) Nächste
19 Beiträge Seite 1 von 2 (current) Nächste

LOOP "in kurz"?

Beitrag von ralf.wenzel (Top Expert / 3946 / 201 / 281 ) »
Moin,

ich hab hier ein Coding, das ziemlich oft solche Codingstrecken enthält:

Code: Alles auswählen.

    LOOP AT itab TRANSPORTING NO FIELDS
    WHERE bla EQ ...
      AND ble   EQ ...
      AND blub   EQ ...
      AND ( feld1 EQ ...
         OR feld2 EQ ... )
      AND datum   NE '99991231'.
      EXIT.
    ENDLOOP.
Ich finde das total schwer lesbar.

Einen READ kann ich schon aufgrund des NE nicht machen. Muss ich das so lassen oder gibt es eine eingänglichere Form, die lesbarer ist?


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

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


Re: LOOP "in kurz"?

Beitrag von a-dead-trousers (Top Expert / 4414 / 224 / 1186 ) »
LOOP unterstützt auch den IN-Operator.
Von daher kannst du dir eine Art Query-Klasse bauen (du stehst ja so auf Klassen) die alle möglichen Felder beinhaltet und mittels Konstruktor oder ähnlichem baust du dir die jeweiligen Abfragen zusammen.

Code: Alles auswählen.

CLASS zcl_filter DEFINITION PUBLIC CREATE PUBLIC.
  PUBLIC SECTION.
    DATA bla TYPE RANGE OF ty_bla.
    DATA ble TYPE RANGE OF ty_ble.
    DATA blub TYPE RANGE OF ty_blub.
    DATA datum TYPE RANGE OF d.

  METHODS query_blub
    IMPORTING
      !id_blub TYPE ty_blub.
ENDCLASS.
CLASS zcl_filter IMPLEMENTATION.
  METHOD query_blub.
    APPEND VALUE #( sign = 'I' option = 'EQ' low = id_blub ) TO me->blub.
  ENDMETHOD.
ENDCLASS.

CLASS zcl_datatable DEFINITION PUBLIC CREATE PUBLIC.
  PRIVATE SECTION.
    DATA itab TYPE ty_itab.
  PUBLIC SECTION.
  METHODS read_table
    IMPORTING
      !ir_filter TYPE REF TO zcl_filter
    RETURNING
      VALUE(rr_itab) TYPE REF TO ty_itab_line.
ENDCLASS.
CLASS zcl_datatable IMPLEMENTATION.
  METHOD read_table.
    LOOP AT me->itab REFERENCE INTO rr_itab
      WHERE bla IN ir_filter->bla
        AND ble IN ir_filter->ble
        AND blub IN ir_filter->blub
        AND datum IN ir_filter->datum
    EXIT.
  ENDMETHOD.
ENDCLASS.

...

DATA(lr_filter) = NEW zcl_filter( ).
lr_filter->query_blub( id_blub = 'lalala' ).

DATA(lr_datatable) = NEW zcl_datatable( ).
DATA(lr_itab_line) = lr_datatable->read_table( ir_filter = lr_filter ).
Somit hast du alle Informationen für eine einzelne Abfrage thematisch zusammengefasst, kannst trotzdem noch sehr gut variieren und musst den Loop nicht ständig neu implementieren.

Wie "lesbar" du die beteiligten Objekte bennenst (ungarisch oder nicht) bleibt dir überlassen 😉

EDIT:
Natürlich macht der Overhead nur Sinn wenn du mehrmals auf dieselbe Tabelle (itab) mit unterschiedlichen Werten zugreifen möchtest. Bei mehreren unterschiedlichen Tabellen(-strukturen) macht das keinen Sinn 😅
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: LOOP "in kurz"?

Beitrag von ralf.wenzel (Top Expert / 3946 / 201 / 281 ) »
Boah. Ja, ich stehe auf Klassen, aber wirklich eingängiger beim Lesen ist DAS auch nicht.

Meine Frage war getrieben von der Vereinfachung:

Code: Alles auswählen.

READ TABLE ITAB ... 
TRANSPORTING NO FIELDS.... 
WITH KEY....
IF SY-SUBRC EQ 0.
.... 
ENDIF.
zu

Code: Alles auswählen.

IF LINE_EXISTS( itab[ .... ]. ENDIF.
Ich möchte vereinfachen und diese Hilfskonstrukte loswerden statt eine Krücke durch eine andere zu ersetzen. Ich bin dankbar für deinen Tipp, aber im Grunde genommen kapsele ich den schwer lesbaren LOOP ja nur in eine Klasse weg.


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

Re: LOOP "in kurz"?

Beitrag von a-dead-trousers (Top Expert / 4414 / 224 / 1186 ) »
ralf.wenzel hat geschrieben:
29.03.2022 12:38
Ich bin dankbar für deinen Tipp, aber im Grunde genommen kapsele ich den schwer lesbaren LOOP ja nur in eine Klasse weg.
Damit man ihn mehrfach verwenden kann.

Vorallem in Hinblick auf die Wartung sehe ich hier einen riesigen Vorteil:
Überall dort wo man mit dieser Art von Objekten den Zugriff realisiert hat muss man bei einer Änderung der Datenstruktur nicht zig Aufrufstellen ändern, sondern nur den einen Loop (oder LINE_EXISTS bzw. READ TABLE).

Stell dir mal vor, du hast verteilt über deinen ganzen Code zehn bis fünfzehn ähnliche Zugriffe auf deine itab. Dann kommt eine neue Anforderung und du musst alle Aufrufstellen kontrollieren, ob da etwas nachzubessern, sprich ein zusätzliches Feld zu versorgen, ist. Bei meiner Lösung musst du das Feld nur in die Abfrage-Klasse aufnehmen und im LOOP abfragen. Fertig. Befüllt muss es dann nur noch von den individuellen Abfrage-Objekten werden wo es benötigt wird.

Wie gesagt, es macht nur Sinn bei entsprechend groß skalierten Projekten mit Ausblick auf viele Nachbesserungen.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: LOOP "in kurz"?

Beitrag von ewx (Top Expert / 4854 / 313 / 644 ) »
Wenn du eine komplexe Abfrage hast, dann ist die nun Mal komplex. Was willst du da kürzer machen?
Mit dem komplexen Loop drückst du ja ggfs. eine bestimmte business-Logik aus. Und wenn du diese kapselst, gewinnst du ja was, weil der Rest des Codings dadurch lesbarer wird.

Code: Alles auswählen.

if helper=>alle_bles_und_blas_innerhalb_periode( i_ble = ble i_bla = bla )
 and helper=>exists_blub_in_vergangenheit( i_blub = blub).

Folgende Benutzer bedankten sich beim Autor ewx für den Beitrag (Insgesamt 3):
a-dead-trousersHaubiIcke0801


Re: LOOP "in kurz"?

Beitrag von a-dead-trousers (Top Expert / 4414 / 224 / 1186 ) »
ewx hat geschrieben:
29.03.2022 12:54
Wenn du eine komplexe Abfrage hast, dann ist die nun Mal komplex. Was willst du da kürzer machen?
Mit dem komplexen Loop drückst du ja ggfs. eine bestimmte business-Logik aus. Und wenn du diese kapselst, gewinnst du ja was, weil der Rest des Codings dadurch lesbarer wird.

Code: Alles auswählen.

if helper=>alle_bles_und_blas_innerhalb_periode( i_ble = ble i_bla = bla )
 and helper=>exists_blub_in_vergangenheit( i_blub = blub).
Und meine Lösung kapselt den Ansatz nur noch weiter indem "i_ble = ble i_bla = bla" bzw. "i_blub = blub" in Objekten (als Businesslogik) zusammengefasst werden um nur eine Methode "helper=>exists_in" warten zu müssen.
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: LOOP "in kurz"?

Beitrag von deejey (Specialist / 422 / 129 / 45 ) »
Das ist ja auch eine komplexe Abfrage, das kann nicht direkt vereinfacht werden. Wäre das mit READ KEY umsetzbar, auch mit Klammern, sähe das genau so komplex aus wie beim LOOP. Das geht höchstens mehrstufig, ist unelegant aber vlt. besser lesbar:

LOOP at ... assigning <fs>
where f1 = 10
and f2 = 20.
if <fs>-field1 = .... and <fs>-field2
and ( ( .... ) or ( ... ) )

irgendwie so 🙃

Re: LOOP "in kurz"?

Beitrag von ralf.wenzel (Top Expert / 3946 / 201 / 281 ) »
a-dead-trousers hat geschrieben:
29.03.2022 12:52
ralf.wenzel hat geschrieben:
29.03.2022 12:38
Ich bin dankbar für deinen Tipp, aber im Grunde genommen kapsele ich den schwer lesbaren LOOP ja nur in eine Klasse weg.
Damit man ihn mehrfach verwenden kann.
Das Problem ist: Ich hab das nicht x-mal mit derselben Tabelle, sondern ähnliche Aufrufe bezogen auf unterschiedliche Tabellen, womit insbesondere die Feldnamen "bla" etc. unterschiedlich sind. Mal sind es mehr, mal sind es weniger, mal mit AND mal mit AND und OR -- einig ist nur: Es ist ein NE drin, das ein READ verhindert.

Man müsste es also schon deutlich abstrakter machen, damit es einen Gewinn bringt.


Ralf

Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
a-dead-trousers

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

Re: LOOP "in kurz"?

Beitrag von ralf.wenzel (Top Expert / 3946 / 201 / 281 ) »
deejey hat geschrieben:
29.03.2022 13:01
Das ist ja auch eine komplexe Abfrage, das kann nicht direkt vereinfacht werden.
Ein READ ist auch komplex und kann per entsprechender Schreibweise deutlich vereinfach werden ;)

Oder eben auch dieser LOOP, solange er kein NE als Operator enthält.


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

Re: LOOP "in kurz"?

Beitrag von ewx (Top Expert / 4854 / 313 / 644 ) »
Es wird dadurch jedoch kaum lesbarer. du hast nur drei Zeilen weniger Coding. Das, was wirklich schwer lesbar ist, ist die Abfrage und die kannst du nicht "wegkürzen".
Ansonsten könntest du die Daten evtl. anders aufbauen und eine Spalte END_OF_TIME einfügen. dann könntest du auf "END_OF_TIME = space" abfragen.

Re: LOOP "in kurz"?

Beitrag von a-dead-trousers (Top Expert / 4414 / 224 / 1186 ) »
ralf.wenzel hat geschrieben:
29.03.2022 13:04
Das Problem ist: Ich hab das nicht x-mal mit derselben Tabelle, sondern ähnliche Aufrufe bezogen auf unterschiedliche Tabellen, womit insbesondere die Feldnamen "bla" etc. unterschiedlich sind. Mal sind es mehr, mal sind es weniger, mal mit AND mal mit AND und OR -- einig ist nur: Es ist ein NE drin, das ein READ verhindert.

Man müsste es also schon deutlich abstrakter machen, damit es einen Gewinn bringt.
Hab ich auch schon lang und breit darüber nachgedacht und ist mir bislang nichts wirklich brauchbares eingefallen. Vorallem wenn man das Coding später mal wiederfinden möchte (wo hab ich überall Zugriffe auf die Tabelle X oder das Feld Y) ist ein generischer/abstrakter Ansatz (ASSIGN COMPONENT und Co.) der falsche Weg. Und dann sollen es später mal auch noch die (älteren) Kollegen verstehen 😉

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
ralf.wenzel

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: LOOP "in kurz"?

Beitrag von ralf.wenzel (Top Expert / 3946 / 201 / 281 ) »
ewx hat geschrieben:
29.03.2022 13:12
Es wird dadurch jedoch kaum lesbarer. du hast nur drei Zeilen weniger Coding. Das, was wirklich schwer lesbar ist, ist die Abfrage und die kannst du nicht "wegkürzen".
Das bestreite ich. Natürlich ist

Code: Alles auswählen.

IF LINE_EXISTS( itab[ .... ] ). ENDIF.
viel eingängiger und schneller zu verstehen als

Code: Alles auswählen.

READ TABLE ITAB ... 
TRANSPORTING NO FIELDS.... 
WITH KEY....
IF SY-SUBRC EQ 0.
.... 
ENDIF.
Schon weil ich auf den ersten Blick sehe: Der will wissen ob die Zeile existiert. Einen READ kann man aus 1.000 Gründen machen und nur aus dem Kontext erschließt sich, was er eigentlich will. Gerade wenn ich mehrere Tabellen habe und dort die Existenz prüfe, kann ich das in einem IF ... AND ... ENDIF abfackeln statt mehrerer solcher mehrzeiligen Krücken zu bauen und in Hilfsvariablen festzuhalten, ob der Satz da ist oder nicht, um dann am Schluss doch IF erg_abfr_a eq ABAP_TRUE and erg_abfr_b eq ABAP_TRUE....ENDIF zu fragen.

Das hab ich schon gehasst, als es 7.40 noch gar nicht gab. 7.40 war für mich wie Weihnachten und Ostern an einem Tag.


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

Re: LOOP "in kurz"?

Beitrag von black_adept (Top Expert / 4103 / 128 / 945 ) »
ralf.wenzel hat geschrieben:
29.03.2022 11:10
Einen READ kann ich schon aufgrund des NE nicht machen. Muss ich das so lassen oder gibt es eine eingänglichere Form, die lesbarer ist?
Wenn du auf einem hinreichend modernen System bist könntest du stattdessen ein SELECT SINLGE auf die itab machen. ABER! SAP bevorzugt bei SELECT SINLGE ohne vollständigen Schlüssel auch die Alternative SELECT...UP TO 1 ROWS. ENDSELECT.
Letztlich bleibst du im Endeffekt bei deinem LOOP at ... (komplexe bedingung). EXIT.
ralf.wenzel hat geschrieben:
29.03.2022 13:55
Das bestreite ich. Natürlich ist

Code: Alles auswählen.

IF LINE_EXISTS( itab[ .... ] ). ENDIF.
viel eingängiger und schneller zu verstehen als

Code: Alles auswählen.

READ TABLE ITAB ... 
TRANSPORTING NO FIELDS.... 
WITH KEY....
IF SY-SUBRC EQ 0.
.... 
ENDIF.
Wenn du das LOOP AT... EXIT. so unleserlich findest: Es gibt Gerüchte, die behaupten, dass Kommentare helfen könnten zu erklären, was in den nächsten Codezeilen passieren soll.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: LOOP "in kurz"?

Beitrag von ralf.wenzel (Top Expert / 3946 / 201 / 281 ) »
black_adept hat geschrieben:
29.03.2022 16:31
Wenn du das LOOP AT... EXIT. so unleserlich findest: Es gibt Gerüchte, die behaupten, dass Kommentare helfen könnten zu erklären, was in den nächsten Codezeilen passieren soll.
Das schreibst du dem, der jedem Entwickler erzählt, bis ihm die Ohren bluten: Wenn du einen Kommentar brauchst, ist dein Coding zu schlecht ;) Kommentare sind sprachenabhängig und müssen mit-gewartet werden.

Für 0.1% der Fälle gilt das nur, weil man das Coding nicht besser machen KANN -- und das scheint so einer zu sein. Ich wollte halt vermeiden, dass ich etwas übersehe. Dann frag ich lieber hier - mir ist lieber, HIER schreibt einer "Ralf, da gibts doch was viel Einfacheres" als wenn der Kunde das macht ;)


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

Re: LOOP "in kurz"?

Beitrag von black_adept (Top Expert / 4103 / 128 / 945 ) »
ralf.wenzel hat geschrieben:
29.03.2022 16:38
Das schreibst du dem, der jedem Entwickler erzählt, bis ihm die Ohren bluten: Wenn du einen Kommentar brauchst, ist dein Coding zu schlecht ;) Kommentare sind sprachenabhängig und müssen mit-gewartet werden.
So eine Aussage sollte in einem Bewerbungsgespräch ein Ausschlusskriterium sein.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
Murdock

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Vergleichbare Themen

1
Antw.
1618
Views
2
Antw.
6693
Views
Kommandozeile im Sapscript zu kurz
von willi100 » 14.10.2011 09:02 • Verfasst in ABAP® Core
1
Antw.
2432
Views
ALV Grid Feldbezeichner statt kurz, lang anzeigen lassen
von Gast » 18.08.2005 16:54 • Verfasst in ABAP® Core
4
Antw.
3867
Views
LOOP in einem LOOP
von Bjuti » 10.09.2013 15:18 • Verfasst in ABAP® für Anfänger
39
Antw.
8070
Views
Loop
von Kai999 » 27.07.2017 16:15 • Verfasst in ABAP® für Anfänger

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.