# Bestellannahme



## rave1989 (22. Jan 2012)

Hi Leute,

Für ein Projekt soll ich in Java ein Programm schreiben, das in der Lage sein soll Bestellungen aufzunehmen.
(Ich Benutze NetBeans 6.9.1 JDK1.7)

-Eine Bestellung besteht dabei aus mehreren Bestellpositionen.
-Eine Bestellposition besteht aus Artikeln und der Anzahl.
-Jede Bestellung muss einem Kunden Zugeordnet werden, Jede Bestellposition einer Bestellung.
-Es sollen Später mit einem aufruf einer Bestellung, alle Bestellpositionen herausgegeben werden .

Das ist nur ein kleiner Auszug aus dem gesamten Projekt, an dem ich allerdings am verzweifeln bin.

Als Tip wurde uns gesagt das wir zwei Klassen erstellen sollen, "Bestellung" und "Bestellposition".

Meine Idee war es bis gerade eben:

Ich sorge erst dafür das über einen Konstruktor der "Bestellposition(int artikel-Id, int anzahl)" solange neue Bestellpositionen erstellt werden, wie der Kunde neue artikel fordert. Am ende werden diese Bestellpositionen dann in eine Arrayliste der Bestellung übernommen, in der dann noch jeweils die Zugehörige Kunden-ID und uhrzeit mit aufgenommen werden. "Bestellund(Bestellposition bestellposition, int uhrzeit, int kundenId)"

Bis jetzt kann ich: 

Am anfang der Bestellung den Kunden anhand der KundenId aus der Arrayliste heraussuchen(und theoretisch später in die Bestellung einbinden)
Die artikel anhand der ID heraussuchen und mit der Anzahl versehen. 

Die Frage ist nun wie stelle ich es an das meine Bestellliste eine Bestellung mit voraussichtlich unendlich vielen Bestellpositionen schluckt. Soweit ich weiß kann man ja nur Konstruktoren einer klasse erstellen die eine definierte anzahl an Parametern annehmen.

Ich bitte euch also um Erfahrungen und Ideen zu der Problemstellung bzw. Ergänzungen zum lösen meines Ansatzes.


----------



## rave1989 (22. Jan 2012)

Nachtrag1: Also eine Bestellung muss später etwa so aussehen:

BestellID
Artikel1, Anzahl
Artikel2, Anzahl
 KundenID, uhrzeit der Lieferung.

Wichtig ist noch die Behandlung des Preises der einzelnen Bestellpositionen.
Denn irgendwie muss ich diesen später noch benutzen um eine Rechnung zu erstellen. Bzw einen Tagesabschluss mit erzieltem Umsatz usw. Aber das kommt später...


----------



## langhaar! (22. Jan 2012)

rave1989 hat gesagt.:


> Die Frage ist nun wie stelle ich es an das meine Bestellliste eine Bestellung mit voraussichtlich unendlich vielen Bestellpositionen schluckt. Soweit ich weiß kann man ja nur Konstruktoren einer klasse erstellen die eine definierte anzahl an Parametern annehmen.



In deine Klasse Bestellung kommt eine Methode um Positionen hinzuzufügen z.B. addOrderLine(OrderLine newOrderLine) und eine Liste (z.B. List<OrderLine> orderList), die alle Positionen aufnimmt. Fertig.


----------



## rave1989 (23. Jan 2012)

Ich verstehe das nicht...

dann ist doch jedes Objekt der Klasse Bestellung meine eigentliche Bestellposition. Und dann bin ich wieder bei dem Problem das meine Bestellung nur einen Artikel aufnehmen kann.

Beschreibe das bitte etwas genauer.


----------



## Michael... (23. Jan 2012)

rave1989 hat gesagt.:


> Die Frage ist nun wie stelle ich es an das meine Bestellliste eine Bestellung mit voraussichtlich unendlich vielen Bestellpositionen schluckt. Soweit ich weiß kann man ja nur Konstruktoren einer klasse erstellen die eine definierte anzahl an Parametern annehmen.


Keine Ahnung was das mit Konstruktoren zu tun hat, aber Du benutzt doch scheinbar schon eine ArrayList für die Kunden. Dann müsstest Du doch wissen, dass ArrayList eine flexible Anzahl an Objekten aufnehmen kann.


----------



## rave1989 (23. Jan 2012)

Das die arrayliste flexibel ist, ist mir klar.

Allerdings verstehe ich nicht wie ich das nun zusammensetzen soll.

Also nochmal, ich erstelle Bestellpositionen, mit der klasse Bestellposition, und lege diese in eine arrayliste ab, soweit alles kein problem.

Jetzt möchte ich mit der Klasse Bestellung eine einzige Bestellung erstellen, sozusagen die Rechnung, die dann Alle Bestellpositionen vereint und unter eine ID aufnimmt.

Da ich am Anfang noch nicht weiß wie viele Bestellpositionen ich haben werde, weiß ich somit nicht wie mein Konstruktor der "Bestellung" aussehen soll. 

Wenn ich es wüsste (Beispiel es sind zwei Bestellpositionen) hätte ich gesagt KonstruktorBestellung( bestellposition1, bestellposition2, kundenID, uhzeit)


Es sollen mehrere Bestellungen neben einander existieren. Ich kann also nicht einfach eine Arrayliste erstellen und da alle möglichen Bestellpositionen reinschmeißen, um diese später alle auf einmal aufzurufen. Denn dann weiß ich ja gar nicht welche Bestellposition zu welcher Bestellung gehört!?

Also das ist mein Ansatz und ich vermute, dass dieser so nicht korrekt ist. Aber mir fehlt einfach die Erfahrung mit Java um einen besseren zu erstellen...


----------



## rave1989 (23. Jan 2012)

Also ich glaube ich habe es noch nicht erwähnt, aber ich bin ein absoluter Anfänger und es ist gut möglich das ich irgendwelche Begriffe durcheinander bringe. Wenn ihr also nicht versteht was ich eigentlich will, sagt mir das bitte, ich versuche es dann nochmal anders zu erklären. 

