Generische Tabelle einer anderen Tabelle überführen

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

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

Generische Tabelle einer anderen Tabelle überführen

Beitrag von abapnewbie (ForumUser / 25 / 12 / 0 ) »
Hallo,

ich habe folgendes Problem. Ich habe eine Methode der ich gerne jegliche Tabelle übergeben würde, daher hat der Parameter den Typ STANDARD TABLE.

Code: Alles auswählen.

CLASS-METHODS test_methode IMPORTING it_table type standard table. 
Das ganze ist eine statische Klasse was dann durch andere Z-Programme aufgerufen werden soll. Jetzt würde ich gerne für den weiteren Verlauf in der Klasse objektorientiert programmieren und habe mir ein paar Member-Variablen im Konstruktor zugelegt. Das Problem dabei ist, dass ich ja nicht sagen kann:

Code: Alles auswählen.

mt_table type standard table.
Da das nicht geht habe ich folgendes versucht:

Code: Alles auswählen.

 DATA mt_table type ref to data.
FIELD-SYMBOLS <fs_table> type standard table. 

ASSIGN me->mt_table->* TO <fs_table>.
<fs_table> = it_table
it_table wird entsprechend richtig in das Programm importiert und ist befüllt. Das Problem liegt eindeutig beim ASSIGN. Könnte mir jemand erklären weshalb das nicht funktioniert? Wie könnte ich die importierte Tabelle in die Variable des erstellen Objektes überführen? Es sollte bitte generisch sein, sodass jegliche Tabelle importiert werden kann.

Vielen Dank im Voraus!

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


Re: Generische Tabelle einer anderen Tabelle überführen

Beitrag von a-dead-trousers (Top Expert / 4397 / 223 / 1182 ) »
Du musst auch einen "Speicherplatz" für die Daten erzeugen. Die Referenz alleine zeigt ohne dem ins Datennirwana.

Code: Alles auswählen.

 DATA mt_table type ref to data.
FIELD-SYMBOLS <fs_table> type standard table. 

CREATE DATA mt_table LIKE it_table.
ASSIGN me->mt_table->* TO <fs_table>.
<fs_table> = it_table

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
abapnewbie

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: Generische Tabelle einer anderen Tabelle überführen

Beitrag von a-dead-trousers (Top Expert / 4397 / 223 / 1182 ) »
Sofern du die Daten nicht wirklich "kopieren" musst, kannst du auch mit einer direkten Referenz auf die Originaldaten arbeiten.

Code: Alles auswählen.

GET REFERENCE OF it_table INTO me->mt_table.
Dabei musst du aber aufpassen, dass die Referenz die "Eigenschaften" des Methoden-Parameters erbt. D.h. bei einem IMPORTING ist die Referenz me->mt_table "Read-Only". Um einen schreibenden Zugriff zu haben musst du den Paramter als CHANGING deklarieren.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
abapnewbie

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: Generische Tabelle einer anderen Tabelle überführen

Beitrag von abapnewbie (ForumUser / 25 / 12 / 0 ) »
a-dead-trousers hat geschrieben:
27.01.2020 20:33
Sofern du die Daten nicht wirklich "kopieren" musst, kannst du auch mit einer direkten Referenz auf die Originaldaten arbeiten.

Code: Alles auswählen.

GET REFERENCE OF it_table INTO me->mt_table.
Dabei musst du aber aufpassen, dass die Referenz die "Eigenschaften" des Methoden-Parameters erbt. D.h. bei einem IMPORTING ist die Referenz me->mt_table "Read-Only". Um einen schreibenden Zugriff zu haben musst du den Paramter als CHANGING deklarieren.
Vielen Dank, deine Lösung hat wie gewünscht funktioniert! Meine Membervariable wird nun richtig befüllt.

Zum Verständnis noch mal: Wenn ich die Tabelle also über IMPORTING in die Klasse übergebe und dann eine mit mt_table darauf referenziere kann ich die mt_table nur lesen. Wenn ich hingegen statt IMPORTING CHANGING nehme, dann kann ich die mt_table auch editieren?

Re: Generische Tabelle einer anderen Tabelle überführen

Beitrag von a-dead-trousers (Top Expert / 4397 / 223 / 1182 ) »
abapnewbie hat geschrieben:
28.01.2020 08:28
Zum Verständnis noch mal: Wenn ich die Tabelle also über IMPORTING in die Klasse übergebe und dann eine mit mt_table darauf referenziere kann ich die mt_table nur lesen. Wenn ich hingegen statt IMPORTING CHANGING nehme, dann kann ich die mt_table auch editieren?
Ja.

