READ TABLE ... WITH KEY [logische Verknüpfung mögl?]

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

Re: READ TABLE ... WITH KEY [logische Verknüpfung mögl?]

Beitrag von Dele (Specialist / 307 / 4 / 47 ) »
In der Hoffnung nicht irgendetwas überlesen zu haben, würde ich Folgendes vorschlagen:

Code: Alles auswählen.

LOOP AT quelle ASSIGNING <quell_felder>.
  Loop at itab INTO wa
         WITH KEY comp1 = '20' OR comp1 = '21'...
         ....
         .... 
  endloop.
...
...
endloop.
Anmerkungen:
- Ich vermute mal, dass außer comp1 noch weitere Suchkriterien für itab benötigt werden
- Man könnte die erlaubten Werte für comp1 ggf. auch in eine range-tabelle füllen und dann z.B. "in r_comp1" abfragen
- Wenn itab nur wenige Einträge hat, geht das o.g. Coding
- Wenn itab viele Enträge haben kann, dann sollte sie nach dem Suchkriterium sortiert sein; ggf. sekundär-index definieren

Folgende Benutzer bedankten sich beim Autor Dele für den Beitrag:
sapjob


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


Re: READ TABLE ... WITH KEY [logische Verknüpfung mögl?]

Beitrag von sapjob (ForumUser / 12 / 5 / 0 ) »
@Dele:
Sieht gut aus, zur Sicherheit noch mal die Frage:
- Der 2. Loop schmeißt jeweils genau den Datensatz in die wa, der die Suchschlüssel-Bedingung erfüllt, oder?
- Mit welchem Befehl kann ich dann innerhalb des inneren Loops den äußeren Durchlauf abbrechen und mit dem nächsten äußeren Datensatz (von quelle) fortsetzen? Hätte ich nur den äußeren Loop, würde das ja per CONTINUE gehen.
- Habe Zweifel bzgl. der Laufzeit, da die Quelldatengröße doch erheblich ist. Was effizienteres geht aber wohl nicht oder?

Re: READ TABLE ... WITH KEY [logische Verknüpfung mögl?]

Beitrag von Haubi (Expert / 625 / 20 / 30 ) »
sapjob hat geschrieben:@Dele:
Sieht gut aus, zur Sicherheit noch mal die Frage:
- Der 2. Loop schmeißt jeweils genau den Datensatz in die wa, der die Suchschlüssel-Bedingung erfüllt, oder?
- Mit welchem Befehl kann ich dann innerhalb des inneren Loops den äußeren Durchlauf abbrechen und mit dem nächsten äußeren Datensatz (von quelle) fortsetzen? Hätte ich nur den äußeren Loop, würde das ja per CONTINUE gehen.
- Habe Zweifel bzgl. der Laufzeit, da die Quelldatengröße doch erheblich ist. Was effizienteres geht aber wohl nicht oder?
Zu 1: Ja
Zu 2: EXIT.
Zu 3: Die innere Tabelle sollte entweder vom Typ SORTED sein (mit den entsprechenden Schlüsselkomponenten) oder einen entsprechenden Sekundärindex besitzen, den Du dann beim LOOP allerdings explizit angeben musst.

Grüße,
Haubi
Das ABAP Kochbuch ab sofort bei Amazon...

I'd rather write code that writes code than write code...

Re: READ TABLE ... WITH KEY [logische Verknüpfung mögl?]

Beitrag von Dele (Specialist / 307 / 4 / 47 ) »
Der 2. Loop schmeißt jeweils genau den Datensatz in die wa, der die Suchschlüssel-Bedingung erfüllt, oder?
Ich nehme an, dass es ausser comp1 noch weitere Suchbedingungen gibt. Sollte es in itab für die Suchschlüssel-Bedingung mehrere gültige comp1-Einträge geben, dann würde der innere Loop, den letzten Eintrag gemäß der Sortierung von itab liefern, sofern du das nicht programmtechnisch steuerst. In diesem Fall müsste geklärt werden, welcher comp1-Eintrag Verwendung finden soll. Den inneren Loop kann man dann mit "EXIT." beenden.
- Mit welchem Befehl kann ich dann innerhalb des inneren Loops den äußeren Durchlauf abbrechen und mit dem nächsten äußeren Datensatz (von quelle) fortsetzen? Hätte ich nur den äußeren Loop, würde das ja per CONTINUE gehen.
Das geht so nicht. Du musst nach dem inneren Loop entscheiden, wie du weiter vorgehen willst. Ganz sicher ist: wenn die innere Loop-Anweisung keinen Eintrag in itab findet, dann ist SY-SUBRC = 4 - andernfalls ist SY-SUBRC = 0 und wa ist mit etwas gefüllt.

