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.
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 ).
Code: Alles auswählen.
READ TABLE ITAB ...
TRANSPORTING NO FIELDS....
WITH KEY....
IF SY-SUBRC EQ 0.
....
ENDIF.
Code: Alles auswählen.
IF LINE_EXISTS( itab[ .... ]. ENDIF.
Damit man ihn mehrfach verwenden kann.ralf.wenzel hat geschrieben: ↑29.03.2022 12:38Ich bin dankbar für deinen Tipp, aber im Grunde genommen kapsele ich den schwer lesbaren LOOP ja nur in eine Klasse weg.
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-trousers • Haubi • Icke0801
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.ewx hat geschrieben: ↑29.03.2022 12:54Wenn 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).
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.a-dead-trousers hat geschrieben: ↑29.03.2022 12:52Damit man ihn mehrfach verwenden kann.ralf.wenzel hat geschrieben: ↑29.03.2022 12:38Ich bin dankbar für deinen Tipp, aber im Grunde genommen kapsele ich den schwer lesbaren LOOP ja nur in eine Klasse weg.
Folgende Benutzer bedankten sich beim Autor ralf.wenzel für den Beitrag:
a-dead-trousers
Ein READ ist auch komplex und kann per entsprechender Schreibweise deutlich vereinfach werden ;)
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 😉ralf.wenzel hat geschrieben: ↑29.03.2022 13:04Das 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.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
ralf.wenzel
Das bestreite ich. Natürlich ist
Code: Alles auswählen.
IF LINE_EXISTS( itab[ .... ] ). ENDIF.
Code: Alles auswählen.
READ TABLE ITAB ...
TRANSPORTING NO FIELDS....
WITH KEY....
IF SY-SUBRC EQ 0.
....
ENDIF.
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.ralf.wenzel hat geschrieben: ↑29.03.2022 11:10Einen 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 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.ralf.wenzel hat geschrieben: ↑29.03.2022 13:55Das bestreite ich. Natürlich istviel eingängiger und schneller zu verstehen alsCode: Alles auswählen.
IF LINE_EXISTS( itab[ .... ] ). ENDIF.
Code: Alles auswählen.
READ TABLE ITAB ... TRANSPORTING NO FIELDS.... WITH KEY.... IF SY-SUBRC EQ 0. .... ENDIF.
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.black_adept hat geschrieben: ↑29.03.2022 16:31Wenn 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.
So eine Aussage sollte in einem Bewerbungsgespräch ein Ausschlusskriterium sein.ralf.wenzel hat geschrieben: ↑29.03.2022 16:38Das 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.
Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
Murdock