Dyn. Tabellen: Wie sucht man auf Ungleichheit? Thema ist als GELÖST markiert

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

Dyn. Tabellen: Wie sucht man auf Ungleichheit?

Beitrag von DeathAndPain (Top Expert / 1070 / 123 / 234 ) » 3. Nov 2017 14:14

Hallo zusammen,

folgender Fall: Ich habe eine interne Tabelle, deren Name nicht statisch bekannt ist, sondern im Feld TABELLENNAME verborgen ist. Über:

Code: Alles auswählen.

FIELD-SYMBOLS <t> type sorted table.

assign (TABELLENNAME) to <t>.
habe ich die Tabelle als <t> ansprechbar gemacht.

Jetzt will ich in dieser Tabelle (unter Nutzung ihres Sortierschlüssels) nach allen Zeilen suchen, bei denen PERNR > '00000008' ist. Wie stelle ich das an? Ich kann ja in LOOP AT oder READ TABLE nicht die Spalte PERNR statisch angeben, da die Tabelle <t> nicht statisch definiert ist und die Spalte demzufolge statisch auch nicht bekannt ist.

o LOOP AT akzeptiert in seiner WHERE-Clause keine dynamische Angabe von der Form ('PERNR') > '00000008'
o READ TABLE akzeptiert eine dynamische Syntax, ist seinerseits aber auf Prüfung auf Gleichheit beschränkt. Dasselbe gilt für die alternative 7.40-Syntax.

Was kann ich tun?


Re: Dyn. Tabellen: Wie sucht man auf Ungleichheit?

Beitrag von Daniel (Specialist / 313 / 67 / 43 ) » 3. Nov 2017 14:23

Mit READ TABLE und PERNR = 00000008.
Der READ stellt den SY-TABIX auf den nächst größeren Eintrag wenn nichts
gefunden wurde.
Dann mit LOOP AT <f> FROM sy-tabix weiterlesen.
im Loop noch einen Check PERNR > 00000008.
Das verarbeitet nur Einträge mit 00000008 unnötigerweise.

Re: Dyn. Tabellen: Wie sucht man auf Ungleichheit?

Beitrag von ewx (Top Expert / 4002 / 166 / 378 ) » 3. Nov 2017 17:33

DeathAndPain hat geschrieben: o LOOP AT akzeptiert in seiner WHERE-Clause keine dynamische Angabe von der Form ('PERNR') > '00000008'
Das stimmt.
Du kannst allerdings die komplette WHERE-BEdingung dynamisieren ab 7.51:
https://help.sap.com/doc/abapdocu_751_i ... DITION_4@4@
DeathAndPain hat geschrieben: o READ TABLE akzeptiert eine dynamische Syntax, ist seinerseits aber auf Prüfung auf Gleichheit beschränkt. Dasselbe gilt für die alternative 7.40-Syntax.
So toll dynamische und generelle Programmierung auch ist: Das sind genau die Grenzen. Es bleibt dir bei einem Release < 7.51 nichts weiter übrig, als im LOOP das Feld per ASSIGN einem Feldsymbol zuzuweisen und jeden Tabelleneintrag einzeln abzufragen.
Eine andere wohl auch nicht performante Methode wäre, die itab in eine gleichartige temporäre Tabelle zu kopieren und mit DELETE itab_temp WHERE (dyn_where) die Daten zu löschen, die du nicht benötigst.
https://help.sap.com/doc/abapdocu_751_i ... e_itab.htm
Bin mir aber nicht sicher, ob das evtl. auch erst ab 7.51 möglich ist.

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


Re: Dyn. Tabellen: Wie sucht man auf Ungleichheit?

Beitrag von Daniel (Specialist / 313 / 67 / 43 ) » 3. Nov 2017 17:39

ewx hat geschrieben: Es bleibt dir bei einem Release < 7.51 nichts weiter übrig, als im LOOP das Feld per ASSIGN einem Feldsymbol zuzuweisen und jeden Tabelleneintrag einzeln abzufragen.
Doch. die Alternative ist der teilsequentielle Loop
wie ich Ihn oben beschrieben habe.
Bei kleinen Tabelle ist das egal, bei großen sehr deutlich
spürbar (wobei jetzt noch die Ausstiegs-Bedingung fehlt).

Re: Dyn. Tabellen: Wie sucht man auf Ungleichheit?

Beitrag von DeathAndPain (Top Expert / 1070 / 123 / 234 ) » 6. Nov 2017 11:47

