Dyn. Tabellen: Wie sucht man auf Ungleichheit?

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

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 / 1795 / 213 / 396 ) »
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?

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


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

Beitrag von Daniel (Specialist / 314 / 68 / 44 ) »
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 / 4784 / 294 / 628 ) »
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 / 314 / 68 / 44 ) »
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 / 1795 / 213 / 396 ) »
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 / 3943 / 105 / 886 ) »
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 / 1795 / 213 / 396 ) »
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 / 3943 / 105 / 886 ) »
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 ) »
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 / 1795 / 213 / 396 ) »
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 / 3943 / 105 / 886 ) »
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 / 1795 / 213 / 396 ) »
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 / 3943 / 105 / 886 ) »
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 / 1795 / 213 / 396 ) »
Doku war halt noch nie die starke Seite von SAP... :-D

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

Beitrag von RIG (Specialist / 110 / 30 / 1 ) »
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:
06.11.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

Vergleichbare Themen

5
Antw.
1418
Views
SAP Anfänger sucht Hilfe
von tim82 » 30.11.2004 00:21 • Verfasst in ABAP® Core
0
Antw.
1781
Views
Syntaxfehler, bei denen man jedes mal erneut sucht...
von ewx » 24.06.2010 09:35 • Verfasst in SAP - Allgemeines
6
Antw.
994
Views
Suchhilfe ein Feld sucht in zwei Datenbankfeldern
von PeterF » 18.07.2020 12:31 • Verfasst in ABAP® für Anfänger
3
Antw.
410
Views
8
Antw.
15785
Views
Customizing-Tabellen vs. Anwendungs-Tabellen
von beterman » 02.11.2011 17:53 • Verfasst in SAP - Allgemeines

Ü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

Zugriff auf Daten via Webdav
vor 34 Minuten von msfox 2 / 34
Interne Tabelle
vor 17 Stunden von sap_enthusiast 3 / 163
Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71

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

Zugriff auf Daten via Webdav
vor 34 Minuten von msfox 2 / 34
Interne Tabelle
vor 17 Stunden von sap_enthusiast 3 / 163
Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 111
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 141