Das was ich gerade programmiere, ist auch das allererste mal überhaupt für mich! Und das alles nach kurzer Einführung in der uni, Rest sollen wir uns selbst beibringen...


----------



## langhaar! (23. Jan 2012)

rave1989 hat gesagt.:


> Wenn ihr also nicht versteht was ich eigentlich will, sagt mir das bitte, ich versuche es dann nochmal anders zu erklären.



Was du willst, ist vollkommen klar und relativ einfach. Warum machst du es nicht einfach mal so, wie ich es dir vorgeschlagen habe?



rave1989 hat gesagt.:


> Es sollen mehrere Bestellungen neben einander existieren. Ich kann also nicht einfach eine Arrayliste erstellen und da alle möglichen Bestellpositionen reinschmeißen, um diese später alle auf einmal aufzurufen. Denn dann weiß ich ja gar nicht welche Bestellposition zu welcher Bestellung gehört!?



Du hast anscheinend das Konstrukt nicht ganz verstanden.
Jede Bestellung hat eine Liste mit den zugehörigen Positionen. Da werden nicht 'alle möglichen Bestellpositionen' durcheinandergeschmissen.

Vielleicht nimmst du dir erst mal Zettel und Stift und malst das mal aus?


Bestellung 1

Bestellung 2

Bestellung 3

Bestellung 4 etc.

Jetzt könnte bespielsweise in Bestellung 3 eine Liste mit 3 Positionen und in Bestellung 2 eine Liste mit 2 Positionen sein. Dadurch, dass die Listen in den jeweiligen Bestellungen enthalten sind, sind die Positionen fest den Bestellungen zugeordnet. Probiers einfach aus.


----------



## Michael... (23. Jan 2012)

rave1989 hat gesagt.:


> Da ich am Anfang noch nicht weiß wie viele Bestellpositionen ich haben werde, weiß ich somit nicht wie mein Konstruktor der "Bestellung" aussehen soll.
> 
> Wenn ich es wüsste (Beispiel es sind zwei Bestellpositionen) hätte ich gesagt KonstruktorBestellung( bestellposition1, bestellposition2, kundenID, uhzeit)


Die Anzahl der Bestellpositionen ist doch am Anfang egal. Der Konstruktor könnte so aussehen

```
public Bestellung(int kundenID, Date datum)
```

Ich würde da allgemein noch einmal darüber nachdenken.


rave1989 hat gesagt.:


> Es sollen mehrere Bestellungen neben einander existieren. Ich kann also nicht einfach eine Arrayliste erstellen und da alle möglichen Bestellpositionen reinschmeißen, um diese später alle auf einmal aufzurufen. Denn dann weiß ich ja gar nicht welche Bestellposition zu welcher Bestellung gehört!?


Die Klasse Bestellung benötigt natürlich eine List o.ä. um die Bestellpositionen aufzunehmen. Also nicht eine ArrayList für alle Bestellpositionen sondern eine pro Bestellung eine ArrayList


rave1989 hat gesagt.:


> Aber mir fehlt einfach die Erfahrung mit Java um einen besseren zu erstellen...


Grundsätzlich würde ich mich ersteinmal von Java lösen und überlegen wie so eine Bestellung strukturiert sein könnte bzw. Bestellungen, Warenkörbe... anschauen und analysieren woraus sie bestehen.


----------



## rave1989 (23. Jan 2012)

also ich mache es doch so wie du beschrieben hast, nur eben mit der Bestellposition. Es bringt mich aber nicht weiter. Bzw verstehe ich nicht wie ich dann weiter vorgehen soll.

Im moment habe ich eine theoretisch unendliche anzahl an Bestellpositionen, die ich keiner bestimmten Bestellung zuordnen kann.

Nach deinem Ansatz hätte ich eine unendliche menge an orderlines ohne eine definierte Bestellung.

Also das gleiche Problem mit einem anderen Namen!? Oder ich verstehe es einfach falsch...


edit, ich glaube jetzt hat es klick gemacht.

Bis jetzt habe ich die listen jeweils in der Verwaltungsklasse erstellt.
Ich müsste aber eine in der Bestellung(klasse) erstellen, die dann für jede einzelne Bestellung erstellt wird. Okay muss ich mal ausprobieren...


----------



## langhaar! (23. Jan 2012)

rave1989 hat gesagt.:


> also ich mache es doch so wie du beschrieben hast, nur eben mit der Bestellposition. Es bringt mich aber nicht weiter. Bzw verstehe ich nicht wie ich dann weiter vorgehen soll.
> 
> Im moment habe ich eine theoretisch unendliche anzahl an Bestellpositionen, die ich keiner bestimmten Bestellung zuordnen kann.
> 
> ...



Lies dir noch mal in Ruhe die Beiträge durch. Die Fragen wurden bereits beantwortet.  Wenn du Probleme hast, zu verstehen, dass ein Atribut einer Klasse (in diesem Fall die Liste mit Bestellpositionen) zu einer Klasse gehört (in diesem Fall die Bestellung), dann solltest du die Aufgabe evtl. beiseite legen und dir das eine oder andere Java Buch durchlesen.


----------



## rave1989 (24. Jan 2012)

also für ein ganzes Buch gibt es keine Zeit mehr... da das Projekt neben den zahlreichen anderen Klausuren bald abzugeben ist. Also um den Rest nicht all zu sehr zu vernachlässigen müsste ich bald fertig werden. Aber das meiste habe ich schon, fehlt theoretisch nur noch die Umsetzung des Bestellvorgangs und dann Optimierung.

Ich habe es allerdings tatsächlich nicht gewusst das die Arraylist ein Atribut einer klasse ist, das macht natürlich einiges anschaulicher.


----------



## Bartleby (24. Jan 2012)

Vielleicht zeigst du einfach mal deinen bisherigen Code, da werden eventuelle Sprachunklarheiten sicher deutlicher.


----------



## ARadauer (24. Jan 2012)

rave1989 hat gesagt.:


> Im moment habe ich eine theoretisch unendliche anzahl an Bestellpositionen, die ich keiner bestimmten Bestellung zuordnen kann.