Eines gilt es noch zubeachten: Wenn du eine in einer anderen Methode definierte Variable an deine Methode übergibst, ist die Referenz nach Verlassen der ersten Methode nicht mehr gültig.
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: Generische Tabelle einer anderen Tabelle überführen

Beitrag von abapnewbie (ForumUser / 25 / 12 / 0 ) »
a-dead-trousers hat geschrieben:
28.01.2020 09:52
abapnewbie hat geschrieben:
28.01.2020 08:28
Zum Verständnis noch mal: Wenn ich die Tabelle also über IMPORTING in die Klasse übergebe und dann eine mit mt_table darauf referenziere kann ich die mt_table nur lesen. Wenn ich hingegen statt IMPORTING CHANGING nehme, dann kann ich die mt_table auch editieren?
Ja.

Eines gilt es noch zubeachten: Wenn du eine in einer anderen Methode definierte Variable an deine Methode übergibst, ist die Referenz nach Verlassen der ersten Methode nicht mehr gültig.
Oh das habe ich jetzt im Debugger auch gemerkt.. Das wird dann aber leider keine Lösung für mein Problem sein, da ich die Daten dieser Tabelle später noch sortieren und filtern möchte. Sobald ich in die Methode abspringe um ein FuBa aufzurufen, löst sich die Referenz tatsächlich wieder.

Welche Möglichkeit hätte ich denn die Daten der Tabelle permanent in der mt_table zu speichern?

Re: Generische Tabelle einer anderen Tabelle überführen

Beitrag von a-dead-trousers (Top Expert / 4397 / 223 / 1182 ) »
abapnewbie hat geschrieben:
28.01.2020 11:18
Welche Möglichkeit hätte ich denn die Daten der Tabelle permanent in der mt_table zu speichern?
Die erste Variante die ich gepostet hab mit der echten Kopie.
Da ist es dann wieder egal ob du die Daten mit IMPORTING oder CHANGING übergeben hast, weil du ja eine eigenständige Kopie davon weiter verwendest. Aber dadurch wird eben auch der Speicherbedarf deines Programms größer was bei so generischen Lösungen nicht außer acht gelassen werden sollte:
"Ja, ich hab da die Methode X. Die hab ich schon so oft verwendet..."
Und dann kracht das Ganze weil man eine Tabelle mit 100.000 Zeilen und mehr übergibt.

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
abapnewbie

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: Generische Tabelle einer anderen Tabelle überführen

Beitrag von black_adept (Top Expert / 4093 / 128 / 940 ) »
abapnewbie hat geschrieben:
27.01.2020 19:42
[...]Ich habe eine Methode der ich gerne jegliche Tabelle übergeben würde, daher hat der Parameter den Typ STANDARD TABLE.
Wenn du jegliche Tabelle übergeben willst müsstest du aber stattdessen "ANY TABLE" verwenden.

Folgende Benutzer bedankten sich beim Autor black_adept für den Beitrag:
abapnewbie

live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Generische Tabelle einer anderen Tabelle überführen

Beitrag von DeathAndPain (Top Expert / 1947 / 257 / 413 ) »
Das ganze ist eine statische Klasse was dann durch andere Z-Programme aufgerufen werden soll. Jetzt würde ich gerne für den weiteren Verlauf in der Klasse objektorientiert programmieren und habe mir ein paar Member-Variablen im Konstruktor zugelegt.
Ich bin nicht sicher, ob ich da eine Schwäche in meinem OO-Verständnis habe oder ob hier ein Widerspruch vorliegt, aber ein Konstruktur dient doch dazu, neue Objektinstanzen zu initialisieren. Eine statische Klasse hat aber doch gar keine Objektinstanzen, sondern funktioniert ähnlich wie ein Funktionsbaustein. Wozu also ein Konstruktor?

Folgende Benutzer bedankten sich beim Autor DeathAndPain für den Beitrag:
abapnewbie


Re: Generische Tabelle einer anderen Tabelle überführen

