# Alter berechnen



## Gast (17. Jul 2006)

Hi ihr fleissigen Java - Bienen  

ich möchte durch die Angabe des Geburtstages einer Person das Alter berechnen. Dazu habe ich folgende Klasse geschrieben: 


```
package Fachklassen;

import java.util.Calendar;  //Aktuelles Datum abfragen

    public class Alter {
    
    public Alter() {
    }
    
    
    private int alter;
    private int gebDatum;
    
    
    Calendar aktDatum = Calendar.getInstance();     //Aktuelles Datum mit Calendar abfragen (Quelle: [url]http://www.pearson.ch/download/media/3827322294_SP.pdf[/url])
        
    public void showDate() {
        System.out.println(java.text.DateFormat.getDateTimeInstance().format(aktDatum.getTime()) );
    }
    
    
    
    
   //Alter aus Geburtsdatum über Mehtoder alter() ermitteln (Quelle: [url]http://www.pearson.ch/download/media/3827322294_SP.pdf[/url])
   
   //Berechnet, welches Alter eine Person, die am "birthdate" geboren wurde, am "otherDate" hat
    public static int alter (Calendar gebDatum, Calendar aktDatum) {
        int alter = 0;
        
        //anderes Datum liegt vor Geburtsdatum
        if (aktDatum.before(gebDatum))
            return -1;
        
        //Jahresunterschied berechnen
        alter = aktDatum.get(Calendar.YEAR) - gebDatum.get(Calendar.YEAR);
        
        //Prüfen, ob Tag in otherDate vor Tag in birthdate liegt. Wenn ja, Alter um 1 Jahr vermindern
        if ( (aktDatum.get(Calendar.MONTH) < gebDatum.get(Calendar.MONTH))
            ||(aktDatum.get(Calendar.MONTH) == gebDatum.get(Calendar.MONTH)
                && aktDatum.get(Calendar.DAY_OF_MONTH) < gebDatum.get(Calendar.DAY_OF_MONTH)))
            --alter;
        
        return alter;
        
    }
  
}
```


Nun habe ich noch eine GUI, wo das Alter eingegeben wird und einen Handler, der die eingebenen Stammdaten auf die Datenbank schreiben soll. Hier die entsprechende Handler Methode: 


```
public void erfassenStammdaten(String name, String vorname, String strasse, int plz, String ort, int gebDatum, boolean behinderung) {
        this.einKunde = new Kunde(name, vorname, strasse, plz, ort, gebDatum, behinderung); //erzeugt neues Objekt Kunde übergibt Konstruktor die Daten
           try {
            Datenbankklassen.DbHandler hd = new Datenbankklassen.DbHandler();  // DbHandler Objekt erzeugen
            hd.schreibeKunde(einKunde);  // Kunde auf DB geschrieben
            Dialogklassen.erfassenNutzungsrecht nr = new Dialogklassen.erfassenNutzungsrecht(this);  //nach Schreiben der Kundedaten wird neues Fenster (Nutzungsrechte) erzeugt //this = gibt Objekt von VerkaufenHandler an den erfassenNutzungsrecht
            nr.show();  // zeigt das Fenster (Nutzungsrechte) an 
            }
        catch (Exception e){
            System.out.println(e);
        }
    }
```


Der Kunde soll je nach Geburtsdatum eine unterschiedliche Einstufung bekommen, das hab ich mal versucht in der Klasse Kunde wie folgt festzuhalten: 


```
public int getKondition(Kunde einKunde) {   //hier wird die Kondition des Kunden festgelegt, wichtig für die spätere Rabattberechnung
       alter = einKunde.getAlter();
        if (alter < 7) {
            return 1; //Kind
        }
        else {
            if (alter < 18) {
                return 2; // Jugendlicher
            }
            else {
                if (alter < 62) {
                    return 3; // Erwachsener
                }
                else {
                    return 4; // Senior
                }
                }
            }
    }
```