Warum? Das macht ja keinen Sinn, mach eine Bestellung mit heutigem Datum. Und da fügst du die Positionen ein. Fertig...


----------



## rave1989 (24. Jan 2012)

Leute, sorry aber ich checks einfach nicht.

ich hab gestern die halbe nacht rumprobiert und hab mich nur noch mehr verwirrt. Es ist überhautp nichts brauchbares bei rausgekommen.

Bitte erklärt mir das nochmal schritt für schritt.

Brauche ich zwei klassen?
Falls ja, in die Klasse der Bestellung kommt die Arrayliste rein! Muss diese dann an einem bestimmten Ort stehen, unter einer Methode etc.?
welche befehle müssen wo stehen?


```
import java.util.ArrayList;

/**
 *
 * @author 
 */
public class Bestellung {
    private ArrayList<Bestellung> bestellListe;
    private static int idCounter = 3000;
    public int id;
    public String artikel;
    public int anzahl;
    public String uhrzeit;
    public int kundenId;
    
    public Bestellung(){
    bestellListe = new ArrayList<Bestellung>(); 
    }
    
    public Bestellung(String uhrzeit, int kundenId) {
        this.artikel = artikel;
        this.anzahl = anzahl;
        this.uhrzeit = uhrzeit;
        this.kundenId = kundenId;
        this.id = idCounter;
        idCounter++;
        
    }

    /**
     * @return the id
     */

    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @return the artikel
     */
    public String getArtikel() {
        return artikel;
    }

    /**
     * @param artikel the artikel to set
     */
    public void setArtikel(String artikel) {
        this.artikel = artikel;
    }

    /**
     * @return the anzahl
     */
    public int getAnzahl() {
        return anzahl;
    }

    /**
     * @param anzahl the anzahl to set
     */
    public void setAnzahl(int anzahl) {
        this.anzahl = anzahl;
    }

    /**
     * @return the uhrzeit
     */
    public String getUhrzeit() {
        return uhrzeit;
    }

    /**
     * @param uhrzeit the uhrzeit to set
     */
    public void setUhrzeit(String uhrzeit) {
        this.uhrzeit = uhrzeit;
    }
}
```

das ist das was ich habe. Gestern habe ich dann in einem anderen Projekt rumprobiert, da dort aber nichts sinnvolles raus gekommen ist, poste ich diesen Quellcode. Hier sind paar Parameter und Methoden drin die nicht verwendet werden, da ich am anfang hier Rumexperementiert habe. Ich muss es dann später nochmal überarbeiten.


```
public class Bestellposition extends Bestellung {

    public Bestellposition(int artikelId, int anzahl, int kundenId) {

    }
}
```


Verwaltungsklasse, in der die Bestellaufnahme erfolgen soll, hier ebenfalls viel rumexperementiert...


```
private void bestellAufnahme() {
        //Bestellzuteilung dem Kunden
        //Erst wird die Kundenliste angezeigt aus der dann der kunde nach Aufforderung per ID herausgesucht wird.
        showKundenListe();
        boolean eingabekontrolle = false;
        int kundenId;
        //Kontrollstruktur für das vorhandensein des kunden und ID eingabeaufforderung
        do{
        int kId = Stdin.readlnInt("Bitte geben Sie die ID des Kunden ein:");
        sucheKundeNachId(kId);
        Iterator<Kunde> iter = kundenListe.iterator();
        while (iter.hasNext()) {
            Kunde i = iter.next();
            if (i.getId() == kId) {
                eingabekontrolle = true;
            }}kundenId = kId;
        }while(!eingabekontrolle);
        
        
        
        boolean mehr = false;

        do {
            showArtikelListe();
            boolean ek2 = false;//ek2 eingabekontrolle2
            int artikelId2;//zum austriksen der gemeinen while schleife
            do {
                int artikelId = Stdin.readlnInt("Bitte geben Sie die ID des gewünschten Artikels an:");
                sucheArtikelNachId(artikelId);

                Iterator<Artikel> iter = artikelListe.iterator();
                while (iter.hasNext()) {
                    Artikel i = iter.next();
                    if (i.getId() == artikelId) {
                        ek2 = true;

                    }
                }
                artikelId2 = artikelId;
            } while (!ek2);
            int anzahl = Stdin.readlnInt("Bitte geben Sie die Anzahl ein:");


            Bestellposition bp1 = new Bestellposition(artikelId2, anzahl, kundenId);
            Bestellung b1 = new Bestellung();
            bestellListe.add(bp1);
            showBestellListe();
            String s = Stdin.readlnString("Weiteren Artikel bestellen?: [y]es [n]o");
            if (s.equals("y")) {
                mehr = false;
            }else {mehr =true;}
        } while (!mehr);
```


----------



## ARadauer (24. Jan 2012)

```
public class Bestellung {
    private ArrayList<Bestellung> bestellListe;
public String artikel;
```
Warum hat deine Bestellung eine Liste von Bestellungen? Und einen Artikel?


----------



## rave1989 (24. Jan 2012)

weil wie oben geschrieben ich rumexperementiert habe, und ich am anfang noch artikel in die Bestellung eingegeben habe. Später habe ich den konstruktor dann umgeändert und eine neue klasse bestellposition gegründet, diese nimmt nun die artikel auf.


In die liste von bestellungen habe ich vor später alle bestellungen zu hinterlegen, damit ich diese auf einmal aufrufen kann.


----------



## Michael... (24. Jan 2012)

Einfach mal überlegen aus welchen Elementen eine Bestellung besteht:
 - Eine Bestellung hat ein Datum, eine KundenID und eine Liste mit Bestellpositionen
 - Eine Bestellposition enthält einen Artikel und die Anzahl
 - Ein Artikel hat eine Bestellnummer, eine Bezeichnung...
Letzteres scheint hier ja nicht zu benötigen und es genügt hier evtl. ein einfacher String.
Die ersten beiden musst Du einfach als Klasse nachbilden.

Und eine Bestellposition erbt sicher nicht von Bestellung. Das sind ja zwei paar Stiefel.


----------



## ARadauer (24. Jan 2012)