Code: Alles auswählen.

LOOP AT quelle ASSIGNING <quell_felder>.
  "==> flag löschen
  Loop at itab INTO wa
         WITH KEY comp1 = '20' OR comp1 = '21'...
         ....
         "==> wenn mehrere möglich sind, dann entscheiden, ob satz gültig ist und  flag setzen 
         .... 
  endloop.
  if sy-subrc eq 0.   "es wurde ein satz gefunedn und wa ist gefüllt
     if flag = true.
        continue.
     endif.
  else.
       "etwas tun
  endif.
     
...
...
endloop.
Habe Zweifel bzgl. der Laufzeit, da die Quelldatengröße doch erheblich ist. Was effizienteres geht aber wohl nicht oder?
OK, habe gerade bemerkt, dass Haubi auch bereits geantwortet hat. Die größe von ITAB ist hier entscheidender als die Größe von Quelltabelle und wie Haubi bereits gesagt hat, sollte ITAB einen Index gemäß den Suchschlüssel-Bedingungen haben, den du dann im inneren Loop auch verwenden musst. Wenn du nur prüfen willst, ob es einen passenden Eintrag in ITAB gibt, dann "transporting no fields" anstatt "into wa" verwenden.

Re: READ TABLE ... WITH KEY [logische Verknüpfung mögl?]

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
sapjob hat geschrieben:Das Problem ist dann, dass der identische Code doppelt, also jeweils hinter dem Fall für erfolgreiches Laden von COMP1 = 20 und noch mal hinter COMP1 = 21 stehen müsste. Das ist eigentlich auch ne schlechte Lösung oder nicht?
In dem Fall finde ich es okay, weil es 1. nicht viel Code ist und zweitens dadurch einfach zu verstehen.
Und einfach zu dokumentieren:
"Wenn mit "20 - allgemeine Blipsblups" kein Eintrag vorhanden ist...
"Dann kann es sein, dass für "21 - Spezielle xyz" ein Eintrag existiert.

"Schicker", dynamischer und erweiterungsfähiger ist es, wenn du die zu prüfenden Werte in eine Tabelle packst (bzw. customizebar machst):

Code: Alles auswählen.

append '20' to check_comp.
append '21' to check_comp.
" Alternativ:
 select * from zcheck_comp into table check_comp.

loop at check_comp.
  read table --- with key comp = check_comp.
  if sy-subrc = 0.
    found = x.
    exit.
  endif.
endloop.
Nächste Frage: Spielt die Reihenfolge evtl. eine Rolle oder reicht es, wenn irgendein Wert - egal welcher - vorhanden ist?

Re: READ TABLE ... WITH KEY [logische Verknüpfung mögl?]

Beitrag von black_adept (Top Expert / 4099 / 128 / 941 ) »
Hallo sapjob,

wenn du an mehreren Stellen das bisherige Coding durch ein möglichst ähnliches ersetzen möchtest, kombiniere doch die Vorschläge die bisher gemacht wurden und lagere das zugehörige Coding in eine Methode aus, in der dann entweder der LOOP oder dei 2 READs nacheinander stattfinden.

Dann könntest du die Zeile

Code: Alles auswählen.

READ TABLE itab into ls_itab with key comp1 = '20' {or comp1 = '21'}
ersetzen durch wieder eine Zeile

Code: Alles auswählen.

lcl_helper=>read_table_with_or( EXPORTING it_itab = itab EXCEPTIONS fail = 4 ).
und könntest dabei dann sogar eventuell verhandene SY-Subrc-Abfragen im Programm so belassen wie sie momentan sind.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: READ TABLE ... WITH KEY [logische Verknüpfung mögl?]

Beitrag von sapjob (ForumUser / 12 / 5 / 0 ) »
Puh, vielen Dank erst mal allen für die tollen Tips, muss mich durch eure Antworten erst mal durchwühlen und werd mich melden, falls noch was unklar sein sollte...

