gelöst Dyn. Tabellen: Wie sucht man auf Ungleichheit?


Getting started ... Alles für einen gelungenen Start.

Moderatoren: Jan, Steff

gelöst Dyn. Tabellen: Wie sucht man auf Ungleichheit?

Beitragvon DeathAndPain » 03.11.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?
DeathAndPain
Specialist
 
Beiträge: 266
Registriert: 05.05.2006, 10:14
Dank erhalten: 65 mal
Ich bin: Entwickler/in

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

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

Beitragvon Daniel » 03.11.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.
Daniel
Specialist
 
Beiträge: 189
Registriert: 10.09.2003, 13:20
Wohnort: Bielefeld
Dank erhalten: 14 mal

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

Beitragvon ewx » 03.11.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 ... ITION_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.

Für diese Nachricht hat ewx einen Dank bekommen :
DeathAndPain
ewx
Top Expert
 
Beiträge: 3415
Registriert: 04.08.2003, 19:55
Wohnort: Schleswig-Holstein
Dank erhalten: 207 mal

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

Beitragvon Daniel » 03.11.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).
Daniel
Specialist
 
Beiträge: 189
Registriert: 10.09.2003, 13:20
Wohnort: Bielefeld
Dank erhalten: 14 mal

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

Beitragvon DeathAndPain » 06.11.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.
DeathAndPain
Specialist
 
Beiträge: 266
Registriert: 05.05.2006, 10:14
Dank erhalten: 65 mal
Ich bin: Entwickler/in

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

Beitragvon black_adept » 06.11.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 ... ITION_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
black_adept
Top Expert
 
Beiträge: 2710
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 388 mal
Ich bin: Freiberufler/in

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

Beitragvon DeathAndPain » 06.11.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.
DeathAndPain
Specialist
 
Beiträge: 266
Registriert: 05.05.2006, 10:14
Dank erhalten: 65 mal
Ich bin: Entwickler/in

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

Beitragvon black_adept » 06.11.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
black_adept
Top Expert
 
Beiträge: 2710
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 388 mal
Ich bin: Freiberufler/in

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

Beitragvon Dele » 06.11.2017, 15:52

Du kannst allerdings die komplette WHERE-BEdingung dynamisieren ab 7.51:

Geht ab 7.02. Hab's gerade getestet.

Für diese Nachricht hat Dele einen Dank bekommen :
DeathAndPain
Dele
Specialist
 
Beiträge: 277
Registriert: 06.05.2005, 11:07
Dank erhalten: 39 mal

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

Beitragvon DeathAndPain » 07.11.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.
DeathAndPain
Specialist
 
Beiträge: 266
Registriert: 05.05.2006, 10:14
Dank erhalten: 65 mal
Ich bin: Entwickler/in

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

Beitragvon black_adept » 07.11.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
black_adept
Top Expert
 
Beiträge: 2710
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 388 mal
Ich bin: Freiberufler/in

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

Beitragvon DeathAndPain » 09.11.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' &amp;&amp; IS_CUST-INFTY.
      ASSIGN (BUFFER_TABLENAME) TO <BUFFER_TABLE>.

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

      LOOP AT <BUFFER_TABLE> ASSIGNING <LINE_OF_BUFFER_TABLE> WHERE (WHERE_BEDINGUNG_FUER_LOOP).
        " do stuff
      ENDLOOP.

Läuft perfekt. :-)
DeathAndPain
Specialist
 
Beiträge: 266
Registriert: 05.05.2006, 10:14
Dank erhalten: 65 mal
Ich bin: Entwickler/in

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

Beitragvon black_adept » 09.11.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
black_adept
Top Expert
 
Beiträge: 2710
Registriert: 08.01.2003, 13:33
Wohnort: Lehrte ( bei Hannover )
Dank erhalten: 388 mal
Ich bin: Freiberufler/in

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

Beitragvon DeathAndPain » 10.11.2017, 12:59

Doku war halt noch nie die starke Seite von SAP... :-D
DeathAndPain
Specialist
 
Beiträge: 266
Registriert: 05.05.2006, 10:14
Dank erhalten: 65 mal
Ich bin: Entwickler/in


Zurück zu ABAP® für Anfänger

  Aktuelle Beiträge   
gelöst Protokoll vergangener RFC Aufrufe
vor 16 Stunden von Dele 3 Antw.
BREAK-POINT-IDs verwenden
vor 15 Stunden von ralf.wenzel 2 Antw.
MEREQ001 Zusatzfelder ausblenden
vor 3 Tagen von SAP4Echo 0 Antw.
gelöst Z Tabelle Key Feld ändern
vor 3 Tagen von DeathAndPain 3 Antw.
gelöst Funktionsbaustein EXIT_SAPLCORF_404 in Transaktion COR6N
vor 20 Stunden von SAP_ENTWICKLER 2 Antw.

  Ähnliche Beiträge beta
Anfänger sucht bestimmte Tabelle und findet nix....
01.03.2003, 18:04 von Wiezorek 3 Antw.
Tabellen Auswertung
24.05.2004, 11:03 von bliP! 6 Antw.
interne tabellen
30.07.2004, 09:50 von LordDeath 3 Antw.
2 Tabellen vergleichen
22.09.2004, 18:39 von Frank Dittrich 3 Antw.
Interne Tabellen mit Key
13.10.2004, 12:47 von Nicole 4 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]

Feedback ...?

Was können wir verbessern? Hinterlasse deine Kontaktdaten, wenn du eine direkte Antwort möchtest.

... Absenden!