rave1989 hat gesagt.:


> weil wie oben geschrieben ich rumexperementiert habe,


Ganz einfach Beistellung hat Bestellpostion, Bestellpostion hat Artikel Nummer und Anzahl... 
Wo ist das Problem?


----------



## rave1989 (24. Jan 2012)

Michael ich verstehe das alles, aber ich verstehe nicht wo ich im quellcode was hinschreiben soll.

Voraussichtlich möchte ich ja aus der verwaltung heraus neue bestellungen erzeugen. Dort kann ich dann aber keine Bestellpositionen in die Liste der Bestellung ablegen.

wie muss ich den Code der Bestellaufnahme abändern damit das funktioniert?

irgendwas in der richtung vielleicht?


```
Bestellposition bp1 = new Bestellposition(artikelId2, anzahl, kundenId);
            Bestellung b1 = new Bestellung();

            b1.bestellPosListe.add(bp1);
            System.out.println(b1.bestellPosListe);
```

also das geht auch bis zeile 4 gut, danach gibts einen fehler. Irgendwas stimmt mit der Arrayliste noch nicht...


----------



## ARadauer (24. Jan 2012)

b1.bestellPosListe.add(bp1);

ja grundsätzlich schon. aber konkret ist es eher unsauber, die liste public zu haben. mach einfach eine methode die die Position einfügt..


```
import java.util.Date;

public class BestellVerwalltung {

    public static void main(String[] args) {
        Bestellung bestellung = new Bestellung(1, new Date());
        bestellung.setKunde("Ich");

        bestellung.addBestellPostion(new BestellPosition("Bier", 3));
        bestellung.addBestellPostion(new BestellPosition("Wein", 3));
        bestellung.addBestellPostion(new BestellPosition("Schnaps", 3));

    }

}
```


```
public class BestellPosition {

    private String artikelNummer;
    private int anzahl;

    public BestellPosition(String artikelNummer, int anzahl) {
        super();
        this.artikelNummer = artikelNummer;
        this.anzahl = anzahl;
    }

    public String getArtikelNummer() {
        return artikelNummer;
    }

    public void setArtikelNummer(String artikelNummer) {
        this.artikelNummer = artikelNummer;
    }

    public int getAnzahl() {
        return anzahl;
    }

    public void setAnzahl(int anzahl) {
        this.anzahl = anzahl;
    }

}
```


```
import java.util.ArrayList;
import java.util.Date;
import java.util.List;


public class Bestellung {
    
    private int id;
    private Date date;
    
    private String kunde;
    
    private List<BestellPosition> positionen = new ArrayList<BestellPosition>();

    public Bestellung(int id, Date date) {
        super();
        this.id = id;
        this.date = date;
    }
    
    public void addBestellPostion(BestellPosition postion){
        positionen.add(postion);
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public String getKunde() {
        return kunde;
    }

    public void setKunde(String kunde) {
        this.kunde = kunde;
    }

    public List<BestellPosition> getPositionen() {
        return positionen;
    }
    
}
```


----------



## rave1989 (24. Jan 2012)

Danke Michael, ich glaube langsam verstehe ich was ich alles falsch gemacht habe bis jetzt.

Aber vorab, wozu das super(); 
und der import List? warum wird da nicht die ArrayListe verwendet sondern die einfache List?


----------



## rave1989 (24. Jan 2012)

sorry in dem Post oben sprach ich natürlich zu "ARadauer" 

kann man hier seine eigenen Beiträge nur innerhalb bestimmter zeit editieren...
edit: der Zitat hat sich erledigt vorausgesetzt (siehe unten 1)


> So nun wieder ran ans programmieren. Also Ich hab das alles so umgesetzt wie oben von ARadauer erklärt. Ich werde aber das gefühl nicht los das der mir jeweils nur eine Position erstellt.
> 
> 
> ```
> ...



wenn ich folgendes anfrage

```
System.out.println(b1.getPositionen());
```
lautet die antwort

```
[PizzaService.BestellPosition@c596a7a]
```

ist das die Speicheradresse der Bestellposition die er mir raus gibt? Wie bekomme ich denn die Bestellposition an sich heraus?

(1)...vorausgesetzt: das ist wirklich die Speicheradresse! Diese ädert sich nämlich bei jeder position, es werden also ganz viele erstellt. :applaus: hurra! Aber wie bekomme ich diese nun heraus?


----------



## ARadauer (24. Jan 2012)

> Wie bekomme ich denn die Bestellposition an sich heraus?


was ist die Bestellposition? Die besteht ja aus mehreren Attributen, was soll Java machen wenn du die Klasse ausgibst? Es gibt den hashcode in hex aus
Du kannst hier einfach die Attribute ausgeben, bzw die toString Methode Bestellposition überschreiben.


----------



## rave1989 (24. Jan 2012)

ich versteh das wieder nicht ganz.

Also eine BestellPosition ist ja ein objekt. Wenn ich die Atribute des Objekts aufrufen will, kann ich das über die punktnotation machen. Aber dazu brauche ich ja den Namen des objekts. Die sind aber bei mir sozusagen namenlos!?

Ich nehme an mit der toString Methode könnte ich der BestellPosition einen Namen geben? Aber ich weiss nicht wie das geht...


----------



## ARadauer (24. Jan 2012)

ok... egal. du willst die positionen ausgeben? dann mach das doch


```
for(BestellPosition pos : b1.getPositionen()){
System.out.println(pos.getArtikelNummer());
}
```


----------



## rave1989 (24. Jan 2012)

Also er gibt mir dann immer jeweils die letzte Position heraus.


Wichtig wäre es halt zu verstehen wie ich zu jedem beliebigem Zeitpunkt jede beliebige Position wieder aufgreifen kann.

Das ist wichtig wenn ich z.B. am Schluss eine Rechnung erstellen will.

Diese solll dann so aussehen


```
Bestellung mit der KundenID 1000, in auftrag gegeben am...
 hat die BestPos mit der Id 2000 anzahl 3,