Hui, schon mal ganz schön viel Code    Jetzt muss ich ja bei der Handler Methode noch die Kondition mit übergeben, damit diese in die DB geschrieben werden kann. Leider hab ich jetzt den Überblick verloren und weiss nicht mehr weiter (vielleicht hänge ich schon zu lange vor dem Computer). Wie baue ich denn die berechnung des Alters und die Einstufung (Kondition) in die HandlerMethode erfassenStammdaten ??? 

Danke für eure Hilfe! 

Grüssle

Claudi


----------



## foobar (17. Jul 2006)

Pack die Berechnung der Kondition doch in die Kunde-Bean, dann kommst du immer dran.

- Warum übergibst du der Methode erfassenStammdaten( nicht direkt die Kunde-Bean? Das wäre viel einfacher zu warten.


```
catch (Exception e){
            System.out.println(e);
        }
```
Sowas ist keine Sinnvolle Fehlerbehandlung. Gib zumindst den Stacktrace aus, oder besser zeig eine Error-Meldung in der GUI an.


----------



## Guest (17. Jul 2006)

Hallo, 

danke für deine Antwort.

Du meinst also ich sollte die Konditionsberechnung gleich in den Handler mit reinpacken, ja? Mein Prof meinte die GUI sollte frei von Fachlogik sein, die Berechnung der Kondition in der GUI würde das ja ganz genau bedeuten, oder? 

Ich probier es jetzt mal aus.. 

Grussi, 

Claudi


----------



## SamHotte (17. Jul 2006)

Schau mal unter Observer-Pattern nach, wie man das trennen kann. Gibt hier im Forum schon ein paar Threads.


----------



## puddah (17. Jul 2006)

Ich habe einfach mal so ein paar Anmerkungen:

1. Du solltest bei einer Verzweigung wie du Sie in der Methode getKondition benutzt entweder mit switch oder mit else if arbeiten.
Wenn du den Code so verschachtelst wird das schnell unübersichtlich.

2. Warum ist die alter Methode in der Klasse Alter static?

3. Warum bekommt die Methode getKondition einen Kunden als parameter?

Mir scheint als würdest du versuchen prozedual zu arbeiten.
java is ja nun mal objektorientiert, also solltest du die Klassen auch so anlegen. Wenn die getKondition Methode Teil der klasse Kunde ist, dann braucht Sie keinen Kunden als Parameter


----------



## Guest (17. Jul 2006)

Hallo! 

Ich habe versucht das mit dem Datum und dem Alter gemäß euren Vorschlägen anzupassen. Mein Ergebnis sieht wie folgt aus: 


```
// Berechnung der Kondition durch Alterseinstufung
    public int setzeKondition() {
       
       int aktJahr = aktDatum.get(Calendar.YEAR);
       int geburtsjahr = Integer.parseInt(this.einKunde.getgebDatum());
       int alter = aktJahr - geburtsjahr;
         
        if (alter < 7) {
            return 1; //Kind
        }
        else {
            if (alter < 18) {
                return 2; // Jugendlicher
            }
            else {
                if (alter < 62) {
                    return 3; // Erwachsener
                }
                else {
                    return 4; // Senior
                }
                }
            }

    }
```


Aber jetzt muss ich das ganze (also die Konditionseinstufung) auch noch irgendwie zusammen mit meinen anderen Daten in meine DB schreiben. Das soll ja über die vorhin erwähnte erfassenStammdaten() Methode erfolgen. Wie baue ich denn jetzt die setzeKondition() Berechnung in die Methode erfassenStammdaten ein??? 

Bin schon echt am verzweifeln, am Mittwoch muss ich es meinem Prof präsentieren und es läuft noch fast nichts *schluchz*  :?


----------



## foobar (17. Jul 2006)

> Bin schon echt am verzweifeln, am Mittwoch muss ich es meinem Prof präsentieren und es läuft noch fast nichts *schluchz*


Kopf hoch, das wird schon ;-)



> Aber jetzt muss ich das ganze (also die Konditionseinstufung) auch noch irgendwie zusammen mit meinen anderen Daten in meine DB schreiben.


