Dynamisch instanziieren

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).

Dynamisch instanziieren

Postby Jana2149 » Mon Nov 28, 2011 9:18 pm

Hallo!

Wie kann man denn geschickt (mit wenig Quellcode) eine Vielzahl an Objekten erzeugen? Ich würde gerne eine Vielzahl von meinen PKW-Instanzen einer internen Tabelle zufügen.
Teilweise werden Werte eines PKWs durch den Konstruktor gesetzt, manche sind jedoch aus der Datenbanktabelle zu holen.
Ist es sinnvoll für jedes Objekt neu auf die Datenbanktabelle zuzugreifen oder sogar notwendig?
Und wie übergebe ich meinem Konstruktor dynamisch Werte?

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. DATA: Zeile TYPE REF TO pkw,
  2. Itab TYPE TABLE OF REF TO pkw.
  3.  
  4. CREATE OBJECT zeile EXPORTING ...
  5. APPEND zeile to itab.
  6.  
GeSHi ©


Ich hoffe ihr könnt mir weiterhelfen,

Ciao!
Jana2149
..
..
 
Posts: 44
Joined: Wed Jun 29, 2011 12:06 am

Re: Dynamisch instanziieren

Postby Helga5133 » Mon Nov 28, 2011 10:09 pm

Hi,

also grundsätzlich empfiehlt es sich alle Daten nach Möglichkeit auf einmal von der DB zu lesen und dann im Programm zu verarbeiten.

Würde mir eine weitere Klasse zur Verwaltung der PKW-Objekte anlegen. Das wäre dann quasi ein Autohändler :wink:
Die Klasse hat dann eine itab vom type table of ref to pkw.

Bei der Erzeugung einer Instanz der Verwalter-Klasse holst du dir die benötigten Daten von DB,
loopst über das Ergebnis, erzeugst jeweils ein PKW-Objekt und hängst es in die itab.
Hier brauchst du ja dann nicht nochmal von der DB lesen. Die Daten hast du ja schon.

Geht natürlich ohne separate Klasse genauso, ist aus OO-Sicht aber sauberer.

Gruß
Volker
Helga5133
..
..
 
Posts: 72
Joined: Wed Nov 25, 2009 5:29 pm

Re: Dynamisch instanziieren

Postby Jana2149 » Thu Dec 01, 2011 10:08 pm

Hallo Volker,

vielen Dank schon mal bis hier hin, hat mir sehr geholfen!
Ich habe noch eine weitere Frage und hoffe, dass sie mir hier beantwortet wird.

Ich bleib jetzt mal bei diesem Autohändler/PKW-Beispiel. In meinem Hauptprogramm habe ich mir nun mehrere Autohändler und jeweils ein paar Autos erzeugt. Die Autohändler erscheinen nach Ausführung des Programms in einem ALV. Dem Screen habe ich einen Handler (onDoubleklick) mitgegeben. Nun würde ich gerne, nach einem Klick auf einen Autohändler, auf der gleichen Seite ein weiteres ALV ausgeben, dass die zu diesem Autohändler zugehörigen Autos anzeigt.

Was mir nun nicht klar ist, nachdem der onDoubleklick-Event ausgelöst wurde, wie komme ich wieder an meine Autohändler und dann auch an meine Autos, um diese im zweiten ALV auszugeben?

Bei der prozeduralen Programmierung habe ich bislang auf eine global verfügbare interne Tabelle zugegriffen, aber bei OO macht man das ja nicht...

Aber wie gehts dann richtig??

Viele Grüße und noch einen schönen Abend! :)
Jana2149
..
..
 
Posts: 44
Joined: Wed Jun 29, 2011 12:06 am

Re: Dynamisch instanziieren

Postby Jana2149 » Fri Dec 02, 2011 3:05 pm

Sollte man dabei vielleicht mit einem Singleton-Pattern arbeiten?
Jana2149
..
..
 
Posts: 44
Joined: Wed Jun 29, 2011 12:06 am

Re: Dynamisch instanziieren

Postby Helga5133 » Fri Dec 02, 2011 7:46 pm

Also ich bin jetzt weit davon entfernt mich einen OO-Profi zu nennen, aber wenn du dir
dann wieder mehrere "Autohändler" erzeugt, müsstest du dir aus meiner Sicht eigentlich wieder
eine Klasse anlegen, welche wiederrum diese Objekte verwaltet usw.

Diese hat dann eine Tabelle vom Typ "Autohändler", die du als ALV anzeigt, bzw dir hierüber die Infos zu den Objekten holst. Beim Doppelklick suchst du dir die betroffene Zeile, hast dein "Autohändler"-Objekt und kannst damit weiterarbeiten.

