Sortierter Tabellentyp für Objekttabelle

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
17 Beiträge • Seite 1 von 2 (current) Nächste
17 Beiträge Seite 1 von 2 (current) Nächste

Sortierter Tabellentyp für Objekttabelle

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Moin,

ich möchte gern eine Tabelle haben, Typ "sortierte Tabelle" mit eindeutigem Schlüssel. Zeilentyp ist die Instanz einer Klasse. Schlüsselfeld ist ein Attribut des Objektes. Soweit das Soll.

Einen solchen Schlüssel schaffe ich aber nicht zu deklarieren, ich wandere von Fehlermeldung zu Fehlermeldung. Ich habe offensichtlich keine andere Wahl, als die gewünschten Schlüsselfelder als Strukturfelder anzulegen (dann muss ich sie aber auch ständig befüllen, was zu redundanten Daten führt).

Richtig?


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

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


Re: Sortierter Tabellentyp für Objekttabelle

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Leider richtig 😕
Das warum kann ich mir aber auch recht gut erklären:
Eine Objektinstanz liegt im HEAP und in der Tabelle ist eigentlich nur ein Zeiger darauf.
Somit kann die Tabellenzeile den Zustand "not bound" einnehmen und der Tabellenschlüssel würde somit "undefiniert".
Wenn man beim Ändern eines Attributes auch noch aufpasen müsste, dass dadurch irgendeine Schlüsselverletzung in einer Tabelle, die man aufgrund von "sauberen Interfaces" uU gar nicht im Zugriff hat, passieren könnte würde das IMHO auch recht schnell verwirrend werden. Ganz zu Schweigen davon ob sich so eine Prüfung im Kernel zwischen HEAP und NON-HEAP überhaupt realisieren lässt.
Schon jetzt frage ich mich hin und wieder warum ein Kurzdump kommt obwohl ich nur eine Spalte ändere, bis ich dann nach längerem Suchen im Aufrufstack eine sortierte Tabelle oder ähnliches entdecke, das den Parameter "implizit" auf "Read-only" setzt.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag (Insgesamt 5):
ralf.wenzelIcke0801tm987456SaskuAcLegxis

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.18
Basis: 7.50

Re: Sortierter Tabellentyp für Objekttabelle

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Besser hätte man das wohl kaum erklären können


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Sortierter Tabellentyp für Objekttabelle

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »

Code: Alles auswählen.

REPORT.
CLASS xyz DEFINITION.
  PUBLIC SECTION.
    METHODS constructor IMPORTING name TYPE string.
    DATA name TYPE string.
ENDCLASS.
CLASS xyz IMPLEMENTATION.
  METHOD constructor.
    me->name = name.
  ENDMETHOD.
ENDCLASS.

TYPES ty TYPE SORTED TABLE OF REF TO xyz WITH UNIQUE KEY table_line.
DATA tab TYPE ty.

START-OF-SELECTION.

*TRY.
*    DATA(obj) =  tab[ table_line->name = 'HUGO'  ].
*  CATCH cx_sy_itab_line_not_found.
*ENDTRY.

  tab = VALUE #( ( NEW #( 'HUGO' ) ) ).
  READ TABLE tab
  INTO DATA(line)
  WITH KEY table_line->name = 'HUGO'.
  IF sy-subrc = 0.
    MESSAGE 'HUGO found' TYPE 'S'.
  ENDIF.

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


Re: Sortierter Tabellentyp für Objekttabelle

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
So kriege ich natürlich einen mörderbreiten Schlüssel mit allen Nachteilen dir das mit dich bringt.


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Sortierter Tabellentyp für Objekttabelle

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
irgendwie hast du auch immer was zu meckern...

Re: Sortierter Tabellentyp für Objekttabelle

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
ewx hat geschrieben:
06.11.2019 23:08

Code: Alles auswählen.

TYPES ty TYPE SORTED TABLE OF REF TO xyz WITH UNIQUE KEY table_line.
Naja, überspitzt formuliert definierst du damit nur eine Tabelle in der man nicht zweimal dieselbe Objektinstanz einfügen kann. Einen optimierten Suchzugriff hat man so nur wenn man eine der Instanzen kennt. Also wenn man wissen möchte ob die Instanz schon vorhanden ist. Einen Schlüssel für den schnellen Zugriff auf die Attribute der Instanzen kann man damit nicht erreichen.

ralf.wenzel hat geschrieben:
06.11.2019 23:48
So kriege ich natürlich einen mörderbreiten Schlüssel mit allen Nachteilen dir das mit dich bringt.
Nicht so ganz. Der Schlüssel ist der Instanzzeiger (INT4?).
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.18
Basis: 7.50

Re: Sortierter Tabellentyp für Objekttabelle

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Was aber geht ist die alte SORT BY und dann BINARY SEARCH Krücke für STANDARD TABLE:

Code: Alles auswählen.

TYPES ty TYPE STANDARD TABLE OF REF TO xyz WITH DEFAULT KEY.
DATA: instance_tab TYPE ty.
APPEND NEW #( ) TO instance_tab.
SORT instance_tab BY table_line->name.
READ TABLE instance_tab REFERENCE INTO DATA(instance) BINARY SEARCH
  WITH KEY table_line->name = ''.
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.18
Basis: 7.50