Na dann mach das doch. Wo liegt das Problem? Füg doch einfach einen weiteren Parameter zur erfassenStammdaten-Methode hinzu und persistiere alles zusammen.


----------



## Guest (17. Jul 2006)

Ich komm da voll durcheinander... 

die ganzen GUIs, Handlers, Fachklassen

ich habs versucht einzusetzen, im Handler und der Fachklasse schien es zu gehen, aber dann hat er in der GUI rumgemeckert, weil dort die Parameter für die Methode erfassenStammdaten aus den Textfeldern gelesen werden, aber eben nicht die Kondition, die ergibt sich ja wiederum aus dem Geburtsdatum. 

Sollte ich die methode setzeKondition mit Parameter programmieren, der Parameter wäre dann das Geburtsdatum das in der GUI angegen wurde? 

Oder wie sonst bekomme ich die setzeKondition in die erfassenStammdaten? Hättest du ne Idee? 

PS: Und Supi das ihr so hilfsbereit seid!!


----------



## Guest (17. Jul 2006)

Also wenn ichs richtig verstanden habe, sind folgende Klassen daran beteiligt: 

1) Die GUI Klasse erfassenStammdatenGUI


```
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

        String name = jTextField1.getText();
        String vorname = jTextField2.getText();
        String strasse = jTextField3.getText();
        int plz = Integer.parseInt(jTextField4.getText());
        String ort = jTextField5.getText();
        String gebDatum = jTextField6.getText();
        boolean behinderung = jCheckBox1.isSelected();
        
        Fachklassen.VerkaufenHandler vk = new Fachklassen.VerkaufenHandler();
        vk.erfassenStammdaten(name, vorname, strasse, plz, ort, gebDatum, behinderung);
        
        this.dispose();
    }
```



2) Als nächstes kommt der VerkaufenHandler zum Einsatz


```
public void erfassenStammdaten(String name, String vorname, String strasse, int plz, String ort, String gebDatum, boolean behinderung) {
        this.einKunde = new Kunde(name, vorname, strasse, plz, ort, gebDatum, behinderung); //erzeugt neues Objekt Kunde übergibt Konstruktor die Daten
           try {
            Datenbankklassen.DbHandler hd = new Datenbankklassen.DbHandler();  // DbHandler Objekt erzeugen
            hd.schreibeKunde(einKunde);  // Kunde auf DB geschrieben
            Dialogklassen.erfassenNutzungsrecht nr = new Dialogklassen.erfassenNutzungsrecht(this);  //nach Schreiben der Kundedaten wird neues Fenster (Nutzungsrechte) erzeugt //this = gibt Objekt von VerkaufenHandler an den erfassenNutzungsrecht
            nr.show();  // zeigt das Fenster (Nutzungsrechte) an 
            }
        catch (Exception e){
            System.out.println(e);
        }
    }
    
    public int setzeKondition() {
       
       int aktJahr = aktDatum.get(Calendar.YEAR);
       int geburtsjahr = Integer.parseInt(this.einKunde.getgebDatum());
       int alter = aktJahr - geburtsjahr;


        if (alter < 7) {
            return 1; //Kind
        }
        else {
            if (alter < 18) {
                return 2; // Jugendlicher
            }
            else {
                if (alter < 62) {
                    return 3; // Erwachsener
                }
                else {
                    return 4; // Senior
                }
                }
            }
    }
```


Dazu noch die Fachklasse Kunde mit dem Konstruktor


```
public Kunde(String name, String vorname, String strasse, int plz, String ort, String gebDatum, boolean behinderung) {
        this.setName(name);
        this.setVorname(vorname);
        this.setStrasse(strasse);
        this.setPlz(plz);
        this.setOrt(ort);
        this.setGebDatum(gebDatum);
        this.setAlter(alter);
        this.setBehinderung(behinderung);
    }
```



3) dann geht das ganze an meinen DbHandler der es in die Datenbank schreiben soll