Zu Singelton-Pattern kann ich dir nichts sagen.

Gruß
Volker
Helga5133
..
..
 
Posts: 72
Joined: Wed Nov 25, 2009 5:29 pm

Re: Dynamisch instanziieren

Postby ewx » Mon Dec 05, 2011 10:57 am

jabap hat geschrieben:Bei der prozeduralen Programmierung habe ich bislang auf eine global verfügbare interne Tabelle zugegriffen, aber bei OO macht man das ja nicht...

Jeder Autohändler müsste eine Methode "get_my_cars" haben. Die kannst du dann aufrufen um an die Autos zu kommen. Du könntest auch ein öffentliches Attribut von "Autohändler" verwenden: Tabelle gt_my_cars. Das ist aber nicht so schön, weil dann der "Autohändler" keinen Einfluß darauf hat, wofür die Liste verwendet wird. Mit einer eigenen Methode kann der Autohändler entscheiden, dass er bestimmte Autos vielleicht gar nicht öffentlich zeigen möchte, z.B. weil das Auto noch nicht geprüft wurde oder gerade von einem potentiellen Käufer begutachtet wird.
Evtl. könnte auch der Autohändler selbst eine Implementierung "Show_my_cars" haben, damit er evtl. die Möglichkeit hat, bestimmte Modelle besonders hervor zu heben.
ewx
.....
.....
 
Posts: 2840
Joined: Mon Aug 04, 2003 9:02 pm

Re: Dynamisch instanziieren

Postby Jana2149 » Fri Dec 09, 2011 12:34 am

Hi Jungs,

ich danke euch.
Eine letzte Frage hätte ich noch. Dabei bleib ich mal beim bisherigen Beispiel.

Ich habe ein interne Tabelle lt_auskunft. Diese beinhaltet Informationen zu den Händlern und den Autos (nicht optimal, ich weiß :? ). Ich loope über diese interne Tabelle und erzeuge mir mein Autohändler-Objekt (Code steht unten). Im Konstruktor des Autohändlers werden Werte der Struktur den Attributen zugewiesen. Mein Autohändler hat jedoch auch Autos. Informationen dazu stehen auch in der internen Tabelle. Sprich, ich muss im Konstruktor des Autohändlers einen Aufruf ähnlich dem unteren vornehmen. Die Struktur würde ich auch diesem Konstruktor übergeben, damit die Attribute des Objekts Auto mit den in lt_auskunft stehenden Werten gefüllt werden können.
Soweit verständlich?

Code: [Select all] [Expand/Collapse] [Download] (Untitled.txt)
  1. LOOP AT lt_auskunft ASSIGNING <fs_auskunft>.
  2.       CREATE OBJECT ref_autohändler EXPORTING values = <fs_auskunft>.
  3.       APPEND ref_autohändler TO me->tab_ref_autohändler.
  4.  
GeSHi ©


Mein Problem ist nun folgendes: lt_auskunft besitzt ein Feld 'nummer'. Dieses Feld 'nummer' gibt an, um welchen Autohändler es sich handelt. Wenn in lt_auskunft nun das Feld 'nummer' zwei (oder mehr) identische Einträge hat, dann darf ich keine weiteren Autohändler-Objekt erzeugen. Ich habe dann ein Autohändler-Objekt mit zwei (oder mehr Autos).

Wie bewerkstellige ich das aber nun?
Von der Logik her müsste ich ja <fs_auskunft>-nummer prüfen, ob im Durchlauf zuvor die selbe 'Nummer' dran war. Bei derselben Nummer darf ich kein neues Autohändler-Objekt erzeugen, da es das entsprechende Objekt ja bereits gibt, ansonsten wird eines erzeugt.
Wenn ich aber kein neues Autohändler-Objekt erzeugen möchte, sondern ein weiteres Auto, das dem Autohändler-Objekt zugewiesen ist, wie kann ich die Werte meiner <fs_auskunft> dem Autoobjekt zuweisen, ohne dass es noch einmal aufgerufen wird.

Wäre euch sehr dankbar, wenn ihr mir in diesem Punkt nochmals weiterhelfen könntet. Da steh ich etwas auf der Leitung.

Schönen Abend noch,

Grüße
Jana2149
..
..
 
Posts: 44
Joined: Wed Jun 29, 2011 12:06 am

Re: Dynamisch instanziieren

Postby Jana2149 » Fri Dec 09, 2011 12:56 pm

Hat sich erledigt.

Gruß
Jana2149
..
..
 
Posts: 44
Joined: Wed Jun 29, 2011 12:06 am


Return to ABAP Objects®

Who is online

Users browsing this forum: No registered users and 11 guests