interene Tabelle nach Länge des Inhalts sortieren

Getting started ... Alles für einen gelungenen Start.
12 Beiträge Seite 1 von 1
12 Beiträge Seite 1 von 1

interene Tabelle nach Länge des Inhalts sortieren

Beitrag von Basler84 (ForumUser / 58 / 27 / 0 ) » 9. Okt 2019 15:04

Hallo zusammen,

ich wollte fragen ob es eine Funktion gibt eine interne Tabelle nach der Länge des Inhalts der Felder einer Spalte zu sortieren.

Bsp:

Spalte X:
1234567*
12*
3456*
98765*

gewünschtes Ergebnis nach Sort:
1234567*
98765*
3456*
12*

es geht wie gesagt nur um die Länge des Feldes. könnte natürlich loopen und eine Hilfstabelle füllen aber vll. gehts ja besser.

Beste Grüße
Basler


Re: interene Tabelle nach Länge des Inhalts sortieren

Beitrag von deejey (Specialist / 239 / 63 / 20 ) » 9. Okt 2019 15:18

Kann nicht ohne Hilfskonstrukt gehen, ich würde so aus der Hüfte geschossen eine Dummyspalte einbauen, Loop drüber und Länge reinballern, dann SORT descending danach.

Folgende Benutzer bedankten sich beim Autor deejey für den Beitrag:
Basler84 (9. Okt 2019 16:11)


Re: interene Tabelle nach Länge des Inhalts sortieren

Beitrag von Basler84 (ForumUser / 58 / 27 / 0 ) » 9. Okt 2019 16:11

Ja genau so hab ichs mal gemacht. Das hatte ich mit dem loop und der Hilfstabelle gemeint. Hatte nur die Hoffnung, dass es da vielleicht was schickeres gibt... :)

Re: interene Tabelle nach Länge des Inhalts sortieren

Beitrag von deejey (Specialist / 239 / 63 / 20 ) » 9. Okt 2019 16:23

So eine Funktion gibt es nicht, du brauchst aber auch keine Hilfdtabelle, nimmst einfach die Originaltabelle und haust noch eine Spalte rein

Re: interene Tabelle nach Länge des Inhalts sortieren

Beitrag von DeathAndPain (Top Expert / 1135 / 128 / 242 ) » 9. Okt 2019 17:40

Die Alternative wäre, ein Sortierverfahren (Bubble Sort oder welches auch immer) selber zu programmieren, Zeilen zu vergleichen und anhand dessen hoch- oder runterzuschieben. Das dürfte aber weder kürzer noch performanter werden, ganz im Gegenteil.

Re: interene Tabelle nach Länge des Inhalts sortieren

Beitrag von edwin (Specialist / 273 / 5 / 46 ) » 9. Okt 2019 18:15

Hi, wenn deine Spalte feste Länge hat, dann kannst auch zuerst den Inhalt nach rechts schieben, sortieren und dann wieder zurück 😊 .
Bsp:

Code: Alles auswählen.

  TYPES : BEGIN OF ty_line,
            spaltex TYPE c LENGTH 40,
            spaltey type c length 5.
  TYPES : END   OF ty_line.

  DATA line_tab TYPE TABLE OF ty_line.

  APPEND INITIAL LINE TO line_tab ASSIGNING FIELD-SYMBOL(<line>).
  <line>-spaltex = '12*'.
  APPEND INITIAL LINE TO line_tab ASSIGNING <line>.
  <line>-spaltex = '1234567*'.
  APPEND INITIAL LINE TO line_tab ASSIGNING <line>.
  <line>-spaltex = '345*'.
  APPEND INITIAL LINE TO line_tab ASSIGNING <line>.
  <line>-spaltex = '345767*'.
  APPEND INITIAL LINE TO line_tab ASSIGNING <line>.
  <line>-spaltex = '9876*'.

  write : / 'Vor dem Sort'.
  LOOP AT line_tab ASSIGNING <line>.
    WRITE : / <line>-spaltex.
    SHIFT <line>-spaltex RIGHT DELETING TRAILING space.
  ENDLOOP.

  SORT line_tab BY spaltex DESCENDING.

  write : / 'Nach dem Sort'.
  LOOP AT line_tab ASSIGNING <line>.
    SHIFT <line>-spaltex LEFT DELETING LEADING space.
    WRITE : / <line>-spaltex.
  ENDLOOP.

Folgende Benutzer bedankten sich beim Autor edwin für den Beitrag:
a-dead-trousers (10. Okt 2019 18:28)


Re: interene Tabelle nach Länge des Inhalts sortieren

Beitrag von DeathAndPain (Top Expert / 1135 / 128 / 242 ) » 9. Okt 2019 18:39

Das ist ein ziemlich gerissener Ansatz! Ich glaube zwar nicht, dass er schneller ist, aber er ist trotzdem gerissen!

Re: interene Tabelle nach Länge des Inhalts sortieren

Beitrag von SaskuAc (Specialist / 286 / 29 / 36 ) » 10. Okt 2019 13:08