```
public void schreibeKunde(Fachklassen.Kunde kunde) {
        try {
            //Kundennummer wird fortlaufend in der DB erstellt (AutoWert)
            sql = "insert into Kunde (name, vorname, strasse, plz, ort, gebDatum, behinderung) VALUES (?, ?, ?, ?, ?, ?, ?)";

            pstmt = einWriter.insert(sql);
            
            pstmt.setString(1, kunde.getName());
            pstmt.setString(2, kunde.getVorname());
            pstmt.setString(3, kunde.getStrasse());
            pstmt.setString(4, String.valueOf(kunde.getPlz()));
            pstmt.setString(5, kunde.getOrt());
            pstmt.setString(6, String.valueOf(kunde.getgebDatum()));
            pstmt.setBoolean(7, kunde.getBehinderung());
            //pstmt.setString(8, String.valueOf(kunde.getKonditionNr()));
            // Kondition muss mit übergeben werden! 
            
            
            pstmt.execute();
            pstmt.close();
            
            
            // Get KundenNr
            int kundenNr = leseKundenNr(kunde.getVorname(), kunde.getName(), kunde.getgebDatum());
            System.out.println("KundenNr: " + kundenNr);
        } catch (Exception e) {
            new javax.swing.JOptionPane().showMessageDialog(null, "DbHandler.schreibenKunde(Kunde) Fehler: " + e.getMessage());
        }
    }
```



Jetzt hatte ich wie gesagt das Problem die Methode setzeKondition hier richtig mit einzubinden... Könnt ihr mir da bitte bitte weiterhelfen???


----------



## Guest (17. Jul 2006)

Hat keiner eine Idee??


----------



## DerUnwissende (17. Jul 2006)

Hi,
da ist aber jmd. ungeduldig! Ja ja, die Jugend. 
Woran genau scheiterst du denn gerade? Wenn ich dich richtig verstanden habe (zu faul wirklich alles zu lesen), willst du diese Kondition, die du ermittelst irgendwie persistent in der DB ablegen?
Im Prinzip machst du dabei dann nichts anders, als mit dem Eintragen deiner ganzen anderen Werte (Name, ...) Du brauchst halt ein Feld in der DB, in das du diesen Wert 
	
	
	
	





```
speichern
```
 kannst. Wie man es speichert, entnimmst du ganz einfach der Insert-Anweisung, die du schon im Code stehen hast. Wie dein DB-Design aussieht musst schließlich du wissen. Dabei solltest du auch aufpassen, diese Einstufung wäre in deinem Fall (wenn sie in die DB geschrieben wird) auch dauerhaft. D.h. jmd. der als Kind in der DB steht, würde natürlich nicht automatisch hochgestuft werden (auch nicht mit 193 Jahren). Auch über die Einstufung solltest du noch mal nachdenken. Es ist viel schöner hier Konstanten zu nehmen. Dann entfällt ein wenig dass 1 Kind ist (leichter lesbar ist immer besser!)


```
class WasAuchImmer {
  public final int KIND = 1;
  ...
  public final int SENIOR = 5;

  public int setzeKondi(final int alter) {
    
     if (alter < 7) {
        return WasAuchImmer.KIND;
     }
     ....
  }
```

Hier wäre wohl schneller klar, dass die Einstufung ein Kind ist. Der Wert dahinter ist der gleiche. Auch ob du später == 1 oder == WasAuchImmer.KIND schreibst ist wohl das gleiche, aber eins von beidem wird wohl leichter verstanden werden (zumindest semantisch).

Gruß Der Unwissende


----------



## The_S (17. Jul 2006)

1. Keine Crosspostings, vor allem net in nem neuen Thread in diesem Forum auf diese Frage verweisen
2. Du wirst ja wohl mal länger als ne Stunde warten können bis sich jemand um dein Problem kümmert. Wir ham auch noch ein privat Leben und werden dafür in keinster weiße bezahlt sondern machen alles freiwillig
3. Antworte ich aus Prinzip nicht solchen penetranten Gästen (!!!).