@ewx: Die erweiterbare Variante sieht super aus. Werds auf die Weise probieren. Würde die int. Tab. check_comp dann wie folgt deklariert werden müssen, wenn sie bel. viele numer.Zeichen der Länge 2 aufnehmen können soll?
DATA: check_comp TYPE TABLE OF n LENGTH 2.

Re: READ TABLE ... WITH KEY [logische Verknüpfung mögl?]

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
sapjob hat geschrieben: @ewx: Die erweiterbare Variante sieht super aus. Werds auf die Weise probieren. Würde die int. Tab. check_comp dann wie folgt deklariert werden müssen, wenn sie bel. viele numer.Zeichen der Länge 2 aufnehmen können soll?
DATA: check_comp TYPE TABLE OF n LENGTH 2.
ich würde eine Struktur definieren:

Code: Alles auswählen.

types: begin of ty_struc,
         comp type n length 2,
       end of ty_struc.
Dann bist du "auf der sicheren Seite" und kannst schnell neue Felder einfügen (Sortierung, Deaktivierung, zweites Schlüsselfeld, ...)

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


Re: READ TABLE ... WITH KEY [logische Verknüpfung mögl?]

Beitrag von sapjob (ForumUser / 12 / 5 / 0 ) »
Alles klar, werds mal angehen. Besten Dank und Mahlzeit erstmal :)

Re: READ TABLE ... WITH KEY [logische Verknüpfung mögl?]

Beitrag von sapjob (ForumUser / 12 / 5 / 0 ) »
ewx hat geschrieben:
sapjob hat geschrieben: @ewx: Die erweiterbare Variante sieht super aus. Werds auf die Weise probieren. Würde die int. Tab. check_comp dann wie folgt deklariert werden müssen, wenn sie bel. viele numer.Zeichen der Länge 2 aufnehmen können soll?
DATA: check_comp TYPE TABLE OF n LENGTH 2.
ich würde eine Struktur definieren:

Code: Alles auswählen.

types: begin of ty_struc,
         comp type n length 2,
       end of ty_struc.
Dann bist du "auf der sicheren Seite" und kannst schnell neue Felder einfügen (Sortierung, Deaktivierung, zweites Schlüsselfeld, ...)
Dann bräuchte ich aber dennoch eine itab mit Zeilenstruktur der oben definierten Struktur, um über die itab iterieren zu können, oder? Also: DATA: t_comp TYPE TABLE OF ty_struc. Korrekt?

Re: READ TABLE ... WITH KEY [logische Verknüpfung mögl?]

Beitrag von ewx (Top Expert / 4849 / 313 / 642 ) »
Korrekt!

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


Re: READ TABLE ... WITH KEY [logische Verknüpfung mögl?]

Beitrag von sapjob (ForumUser / 12 / 5 / 0 ) »
Super :)

Also der komplette Teil für die Abfrage wäre dann:

Code: Alles auswählen.

TYPES: BEGIN OF ty_s_xyz,
        comp TYPE n LENGTH 2,
       END OF ty_s_xyz.

DATA: t_xyz TYPE TABLE OF ty_s_xyz.
    
APPEND '20' TO t_xyz.
APPEND '21' TO t_xyz.

LOOP AT t_xyz INTO wa_xyz.
  LOOP AT quelle ASSIGNING <quellfelder>.
     READ TABLE itab WITH KEY <quellfelder>-comp = wa_xyz-comp.
     if sy-subrc = 0.
       found = x.
       exit.
     endif.
  endloop.
endloop.        
Wäre alternativ auch möglich und für feste 2 Werte (20 und 21) vllt sogar simpler:

Code: Alles auswählen.

LOOP AT quelle ASSIGNING <quellfelder>.
   READ TABLE itab INTO wa WITH KEY <quellfelder>-comp = '20'.
   IF sy-subrc <> 0.
       READ TABLE itab INTO wa WITH KEY <quellfelder>-comp = '21'.
       IF sy-subrc <> 0.
          CONTINUE.
       ENDIF.
   ENDIF.
   found = x.  //Dieser Code wird (wie beabsichtigt) ausgeführt, wenn der Datensatz <quellfelder> eine Komponente comp == '20' oder '21' hat, richtig?