hat die BestPos mit der Id 2011 anzahl2,
soll ausgeliefert am...
```


----------



## Michael... (24. Jan 2012)

Nutzt Du die Klassen von ARadauer? Wie schaut der Code zum Befüllen einer Bestellung mit den Bestellpositionen aus?


----------



## rave1989 (24. Jan 2012)

Ja bis auf paar kleine Veränderungen nutze ich den code:


```
import java.util.*;
import java.util.Date;
import java.util.List;
 
 
public class Bestellung {
    
    private List<BestellPosition> positionen = new ArrayList<BestellPosition>();
    private static int idCounter = 3000;
    private int id;
    private Date date;
    private int kundenId;
    
    
    public Bestellung(){
  }
    
    public Bestellung(int kundenId, Date date) {
    
        this.date = date;
        this.kundenId = kundenId;
        this.id = idCounter;
        idCounter++;
        
    }
 
    
    public void addBestellPosition(BestellPosition position){
        positionen.add(position);
    }
 
    public int getId() {
        return id;
    }
 
    public void setId(int id) {
        this.id = id;
    }
 
    public Date getDate() {
        return date;
    }
 
    public void setDate(Date date) {
        this.date = date;
    }
 
    public int getKundenId() {
        return kundenId;
    }
 
    public void setKundenId(int kundenId) {
        this.kundenId = kundenId;
    }

    public List<BestellPosition> getPositionen() {
        return positionen;



    }


}
```


----------



## Michael... (24. Jan 2012)

und wo und wie wird die Bestellung mit den Bestellpostionen befüllt?


----------



## rave1989 (24. Jan 2012)

in meiner Hauptklasse Verwaltung über eine Methode der Verwaltung bestellAufnahme() der untere block

```
private void bestellAufnahme() {
        //Bestellzuteilung dem Kunden
        //Erst wird die Kundenliste angezeigt aus der dann der kunde nach Aufforderung per ID herausgesucht wird.
        showKundenListe();
        boolean eingabekontrolle = false;
        int kundenId;
        //Kontrollstruktur für das vorhandensein des kunden und ID eingabeaufforderung
        do {
            int kId = Stdin.readlnInt("Bitte geben Sie die ID des Kunden ein:");
            sucheKundeNachId(kId);
            Iterator<Kunde> iter = kundenListe.iterator();
            while (iter.hasNext()) {
                Kunde i = iter.next();
                if (i.getId() == kId) {
                    eingabekontrolle = true;
                }
            }
            kundenId = kId;
        } while (!eingabekontrolle);



        boolean mehr = false;

        do {
            showArtikelListe();
            boolean ek2 = false;//ek2 eingabekontrolle2
            int artikelId2;//zum austriksen der gemeinen while schleife
            do {
                int artikelId = Stdin.readlnInt("Bitte geben Sie die ID des gewünschten Artikels an:");
                sucheArtikelNachId(artikelId);

                Iterator<Artikel> iter = artikelListe.iterator();
                while (iter.hasNext()) {
                    Artikel i = iter.next();
                    if (i.getId() == artikelId) {
                        ek2 = true;

                    }
                }
                artikelId2 = artikelId;
            } while (!ek2);
            int anzahl = Stdin.readlnInt("Bitte geben Sie die Anzahl ein:");



            Bestellung b1 = new Bestellung(kundenId, new Date());
            bestellListe.add(b1);
            b1.addBestellPosition(new BestellPosition(artikelId2, anzahl));
            
            System.out.println(b1.getDate());
            System.out.println(b1.getPositionen());
            for(BestellPosition pos : b1.getPositionen()){
            System.out.println(pos.getArtikelId());
}
            String s = Stdin.readlnString("Weiteren Artikel bestellen?: [y]es [n]o");
            if (s.equals("y")) {
                mehr = false;
            } else {
                mehr = true;
            }
        } while (!mehr);
}
```


und fürs erste möchte ich über diese Methode der Hauptklasse die Bestellungen danach anzeigen können
	
	
	
	





```
private void showBestellListe() {
        String s;

        printZentriert("Bestell-Id");
        printZentriert("Kunden-Id");
        printZentriert("Artikel-ID");
        printZentriert("Anzahl");
        
        printLF();
        printLinieLF(4); // Trennlinie für 6 Felder anzeigen

        Iterator<Bestellung> iter = bestellListe.iterator();
        while (iter.hasNext()) {
            Bestellung i = iter.next();

            s = castInt2String(i.getId());
            printZentriert(s);
            s= castInt2String(i.getKundenId());


          

            
            printLF();
        }
        printLF();
    }
```


----------



## Michael... (24. Jan 2012)

Du legst in der Schleife ja bei jedem Durchlauf eine neue Bestellung an, daher kann es ja nie mehr als eine Position pro Bestellung geben. Die Bestellung muss natürlich ausserhalb der Schleife erzeugt werden.


----------



## rave1989 (24. Jan 2012)

ahhh es funktioniert. Gut das erklärt natürlich einiges.

Das war ja ein echt blöder Fehler. Aber jetzt erstellt der mir eine Bestellung mit mehreren Positionen.

Vielen Dank Leute, ohne euch wär ich aufgeschmissen.

okay jetzt weiter rumprobieren :-D


Leute ich habe noch ein hoffentlich letztes Problem mit den Positionen.
Also auf diese weise rufe ich ja alle auf.



```
for(BestellPosition pos : b1.getPositionen()){
System.out.println(pos.getArtikelNummer());
}
```

Wie kann ich diese aber einzeln aufrufen. Also erst die erste dann die zweite.

Also ich versuche diese nun beim ausgeben der BestellListe anzuzeigen.
gewollt ist
	
	
	
	





```
Bestell-Id   |   Kunden-Id    |   Artikel-ID   |     Anzahl     | 
--------------------------------------------------------------------
     3000      |      1000      |      2000      |       1        | 
     3000      |      1000      |      2003      |       2
```

ausgeben tut er mir das hier

```
Bestell-Id   |   Kunden-Id    |   Artikel-ID   |     Anzahl     | 
--------------------------------------------------------------------
     3000      |      1000      |      2000      |       1        | 
     2003      |       2        | 
     3000      |      1000      |