Ja, so bin ich dann auch rangegangen, vielen Dank. (Ich habe einen WHILE statt eines LOOPs verwendet, aber bin im Endeffekt Deinem Ansatz gefolgt, per READ TABLE den Index des ersten Eintrags der Ungleichheit zu ermitteln und dann über den WHILE am Ende meines Suchbereiches wieder auszusteigen.) Aber ärgerlich ist es schon, dass die SAP lauter neue Befehle mit zum Teil recht zweifelhaftem Nutzen (FOR...) einführt, aber Trivialitäten wie die Möglichkeit einer dynamischen WHERE-Angabe beim LOOP nicht zulässt. Na ja, mit 7.51 scheint sie ja zu kommen, vielen Dank an ewx. Leider sind wir noch auf 7.50.

So bin ich ja sogar gezwungen, den alten READ TABLE... TRANSPORTING NO FIELDS anstelle der schicken neuen 7.40-Syntax zu nutzen, da mir letztere den SY-TABIX nicht setzt.

Immerhin funktioniert es, und ich kann die maximale Schlüsseloptimierung so nutzen, wenn auch mit mehr Codingaufwand (was wegen des Mehrs an auszuführenden Befehlen auch ein bisschen die Performance drückt).
die Alternative ist der teilsequentielle Loop
"teilsequentiell" würde ich es noch nicht mal nennen, da ich die Schleife ja auf genau die Zeilen reduziere, die ich auch bekommen würde, wenn LOOP AT ... WHERE (column) > wert funktionieren würde. Die Suchoptimierung als solche ist also im Rahmen dessen, was der Index hergibt, vollständig.

Re: Dyn. Tabellen: Wie sucht man auf Ungleichheit?

Beitrag von black_adept (Top Expert / 3261 / 54 / 577 ) » 6. Nov 2017 12:56

ewx hat geschrieben:Du kannst allerdings die komplette WHERE-BEdingung dynamisieren ab 7.51:
https://help.sap.com/doc/abapdocu_751_i ... DITION_4@4@
DeathAndPain hat geschrieben: o READ TABLE akzeptiert eine dynamische Syntax, ist seinerseits aber auf Prüfung auf Gleichheit beschränkt. Dasselbe gilt für die alternative 7.40-Syntax.
So toll dynamische und generelle Programmierung auch ist: Das sind genau die Grenzen. Es bleibt dir bei einem Release < 7.51 nichts weiter übrig, als im LOOP das Feld per ASSIGN einem Feldsymbol zuzuweisen und jeden Tabelleneintrag einzeln abzufragen.
Die WHERE-Bedingung kann man schon viel länger dynamisieren ( mindestens 7.40 - wahrscheinlich auch schon früher ). Das Problem in diesem speziellen Fall ist, dass die Tabelle über die der LOOP geht während des Compilens nicht statisch bekannt ist. Habe allerdings in diesem Moment kein 7.51er System unter den Fingern, so dass ich nicht prüfen kann, ob die Fehlermeldung "Bei "... WHERE ..." muss der Zeilentyp der Tabelle statisch bekannt sein." dort nicht mehr erscheint sondern SAP tatsächlich die Sprache erweitert hat ohne einen Buchstaben an der Doku zu ändern.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Dyn. Tabellen: Wie sucht man auf Ungleichheit?

Beitrag von DeathAndPain (Top Expert / 1070 / 123 / 234 ) » 6. Nov 2017 14:53

Die WHERE-Bedingung kann man schon viel länger dynamisieren ( mindestens 7.40 - wahrscheinlich auch schon früher ). Das Problem in diesem speziellen Fall ist, dass die Tabelle über die der LOOP geht während des Compilens nicht statisch bekannt ist.
Irgendwie widersprichst Du Dir hier gerade selber. Dynamisierbarkeit bedeutet doch gerade, dass keine statische Angabe erforderlich ist.

Re: Dyn. Tabellen: Wie sucht man auf Ungleichheit?

Beitrag von black_adept (Top Expert / 3261 / 54 / 577 ) » 6. Nov 2017 15:42

DeathAndPain hat geschrieben:
Die WHERE-Bedingung kann man schon viel länger dynamisieren ( mindestens 7.40 - wahrscheinlich auch schon früher ). Das Problem in diesem speziellen Fall ist, dass die Tabelle über die der LOOP geht während des Compilens nicht statisch bekannt ist.
Irgendwie widersprichst Du Dir hier gerade selber. Dynamisierbarkeit bedeutet doch gerade, dass keine statische Angabe erforderlich ist.
Dynamierbarkeit der WHERE-Bedingung <> Dynamisierbarkeit aller Teile des LOOP-Befehls.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Dyn. Tabellen: Wie sucht man auf Ungleichheit?

Beitrag von Dele (Specialist / 307 / 4 / 47 ) » 6. Nov 2017 15:52

Du kannst allerdings die komplette WHERE-BEdingung dynamisieren ab 7.51:
Geht ab 7.02. Hab's gerade getestet.

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


Re: Dyn. Tabellen: Wie sucht man auf Ungleichheit?