ENDLOOP.
Vllt. noch eine Randfrage, damit ich in Zukunft solche Basics außerhalb von großen bestehenden Codes testen kann: Wie erstelle ich schnell ein Testprogramm, dass selbständig lauffähig ist?

Danke nochmals!

Re: READ TABLE ... WITH KEY [logische Verknüpfung mögl?]

Beitrag von black_adept (Top Expert / 4099 / 128 / 941 ) »
sapjob hat geschrieben:Vllt. noch eine Randfrage, damit ich in Zukunft solche Basics außerhalb von großen bestehenden Codes testen kann: Wie erstelle ich schnell ein Testprogramm, dass selbständig lauffähig ist?

Danke nochmals!
SE38
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: READ TABLE ... WITH KEY [logische Verknüpfung mögl?]

Beitrag von black_adept (Top Expert / 4099 / 128 / 941 ) »
ralf.wenzel hat geschrieben:...
TRY.
wa = VALUE #( itab[ comp = '20' ] ).
CATCH cx_sy_itab_line_not_found.
TRY.
wa = VALUE #( itab[ comp = '21' ] ).
CATCH cx_sy_itab_line_not_found.
*** Weitere Alternativen nach gleichen Muster
*** bzw. kein Satz gefunden nach der letzten Alternative
ENDTRY.
ENDTRY.
@Ralf: Da du ja ein großer Fan der neuen 7.4er Syntax bist, hier für dich die "vereinfachte" Version, die mit nur einem TRY-CATCH auskommt und quasi die "OR"-Bedingung mittels Table-Expression hergibt.
TRY.
wa = VALUE #( itab[ comp = '20' ] DEFAULT itab[ comp = '21' ] ).
CATCH cx_sy_itab_line_not_found.
ENDTRY.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: READ TABLE ... WITH KEY [logische Verknüpfung mögl?]

Beitrag von ralf.wenzel (Top Expert / 3935 / 200 / 281 ) »
Richtig, ich stehe auf das 7.40-Coding, weil es dem "pro Gedankengang einen Befehl" sehr nahekommt und das frühere Gehampel mit Hilfsvariablen ein Ende nimmt. Allerdings führt das dazu, dass Menschen, die das nicht gewohnt sind, davor sitzen als sei es eine komplett andere Programmiersprache (ich übe ja selbst noch ;) ).

Aber sowas ist extrem verlockend, wenn man mit VALUE, FOR und CORRESPONDING im Nu Selektionsrange-Tabellen aufbauen kann oder SHIFT_LEFT/RIGHT an funktionalen Operandenpositionen einsetzen kann. Das Coding wird einfach nicht mehr so zerschnitten und deutlich kompakter.

Den Tip muss ich mal auseinandernehmen.

Edit: Dafür muss ich aber noch ein Vierteljahr warten, wir haben noch kein SP08, sondern eiern immer noch auf SP05 rum ;)
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Vergleichbare Themen

4
Antw.
3196
Views
Read mit OR Verknüpfung?
von fcmfanswr » 18.11.2010 09:24 • Verfasst in ABAP® Core
3
Antw.
3008
Views
read table
von kostonstyle » 27.03.2008 15:38 • Verfasst in ABAP® für Anfänger
5
Antw.
18966
Views
read table liefert sy-subrc = 4
von c oco » 04.04.2011 17:09 • Verfasst in ABAP® für Anfänger
8
Antw.
9430
Views
Read Table mit MAX Datum und Zeit
von autohandel7 » 23.08.2018 10:54 • Verfasst in ABAP® für Anfänger
2
Antw.
3532
Views
READ TABLE dynamisch aufrufen
von RiffRaff » 27.12.2004 12:04 • Verfasst in ABAP® Core

Aktuelle Forenbeiträge

Daten an Tabelle binden
vor 10 Stunden von Bright4.5 3 / 1485
Regex in where
vor 11 Stunden von tar 6 / 157

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

Daten an Tabelle binden
vor 10 Stunden von Bright4.5 3 / 1485
Regex in where
vor 11 Stunden von tar 6 / 157

Unbeantwortete Forenbeiträge

aRFC im OO-Kontext
vor 5 Wochen von ralf.wenzel 1 / 3261
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9821