Re: Sortierter Tabellentyp für Objekttabelle

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
....was aber nicht das ist, was ich mir unter einem optimierten Zugriff vorstelle, weil man die Tabelle potentiell bei jedem Zugriff umsortieren muss.


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Sortierter Tabellentyp für Objekttabelle

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Tja, das OO-Geraffel ist halt schön abstrakt, aber performancetechnisch ineffizient. Einen Tod musst Du sterben.
a-dead-trousers hat geschrieben:TYPES ty TYPE STANDARD TABLE OF REF TO xyz WITH DEFAULT KEY.
Was willst Du mit dem DEFAULT KEY, mit dem machst Du doch eh nix, sondern nutzt ganz andere Spalten als effektiven Suchschlüssel. Da wäre WITH EMPTY KEY ehrlicher.

Re: Sortierter Tabellentyp für Objekttabelle

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
DeathAndPain hat geschrieben:
07.11.2019 08:17
Tja, das OO-Geraffel ist halt schön abstrakt, aber performancetechnisch ineffizient.
du kannst es auch nicht lassen, oder? 🙃

Dafür, dass du in deinen sonstigen Aussagen sehr klar und spezifisch bist, bist du, sobald es irgendwie mit Klassen zu tun hat, herrlich polemisch.

Ja, performancetechnisch ist das Konstrukt wahrscheinlich nicht der Brüller. Der Schlüssel ist wahrscheinlich der Instanzzähler, insofern kann man sich die Key-Definition mit Table_line tatsächlich sparen.
Die Zugriffsgeschwindigkeit ist ähnlich, egal ob

Code: Alles auswählen.

TYPE SORTED TABLE OF REF TO xyz WITH UNIQUE KEY table_line.
oder

Code: Alles auswählen.

TYPE STANDARD TABLE OF REF TO xyz with EMPTY KEY.
(Getestet mit 10.000.000 Einträgen)

Mir war es erstmal wichtig, dass man überhaupt mit dem READ auf Attribute der Instanz zugreifen kann. Wenn es dann wirklich auf Performance ankommt, muss man halt eine umständliche Deklaration der Tabellenzeile vornehmen mit dem Nachteil der doppelten Datenhaltung und umständlichen Handling, wenn sich ein Schlüsselwert ändern sollte.

Mir ist es in erster Linie wichtig, dass die Programme so einfach wie möglich und möglichst gut lesbar sind. Je einfacher die zugrunde liegende Datendeklaration ist, desto potentiell einfacher ist also auch das Programm. Da sind mir ein paar Millisekunden im 98% der Fälle echt egal.

Meine Tests habe ich mit einer zugegeben sehr einfachen und kleinen Klasse gemacht. Kann sein, dass sich die Zugriffen exponentiell verschlechtern, wenn man wirklich große Objektreferenzen so verwaltet.

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


Re: Sortierter Tabellentyp für Objekttabelle

Beitrag von ewx (Top Expert / 4784 / 294 / 628 ) »
ralf.wenzel hat geschrieben:
07.11.2019 08:04
....was aber nicht das ist, was ich mir unter einem optimierten Zugriff vorstelle, weil man die Tabelle potentiell bei jedem Zugriff umsortieren muss.
Warum musst du die Tabelle bei jedem Zugriff umsortieren?

Re: Sortierter Tabellentyp für Objekttabelle

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Ich schrieb "potentiell" - Wenn ich erst nach Attribut A und dann nach Attribut B sortieren muss, weil der erste Zugriff nach Attribut A und der zweite nach Attribut B erfolgt.


Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Re: Sortierter Tabellentyp für Objekttabelle

Beitrag von a-dead-trousers (Top Expert / 4271 / 213 / 1140 ) »
Nicht zu vergessen, wenn man neue Einträge hinzufügt oder ein Instanzattribut ändert.
Da behelfe ich meistens mit einem ON_CHANGED Ereignis.
Wenn eine Instanz "bemerkt", dass sich ein Attribut geändert hat (geht natürlich nur bei PUBLIC READ-ONLY mit eigener SET-Methode), wird das Ereignis gefeuert und die Instanz, welche die Tabelle mit den Instanzen beinhaltet, sortiert dann neu.
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.18
Basis: 7.50

Re: Sortierter Tabellentyp für Objekttabelle

Beitrag von ralf.wenzel (Top Expert / 3776 / 176 / 262 ) »
Warum muss das PUBLIC sein?

Ralf
Bild
Ralf Wenzel Heuristika SAP-Development
25 Jahre SAP-Entwickler • 20 Jahre Freiberufler
PublikationenUngarische NotationXing

Vergleichbare Themen

4
Antw.
2461
Views
Tabellentyp
von JohnLocklay » 06.07.2017 14:10 • Verfasst in ABAP® Core
4
Antw.
3661
Views
Datentyp einem Tabellentyp übergeben
von nightyX » 13.05.2004 11:22 • Verfasst in ABAP® für Anfänger
3
Antw.
8175
Views
Datenbanktabelle aus Tabellentyp / Struktur erstellen?
von HUMA » 21.09.2004 14:57 • Verfasst in ABAP® für Anfänger
3
Antw.
1758
Views
Tabellentyp mit p0040-Daten erweitern
von Mijira » 05.07.2016 09:31 • Verfasst in ABAP® Core
4
Antw.
1795
Views
Spaltenname zu eigenen Tabellentyp hinzufügen
von Dyrdek » 21.11.2016 10:00 • Verfasst in ABAP® für Anfänger

Aktuelle Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 255

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

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 64
Interne Tabelle
vor 5 Tagen von black_adept 2 / 133
MaLo-Checker in ABAP
vor einer Woche von A6272 6 / 255

Unbeantwortete Forenbeiträge

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