edwin hat geschrieben:
9. Okt 2019 18:15
Hi, wenn deine Spalte feste Länge hat, dann kannst auch zuerst den Inhalt nach rechts schieben, sortieren und dann wieder zurück 😊 .
Wie genau funktioniert das... Habe shift noch nie verwendet... hmm .. kannst du das mal erklären? Also wieso funktioniert der Sort in diesem fall? Was macht das shift mit den Feldern / der Tabelle, dass es dann funktioniert?

Re: interene Tabelle nach Länge des Inhalts sortieren

Beitrag von a-dead-trousers (Top Expert / 3264 / 86 / 827 ) » 10. Okt 2019 13:17

SaskuAc hat geschrieben:
10. Okt 2019 13:08
edwin hat geschrieben:
9. Okt 2019 18:15
Hi, wenn deine Spalte feste Länge hat, dann kannst auch zuerst den Inhalt nach rechts schieben, sortieren und dann wieder zurück 😊 .
Wie genau funktioniert das... Habe shift noch nie verwendet... hmm .. kannst du das mal erklären? Also wieso funktioniert der Sort in diesem fall? Was macht das shift mit den Feldern / der Tabelle, dass es dann funktioniert?
Das SHIFT "verschiebt" den Inhalt im Zielfeld um eine gewisse Anzahl nach links oder rechts. Da nun die Leerzeichen VORNE stehen und diese laut Codepage (z.B. ISO-8859-1) eine niedrigere Wertigkeit haben als andere Zeichen, funktioniert die Sortierung nun so, als ob man nach der Länge sortieren würde. Man sollte sich aber im Klaren sein, dass trotzdem zusätzlich noch die Sortierung der gleich langen Wörter nach dem Alphabet erfolgt, was je nach Aufgabenstellung gewünscht oder nicht gewünscht sein könnte.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
SaskuAc (11. Okt 2019 08:28)

Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.07
Basis: 7.40

Re: interene Tabelle nach Länge des Inhalts sortieren

Beitrag von edwin (Specialist / 273 / 5 / 46 ) » 10. Okt 2019 13:39

Hi,
"shift right deleting trailing space"
Inhalt rechts schieben mit Löschung "angehängter" Leerzeichen
Bsp:
'1234567* ' -> ' 1234567*'
"shift left deleting leading space"
Inhalt links schieben mit Löschung führender Leerzeichen
Bsp:
' 1234567*' -> '1234567* '
am besten du schaust mal die ABAP Hilfe zu shift an
wenn du nun die "geschobenen" Daten anschaust, siehst du, dass jetzt die Sortierung, wie von dir gewünscht funktioniert:

Code: Alles auswählen.

'1234567*      ' -> '      1234567*'
'12*           ' -> '           12*'
'3456*         ' -> '         3456*'
'98765*        ' -> '        98765*'
sort descending -> Sort absteigend damit auch automatisch der Länge nach absteigend, oder sort ascending damit auch automatisch der Länge nach aufsteigend. (Auch hier wieder: schau dir die Hilfe zu sort an).

Jetzt musst du nur noch die Daten in die ursprüngliche Form bringen mit
Shift left.

Voraussetzung ist natürlich, dass keine führenden Leerzeichen in den Ausgangsdaten vorkommen.

/Edwin

Folgende Benutzer bedankten sich beim Autor edwin für den Beitrag:
SaskuAc (11. Okt 2019 08:28)


Re: interene Tabelle nach Länge des Inhalts sortieren

Beitrag von black_adept (Top Expert / 3304 / 58 / 601 ) » 10. Okt 2019 15:37

Irgendwie mag ich Edwins Lösung. Sie ist zwar vom Grundsatz her falsch aber sollte für die meisten Fälle, die man in freier Wildbahn antrifft, funktionieren. 😜
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: interene Tabelle nach Länge des Inhalts sortieren

Beitrag von edwin (Specialist / 273 / 5 / 46 ) » 10. Okt 2019 15:51

black_adept hat geschrieben:
10. Okt 2019 15:37
Sie ist zwar vom Grundsatz her falsch
😊

Seite 1 von 1

Aktuelle Forenbeiträge

Web Service Restful API
vor 11 Stunden von Tron 2 / 32
Entwurfsmuster in ABAP / OO
vor 2 Tagen von Maximus 16 / 2132
VA01, Kundenauftragserfassung Preisdatum
vor 2 Tagen von SAP_ENTWICKLER 1 / 53
Rabax Fehlermeldung
vor 2 Tagen von zzcpak 2 / 84
Aufgabe Programm/- Tabellenerstellung
vor 2 Tagen von SaskuAc 3 / 84

Unbeantwortete Forenbeiträge

VA01, Kundenauftragserfassung Preisdatum
vor 2 Tagen von SAP_ENTWICKLER 1 / 53
HANA Audit Trail
vor einer Woche von JohnLocklay 1 / 97
Halber Tag Urlaub
vor einer Woche von SO4SAP 1 / 61
Funktionsbausteine BAPI_INCOMINGINVOICE*****
vor einer Woche von Rabea1103 1 / 70
S4/HANA in der Cloud / 14 Tage Trial
vor 3 Wochen von Tron 1 / 102