```

Weil er nach der Kunden ID alle Positionen auf einmal ausgibt. Dann nochmal Bestell und Kunden ID.

```
private void showBestellListe() {
        String s;

        printZentriert("Bestell-Id");
        printZentriert("Kunden-Id");
        printZentriert("Artikel-ID");
        printZentriert("Anzahl");

        printLF();
        printLinieLF(4); // Trennlinie für 4 Felder anzeigen

        Iterator<Bestellung> iter = bestellListe.iterator();
        while (iter.hasNext()) {
            Bestellung i = iter.next();

            s = castInt2String(i.getId());
            printZentriert(s);
            s = castInt2String(i.getKundenId());
            printZentriert(s);

            for (BestellPosition pos : i.getPositionen()) {


                s = castInt2String(pos.getArtikelId());
                printZentriert(s);
                s = castInt2String(pos.getAnzahl());
                printZentriert(s);
                printLF();

            }
// das hier ist unsauber und getrickst, würde aber vermutlich funktionieren wenn er mir nur eine Position ausgeben würde...
            s = castInt2String(i.getId());
            printZentriert(s);
            s = castInt2String(i.getKundenId());
            printZentriert(s);
            printLF();
        }
    }
```
Also so wie ich das gewohnt bin über den iterator schaff ich es nicht.


----------



## langhaar! (25. Jan 2012)

rave1989 hat gesagt.:


> Leute ich habe noch ein hoffentlich letztes Problem mit den Positionen.
> Also auf diese weise rufe ich ja alle auf.
> 
> 
> ...



Die for Schleife macht doch genau das; erst das erste, dann das zweite...

Deine Bestellpositionen sind eine Liste. Somit kannst du alles anwenden, was in der Java Api für Listen spezifiziert ist. U.A. kannst du aus der Liste einen Iterator holen oder auch auf die Listenelemente mit get(i) zugreifen.

Es macht aber logisch keinen Unterschied, ob du die Liste mit einem Iterator oder der oben genannten for Schleife durchläufst.

Du hast ein strukturelles Problem mit der Schachtelung deiner Schleifen.
Die Ausgabe der Bestellnr. gehört in die innere Schleife.


----------



## rave1989 (25. Jan 2012)

hast recht war nur ein strukturelles wenn mans mit der for schleife macht.

Über den Iterator aber ging es nicht weil unzählige andere probleme vorhanden waren.
Und das hat mich dann zunehmend verwirrt.

Hab es jetzt gelöst es funktioniert! :toll:


----------



## rave1989 (27. Jan 2012)

Hey Leute, das Projekt geht voran, dank eurer Hilfe! *TOP*:toll:

Leider bin ich wieder an einer Stelle hängen geblieben und hoffe sehr auf eure Hilfe!

Mittlerweile sieht mein Bestellvorgang gekürzt so aus:

```
Bitte geben Sie die ID des gewünschten Artikels an(abbruch mit [0]): 2011
Bitte geben Sie die Anzahl ein: 2

Aktuelle Bestellung des Kunden: 1000
---------------------------------------------------
  Artikel-ID   |     Anzahl     |     Preis      | 
---------------------------------------------------
     2000      |       3        |        8,97    | 
     2011      |       2        |        1,98    | 
Weiteren Artikel bestellen?: [y]es [n]o
```

Was noch fehlt ist die Einführung eines Mindestbestellwertes. Dieser soll anhand der Postleitzahl des Kunden ermittelt werden.

Als Tipp wurde uns ans Herz gelegt die Enumeration zu benutzen. Und genau hier ist das Problem, mit dem was wir dazu durch genommen haben und mit eigenen Recherchen im Internet komme ich nicht weiter. Ich verstehe die Funktionsweise von Enum nicht ganz.

wir haben ein kleines Beispiel zu Enumeration erhalten, anhand dieses Bsp. habe ich folgendes erstellt:

```
public enum Postleitzahl {
//vorerst nur eine Postleitzahl, später eine liste...
    nah("66111", 2,99);
   

    private String postleitzahl;
    private double mindestbestellwert;

  Postleitzahl(String plz, double mbw)
    {
        this.postleitzahl = plz;
        this.mindestbestellwert = mbw;
    }

    /**
     * Methode gibt die Bewertungszahl des Haustyps zurueck.
     * @return bewertungszahl
     */
    public double getMindestbestellwert()
    {
        return this.mindestbestellwert;
    }

    /**
     * Methode gibt die Typbezeichnung des Hauses zurueck.
     * @return typ
     */
    public String getPostleitzahl()
    {
        return this.postleitzahl;
    }
}
```

Die Idee ist. In der Verwaltungsklasse eine Methode zu gründen die den Mindestbestellwert ermittelt. In etwa so:

```
public double bestimmeMindestbestellwert(int plz) {
        
        String p = castInt2String(plz);
        double mbw = Postleitzahl.valueOf(p));
        return mbw;
    }
```
Hier ist nun das Hauptproblem, da ich nicht wirklich verstehe wie mit Enum umzugehen ist, hab ich den schrott da oben hingeschrieben. In Wirklichkeit ist oben gewollt, dass er mir anhand des Parameters "int plz" aus meinem Enum Postleitzahl den Mindestbestellwert herausgibt. (Bsp. plz 66111 = mbw 2,99)

Später dann möchte ich bei der bestellaufnahme die Methode einfügen und irgendwann folgendes erreichen:


```
Aktuelle Bestellung des Kunden: 1000
---------------------------------------------------
  Artikel-ID   |     Anzahl     |     Preis      | 
---------------------------------------------------
     2000      |       3        |             8,97    | 
     2011      |       2        |             1,98    | 