Beitrag von abapnewbie (ForumUser / 25 / 12 / 0 ) »
DeathAndPain hat geschrieben:
28.01.2020 12:52
Das ganze ist eine statische Klasse was dann durch andere Z-Programme aufgerufen werden soll. Jetzt würde ich gerne für den weiteren Verlauf in der Klasse objektorientiert programmieren und habe mir ein paar Member-Variablen im Konstruktor zugelegt.
Ich bin nicht sicher, ob ich da eine Schwäche in meinem OO-Verständnis habe oder ob hier ein Widerspruch vorliegt, aber ein Konstruktur dient doch dazu, neue Objektinstanzen zu initialisieren. Eine statische Klasse hat aber doch gar keine Objektinstanzen, sondern funktioniert ähnlich wie ein Funktionsbaustein. Wozu also ein Konstruktor?
Habe mich verschrieben, innerhalb der Klasse wird natürlich OO-Programmiert. Die Klasse soll einem Export dienen und dementsprechend soll die "Hauptmethode" statisch aufrufbar sein. Quasi klassenname=>hauptmethode ( it_table = irgendeine tabelle die exportiert werden soll). Innerhalb der Klasse wird dann in dieser Methode eine Instanz erzeugt und dann weiter programmiert. Das Problem entsteht dabei, wenn ich nun versuche diese it_table in einer Membervariable abzuspeichern. Die Lösung:

Code: Alles auswählen.

GET REFERENCE OF it_table INTO me->mt_table. 
funktioniert wunderbar wenn man die Tabelle nur auslesen möchte. Allerdings möchte ich diese Tabelle auch filtern und sortieren bevor ich sie exportiere. Ich kann die mt_table dann aber nicht mehr überarbeiten bzw. Felder daraus löschen usw.

Ich habe mich entschieden für diese Lösung speziell die Methoden alle statisch zu programmieren, da ich sie so einfacher wiederverwenden kann.

Allerdings würde mich trotzdem eine Lösung interessieren, falls dieses Problem in Zukunft erneut auftaucht.

Re: Generische Tabelle einer anderen Tabelle überführen

Beitrag von black_adept (Top Expert / 4093 / 128 / 940 ) »
abapnewbie hat geschrieben:
28.01.2020 13:27
Allerdings würde mich trotzdem eine Lösung interessieren, falls dieses Problem in Zukunft erneut auftaucht.
Hat adt doch schon gepostet: viewtopic.php?f=3&t=24142#p94643
live long and prosper
Stefan Schmöcker

email: stefan@schmoecker.de

Re: Generische Tabelle einer anderen Tabelle überführen

Beitrag von DeathAndPain (Top Expert / 1947 / 257 / 413 ) »
Die Klasse soll einem Export dienen und dementsprechend soll die "Hauptmethode" statisch aufrufbar sein.
[...]
Ich habe mich entschieden für diese Lösung speziell die Methoden alle statisch zu programmieren, da ich sie so einfacher wiederverwenden kann.
Wo genau liegt der Vorteil der statischen Programmierung, wenn die Methode - und so habe ich Dich verstanden - aus nicht mehr besteht als einer Schale, die eine Instanz daraus macht? Weshalb sollte es für rufende Programme einfacher sein, nicht selbst mit der instanziierten Methode zu arbeiten?

Seite 1 von 1

Vergleichbare Themen

3
Antw.
3190
Views
Tabellenzeile aus einer Generische Tabelle löschen
von Gabriel99 » 08.04.2016 14:53 • Verfasst in ABAP® für Anfänger
5
Antw.
901
Views
1
Antw.
570
Views
2
Antw.
4616
Views
Join über Tabelle trotz Pool/Cluster Tabelle
von em.tie » 04.12.2006 18:38 • Verfasst in ABAP® für Anfänger

Ü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

Trennen Strasse und Hausnummer
vor 11 Stunden von msfox 18 / 11012
Dialog-Container mit Toolbar/Status
vor 14 Stunden von black_adept gelöst 27 / 4130
IT0024 Qualifikationen CP-ID
vor 16 Stunden von ArjenR 1 / 114

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

Trennen Strasse und Hausnummer
vor 11 Stunden von msfox 18 / 11012
Dialog-Container mit Toolbar/Status
vor 14 Stunden von black_adept gelöst 27 / 4130
IT0024 Qualifikationen CP-ID
vor 16 Stunden von ArjenR 1 / 114

Unbeantwortete Forenbeiträge

IT0024 Qualifikationen CP-ID
vor 16 Stunden von ArjenR 1 / 114
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 3050
Hilfe bei SWEC/SWE2
September 2024 von retsch 1 / 9644