Sortierung der internen Tabelle nach SELECT

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
10 Beiträge • Seite 1 von 1
10 Beiträge Seite 1 von 1

Sortierung der internen Tabelle nach SELECT

Beitrag von cali (ForumUser / 51 / 0 / 0 ) »
Hallo!

ich habe ein etwas merkwürdiges Phänomen. Wenn ich aus der Tabelle VBAP die Positionsdaten via SELECT für einen Beleg in eine interne Tabelle herauslese, passiert es bei einer bestimmten Belegnummer, dass auf einmal die interne Tabelle auf einmal nicht mehr durchgängig sortiert ist (also die Sortierung nach POSNR ist nicht mehr durchgängig)!?

Hat vielleicht irgendjemand eine Idee woran das liegen könnte??

gruss cali

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


Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo cali,

wenn Du den SELECT ohne den Zusatz ORDER BY benutzt hast, ist das Verhalten klar.
Die Datenbank liefert die Daten nicht per se nach Primärschlüssel sortiert zurück. Dies gilt im Besonderen dann, wenn nicht der Primärschlüsselindex benutzt wird.

Genau genommen liegen die Daten in der Datenbank in der Regel auch nicht sortiert vor, sondern die Sortierung wird durch den, SAP-seitig implizit vorhandenen, Primärindex (aller Schlüsselfelder) bwerkstelligt.
Neue Daten werden an irgendeiner freien Stelle abgelegt und der Primärindex, sowie alle weiteren Indezes, werden neu sortiert aufgebaut.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von DeathGuardian (Expert / 759 / 0 / 3 ) »
Das liegt daran, wie die Datenbank liest.
Ein Select heisst nur "hohl mir diese Daten", er heisst aber nicht "hohl mir die Daten in einer bestimmten Reihenfolge".
Von daher ist, wenn du es sortiert haben willst, ein SORT ITAB nach dem Select zu empfehlen.

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
DeathGuardian hat geschrieben:...
Von daher ist, wenn du es sortiert haben willst, ein SORT ITAB nach dem Select zu empfehlen.
Dem kann ich nicht uneingeschränkt zustimmen.

Der Zusatz ORDER BY der SELECT-Anweisung weißt die Datenbank selbst an, eine Sortierung vorzunehmen, was m.E. in vielen Fällen günstiger ist, als die Daten erst zu lesen und dann zu sortieren.
Beim Sammeln der Daten müsste die Datenbank bereits die Sortierung aufbauen können, was somit schneller sein dürfte... QED

PS:
es gibt OpenSQL-Formen, bei denen der Zusatz nur eingeschränkt (z.B. FOR ALL ENTIRES) oder garnicht (z.B. i.d.R. JOIN) verwendet werden kann.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von se80 (ForumUser / 21 / 0 / 0 ) »
Hallo,

vorweg: ORDER BY ist beim Join möglich.
Allerdings ist dies häufig nicht sinnvoll, da es zu sehr schlechten Laufzeitresultaten kommen kann, wenn Joins mit ORDER BY verknüpft werden.

Ich stimme DeathGuardian zu, daß es häufig sinnvoll ist, die Sortierung nach dem SELECT in der internen Tabelle vorzunehmen. Wir haben nur einen Datenbankserver, aber meistens mehrere Applikationsserver. Deshalb empfiehlt es sich, mit dem DB-Server pfleglich umzugehen und im Zweifel die Last auf den Applikationsserver zu verlagern.

Gruß

Gerd

Beitrag von cali (ForumUser / 51 / 0 / 0 ) »
Hallo und danke für eure Antworten, zwei Fragen hätte ich dazu noch:

1.) Wenn ich mir mit der SE16 die Tabelle VBAP für disen entsprechenden VB-Beleg ansehe, liegen die Daten komischerweise korrekt sortiert nach POSNR vor. Bloss wenn ich einene einfacchen SELET in eine ITAB mache gerät die Sortierung durcheinander?!

2.) Ich habe versucht mein SELECT Statement durch eine ORDER-BY Anweisung zu ergänzen aber hier bekomme ich vom Compiler angemeckert: "Falscher Ausdruck "Order by" in logischer Bedingung. Die Zuweisung von "000000" nach "POSNR" ist potentiell nicht verlustfrei. Es sind deshalb keine Optimierungen beim LOOP möglich" (Keine Ahnung was das bedeuten soll?!

So sieht das SELET Statement aus:

Code: Alles auswählen.

SELECT posnr
           matnr
           kwmeng
           zmeng
           vrkme
           grpos
           uepos
           arktx
           netwr
           waerk
           awahr
           pstyv
           cuobj FROM vbap
                 INTO TABLE mp_vbap
                WHERE vbeln = iv_vbeln
                ORDER-BY posnr.

Beitrag von JHM (Top Expert / 1197 / 1 / 197 ) »
Versuchs mal ohne Bindestrich bei ORDER BY.

Code: Alles auswählen.

SELECT posnr
           matnr
           kwmeng
           zmeng
           vrkme
           grpos
           uepos
           arktx
           netwr
           waerk
           awahr
           pstyv
           cuobj FROM vbap
                 INTO TABLE mp_vbap
                WHERE vbeln = iv_vbeln
                ORDER BY posnr.
[/quote]
Gruß Hendrik

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
se80 hat geschrieben:...
vorweg: ORDER BY ist beim Join möglich.
Allerdings ist dies häufig nicht sinnvoll, da es zu sehr schlechten Laufzeitresultaten kommen kann, wenn Joins mit ORDER BY verknüpft werden.
...
ich habe ja 'i.d.R beim JOIN' geschrieben, was bedeuten sollte, dass es in einzelnen Fällen wohl doch möglich ist... (ob sinnvoll, ist eine andere Frage...)
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von cali (ForumUser / 51 / 0 / 0 ) »
Danke!
1.) Hat noch jemand eine Antwort auf Frage 1?
gruss cali

Beitrag von DeathGuardian (Expert / 759 / 0 / 3 ) »
cali hat geschrieben:Danke!
1.) Hat noch jemand eine Antwort auf Frage 1?
gruss cali
JO, SE16 macht ein ORDER BY PrimaryKey!

@Ewiger Streit zwischen "ORDER BY" und "SORT dannach"!
Sind bei gut, nur ist manchmal der eine besser und ein anderes mal der Andere.
Je nach Select/Join, DB-Server, Appl, Datenmenge usw.
(bei mir z.B. ist es IMMER der SORT)

Seite 1 von 1

Vergleichbare Themen

2
Antw.
2193
Views
Sortierung von internen Tabellen mit DEC-Feldern
von Bitfummler » 10.09.2009 13:55 • Verfasst in ABAP® Core
3
Antw.
3680
Views
Sortierung einer internen Tab. mit Zeilentyp einer Referenz
von ABAP_User » 22.03.2012 08:51 • Verfasst in ABAP Objects®
6
Antw.
714
Views
Interne Tabelle Sortierung
von abap_frischling » 28.02.2022 20:16 • Verfasst in ABAP® für Anfänger
2
Antw.
2623
Views
DB Abfrage in interne Tabelle - Sortierung
von Eddi » 09.03.2007 09:47 • Verfasst in ABAP® Core

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Aktuelle Forenbeiträge

Daten an Tabelle binden
vor 8 Stunden von Bright4.5 3 / 1482
Regex in where
vor 10 Stunden von tar 6 / 153

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 8 Stunden von Bright4.5 3 / 1482
Regex in where
vor 10 Stunden von tar 6 / 153

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