Mindestbestellwert: 2,99   | Summe:  10,95 |
Mbw erreicht, Bestellung freigegeben.
```

Es hackt aber ansich nur am Enum, den rest werde ich natürlich(naja hoffentlich) selbst hinbekommen.

Also was sollte ich wie anders im Enum Postleitzahl schreiben, damit ich mein Vorhaben umsetzen kann?
+Wie hole ich danach aus diesem die mir wichtige Info raus. 

Für heute Nacht bin ich leider nicht mehr zu Mehr fähig als dass da oben,
Vielen Dank für eure Mühe und Verständnis mit mir!


----------



## ARadauer (27. Jan 2012)

Den Tipp zur Abbildung von Postleitzahlen ein Enum zu verwenden verstehe ich nicht ganz. Macht für mich keinen Sinn. Ein Enum ist eine Aufzählung.
Für zb einen Status oder sowas in die Richtung.


----------



## truesoul (27. Jan 2012)

> Als Tipp wurde uns ans Herz gelegt die Enumeration zu benutzen.


Dafür total unpassend und nicht nachvollziehbar aber destotrotz :
Enums (ab Java 5).

Warum nicht nachvollziehbar:


> Ein Enum ist eine Aufzählung.



Z.b eine Map mit würde da mehr Sinn machen. 

Mfg


----------



## langhaar! (27. Jan 2012)

rave1989 hat gesagt.:


> Was noch fehlt ist die Einführung eines Mindestbestellwertes. Dieser soll anhand der Postleitzahl des Kunden ermittelt werden.
> 
> Als Tipp wurde uns ans Herz gelegt die Enumeration zu benutzen.



Vermutlich hast du da etwas ein wenig durcheinandergebracht.
PLZ-Nummern über Enums aufzuzählen macht - wie bereits von meinen Vorpostern erwähnt - keinen Sinn.

Ich vermute, es gibt eine Gurppe von Mindestbestellwerten, die du aufzählen sollst und dann den PLZ zuweist.

Beispiel:

MBW1 = 10 Euro
MBW2 = 20 Euro
MBW3 = 50 Euro

Die Zuweisung selbst würde dann z.B. über eine Map funktionieren, so dass man jeder PLZ einen Bestellwert zuweisen kann oder evtl. sogar nach Nummernkreisen. Beispiel:

Wenn PLZ zwischen 50000 und 59999 dann nutze MBW1
Wenn PLZ zwischen 100000 und 49999 dann nutze MBW2
Ansonsten nimm MBW3

Das hängt von dem genauen Wortlaut bzw. der Interpretation der Aufgabe ab.


----------



## rave1989 (27. Jan 2012)

Also eine "Map" sagt mir nichts, haben wir nicht durchgenommen!

Der genaue Wortlaut in der Aufgabenstellung lautet:


> Aufzahlungsklasse (Enum-Klasse)
> Fur Postleitzahlen der Orte und Mindestbestellwerte



Wie genau wir das umsetzen sollen wird eben nicht erwähnt. Es gibt nur ein bespiel zum Enum, in einem komplett anderem Zusammenhang. 

die Idee von langhaar finde ich ganz gut, so war in etwa auch mein Ansatz. Deswegen steht auch bei mir oben "nah(66111, 2.99)" später wollte ich noch "weit", "sehrweit" einfügen. bzw MBW 1, 2 ,3...


----------



## Marcinek (27. Jan 2012)

Hallo,

obwohl man dafür niemals Enumarationen nehmen würde, weil diese eigentlich fest sind, könnte man das dennoch so machen.

1. Enumaration genau so wie du sie oben gemacht hast,

2. Die Bestellung hat ein Feld PLZ.

Dann kannst du machen PLZ.getMBW().

Die Verwaltungsklasse soll nix über PLZs wissen sollen


----------



## rave1989 (30. Jan 2012)

Naja ich nehme an wir sollen irgendwie ein Enum verwenden und da das mit der Postleitzahl am passendsten ist als alles andere sollen wir es eben so machen, ansonsten kann ich es mir auch nicht erklären.

"2. Die Bestellung hat ein Feld PLZ." was genau meinst du damit?

ich verstehe gerade nicht wie ich PLZ mit Punktnotation ansprechen kann, instanzieren darf ichs nicht, anders gibt er mir die Methoden nicht her...


----------



## Marcinek (30. Jan 2012)

Genau das solltest du in einem Buch nachlesen.


----------



## rave1989 (31. Jan 2012)

Naja vielleicht könntet ihr mir ja bitte noch die eine Sache erklären bevor ich hier wahsninnig werde...;(


----------



## Kiri (31. Jan 2012)

rave1989 hat gesagt.:


> Naja ich nehme an wir sollen irgendwie ein Enum verwenden und da das mit der Postleitzahl am passendsten ist als alles andere sollen wir es eben so machen, ansonsten kann ich es mir auch nicht erklären.
> 
> "2. Die Bestellung hat ein Feld PLZ." was genau meinst du damit?
> 
> ich verstehe gerade nicht wie ich PLZ mit Punktnotation ansprechen kann, instanzieren darf ichs nicht, anders gibt er mir die Methoden nicht her...



Dann ließ dir mal folgendes durch (Stichwort "static"): static Punktnotation


----------



## Marcinek (31. Jan 2012)

Oder direkt das:

1.11. Aufzählungstypen (enums)

Hast du kein Java Buch, das Enums beschreibt?


----------



## rave1989 (31. Jan 2012)

Nein ich habe leider kein Java Buch, ist aber auch nicht unbedingt notwendig, steht doch alles im Internet, man muss es nur noch verstehen und anwenden können.

Ok also die klassische Punktnotation ist bei Enum etwas anders habe ich jetzt kapiert.

Meine Methode um den MBW herauszubekommen habe ich folgend umgestaltet:


```
public void bestimmeMindestbestellwert() {
        
        Postleitzahl p = Postleitzahl.p66111;

        int mbw = p.getMindestbestellwert();
           System.out.println( "ich bin mbw"+ mbw);
```

Das ist jetzt rein provisorisch und Spiegelt keineswegs die angestrebte Methode. Das wunderbare daran ist, es funktioniert, erklärt mir so ein bisschen die Punktnotation beim Enum und das  war es dann auch.

Wie ich anhand einer vorgegebenen Postleitzahl die bevorzugterweise an die obere Methode übergeben werden soll, meinen MBW herausbekomme ist mir leider immernoch nicht klar.

Ich müsste ja praktisch einen Vergleich mit dem Enum anstellen. "Wenn Postleitzahl 66111, gib MBW raus!"

...

Hmm gerade :idea: einen Gedankenblitz gehabt:

Was wenn ich meine ca 20 PLZ in 3 Gruppen sortiere. Damit einen vergleich anstelle der mir dann nur noch "nah, fern, sehrweit" rausspukt. Diese drei Gruppen haben einen MBW und den lasse ich mir ausgeben...  Ist zwar vermutlich ein Umweg über 7 Berge aber mal ausprobieren...



edit:

also praktisch sowas
	
	
	
	





```
public int bestimmeMindestbestellwert(int plz) {
        
        int mbw = 0;
        if(plz == 66111){
         Postleitzahl p = Postleitzahl.nah;
        mbw = p.getMindestbestellwert();}
return mbw;}
```

jetzt nur noch die PLZ in 3 Kategorien einordnen und "else if" Anweisung formulieren.

Frage, wie kann ich die if-Schleife hierbei am schönsten formulieren. Vor allem mit den ca 20 PLZ.


----------



## rave1989 (31. Jan 2012)

ok so sieht das Ergebnis aus:



```
AKTUELLE BESTELLUNT DES KUNDEN: 1000
---------------------------------------------------
  Artikel-ID   |     Anzahl     |     Preis      | 
---------------------------------------------------
     2000      |       2        |        5,98    | 
----------------------------SUMME:       5,98    | 
---------------MINDESTBESTELLWERT:      5        | 
Bestellstatus: FREIGEGEBEN
```

über diesen Umweg:


```
public int bestimmeMindestbestellwert(int plz) {

        int mbw = 0;

        if (plz == 66111 || plz == 66113 || plz == 66115 || plz == 66117 || plz == 66119|| plz == 66121) {
            mbw = Postleitzahl.nah.getMindestbestellwert();
        } else if (plz == 66123 || plz == 66125 || plz == 66126 || plz == 66127 || plz == 66128) {
            mbw = Postleitzahl.fern.getMindestbestellwert();

        } else {
            mbw = 12;
        }
        return mbw;
    }
```

Also für Verbesserungsvorschläge immer offen! ;-)


----------



## Marcinek (31. Jan 2012)

Verstehe ich nicht.

Oben hast du zwei richtige Gedanken, und dann kommt da sowas bei raus???


```
public enum Postleitzahl {

	D45329(6), D45689(7);
	
	private int mbw;

	private Postleitzahl (int mindestbestellwert) {
		this.setMbw(mindestbestellwert);
	}

	public int getMbw() {
		return mbw;
	}

	private void setMbw(int mbw) {
		this.mbw = mbw;
	}
	
	
}
```
und dann

```
public class Bestellung {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Postleitzahl valueOf = Postleitzahl.valueOf("D45329");

		valueOf.getMbw();
	}

}
```

Die PLZ muss an die Bestellung dran.


----------



## rave1989 (1. Feb 2012)

naja ganz einfach:

das hier passt nicht ganz bzw. weiß nicht wie ich damit richtig umgehen soll.

```
public class Bestellung {
 