----------



## Guest (17. Jul 2006)

Entschuldigt wenn ich ungeduldig war, bin nur sehr mit den Nerven runter. 

Weiss wirklich eure Hilfe zu schätzen! 

Ohne euch würde ich doch schon am Baum hangeln...  :wink:


----------



## L-ectron-X (17. Jul 2006)

Hab mich des Problems schon angenommen. Posting ist gelöscht.


----------



## Guest (17. Jul 2006)

sorry wenn ich euch mit crossposting so nen stress gemacht habe, wollte ich nicht


----------



## foobar (17. Jul 2006)

> Wir ham auch noch ein privat Leben


privat was? *lol*


----------



## The_S (17. Jul 2006)

joa, ich lebe gerne für mich privat, Pirvatleben hingegen mag ich gar net  :bae:


----------



## Guest (17. Jul 2006)

Hallo, 

ich versuche immernoch eine Lösung zu finden. Folgendes habe ich programmiert: 


```
/*
 * Kondition.java
 *
 * Created on 17. Juli 2006, 19:10
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package Fachklassen;


import java.util.Date;
import java.util.Calendar;
import java.util.*;
import java.text.*;


/**
 *
 * @author kovmar
 */
public class Kondition {
    
    /** Creates a new instance of Kondition */
    public Kondition(String gebDat) {
        this.gebDat = gebDat;
    }
    
    String gebDat;
    private Kunde einKunde;
    
    private static int KIND = 1;            
    private static int JUGENDLICHER = 2;
    private static int ERWACHSENER = 3;
    private static int SENIOR = 4;
    
    
    public int berechneAlter() {
		GregorianCalendar cal = new GregorianCalendar();
		int jahr;
                int tag;
                int alter;
                

		jahr = cal.get(cal.YEAR);
		tag = cal.get(cal.DAY_OF_YEAR);
		cal.setTime(gebDat);
		alter = jahr - cal.get(cal.YEAR);
		if (tag < cal.get(cal.DAY_OF_YEAR)) {
			--alter;
		}
                if (alter < 7) {
            return Kondition.KIND; //Kind
        }
        else {
            if (alter < 18) {
                return Kondition.JUGENDLICHER; // Jugendlicher
            }
            else {
                if (alter < 62) {
                    return Kondition.ERWACHSENER; // Erwachsener
                }
                else {
                    return Kondition.SENIOR; // Senior
                    } 
            }
        }
		
    }
    
    public static void main (String args[]) throws Exception {
		Kondition k;

		k = new Kondition("06111980");		
		System.out.println(k);
		System.out.println(k.berechneAlter());
		System.exit(0);
	}
    
}
```

Leider gibt es bei cal.setTime(gebDat); eine Fehlermeldung, Date cannot be applied to String

Ich hab aber in meiner ganzen Datenbank und den restlichen Klassen das Datum als String deklariert... 

Gibt es eine Möglichkeit dieses Problem zu umgehen bzw. zu lösen??


----------



## Brainiac (17. Jul 2006)

Benutze mal:

```
cal.setTime(DateFormat.parseString(gebDat));
```


----------



## Guest (17. Jul 2006)

Danke fuer die schnelle Antwort! 

Muss ich dazu noch eine extra Klasse importieren? 

Es kommt die Fehlermeldung cannot find symbol method parseString(java.lang.String)


----------



## Brainiac (17. Jul 2006)

Hatte mich verschrieben die Methode heißt parse(). Ich hab sie nur aus der API von new Date(String s) mußt mal schauen

So könnte da aussehen:

```
try {
        cal.setTime(new SimpleDateFormat().parse(gebDat)); 
      } catch (ParseException pe) {
          //ErrorHandling
      }
```


----------



## foobar (17. Jul 2006)

@Gast Warum benutzt du keine IDE? Damit kannst du dir viel Arbeit ersparen.


----------



## Guest (18. Jul 2006)

Wie meinst du das mit IDE?? 