Beitrag von DeathAndPain (Top Expert / 1070 / 123 / 234 ) » 7. Nov 2017 11:36

Na, ist doch super, das ist doch die ganze Miete, vielen Dank!
black_adept hat geschrieben:Dynamierbarkeit der WHERE-Bedingung <> Dynamisierbarkeit aller Teile des LOOP-Befehls.
Gut, aber das ist wenig relevant, denn die gesamte Bedingung in einen String zu packen, werde ich hinbekommen.

Re: Dyn. Tabellen: Wie sucht man auf Ungleichheit?

Beitrag von black_adept (Top Expert / 3261 / 54 / 577 ) » 7. Nov 2017 12:48

Das wird dir nix nützen, da du über ein nicht typisiertes Feldsymbol loopst und SAP da halt keine WHERE-Bedingungen akzeptiert - auch keine dynamischen.
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Dyn. Tabellen: Wie sucht man auf Ungleichheit?

Beitrag von DeathAndPain (Top Expert / 1070 / 123 / 234 ) » 9. Nov 2017 13:43

Wenn das stimmen würde, würde mein Code nicht funktionieren. :wink:

Die Typisierung TYPE SORTED TABLE des Feldsymbols reicht wunderbar aus. Das sieht dann so aus:

Code: Alles auswählen.

      FIELD-SYMBOLS <BUFFER_TABLE>   TYPE SORTED TABLE.
      DATA WHERE_BEDINGUNG_FUER_LOOP TYPE STRING.

      BUFFER_TABLENAME = 'GT_BUFFER_IT' && IS_CUST-INFTY.
      ASSIGN (BUFFER_TABLENAME) TO <BUFFER_TABLE>.

      WHERE_BEDINGUNG_FUER_LOOP = `PERNR = '` && IV_PERSNR && `' `     " Der LOOP findet auf der Tabelle GT_BUFFER_ITxxxx statt. Alle diese
                           && `AND SUBTY = '` && IS_CUST-SUBTY && `' ` " Tabellen sind nach PERNR SUBTY BEGDA sortiert.
                           && `AND BEGDA <= '` && IV_DATE && `' `
                           && `AND ENDDA >= '` && IV_DATE && `'`.

      LOOP AT <BUFFER_TABLE> ASSIGNING <LINE_OF_BUFFER_TABLE> WHERE (WHERE_BEDINGUNG_FUER_LOOP).
        " do stuff
      ENDLOOP.
Läuft perfekt. :-)

Re: Dyn. Tabellen: Wie sucht man auf Ungleichheit?

Beitrag von black_adept (Top Expert / 3261 / 54 / 577 ) » 9. Nov 2017 19:59

Das ist doch schön - und zeigt, dass SAP tatsächlich die Sprache erweitert hat, denn das was du da postest ging unter früheren Releases nicht. Und an der Doku hat sich keine Silbe geändert....
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Dyn. Tabellen: Wie sucht man auf Ungleichheit?

Beitrag von DeathAndPain (Top Expert / 1070 / 123 / 234 ) » 10. Nov 2017 12:59

Doku war halt noch nie die starke Seite von SAP... :-D

Re: Dyn. Tabellen: Wie sucht man auf Ungleichheit?

Beitrag von RIG (ForumUser / 91 / 24 / 0 ) » 13. Aug 2019 16:39

Sorry wenn ich den Thread nochmal aufwärme, aber ich habe gerade die Herausforderung an einem älteren Release eine Dynamische Programmierung umzusetzen.
black_adept hat geschrieben:
6. Nov 2017 12:56
"Bei "... WHERE ..." muss der Zeilentyp der Tabelle statisch bekannt sein."
Stoße dabei genau auf diesen Fehler und Frage mich ob es dafür einen Workaround für alte Releases gibt?

Viele Dank und viele Grüße

Seite 1 von 2 (current) Nächste

Aktuelle Forenbeiträge

HTTP Request
vor 22 Stunden von a-dead-trousers 4 / 70
Verfügbarkeitsprüfung
Gestern von deejey 2 / 56
Verwaltung
Gestern von deejey 2 / 48
BSP-Seiten als Service - Problem bei HTTP-Request
vor 2 Tagen von Xilukarim 1 / 49

Unbeantwortete Forenbeiträge

BSP-Seiten als Service - Problem bei HTTP-Request
vor 2 Tagen von Xilukarim 1 / 49
CCS Bonusabrechnung
vor 2 Tagen von SAP_ENTWICKLER 1 / 31
At Selection-Screen
vor 3 Tagen von L0w-RiDer 1 / 49
SP01 Verweildauer
vor einer Woche von SAP_ENTWICKLER 1 / 102
Transaktion OMT3B Subscreens in Dynpros einhängen
vor einer Woche von SAP_ENTWICKLER 1 / 69