    /**
     * @param args
     */
    public static void main(String[] args) {
        Postleitzahl valueOf = Postleitzahl.valueOf("D45329");
 
        valueOf.getMbw();
    }
 
}
```

Mein Ablauf sieht es ja vor dass ich hier:

```
Iterator<Kunde> iter = kundenListe.iterator();
        while (iter.hasNext()) {
            Kunde i = iter.next();
            if (i.getId() == kundenId) {
               plz = i.getPostleitzhal();
            }}
```

die PLZ bekommme und diese dann weiterverarbeiten will. Und jetzt weiß ich nicht wie ich damit weiter arbeiten soll, das war ja von anfang an das problem.

ich kann ja nicht folgendes verwenden
	
	
	
	





```
public static void main(String[] args) {
        Postleitzahl valueOf = Postleitzahl.valueOf(plz);
 
        valueOf.getMbw();
```

(plz ist meine plz von oben als int) In deinem fall müsste ich dann alle Postleitzahlen mit einem Buchstaben versehen. Was ja auch eine Umwandlung zu einem String erfordern würde, die Umwandlung an sich ist ja kein Problem, aber zu meinem int müsste ich ja noch einen Buchstaben anhängen. Bzw die hälfte umschreiben und überall aus int PLZ einen  String p66111 machen. Und das sind einfach zu viele Sachen die mein wissen Überseiten bzw. den Arbeitsaufwand in die höhe treiben...


----------



## Marcinek (1. Feb 2012)

```
valueOf("D" + i.getPostleitzhal());
```

Naja das Problem ist hier, dass du enumerationen benutzen musst um den MBW anhand der PLZ zu definieren. Das würde man so niemals machen. Aber gehen tut das mit wenig aufwand.


----------



## rave1989 (1. Feb 2012)

Also danke nochmal, aber ich denke ich werde es fürs erste so belassen wie es ist. Wenn ich noch Zeit und Lust habe werde ich es am ende überarbeiten, aber fürs erste funktioniert es ja auch so und vermittelt so ein bisschen mehr den Eindruck, dass ich es auch selbst programmiert habe.


Mal eine kurze Frage:

Gibt es die Möglichkeit die Laufzeit meines Programms dazu zu benutzen um z.B. den Lohn der Mitarbeiter zu bestimmen?

Bsp:

Ich Starte mein Programm, führe mehrere Bestellungen aus. Das ganze dauert 1 Stunde.
Wenn ich nun eine Moment-Abrechnung erstellen will, soll eine Methode schauen wie lange das Programm gelaufen ist, und dann jeweils die zeit mal den Stundensatz des Personals rechnen.

Ich nehme an ich müsste dafür sone art Zähler benutzen der beim Start des Programms ausgeführt wird!?


----------



## rave1989 (8. Feb 2012)

Hey Leute, möchte mich nochmals bei allen herzlich bedanken die hier mitgeholfen haben. Habe heute mein Projekt mit sehr gut bewertet bekommen! Einfach super!


----------