sorry, bin noch voll die Programmierwurst, kenn mich echt nicht gut aus


----------



## Guest (18. Jul 2006)

Hab das jetzt folgendermassen gelöst:


```
/*
 * Kondition.java
 *
 * Created on 17. Juli 2006, 19:10
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package Fachklassen;


import Fachklassen.*;
import java.util.Date;
import java.util.Calendar;
import java.util.*;
import java.text.*;


/**
 *
 * @author kovmar
 */
public class Kondition {
    
    /** Creates a new instance of Kondition */
    public Kondition(String gebDat) {
        this.gebDat = gebDat;
    }
    
    String gebDat;
    private Kunde einKunde;
    
    private static int KIND = 1;            
    private static int JUGENDLICHER = 2;
    private static int ERWACHSENER = 3;
    private static int SENIOR = 4;
    
    
    //berechnet zuerst das Alter, daraus wird dann die Kondition des Kunden errechnet 
    public int berechneAlter() {
		GregorianCalendar cal = new GregorianCalendar();
		int jahr;
                int tag;
                int alter;                
		jahr = cal.get(cal.YEAR);
		tag = cal.get(cal.DAY_OF_YEAR);
                try { 
                cal.setTime(new SimpleDateFormat().parse(gebDat)); 
                } catch (ParseException pe) { 
                pe.getMessage(); 
                } 
		alter = jahr - Integer.parseInt(gebDat.substring(4,8));
		if (tag < cal.get(cal.DAY_OF_YEAR)) {
			--alter;
		}               
  
                if (alter < 7) {
            return Kondition.KIND; //Kind
        }
        else {
            if (alter < 18) {
                return Kondition.JUGENDLICHER; // Jugendlicher
            }
            else {
                if (alter < 62) {
                    return Kondition.ERWACHSENER; // Erwachsener
                }
                else {
                    return Kondition.SENIOR; // Senior
                    } 
            }
        }
		
    }
    
    
//          --main Klasse für Testzwecke--  
//    
//    public static void main (String args[]) throws Exception {
//		Kondition k;
//
//		k = new Kondition("06111980");		
//		System.out.println(k);
//		System.out.println(k.berechneAlter());
//		System.exit(0);
//	}
    
}
```

Funktioniert soweit auch, jedoch wird nicht das genaue Geburtsdatum gelöst. Wie könnte ich das Problem angehen?


----------



## foobar (18. Jul 2006)

@Programmierwurst ;-)
http://de.wikipedia.org/wiki/Integrierte_Entwicklungsumgebung
http://de.wikipedia.org/wiki/Eclipse_(IDE)


----------



## Der_Unwissende (18. Jul 2006)

Gast hat gesagt.:
			
		

> Funktioniert soweit auch, jedoch wird nicht das genaue Geburtsdatum gelöst. Wie könnte ich das Problem angehen?



Ok, ich bemühe mal die Glaskugel.... Hat nicht geklappt. Da musst du dir vielleicht doch mal die Mühe machen und dir etwas Zeit nehmen. Also ganz ehrlich, es gibt ein paar Forenregeln, die eigentlich einheitlich in allen Foren gelten. Die solltest du mal verinnerlichen. 
Wichtig ist es nicht ungeduldig zu sein. Das gilt natürlich nicht nur für das Warten auf eine Antwort, sondern auch das Schreiben deiner Beiträge. Wenn du möchtest dass man dir hilft, dann hilf auch den Leuten. Nimm dir einfach mal die Zeit und formulier aus, wo genau dein Problem liegt. Was möchtest du erreichen, was hast du schon versucht, woran genau scheiterst du gerade (so genau wie möglich). 
Wenn du Fehler hast, dann poste einfach mal die Stelle, an der die Fehler auftauchen (neben der Fehlermeldung). Den ganzen Quellcode zu posten und zu sagen "Läuft nicht" hilft keinem weiter. 

Was heißt denn "es wird nicht das genaue Geburtsdatum gelöst?"?

Gruß Der Unwissende


----------

