Eclipse, Access < Sonstige < Schule < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 16:39 Mi 06.06.2007 | Autor: | SusaSch |
Hallo
Wir haben gerade in der schule eclipse bzw den zugriff mit eclipse auf eine access-datenbank. Nun habe ich zu folgendem eine frage:
PreparedStatement pStat = dbConn.prepareStatement(sqlAnweisung);
Wir haben bis jetzt immer nur etwas in variablen abgespeichert.
Also das PreparedStatement ist doch eine klasse oder? bzw das pStat ein objekt. Wenn wir bis jetzt Objekte erschaffen haben ging das immer mit einem : ... new ..
Warum kann man dort einfach ein Objekt wie eine variable behandeln und was reinspeichern? Und warum ohne das objekt vorher erschaffen zu haben?
LG Susi
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:51 Mi 06.06.2007 | Autor: | piet.t |
Hallo Susi,
> Hallo
> Wir haben gerade in der schule eclipse bzw den zugriff mit
> eclipse auf eine access-datenbank. Nun habe ich zu
> folgendem eine frage:
>
> PreparedStatement pStat =
> dbConn.prepareStatement(sqlAnweisung);
>
> Wir haben bis jetzt immer nur etwas in variablen
> abgespeichert.
> Also das PreparedStatement ist doch eine klasse oder?
Ja, ist es.
> bzw das pStat ein objekt.
Jein (siehe unten)....
> Wenn wir bis jetzt Objekte erschaffen
> haben ging das immer mit einem : ... new ..
> Warum kann man dort einfach ein Objekt wie eine variable
> behandeln und was reinspeichern?
pstat ist genau genommen nicht ein Objekt, sondern eine "Objektreferenz", über die man ein Objekt finden kann.
Im Prinzip kannst Du Dir pstat zunächst als eine Variable vorstellen, in der Du ein Objekt der Klasse "PreparedStatement" ablegen kannst. Anschließend benutzt du dann pstat, um das Objekt anzusprechen, d.h. Methoden aufzurufen (z.B. pstat.execute()) oder Attribute anzusprechen. Damit verwendest Du pstat sozusagen als Zugang zu dem darin abgelegten Objekt.
> Und warum ohne das objekt
> vorher erschaffen zu haben?
In diesem Fall brauchst Du das betreffende Objekt nicht erschaffen, da das schon jemand anders für dich tut - nämlich dein Connection-Objekt dbConn (genauer: das Objekt, das Du über dbConn ansprichst) in seiner prepareStatement()-Methode.
Wird's schon etwas klarer?
Gruß
piet
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:41 Do 07.06.2007 | Autor: | SusaSch |
Hallo
Ja hat mir sehr geholfen :). Nun habe ich aber ein anderes Problem. Da ich privat etwas experimentiere weiß ich gar nicht ob das was ich machen will überhaupt geht. Also wir haben bis jetzt mit eclipse sachen in access datenbanken abgespeichert und ausgelesen.... Dabei haben wir immer von der Oberfläche ein Objekt in dem z.B. eine Artikelnr gespeichert war an die Datenbanverbindung übergeben....Am ende kam dann von der datenbankverbindung das Objekt wieder zurück > darin stand nun zusätzlich der name und der preis (eben das was man abgerufen haben wollte). Weiß nich wie ichs besser erklären soll ;).
Auf jedenfall konnte man dann eben auf der Oberfläche die entsprechenden sachen ausgeben. Aber eben immer nur von einem artikel. Man konnte also eben nur name und preis von dem Artikel mit der Artikelnr 1 .. abfragen und ausgeben.
So und jetzt zu meiner eigentlichen frage. Ich würde gerne eine abfrage machen in der mehrere Artikel (also zeilen der accessdatenbank) abgefragt werden. Das würde ja bedeuten, dass von der datenbankverbindung eine art tabelle übergeben würde. Die frage ist> geht das was ich vorhabe? Und wenn ja wie?
LG Susi
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 16:59 Do 07.06.2007 | Autor: | piet.t |
Hallo,
jetzt müsste man natürlich wissen, wie Ihr den einen Satz ausgelesen habt, an sich müsste es so was ähnliches wie das hier sein:
1: |
| 2: | ResultSet rs = pStat.executeQuery();
| 3: | rs.next(); //Positioniert auf ersten Satz
| 4: | String name = rs.getString("name");
|
So ein ResultSet kann aber (je nach Abfrage) auch mehrere Einträge enthalten. Dann kann man durch Aufruf von next() immer eine Zeile im Ergebnis weiterrücken. Am besten macht man das dann mit einer Schleife, die abbricht wenn next() false zurückgibt (dann gibt es keine weiteren Ergebniszeilen).
Also z.B. so:
1: |
| 2: | ResultSet rs = pStat.executeQuery();
| 3: | while(rs.next()) {
| 4: | String name = rs.getString("name");
| 5: | System.out.println(name);
| 6: | }
|
Wenn ihr beim Auslesen des einen Objekts anders vorgegangen seid, dann poste doch einfach mal Deinen Code, dann können wir mal schauen, wie man den für mehrere Objekte abändern muss.
Gruß
piet
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:32 Do 07.06.2007 | Autor: | SusaSch |
Hallo
Bei mir sieht das so ähnlich aus. Hier meins :
Von der DBVerbindung
public Artikel ArtikelAbrufenAnhandVonArtikelNumme
(Artikel meinArtikel)
{
try
{
String sqlAnweisung = "Select Artikelname, Preis from Artikel where Artikelnummer =?";
PreparedStatement pStat = dbConn.prepareStatement(sqlAnweisung);
pStat.setInt(1, meinArtikel.getArtikelnummer());
ResultSet rSet = pStat.executeQuery();
if (rSet.next())
{
meinArtikel.setArtikelname(rSet.getString("Artikelname"));
meinArtikel.setPreis(rSet.getDouble("Preis"));
}
else
{
}
}
catch (Exception e)
{
System.out.println("Fehler beim anrufen des Artikels");
meinArtikel.setArtikelname("Fehler beim speichern");
}
return meinArtikel;
hier von der Oberfläche:
Artikel meinArtikel = new Artikel();
int iArtikelnummer = Integer.parseInt(txtArtikelnummer.getText());
meinArtikel.setArtikelnummer(iArtikelnummer);
meineDbv.verbindeMitAccess();
meinArtikel = meineDbv.ArtikelAbrufenAnhandVonArtikelNummer(meinArtikel);
meineDbv.beendeVerbindung();
String sArtikelname =meinArtikel.getArtikelname();
String sPreis = Double.toString(meinArtikel.getPreis());
txaAusgabe.setText("Der Artikel mit der Artikelnummer: "+iArtikelnummer+" heißt: [mm] \n");
[/mm]
[mm] txaAusgabe.append(sArtikelname+"\nund [/mm] kostet: [mm] \n");
[/mm]
txaAusgabe.append(sPreis+" ");
Also so sieht das bei mir aus. Da das ResulSet ja so ne art tabelle ist habe ich mir schon gedacht, dass da mehr drin stehn kann. Mein problem sind eher die weiteren schritte. Bei mir wird ja am schluss wieder was an die oberfläche zurückgegeben(meinArtukel) indem ja dann das drin steht was nachher auf die oberfläche soll. Aber was muss ich übergeben, wenn man mehr als nur eins ausgeben will? Und was muss ich dann in der Oberfläche machen?
LG Susi
}
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 19:42 Do 07.06.2007 | Autor: | piet.t |
Die Zugriffsmethode auf die Datenbank könnte etwa so aussehen:
1: |
| 2: | public List<Artikel> alleArtikelAbrufen() {
| 3: | try
| 4: | {
| 5: | List<Artikel> ergebnis = new ArrayList<Artikel>();
| 6: | String sqlAnweisung = "Select Artikelname, Preis from Artikel";
| 7: | PreparedStatement pStat = dbConn.prepareStatement(sqlAnweisung);
| 8: | ResultSet rSet = pStat.executeQuery();
| 9: | while(rSet.next()){
| 10: | Artikel derArtikel = new Artikel();
| 11: | derArtikel.setArtikelnummer(rSet.getInt("Artikelnummer"));
| 12: | derArtikel.setArtikelname(rSet.getString("Artikelname"));
| 13: | derArtikel.setPreis(rSet.getDouble("Preis"));
| 14: | ergebnis.add(derArtikel)
| 15: | }
| 16: | return ergebnis;
| 17: | }
|
Also: Da Du ja keinen Artikel auswählen willst brauchst Du auch nichts an die Funktion zu übergeben. Zurück kommt eine Liste von Artikeln (im java-Jargon List<Artikel>).
Im Gegensatz zu deiner bisherigen Funktion wird next() jetzt wie schon gezeigt in einer Schleife mehrmals aufgerufen und für jeden Eintrag im ResultSet wird ein Artikel-Objekt erzeugt und der Liste hinzugefügt (mit add()).
Zum Schluss wird einfach die gefüllte Liste zurückgegeben.
In der aufrufenden Funktion muss man dann natürlich die Liste durchgehen und jeden einzelnen Artikel ausgeben:
1: |
| 2: | List<Artikel> artikelListe = alleArtikelAbrufen();
| 3: | // Lies: Für alle Artikel aus der artikelListe
| 4: | for(Artikel artikel: artikelListe) {
| 5: | ....hier gibst Du artikel aus....
| 6: | }
|
Das ganze Handling der Datenbankverbindung habe ich mal weggelassen, aber das bleibt ja wie es war.
Beachte: das ganze ist im java5-Stil geschrieben. Bei einem älteren Compiler kann es sein, dass das alles so nicht funktioniert. Wenn das bei Dir der Fall ist melde Dich nochmal, dann gibt es die java4-Version....
Gruß
piet
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:02 Do 07.06.2007 | Autor: | SusaSch |
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Hallo
public List<Artikel> alleArtikelAbrufen() {
3: try
4: {
5: List<Artikel> ergebnis = new ArrayList<Artikel>();
6: String sqlAnweisung = "Select Artikelname, Preis from Artikel";
7: PreparedStatement pStat = dbConn.prepareStatement(sqlAnweisung);
8: ResultSet rSet = pStat.executeQuery();
9: while(rSet.next()){
10: Artikel derArtikel = new Artikel();
11: derArtikel.setArtikelnummer(rSet.getInt("Artikelnummer"));
12: derArtikel.setArtikelname(rSet.getString("Artikelname"));
13: derArtikel.setPreis(rSet.getDouble("Preis"));
14: ergebnis.add(derArtikel)
15: }
16: return ergebnis;
17: }
Also: Da Du ja keinen Artikel auswählen willst brauchst Du auch nichts an die Funktion zu übergeben. Zurück kommt eine Liste von Artikeln (im java-Jargon List<Artikel>).
Im Gegensatz zu deiner bisherigen Funktion wird next() jetzt wie schon gezeigt in einer Schleife mehrmals aufgerufen und für jeden Eintrag im ResultSet wird ein Artikel-Objekt erzeugt und der Liste hinzugefügt (mit add()).
Zum Schluss wird einfach die gefüllte Liste zurückgegeben.
In der aufrufenden Funktion muss man dann natürlich die Liste durchgehen und jeden einzelnen Artikel ausgeben:
1:
2: List<Artikel> artikelListe = alleArtikelAbrufen();
3: // Lies: Für alle Artikel aus der artikelListe
4: for(Artikel artikel: artikelListe) {
5: ....hier gibst Du artikel aus....
6: }
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Muss sagen bin ein klein wenig überfordert :).
schon alleine das :
List<Artikel> ergebnis = new ArrayList<Artikel>();
versteh ich nich ganz. Muss ich da einfach nur list schreiben, oder was soll das <....> bedeuten? Undwarum steht vorne nur list und hinten arraylist?
War bei uns sonst immer so.
Rechner meinRechner = new Rechner
Und was macht diese zeile?
ergebnis.add(derArtikel)
tut sie ein komplettes objekt ( also nr,preis und name) in die liste setzen? D.h. das die liste dann viele objekte sind?Glaube hast du in deinem text bereits beantwortet ;).
Diesen abschnitt verstehe ich gar nicht:
1:
2: List<Artikel> artikelListe = alleArtikelAbrufen();
3: // Lies: Für alle Artikel aus der artikelListe
4: for(Artikel artikel: artikelListe) {
5: ....hier gibst Du artikel aus....
6: }
Kannst du mir vll erklären was das ist :).
Na ja und was mach ich dann wenn diese liste an die oberfläche zurückgegeben wurde? Wie bekomme ich das dann auf die oberfläche in ne textarea. Haben da bis jetzt nur text oder variablen "reingeschrieben". Kann man da ne ganze liste ausgeben?
LG Susi
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 20:42 Do 07.06.2007 | Autor: | piet.t |
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
>
> public List<Artikel> alleArtikelAbrufen() {
> 3: try
> 4: {
> 5: List<Artikel> ergebnis = new ArrayList<Artikel>();
> 6: String sqlAnweisung = "Select Artikelname, Preis from
> Artikel";
Hier hab ich noch einen Fehler drin: es muss natürlich "Select Artikelnummer, Artikelname, Preis.." heissen, sonst können wir die Artikelnummer ja nicht aus dem Resultset ablesen.....
> 7: PreparedStatement pStat =
> dbConn.prepareStatement(sqlAnweisung);
> 8: ResultSet rSet = pStat.executeQuery();
> 9: while(rSet.next()){
> 10: Artikel derArtikel = new Artikel();
> 11:
> derArtikel.setArtikelnummer(rSet.getInt("Artikelnummer"));
> 12:
> derArtikel.setArtikelname(rSet.getString("Artikelname"));
> 13: derArtikel.setPreis(rSet.getDouble("Preis"));
> 14: ergebnis.add(derArtikel)
> 15: }
> 16: return ergebnis;
> 17: }
>
> 1:
> 2: List<Artikel> artikelListe = alleArtikelAbrufen();
> 3: // Lies: Für alle Artikel aus der artikelListe
> 4: for(Artikel artikel: artikelListe) {
> 5: ....hier gibst Du artikel aus....
> 6: }
>
>
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>
> Muss sagen bin ein klein wenig überfordert :).
Kann ich mir vorstellen, allerdings weiß ich natürlich auch nicht so genau was Du schon kennst und was noch nicht....
>
> schon alleine das :
>
> List<Artikel> ergebnis = new ArrayList<Artikel>();
>
> versteh ich nich ganz. Muss ich da einfach nur list
> schreiben, oder was soll das <....> bedeuten? Undwarum
> steht vorne nur list und hinten arraylist?
> War bei uns sonst immer so.
> Rechner meinRechner = new Rechner
Stell Dir List einfach mal als eine Klasse vor (eigentlich ist es ein Interface, aber das mach hier nicht viel Unterschied). Ein Objekt der Klasse List ist eine Liste, die beliebige Objekte aufnehmen kann. Da in unsere Liste aber nur Artikel sollen kann man das in java5 noch zusätzlich angeben, indem man <Artikel> dazuschreibt. Also: List<Artikel> bedeutet: das hier definierte Objekt ist eine Liste von Artikeln.
Das mit der ArrayList kann gerne etwas verwirrend sein, nur soviel: eine ArrayList ist eine spezielle Sorte von Liste (leider kann man keine List-Objekte direkt erzeugen....)
>
> Und was macht diese zeile?
> ergebnis.add(derArtikel)
>
> tut sie ein komplettes objekt ( also nr,preis und name) in
> die liste setzen? D.h. das die liste dann viele objekte
> sind?Glaube hast du in deinem text bereits beantwortet ;).
Genau das!
>
>
>
> Diesen abschnitt verstehe ich gar nicht:
>
> 1:
> 2: List<Artikel> artikelListe = alleArtikelAbrufen();
> 3: // Lies: Für alle Artikel aus der artikelListe
> 4: for(Artikel artikel: artikelListe) {
> 5: ....hier gibst Du artikel aus....
> 6: }
>
Das sollten ein paar Fragmente zur Ausgabe auf die Oberfläche sein...
Zeile 2 etnspricht in etwas Deinem
meinArtikel = meineDbv.ArtikelAbrufenAnhandVonArtikelNummer(meinArtikel);
nur eben mit vielen Artikeln.
Zu Zeile 4 bis 6:
Wenn Du alle Artikel ausgeben willst, dann musst Du natürlich die Liste Artikel für Artikel durchgehen und jeden einzeln in die Textarea ausgeben. Für das Durchgehen der Liste dient die for-Schleife, das Ausgeben hatte ich mir erstmal gespart.
> Kannst du mir vll erklären was das ist :).
>
> Na ja und was mach ich dann wenn diese liste an die
> oberfläche zurückgegeben wurde? Wie bekomme ich das dann
> auf die oberfläche in ne textarea. Haben da bis jetzt nur
> text oder variablen "reingeschrieben". Kann man da ne ganze
> liste ausgeben?
Naja, eine Liste ist ja eigentlich auch nur Text, nur eben etwas länger
Spaß beiseite: Die liste kannst Du natürlich nicht direkt in die Textarea übertragen, Du musst schon für jeden Artikel eine Zeile in die Textarea stellen.
Wenn man nur die Artikelnummern ausgeben wollte sähe das etwa so aus:
1: |
| 2: | for(Artikel artikel: artikelListe) {
| 3: | // beachte: "\n" beginnt in der Ausgabe eine neue Zeile
| 4: | String ausgabeZeile = "Artikelnummer" + artikel.getArtikelnummer() + "\n"
| 5: | txaAusgabe.append(ausgabeZeile);
| 6: | }
|
Also: alle Artikel durchgehen und für jeden eine Zeile in die Ausgabe schreiben - ich denke so ähnlich wolltest Du es doch haben...
Gruß
piet
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:54 Do 07.06.2007 | Autor: | SusaSch |
Hallo
Man kann sagen > ich kann so gut wie nichts :).
Muss sagen bin ein klein wenig überfordert :).
Kann ich mir vorstellen, allerdings weiß ich natürlich auch nicht so genau was Du schon kennst und was noch nicht....
>
> schon alleine das :
>
> List<Artikel> ergebnis = new ArrayList<Artikel>();
>
> versteh ich nich ganz. Muss ich da einfach nur list
> schreiben, oder was soll das <....> bedeuten? Undwarum
> steht vorne nur list und hinten arraylist?
> War bei uns sonst immer so.
> Rechner meinRechner = new Rechner
Stell Dir List einfach mal als eine Klasse vor (eigentlich ist es ein Interface, aber das mach hier nicht viel Unterschied). Ein Objekt der Klasse List ist eine Liste, die beliebige Objekte aufnehmen kann. Da in unsere Liste aber nur Artikel sollen kann man das in java5 noch zusätzlich angeben, indem man <Artikel> dazuschreibt. Also: List<Artikel> bedeutet: das hier definierte Objekt ist eine Liste von Artikeln.
Das mit der ArrayList kann gerne etwas verwirrend sein, nur soviel: eine ArrayList ist eine spezielle Sorte von Liste (leider kann man keine List-Objekte direkt erzeugen....)
>
> Und was macht diese zeile?
> ergebnis.add(derArtikel)
>
> tut sie ein komplettes objekt ( also nr,preis und name) in
> die liste setzen? D.h. das die liste dann viele objekte
> sind?Glaube hast du in deinem text bereits beantwortet ;).
Genau das!
>
>
>
> Diesen abschnitt verstehe ich gar nicht:
>
> 1:
> 2: List<Artikel> artikelListe = alleArtikelAbrufen();
> 3: // Lies: Für alle Artikel aus der artikelListe
> 4: for(Artikel artikel: artikelListe) {
> 5: ....hier gibst Du artikel aus....
> 6: }
>
Das sollten ein paar Fragmente zur Ausgabe auf die Oberfläche sein...
Zeile 2 etnspricht in etwas Deinem
meinArtikel = meineDbv.ArtikelAbrufenAnhandVonArtikelNummer(meinArtikel);
nur eben mit vielen Artikeln.
Zu Zeile 4 bis 6:
Wenn Du alle Artikel ausgeben willst, dann musst Du natürlich die Liste Artikel für Artikel durchgehen und jeden einzeln in die Textarea ausgeben. Für das Durchgehen der Liste dient die for-Schleife, das Ausgeben hatte ich mir erstmal gespart.
> Kannst du mir vll erklären was das ist :).
>
> Na ja und was mach ich dann wenn diese liste an die
> oberfläche zurückgegeben wurde? Wie bekomme ich das dann
> auf die oberfläche in ne textarea. Haben da bis jetzt nur
> text oder variablen "reingeschrieben". Kann man da ne ganze
> liste ausgeben?
Naja, eine Liste ist ja eigentlich auch nur Text, nur eben etwas länger
Spaß beiseite: Die liste kannst Du natürlich nicht direkt in die Textarea übertragen, Du musst schon für jeden Artikel eine Zeile in die Textarea stellen.
Wenn man nur die Artikelnummern ausgeben wollte sähe das etwa so aus:
1:
2: for(Artikel artikel: artikelListe) {
3: // beachte: [mm] "\n" [/mm] beginnt in der Ausgabe eine neue Zeile
4: String ausgabeZeile = "Artikelnummer" + artikel.getArtikelnummer() + [mm] "\n" [/mm]
5: txaAusgabe.append(ausgabeZeile);
6: }
Also: alle Artikel durchgehen und für jeden eine Zeile in die Ausgabe schreiben - ich denke so ähnlich wolltest Du es doch haben...
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Damit gehts mir nicht unbedingt besser ;). Hab ne 2.1.3 version > würde mal sagen nen alten hund. Na ja das nur nebenbei.
Bei mir mochte er die list nicht(Convertierung von arraylist auf list nicht möglich). .
Also: alle Artikel durchgehen und für jeden eine Zeile in die Ausgabe schreiben - ich denke so ähnlich wolltest Du es doch haben...
Das versteh ich nicht. Ich weiß doch nicht welche artikel in der liste stehn >>oder? Ich müsste doch sonst nicht die datenbank fragen. Soweit ich das sehe kommt da ne liste wieder wo ich weder weiß wieviel noch welche artikel drinstehn.
for(Artikel artikel: artikelListe)
Und was muss hier beu Artikel artikel und artikelliste rein? Bin schon ganz verwirrt.
Sorry das ich soviele fragen stelle :(. Aber ich dachte nich das es "so schwer" ist.
LGSusi
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 16:47 Fr 08.06.2007 | Autor: | piet.t |
So, jetzt habe wir beide nochmal drüber geschlafen und ich starte einfach nochmal einen neuen Erklärungsversuch - diesmal ganz ohne ArrayList und java5 und solche Scherze, vielleicht wird es dadurch etwas verständlicher (ich hoffe es zumindest).
Zuerst wollen wir ja wieder eine Datenbank-Zugriffsmethode haben. Die alte bekam einen Artikel mit gesetzter Artikelnummer übergeben und hat diesen mit allen gesetzten Attributen zurückgegeben. Jetzt wollen wir alle Artikel aus der Datenbank haben, also brauchen wir ja schon mal keine Artikelnummer übergeben, d.h. wir sparen uns den Artikel als Übergabeparameter.
Schwieriger wird es mit der Rückgabe: wir wollen von der Funktion ja beliebig viele Artikel geliefert bekommen, sie kann aber immer nur ein Objekt zurückgeben. Die Lösung: die Funktion gibt ein Behälterobjekt zurück, in dem alle Artikelobjekte "verpackt" sind. Für solche Behälterobjekte gibt es die verschiedensten Möglichkeiten, heute probieren wir es einmal mit einem Objekt der Klasse "Vector". Ein Vector ist eigentlich auch nichts anderes als eine Liste, in der mehrere Objekte der Reihe nach aufgeführt sind.
Mit dieser Klasse sieht unsere Zugriffsmethode dann vielleicht so aus:
1: |
| 2: | //die import-Zeile braucht java um zu wisen, dass es die Standardklasse Vector nehmen soll und nicht irgendeine andere die zufällig auch so heisst
| 3: | import java.util.Vector;
| 4: |
| 5: | //hier kommt dann Deine Klassendeklaration (DBVerbindung), Attribute, andere Methoden usw....
| 6: |
| 7: | // und hier unsere Zugriffsmethode:
| 8: | // sie bekommt nichts übergeben und liefert einen Vector zurück
| 9: | public Vector alleArtikelAbrufen() {
| 10: | //erstmal legen wir unser Vector-Objekt an, um dann die Artikel reinlegen zu können
| 11: | Vector ergebnisVector = new Vector();
| 12: |
| 13: | // Den try brauchen wir, um SQL-Fehler fangen zu können...
| 14: | try {
| 15: | // Dann die sql-Anweisung: Für alle Artikel aus der Datenbank Artikelnummer, Artikelname und Preis lesen
| 16: | String sqlAnweisung = "Select Artikelnummer, Artikelname, Preis from Artikel";
| 17: | // Das SQL-Statement an die Datenbank geben und ausführen.
| 18: | // dadurch bekommen wir ein ResultSet mit den gelesenen Werten
| 19: | PreparedStatement pStat = dbConn.prepareStatement(sqlAnweisung);
| 20: | ResultSet rSet = pStat.executeQuery();
| 21: |
| 22: | // Jetzt müssen wir solange jeweils die nächste Zeile aus dem ResultSet
| 23: | //auslesen, bis es keine weitere Zeile mehr gibt (d.h. bis next() false zurückliefert)
| 24: | while(rSet.next()) {
| 25: | //Pro Datenbankzeile müssen wir ein neues Artikelobjekt anlegen
| 26: | Artikel einArtikel = new Artikel();
| 27: | //und dann noch die Werte aus der Datenbank reinschreiben
| 28: | einArtikel.setArtikelnummer(rSet.getInt("Artikelnummer"));
| 29: | einArtikel.setArtikelname(rSet.getString("Artikelname"));
| 30: | einArtikel.setPreis(rSet.getDouble("Preis"));
| 31: | //Nachdem das Artikelobjekt jetzt so aussieht wie es soll können wir es
| 32: | // im Vector ablegen
| 33: | ergebnisVector.add(einArtikel);
| 34: | } //hier ist die while-Schleife zu Ende, weiter geht es erst wenn alle Einträge im ResultSet abgearbeitet sind
| 35: |
| 36: | } catch(Exception e){
| 37: | // TODO hier rein kommt die Fehlerbehandlung...
| 38: | }
| 39: |
| 40: | // Nachdem jetzt alle Artikel-Objekte im Vector liegen geben wir den an den Aufrufer zurück...
| 41: | return ergebnisVector;
| 42: | }
|
So viel erstmal zum Datenbank auslesen. Jetzt muss das ganze noch irgendwie an die Oberfläche...
1: |
| 2: | // Den Teil solltest Du schon kennen...
| 3: | meineDbv.verbindeMitAccess();
| 4: | // Hier kommt eine neue Zeile, in der wir die neue Lesemethode aufrufen
| 5: | Vector ergebnisVector = meineDbv.alleArtikelAbrufen();
| 6: | meineDbv.beendeVerbindung();
| 7: |
| 8: | // Vielleicht machen wir noch eine hübsche Überschrift...
| 9: | txaAusgabe.setText("Liste aller Artikel:\n");
| 10: |
| 11: | // Jetzt wird es spannend: wir müssen einen Artikel nach dem anderen aus
| 12: | // dem ergebnisVector holen und jeweils in die TextArea schreiben
| 13: | // Der einfachheit halber machen wir das mal über eine Zählschleife:
| 14: | // Zähle i so lange hoch, bis die Größe des Vectors erreicht ist
| 15: | for(int i = 0;i<ergebnisVector.size();i++) {
| 16: | // Den Artikel an der i-ten Position aus dem Vector holen.
| 17: | // Da java nicht weiss, dass in dem Vector nur Artikel-Objekte stehen
| 18: | // muss man ihm das sagen, indem man (Artikel) hinter das = schreibt
| 19: | Artikel einArtikel = (Artikel)ergebnisVector.get(i);
| 20: | // und jetzt kann man irgendwelchen Text zum Artikel in dei Textarea schreiben...
| 21: | txaAusgabe.append("Artikel Nr " + einArtikel.getArtikelnummer() + " kostet " + einArtikel.getPreis() + " Euro. \n");
| 22: | } // hier endet die for-Schleife
|
So, ich hoffe damit geht es etwas besser...
Gruß
piet
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 14:04 Sa 09.06.2007 | Autor: | SusaSch |
Hallo
Vielen dank für deine mühe > habs denk ich jetzt größtenteils verstanden :). Werde es gleich mal ausprobieren.
Kennst du vll gute i net seiten oder bücher, womit man sich das gut selbst beibringen kanne?
LG Susi
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 16:23 Sa 09.06.2007 | Autor: | piet.t |
Hmm, den absoluten Volltreffer habe ich da jetzt leider nicht zu bieten.
Das einzige, was mir so spontan einfällt wäre "Java ist auch eine Insel", das gibt's als Online-Version hier.
Ansonsten lasse ich das mal als "teilweise beantwortet" stehen, vielleicht verirrt sich dann ja noch jemand anders hierher und hat noch ein paar Vorschläge.
Gruß
piet
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 18:19 Sa 09.06.2007 | Autor: | SusaSch |
Hi
Hab mich gerade an einer nummer schwieriger versucht und bin kläglich gescheitert. Wollte drei textfelder in die man artikelnummern eingeben kann.Ein button. Ausgespukt werden sollen nachher name und preis. Hab zwar was getippt erscheint mir aber zu umständlich und funktioniert auch nicht. Kannst du vll mal schaun wie man es hätte besser machen müssen?
OF
//Soviele Artikel kann nicht richtig sein oder?
Artikel meinArtikel = new Artikel();
Artikel meinArtikel1 = new Artikel();
Artikel meinArtikel2 = new Artikel();
Artikel meinArtikel3 = new Artikel();
Vector meinVector = new Vector();
int iArtikelnummer =Integer.parseInt(txtArtikel1.getText());
meinArtikel1.setArtikelnummer(iArtikelnummer);
meinVector.add(meinArtikel1);
iArtikelnummer = Integer.parseInt(txtArtikel2.getText());
meinArtikel2.setArtikelnumme(iArtikelnummer);
meinVector.add(meinArtikel2);
iArtikelnummer =Integer.parseInt(txtArtikel3.getText());
meinArtikel3.setArtikelnummer(iArtikelnummer); meinVector.add(meinArtikel3);
meineDbv.verbindeMitAccess();
meinVector = meineDbv.abfrageVonBestimmtenArtikeln(meinVector);
meineDbv.beendeVerbindung();
for (int i = 0; i < meinVector.size(); i++)
{
meinArtikel =(Artikel) meinVector.get(i);
txaAusgabe.append("Artikel Nr "+meinArtikel.getArtikelnummer() + " kostet " + meinArtikel.getPreis() + " Euro. [mm] \n"); [/mm]
}
DBV
public Vector abfrageVonBestimmtenArtikeln(Vector meinVector)
{
try
{
for (int i = 0; i < meinVector.size(); i++)
{
Artikel meinArtikel = (Artikel)meinVector.get(i);
String sqlAnweisung = "Select Preis from Artikel where Artikelnummer =?";
PreparedStatement pStat = dbConn.prepareStatement(sqlAnweisung);
pStat.setInt(1,meinArtikel.getArtikelnummer());
ResultSet rSet = pStat.executeQuery();
if(rSet.next())
{
meinArtikel.setArtikelnummer(rSet.getInt("Artikelnummer"));
meinArtikel.setArtikelname(rSet.getString("Artikelname"));
meinArtikel.setPreis(rSet.getDouble("Preis"));
meinVector.add(meinArtikel);
}
}
}
catch (Exception e)
{
System.out.println("Fehler");
}
return meinVector;
}
LG Susi
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:57 Sa 09.06.2007 | Autor: | piet.t |
> Hi
> Hab mich gerade an einer nummer schwieriger versucht
Na, Du traust Dich was....
> und bin kläglich gescheitert. Wollte drei textfelder in die man
> artikelnummern eingeben kann.Ein button. Ausgespukt werden
> sollen nachher name und preis. Hab zwar was getippt
> erscheint mir aber zu umständlich und funktioniert auch
> nicht. Kannst du vll mal schaun wie man es hätte besser
> machen müssen?
Ich will's mal versuchen...
Mal schauen, was ich so auf die Schnelle sehe. Genauer wird es natürlich, wenn Du noch sagst was eigentlich genau schiefgeht....
>
> OF
>
> //Soviele Artikel kann nicht richtig sein oder?
> Artikel meinArtikel = new Artikel();
> Artikel meinArtikel1 = new Artikel();
> Artikel meinArtikel2 = new Artikel();
> Artikel meinArtikel3 = new Artikel();
...den ersten Artikel den Du da anlegst verwendest Du ja später nicht mehr, also könntest Du Dir den sparen. Aber nach dem Verfahren, wei Du Deine Datenbankmethode aufrufst musst Du wirklich 3 Artikelobjekte anlegen. Etwas elegatner wird das natürlich, wenn man die ganze Abhandlung in einer Schleife macht, aber dann müsste man auch die Textfelder wieder in eine Tabelle packen und das sparen wir uns lieber mal....
> Vector meinVector = new Vector();
> int iArtikelnummer
> =Integer.parseInt(txtArtikel1.getText());
> meinArtikel1.setArtikelnummer(iArtikelnummer);
> meinVector.add(meinArtikel1);
> iArtikelnummer = Integer.parseInt(txtArtikel2.getText());
> meinArtikel2.setArtikelnumme(iArtikelnummer);
> meinVector.add(meinArtikel2);
> iArtikelnummer =Integer.parseInt(txtArtikel3.getText());
> meinArtikel3.setArtikelnummer(iArtikelnummer);
> meinVector.add(meinArtikel3);
So weit sieht es schon mal gut aus...
> meineDbv.verbindeMitAccess();
> meinVector =
> meineDbv.abfrageVonBestimmtenArtikeln(meinVector);
> meineDbv.beendeVerbindung();
> for (int i = 0; i < meinVector.size(); i++)
> {
> meinArtikel =(Artikel) meinVector.get(i);
> txaAusgabe.append("Artikel Nr
> "+meinArtikel.getArtikelnummer() + " kostet " +
> meinArtikel.getPreis() + " Euro. [mm] \backslash [/mm] n");
>
> }
...und auch daran habe ich jetzt erstmal nichts auszusetzen
>
>
> DBV
> public Vector abfrageVonBestimmtenArtikeln(Vector
> meinVector)
> {
>
> try
> {
>
> for (int i = 0; i < meinVector.size(); i++)
...den folgenden Block durchlläufst Du also für jeden übergebenen Artikel. Das finde ich richtig gut, denn so kann man die Funktion nicht nur mit 3 sondern auch mit 17 oder 367 Artikeln aufrufen....
> {
>
>
> Artikel meinArtikel = (Artikel)meinVector.get(i);
> String sqlAnweisung = "Select Preis from Artikel where
> Artikelnummer =?";
> PreparedStatement pStat =
> dbConn.prepareStatement(sqlAnweisung);
Den Teil mit der SQL-Anweisung und dem Prepared Statement sollte man besser vor der Schleife machen. Dein SQL ist ja immer das gleiche, nur der Abfrageparameter ändert sich jedesmal. D.h. man kann für jeden Artikel das gleiche PreparedStatement-Objekt verwenden, das ist gerade der Unterschied zwischen PreparedStatement und Statement. So funktioniert es auch, ist aber etwas langsamer (was bei 3 Artikeln nicht so schlimm ist, bei 30000 würde man aber schon was merken).
> pStat.setInt(1,meinArtikel.getArtikelnummer());
> ResultSet rSet = pStat.executeQuery();
> if(rSet.next())
> {
>
> meinArtikel.setArtikelnummer(rSet.getInt("Artikelnummer"));
...die Artikelnummer von meinArtikel ist ja eigentlich schon gesetzt, das hast Du schon in der Methode der Oberfläche erledigt. Hier kannst Du es Dir eigentlich sparen, aber kaputt machst Du damit eigentlich nichts.
>
> meinArtikel.setArtikelname(rSet.getString("Artikelname"));
> meinArtikel.setPreis(rSet.getDouble("Preis"));
> meinVector.add(meinArtikel);
An dieser Zeile habe nun doch noch was auszusetzen. Du kommst in die Methode mit einem Vector mit 3 Artikeln. Für jeden dieser Artikel füllst Du jetzt die restlichen Felder aus der Datenbank und hängst ihn anschließend nochmal hinten an den Vector. Warum denn, eigentlich ist der Artikel ja schon drin....
Das Ergebnis ist, dass Dein Vector am Ende 6 Einträge hat: Die 3 Artikel die Du übergeben hast und dann nochmal die selben 3 Artikel hinterher...
> }
>
> }
>
>
>
> }
> catch (Exception e)
> {
> System.out.println("Fehler");
Wenn etwas schiefgeht wäre es natürlich praktisch, hier etwas mehr Information zu haben als nur "Fehler". Ein "e.printStackTrace()" ist hier u.U. angebracht.
> }
> return meinVector;
> }
>
Also im großen und ganzen finde ich das sieht nicht schlecht aus - bis auf das Problem mit den doppelten Artikeln im Vector. Bis auf die Einschränkung, dass am Ende 6 Artikel ausgegeben werden müsste es m.E. auch funktionieren. Aber wie gesagt, wenn Du noch sagst was Dich stört bzw. die entsprechende Fehlermeldung oder Exception postest kann man dem genauer nachgehen.
Gruß
piet
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 19:06 Sa 09.06.2007 | Autor: | SusaSch |
hi
Das problem ist, dass er zwar die artikelnummern ausspukt > aber für jeden artikel den preis null angibt. das stimmt aber nicht.
actionPerformed()
Odbc-Treibername in Ordnung
Verbindung hergestellt
Fehlerjava.sql.SQLException: Column not found
Verbindung beendet
LG Susi
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 19:52 Sa 09.06.2007 | Autor: | piet.t |
>
> actionPerformed()
> Odbc-Treibername in Ordnung
> Verbindung hergestellt
> Fehlerjava.sql.SQLException: Column not found
...irgendeine Spalte der Datenbanktabelle scheint nicht zu passen. Prüfe nochmal, ob die Schreibweise von "Preis" und "Artikelnummer" im SQL-Befehl und in der Datenbank auch genau gleich ist (Tippfehler?). sonst weiss ich jetzt auch nicht....
Der Fehler passt auf jeden Fall zu Deiner Beschreibung: das prepareStatement() wirft eine Exception, die fängst Du dann am Ende der Methode auf und der Vector kommt wieder genau so zurück, wie Du ihn übergeben hattest: nur mit Artikelnummern, ohne Preis.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 20:09 Sa 09.06.2007 | Autor: | SusaSch |
Hallo
Is irgendwie komisch. Habe alles kontrolliert > hat übereingestimmt. Nun habe ich eben eine sql anweisung von weiter oben runterkopiert und die einschränkung drangehängt > jetzt gehts :). Er wollte mich wohl ärgern.
Wieder vielen dank. Mir wird in den nächsten tagen sicher wieder was neues einfallen :).
LG susi
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 09:35 So 10.06.2007 | Autor: | SusaSch |
Morgen :)
Lange hat es ja nicht gedauert ;). Hab auch nur eine kurze frage. Du hast doch gestern gemeint, dass es eleganter ginge, wenn man die textfelder in ne liste packt und ne schleife macht. Da ich das gerne heute mittag mal ausprobieren mag wollte ich fragen ob man txt´s auch in einen vector packen kann.
LG Susi
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 12:10 So 10.06.2007 | Autor: | piet.t |
Ja, in einen Vector kann man jede Sorte Objekt reinpacken - zur Not auch alle möglichen Sorten durcheinander, allerdings wird dann das Handling ziemlich unschön.
Zu beachten ist allerdings., dass beim Aufruf von get() immer erstmal angenommen wird, dass ein Object zurückkommt. Wenn man einen anderen Objekttyp hat und den auch passend verwenden will muss man also erst einen "Typcast" ausführen, d.h. java sagen von welcher Klasse dieses Objekt ist. Das haben wir mit den Artikeln ja schon gemacht, mit anderen Objekttypen get es so ähnlich. Einfach
(Klassenname)
vor den Aufruf der get()-Methode schreiben. Ein Beispiel für einen String:
String stringAusVector = (String)einVector.get(0);
Viel Erfolg!
P.S.: Für die nächsten Fragen solltest Du vielleicht mal einen neuen thread aufmachen, in der Gesamtansicht werden die Artikel jetzt schon ziemlich schmal....
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 12:28 So 10.06.2007 | Autor: | SusaSch |
wird gemacht :).
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 13:43 So 10.06.2007 | Autor: | SusaSch |
hi
Also dieser versuch is noch kläglicher gescheiter als der davor ;)> schon an der überlegnung. Ich weiß nich genau wie das mit der schleife funktionieren soll.
Hatte jetzt gedacht:
Textfelder in den vector packen
> Schleife schreiben, die in jeder runde das textfeld an der jeweiligen position im vector ausliest, in ein objekt packt und dann wieder in den vector schreibt.
> aber das ist quatsch und funktioniert auch nicht :(.
Kannst du bitte mal versuchen in wenigen worten zu erklären, was die schleife tun soll?
Lg susi
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 14:38 So 10.06.2007 | Autor: | piet.t |
Das wichtigste ist denke ich, dass Du auf jeden Fall 2 verschiedene Vektoren verwenden solltest - einen für die Textfelder und einen für die Artikel (sonst wird es wie gesagt bestimmt hässlich).
Dern Textfeld-Vektor müsstest Du dann ja schon beim erstellen der Oberfläche bestücken, der Artikel-Vektor sollte vor jedem Schleifendurchlauf leer sein (notfalls cor der Schleife noch artikelVector.clear() aufrufen).
In der Schleife dann einfach den Textfeld-Vektor durchgehen und für jeden Eintrag das Textfeld auslesen und wenn was drinsteht ein Artikelobjekt anlegen, die Artikelnummer bestücken und den Artikel dem Artikelvektor hinzufügen. Mehr sollte es eigentlich nicht sein.
Gruß
piet
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:40 So 10.06.2007 | Autor: | SusaSch |
hallo
Also meine variante funktioniert leider nicht ganz. D.h. er spuckt 3 mal die gleiche zeile aus(von dem artikeln dessen nr ins dritte feld eingegeben wurde). Da ich sowas noch nie gemacht habe, weiß ich auch gar nicht obs so geht:). Vll findest du ja was.
Vector txtvector = new Vector();
Vector artikelVector = new Vector();
Artikel meinArtikel = new Artikel();
txtvector.add(txtArtikel1);
txtvector.add(txtArtikel2);
txtvector.add(txtArtikel3);
for (int i = 0; i < txtvector.size(); i++)
{
TextField meinTextfeld = new TextField();
meinTextfeld =(TextField)txtvector.get(i);
int iArtikelnummer =Integer.parseInt(meinTextfeld.getText());
meinArtikel.setArtikelnummer(iArtikelnummer);
artikelVector.add(meinArtikel);
}
meineDbv.verbindeMitAccess();
artikelVector = meineDbv.abfrageVonBestimmtenArtikeln(artikelVector);
meineDbv.beendeVerbindung();
for (int i = 0; i < artikelVector.size(); i++)
{
meinArtikel =(Artikel) artikelVector.get(i);
txaAusgabe.append("Artikel Nr " + meinArtikel.getArtikelnummer() + " kostet " + meinArtikel.getPreis() + " Euro. [mm] \n"); [/mm]
}
LG Susi
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 17:14 So 10.06.2007 | Autor: | piet.t |
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
> hallo
>
> Also meine variante funktioniert leider nicht ganz. D.h. er
> spuckt 3 mal die gleiche zeile aus(von dem artikeln dessen
> nr ins dritte feld eingegeben wurde). Da ich sowas noch
> nie gemacht habe, weiß ich auch gar nicht obs so geht:).
> Vll findest du ja was.
>
>
> Vector txtvector = new Vector();
> Vector artikelVector = new Vector();
> Artikel meinArtikel = new Artikel();
Wenn Du das Artikel-Objekt hier erzeugst, dann kreigst Du natürlich nur eines, wir brauchen aber 3 Stück => das new Artikel() muss in die Schleife!
> txtvector.add(txtArtikel1);
> txtvector.add(txtArtikel2);
> txtvector.add(txtArtikel3);
>
> for (int i = 0; i < txtvector.size(); i++)
> {
> TextField meinTextfeld = new TextField();
Die Textfeld-Objekte hast Du ja schon vorher angelegt, d.h. new() kannst Du Dir hier sparen(würde aber nicht schaden). Allerdings musst Du ja noch die Referenz "meinTextfeld" definieren. Also lieber so:
TextField meinTextfeld;
> meinTextfeld =(TextField)txtvector.get(i);
> int iArtikelnummer
> =Integer.parseInt(meinTextfeld.getText());
> meinArtikel.setArtikelnummer(iArtikelnummer);
> artikelVector.add(meinArtikel);
Wie gesagt, wir haben nur 1 Artikelobjekt angelegt. Für dieses ändern wir jetzt in jedem Schleifendruchlauf die Artikelnummer ab und stellen jedesmal das selbe Objekt in die Liste.
Für jeden Textfeld-Eintrag soll aber ein neues Artikel-Objekt erzeugt werden, d.h. nach dem parseInt().... solte noch folgendes stehen:
meinArtikel = new Artikel();
>
> }
>
> meineDbv.verbindeMitAccess();
>
> artikelVector =
> meineDbv.abfrageVonBestimmtenArtikeln(artikelVector);
> meineDbv.beendeVerbindung();
>
> for (int i = 0; i < artikelVector.size(); i++)
> {
> meinArtikel =(Artikel) artikelVector.get(i);
> txaAusgabe.append("Artikel Nr " +
> meinArtikel.getArtikelnummer() + " kostet " +
> meinArtikel.getPreis() + " Euro. [mm]\n");[/mm]Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
>
> }
> LG Susi
Sonst müsste alles passen!
Gruß
piet
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:52 So 10.06.2007 | Autor: | SusaSch |
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Ja jetzt gehts danke.
txtvector.add(txtArtikel1);
> txtvector.add(txtArtikel2);
> txtvector.add(txtArtikel3);
>
> for (int i = 0; i < txtvector.size(); i++)
> {
> TextField meinTextfeld = new TextField();
Die Textfeld-Objekte hast Du ja schon vorher angelegt, d.h. new() kannst Du Dir hier sparen(würde aber nicht schaden). Allerdings musst Du ja noch die Referenz "meinTextfeld" definieren. Also lieber so:
TextField meinTextfeld;
> meinTextfeld =(TextField)txtvector.get(i);
> int iArtikelnummer
> =Integer.parseInt(meinTextfeld.getText());
> meinArtikel.setArtikelnummer(iArtikelnummer);
> artikelVector.add(meinArtikel);
Wo habe ich denn die textfeldobjekte angelegt? Versteh nich wann man das mit new() und wann man das nich machen muss. Also ich habe nichts getippt das ein textfeldobjekt angelegt hätte *kopfkraz*.
LG Susi
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 19:51 So 10.06.2007 | Autor: | piet.t |
>
> Wo habe ich denn die textfeldobjekte angelegt? Versteh nich
> wann man das mit new() und wann man das nich machen muss.
> Also ich habe nichts getippt das ein textfeldobjekt
> angelegt hätte *kopfkraz*.
>
Jetzt kommt wieder mein Problem, dass ich von der Erstellung von Oberflächen eigentlich keinen Schimmer habe....
Wie habt Ihr denn Eure Oberflächen erzeugt? Nachdem was Du schreibst gehe ich mal davon aus, dass Du die Anwendung irgendwie über die Eclipse-Oberfläche "zusammengeklickt" hast. Dann hat die Befehle zum erstellen der Textfelder der Eclipse-Codegenerator erzeugt.
Aber da müssen Sie ja schon sein, weil Du ja txtArtikel1 usw. schon dem Vector hinzugefügt hast - das könnte man zwar auch machen wenn hinter den Namen keine Objekte hängen, wäre aber ziemlich sinnlos.
Um zu wissen wann man den new-Operator verwenden muss und wann nicht muss man sich nochmal den Unterschied zwischen einem Objekt und einer Objektreferenz klarmachen. Ein Objekt ist erstmal eine Instanz einer Klasse, die irgendwo im Speicher herumschwimmt. Da man die Objekte da nicht so einfach finden kann braucht man noch Wegweiser, die einem sagen, wo man das Objekt findet. Das sind dann die Objektreferenzen.
Hier mal ein bisschen Beispielcode mit der Klasse Hund....
1: | new Hund("Hasso");
| 2: | Hund einHund = new Hund("Waldi");
| 3: | Hund derselbeHund = einHund;
| 4: | derselbeHund.getName();
| 5: | Hund einAndererHund = new Hund("Fiffi");
| 6: | derselbeHund = einAndererHund;
| 7: | derselbeHund.getName();
|
Zeile 1 erzeugt ein Hundeobjekt mit Namen "Hasso" (beachte: Hundename ist hier so ähnlich zu verstehen wie euer Artikelname, nicht mit dem Namen der Refernz verwechseln). Allerdings werden wir diesen Hund nie mehr finden, da wir keinen Wegweiser darauf gebildet haben.
In Zeile 2 erzeugen wir einen neuen Hund "Waldi". Um den wiederfinden zu können merken wir uns seinen Speicherort unter der Bezeichnung "einHund". Also "einHund" ist die Referenz auf das Hundeobjekt "Waldi".
Zeile 3 erzeugt keinen neuen Hund. Wir bauen nur einen zusätzlichen Wegweiser "derselbeHund" auf, der aber auch wieder zum Hund "Waldi" führt.
Preisfrage: was passiert jetzt in den Zeilen 5 und 6? Wenn wir den Hundenamen über getName() abrufen können, was liefert dann der Aufruf von derselbeHund.getName() in Zeile 4 und was in Zeile 7? Warum?
Wenn Du das alles verstanden hast, dann sollte auch das new für dich kein Problem mehr sein: new brauchst Du immer dann, wenn Du ein neues Objekt anlegen willst. Wenn Du nur einen neuen Wegweiser bauen möchtest, dann ist new nicht nötig.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:12 So 10.06.2007 | Autor: | SusaSch |
Hallöle
Ja genau haben das bis jetzt immer zusammengeklickt. D.h. also er erzeugt selber die testfelder. Dank deiner erklärung blick ichs jetzt aber auch :). Kann dir gar nicht genug danken.
Ich merk mir das jetzt einfach mit familien und hausnummern.
Familie HausNr1 = new Familie();
Am Anfang schafft man eine Familie
;)(Objekt) und steckt sie in ein haus mit einer bestimmten hausnummer (referenz). Zieht die familie um (Wechselt speicherort), wechselt sich nur die hausnummer > eine neue familie muss man na klar nich erschaffen.
Familie HausNr2 = HausNr1
Nu is die familie umgezogen bzw was in dem einen speicherort stand is in einen anderen umgezogen > richtig?
Das heißt das mein txtArtikel1 > der speicherort ist.
txtvector.add(txtArtikel1);
> txtvector.add(txtArtikel2);
> txtvector.add(txtArtikel3);
hier nimmt er jeweils die textfelder(Objekte) aus ihrem speicherort(hausnummer) und tut die textfelder in eine liste. > Sind dann die alten Speicherorte txtArtikel1... usw leer?
TextField meinTextfeld;
meinTextfeld =(TextField)txtvector.get(i);
Und hier kommen die textfelder(Objekte) aus der liste wieder und bekommen einen neuen Speicherort (ziehen in ein neues haus ;).
LG Susi
LG Susi
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 21:39 So 10.06.2007 | Autor: | piet.t |
Damit bist Du schon dicht dran, aber das ist es noch nicht ganz. Familien ziehen nur sehr ungern um, d.h. man lässt sie möglichst im gleichen Haus (sprich: am gleichen Speicherort). Aber sagen wir mal, man kann mit der Familie nur telefonisch in Kontakt treten. Dann wäre die Referenz sozusagen eine Telefonnummer, unter der ich das Objekt erreichen kann. Dann passen auch manche Sachen besser ins Bild: eine Familie kann durchaus auch unter mehreren Telefonnummern erreichbar sein - wenn sie eine neue Nummer bekommt ist die alte deshalb noch nicht automatisch ungültig.
Also: txtArtikel1 ist eine Telefonnummer, unter der Du ein bestimmtes Tetfeld erreichen kannst und über diese Nummer kannst Du auch die Methoden des Textfelds ansprechen (txtArtikel1.getText()).
Und innerhalb der Schleife zum Aulesen der Textfelder vergibst Du eine "wandernde" Telefonnummer:
Durch
meinTextfeld =(TextField)txtvector.get(i);
teilst Du die Numer "meinTextfeld" dem Feld zu, das Du gerade aus dem Vector geholt hast. Egal ob es das erste, das zweite oder das dritte ist: über meinTextfeld sprichst Du immer das gerade aktuelle Textfeld an. Das ist vielleicht vergleichbar mit einem Diensthandy im Bereitschaftsdienst: Das Handy wird immer weitergegeben, so dass man den aktuell diensthabenden immer unter dieser Nummer erreichen kann, auch wenn man nicht weiss, wer das gerade ist.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 21:47 So 10.06.2007 | Autor: | SusaSch |
oki dann dürfen die familien eben bleiben wo sie sind :)
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:46 Mo 11.06.2007 | Autor: | SusaSch |
Die nervensäge mal wieder :)
Ich muss leider sagen,dass nachdem ich nochmal drüber geschlafen habe ich das ganze doch noch immer nicht verstehe. BZw ich denke das das ein grundlegendes problem ist> ich denke das ich auch andere sachen anders verstanden habe (laut erklärung des lehrers ) als sie eigentlich sind. Das macht mir jetzt probleme > weil das ganze jetzt nicht mehr zusammenpasst. Also falls es dir nicht zuviel wird, würde ich am liebsten nochmal recht am anfang anfangen. Mir macht es nämlich keinen spaß zu pogrammieren, wenn ich weiß das ich nicht weiß was im hintergrund abläuft.
Also. Fangen wir mal bei den variablen an. Am anfang durften wir immer reihenweise attribute anlegen und set und get methoden schreiben. Die frage die ich mir stelle ob auch variablen nur telefonnummern haben.
private double preis;
public double setPreis(double preisEingabe)
{
preis = preisEingabe;
}
Das mal als bsp. Unser lehrer hat uns das damals so erklärt:
Variablen sind wie eimer. double is der datentyp der in den eimer gewofen werden kann. Preis ist der name des eimers. Man tippt also nun eine zahl ein, die dann im eimer mit dem namen PreisEingabe geworfen wird. Im weiteren schritt > preis = preisEingabe> wird die Zahl aus dem einen eimer rausgeholt und in den anderen reingeschmissen.
Ich denke aber nachdem wir das mit den telefonnummern usw besprochen haben, kann das doc nicht ganz stimmen. Sind diese referenzen denn jetzt eimer oder nur wegweiser. Und sind die variablen auch nur wegweiser oder eimer ;). oder so? Ich bin verwirrt.
Daher auch die sache mit dem umziehen. ich war immer der meinung das die daten ihren speicherort(eimer) wechseln.
Hoffe es hängt dir nich schon aus den "ohren raus".
LG Susi > die die hoffnung hat das irgendwann licht ins dunkel kommt.
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 14:54 Di 12.06.2007 | Autor: | jerry |
Hallo,
ich hoffe du hast nichts dagegen, dass ich hier mal mit einspringe =)
Also in Java musst du unterscheiden zwischen einfachen Datentypen und Klassen die du selbst geschrieben hast.
int, double, char,... sind einfache Datentypen.
String, Klasse1, Klasse2 sind "normale" Datentypen (mir fällt grad kein Fachbegriff ein =)
Das heißt letztlich dass deine Vorstellung von Hausnummern für Objekte immer noch gültig ist.
Nur bei einfach Datentypen mit zB. nur 2 Byte Größe, macht es keinen Sinn eine Referenz zusätzlich zu speichern, denn eine Referenz benötigt auch (soweit ich weiß) 2 Byte. Somit ergibt sich hier kein wirklicher Vorteil. Es sind letztlich dann nur Variablen, keine wirklichen Objekte. Diese einfachen Typen gab es bereits in allen Programmiersprachen auch wenn sie nicht objektorientiert sind.
Hoffe ich hab alles richtig und verständlich beschrieben.
Gruß jerry
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:46 Di 12.06.2007 | Autor: | SusaSch |
Hallo
Klar darfst du dich mit einmischen :) . WIr sind aber inzwischen auf die ebene mit hunde- haus und telefonnummer beispielen gesunken. Deine bytes überfordern mich da ziemlich ;).
Trotzdem danke.
LG Susi
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 17:57 Di 12.06.2007 | Autor: | piet.t |
Hallo,
im Prinzip hat jerry das schon alles zutreffend beschrieben, ich lasse jetzt einfach mal die Bytes raus :-D
In java gibt es einen festen Bestand an sogenannten primitiven Datentypen. Das sind die Typen boolean, char, byte, short, int, long, float und double. Das sind sozusagen die "Atome" der Datenhaltung in java. für die stimmt auch das ild mit den Eimern: jeder Eimer hat genau einen Wert als Inhalt und der Inhalt kann nur über den einen Bezeichner angesprochen werden (sprich: was ich in einem Eimer verändere tut erstmal nix am Inhalt eines anderen Eimers).
Wenn man möchte kann man aus diesen Datentypen dann noch Tabellen bauen (sogenannte arrays). Z.B. wäre int[8] eine Tabelle mit 8 Einträgen vom Typ int. Auc hier passt das Bild vom Eimer.
Die Stärke von java ist aber, dass man diese Atome zu komplexeren Gebilden zusammensetzen und noch mit bestimmten Verhaltensweisen ausstatten kann: das sind dann die berühmten Klassen. Wo ein einfaches Datum noch gut in einen Eimer passt, da reicht dieser für ein Objekt einer komplexen Klasse nicht mehr aus (ist zwar so nicht ganz richtig, aber das Bild gefällt mir gerade).
Wenn man also mit Objekten arbeiten will, dann steckt man die in einen etwas komplizierteren Behälter und verpasst ihnen einen Telfeonanschluss, unter dem man sie erreichen kann - das ist dann unsere Objektreferenz. Der Unterschied ist im wesentlichen folgender: ein und dasselbe Objekt kann wie schon gesagt über verschiedene Referenzen bedient werden. Nimmt man über eine Referenz eine Änderung an diesem Objekt vor (beachte: man ändert das Objekt und ändert nicht die Referenz, so dass sie auf ein anderes Objekt zeigt), dann sieht man diese Ändernug auch über die andere Referenz. Wären auch die Objektreferenzen einfach Eimer, dann wäre ein Objekt in mehreren Eimern und das klappt nicht so ganz.
Um das ganze mal in ein Gesamtbild zu packen:
Unsere primitiven Datentypen sind Eimer. Wenn wir jetzt eine Klasse programmieren und ein Objekt dieser Klasse erzeugen, dann bilden wir sozusagen eine ganze Menge von Eimern und stellen gleichzeitig noch eine Person ein, die für die Verwaltung dieser Eimer zuständig ist. Und weil wir diese Person nicht direkt ansprechen dürfen drücken wir ihr noch ein Handy(oder auch mehrere) in die Hand. Man kann dem Verwalter dann z.B. telefonisch mitteilen, dass er bitte einen bestimmten Wert in einen Eimer werfen soll (Artikel.setPreis(38.50)) oder er möchte doch bitte mal nachschauen, was sich in dem Eimer xy befindet (Artikel.getPreis()).
Also: die Eimer sind noch da, aber wir bedienen sie nicht mehr direkt. Und unseren Bediener erreichen wir eben nur per Telefon.
Der Vergleich hinkt zwar bestimmt an ein paar Stellen, aber das wichtigste sollte rüberkommen.
Gruß
piet
P.S.: Wie Du vielleicht gemerkt hast kommt String bei den primitiven Datentypen nicht vor. Das liegt daran, dass String auch eine Klasse ist die vor allem aus vielen char-Eimern besteht und uns von den Machern von java freundlicherweise bereits mitgeliefert wurde.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 18:07 Di 12.06.2007 | Autor: | SusaSch |
Hey
Du solltest mal ein buch schreiben über eimer handys und hunde :).
Heißt das, dass wenn man diese set methode nimmt:
private double preis;
public void setPreis(dounle preisEingabe)
{
preis = preisEingabe;
}
> die daten im speicher wirklich den platz wechslen. Also aus dem einen eimer raus und in den anderen rein? Weil es ja eben bei den objekten nur neue wegweiser sind.
LG Susi
Ps. Das mit String hab ich mir schon gedacht(wird ja als einziges von denen groß geschrieben)
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 18:59 Di 12.06.2007 | Autor: | piet.t |
> Hey
> Du solltest mal ein buch schreiben über eimer handys und
> hunde :).
> Heißt das, dass wenn man diese set methode nimmt:
>
>
> private double preis;
> public void setPreis(dounle preisEingabe)
> {
> preis = preisEingabe;
> }
>
> > die daten im speicher wirklich den platz wechslen. Also aus
> dem einen eimer raus und in den anderen rein? Weil es ja
> eben bei den objekten nur neue wegweiser sind.
>
>
> LG Susi
>
> Ps. Das mit String hab ich mir schon gedacht(wird ja als
> einziges von denen groß geschrieben)
>
Die Frage hab ich jetzt nicht so ganz verstanden....
Es gibt einen Eimer preisEingabe und es gibt den Eimer preis, der der Klasse gehört. wenn man jetzt sagt
preis=preisEingabe;
bedeutet das soviel wie: fülle den Inhalt des rechten Eimers in den linken Eimer. So weit so gut, nur hört da das Bild von den Eimern leider schon wieder auf, weil der rechte Eimer dadruch nicht geleert wird - der hat immer noch den gleichen Inhalt. D.h. die Daten bewegen sich nicht sondern der Inhalt von preisEingabe wird kopiert und an die Stelle von preis geschrieben.
Achtung: preis ist ein Eimer und hat als solcher einen festen Platz. "Wegweiser" sind nur Objektreferenzen, also solche die auf ein Objekt zeigen.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 19:08 Di 12.06.2007 | Autor: | SusaSch |
Langsam kommen wir der antwort ja auf die spur. Meine frage war eben gerade die, ob der eine eimer leer wird und der andere dafür voll. So hat das uns nämlich unser lehrer erklärt> das es einfach umgefüllt wird. Das stimmt aber ja dann nicht > es wird kopiert und beide haben das gleiche .
Aber jetzt nochmal zu den eimern.
Wenn ich eine variable anlege:
double preis;
was ist dann der preis. Ein wegweiser? Oder kann man mit denen direkt kommunizieren?
Denn bei den objekten:
Hund meinHund =....;
ist meinHund ja ein wegweiser. Und kein "eimer".
Langsam wirds wohl peinlich, dass ich das ganze nicht so ganz verstehe :(.
LG Susi
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 19:23 Di 12.06.2007 | Autor: | piet.t |
Eigentlich ist es ganz einfach:
Wenn Du etwas anlegst und es ist von einem der Typen boolean, char, byte, short, int, long, float, double oder ein Array davon (also was mit eckigen Klammern), dann handelt es sich um einen Eimer, in allen anderen Fällen um einen Wegweiser. Also:
double Preis; => Eimer
Artikel meinArtikel; => Wegweiser
TextArea ausgabe; =>ausgabe wäre also ein???
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 19:33 Di 12.06.2007 | Autor: | SusaSch |
ähhh wegweiser?
|
|
|
|
|
Status: |
(Frage) überfällig | Datum: | 17:11 Sa 23.06.2007 | Autor: | SusaSch |
Hallo
habe jetzt einige zeit pause vom programmieren gemacht, werde mich aber in den nächsten tagen wieder intensiver damit beschäftigen. Habe mal wieder eine frage. Unzwar haben wir ein gästehaus und meine mum möchte was wo sie namen usw von gästen abspeichern und abrufen kann. Habe ja bereits mit eclipse auf access zugegriffen und sowas programmiert. Nun is es aber nicht so praktisch wenn meine mum eclipse auf dem rechner installiert bekommt bzw in eclipse irgendwas aufrufen muss> is ihr zu kompliziert ;). Nun die frage > gibt es nicht irgendeine möglichkeit sowas außerhalb eclipse zu öffen? Bin nu ja nich wirklich ein programmierprofi der ein eigenes programm zusammentippen kann. Hoffe man versteht was ich meine :)
LG Susi
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:03 Di 26.06.2007 | Autor: | M4rv3l0u5 |
Hallo Susi !
Ich hab sowas mal in ähnlicher Form programmiert für Geräte. Hab das mit VB.net gemacht. Dazu gibts ne menge tutorials und auch fertige scripte (wobei zu fuß das beste ist).
Vorraussetzung ist nur ein windowsrechner.
Da kann man dann mit VB das eingabefeld programmieren, das speichert alles in ne acsessdatenbank und ein zweites script kannst du dir gestalten mit diversen suchfunktionen. Kannst das auch in Excel anlegen, aber da is bei 65556 (oder so!!) ende in einer Tabelle.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 21:40 So 10.06.2007 | Autor: | jerry |
Hallo,
eine kleine Anmerkung am Rande:
Ab Java 1.5 werden sogenannte typisierte Vectoren unterstützt. Das heißt du kannst beim Erzeugen des Vectors bereits den Typ der Elemente festlegen.
Damit kannst du dir das ständige Casten beim Zugriff auf ein Element sparen.
zB:
Erzeugung des Vectors:
Vector<TextField> txtvector = new Vector<TextField>();
Zugriff:
TextField meinTextfeld = new TextField();
meinTextfeld =txtvector.get(i);
nimmt einem etwas die Schreibarbeit ab. :)
Gruß jerry
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:02 Mo 11.06.2007 | Autor: | piet.t |
Das Thema hatten wir weiter oben schon mal. Aber nachdem wir hier von Eclipse 2.1.3 reden müssen wir halt auch (zumindest vorerst) beim 1.4er Java bleiben (auch wenn's schwerfällt).
Nebenbei gesagt: wirklich viel Schreibarbeit spart man sich mit den typisierten Collections auch nicht - der Cast fällt weg, dafür schreibt man alle Nase lang Vector<Artikel> - und das ist ja genuso viel zusätzliches Tippen wie 1 Cast.
Allerdings hat man bei konsequenter Anwendung natürlich ein durchgängig typsicheres Vorgehen und vermeidet vielleicht doch einige ClassCastExceptions....
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 14:36 So 10.06.2007 | Autor: | Herby |
Hallo Peter,
>
> P.S.: Für die nächsten Fragen solltest Du vielleicht mal
> einen neuen thread aufmachen, in der Gesamtansicht werden
> die Artikel jetzt schon ziemlich schmal....
wenn du unter Ansicht die Option "flach" anwählst, dann erscheinen alle Beiträge in voller Bildschirmgröße.
Liebe Grüße
Herby
|
|
|
|