# Inventarverwaltung



## chawo87 (5. Nov 2010)

Guten Morgen zusammen,

Ich habe folgende Aufgabe bekommen:
Ich soll eine Inventarverwaltung der Hard- und Software erstellen.
Das Ganze soll in einer SQL-Datenbank gespeichert werden.
Das Programm soll in Java (auch OOP) programmiert werden und die Eingabe der Daten soll über ein Applet geschehen.

Bis jetzt sehen meine Tabellen so aus:
Hardware: ID, InventarNr, SerienNr, Kaufdatum, Mitarbeiter/Domain, Modell, Typ
Software: ID, Name, LizenzNr, Mitarbeiter/Domain


So nun zu meinem Problem: OOP
Was für Klassen wären sinnvoll anzulegen???
GUI(Applet) 
 - Textfelder zum eintragen
 - Buttons zum speichern, löschen, ändern
 - ChoiceMenu zur Auswahl der gespeicherten Daten 
 -
Verbindung(Verbindung zur DB)
Speichern(SQL-String zum Speichern der eingetragenen Daten)
Löschen
Ändern
Auswahl


Wie findet ihr meine ersten Überlegungen?
Habt ihr Verbesserungsvorschläge oder Kritik?
Habe ich etwas wichtiges vergessen?

Danke im voraus


----------



## Marcinek (5. Nov 2010)

Ja sieht gut aus...

Man sollte das so aufbauen:  Datenhaltung <-> Fachlogik <-> Anzeige


----------



## ARadauer (5. Nov 2010)

> Was für Klassen wären sinnvoll anzulegen???


du musst keine Klassen für Gui Elemente machen, die gibt es schon 



> Verbindung(Verbindung zur DB)
> Speichern(SQL-String zum Speichern der eingetragenen Daten)
> Löschen
> Ändern
> Auswahl


naja, Connection Klasse gibt es natürlich auch schon.
Speichern, Löschen sind Methoden, eher in einem Objekt gepaselt...

1. Schau dir mal ein paar Grundlagen zum Thema Swing an, dann hast du mal ein Vorstellung wie man Guis in Java macht.
2. Ließ dich mal einwenig zum Thema MVC ein, da gehts darum, wie man so eine Anwendung struktuiert. wie Marcinek schon gesagt hatte Datenhaltung<-> Fachlogik <-> Anzeige ..
3. Schau dir das DAO Pattern an, Objekt das dir den Datenzugriff für ein Fachobjekt regelt...

Das ist dann mal eine gute Basis um eine saubere und sinnvoll strukturierte Anwendung zu schreiben.


----------



## chawo87 (5. Nov 2010)

> 1. Schau dir mal ein paar Grundlagen zum Thema Swing an, dann hast du mal ein Vorstellung wie man Guis in Java macht.
> 2. Ließ dich mal einwenig zum Thema MVC ein, da gehts darum, wie man so eine Anwendung struktuiert. wie Marcinek schon gesagt hatte Datenhaltung<-> Fachlogik <-> Anzeige ..
> 3. Schau dir das DAO Pattern an, Objekt das dir den Datenzugriff für ein Fachobjekt regelt...



danke für die tipps, habe mich jetzt mal ein wenig in MVC und DAO-Pattern eingelesen werde dann im Verlauf der nächsten Wochen nach und nach erste Ergebnisse vom Code liefern


EDIT:
hab jetz ma ne testverbindung erstellt (und alles in die GUI geschrieben, funktioniert auch mit dem speichern)


```
public void start(){
    	   		
    	    try {
    	      String driver = "com.mysql.jdbc.Driver";
    	      String url = "jdbc:mysql://localhost/verwaltung";
    	      String user = "isdochegal";
    	      String password = "auchegal";      

    			try {
    				Class.forName(driver);
    				try {
    					conn=DriverManager.getConnection(url, user, password);
    				} catch (SQLException e) {
    					e.printStackTrace();
    				}
    			} catch (ClassNotFoundException e) {
    				e.printStackTrace();
    			}
    	    } catch(Exception ex) {
    	      ex.printStackTrace();
    	    }
    	  }
```


```
public void init(){
    	speichernButton.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e) {
				if(conn !=null){
					try {
						PreparedStatement statement = conn.prepareStatement(savestring);
						statement.setString(1, inventarNrTextField.getText());
						statement.setString(2, serienNrTextField.getText());
						statement.setString(3, typTextField.getText());
						statement.setString(4, modellTextField.getText());
						statement.executeUpdate();					
					} catch (SQLException ex) {
						ex.printStackTrace();
					}		
				} 
			}
    	});    	
    }
```


```
public void stop(){
    	try {
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
    }
```


----------



## chawo87 (11. Nov 2010)

So sieht bis jetzt die GUI aus.

Was noch fehlt sind die rotmarkierten Zeilen und Spalten.

wie ist dies am besten realisierbar wenn ich die Daten von der Sql Datenbank dort hineinschreiben möchte?

danke im vorraus


----------



## Gast2 (11. Nov 2010)

Mit einer JTable.

Musst du halt aus den ResultSet und den ResultMetadata (für die Spaltennamen) aufbauen.


----------



## chawo87 (12. Nov 2010)

```
Vector<String> columns = new Vector<String>();
		    columns.add("ID");
		    columns.add("InventarNr");
		    columns.add("SerienNr");
		    columns.add("Typ");
		    columns.add("Modell");
```


so hab ich das jetzt erstmal mit den Spaltennamen gelöst, so werden sie zwar nicht aus der Datenbank geladen aber müssen sie ja auch nicht.

Mit dem ausfüllen der Tabelle hab ich jetzt nur ein kleines Problem ich hab schon ein fertiges resultStatement aber habe keine idee wie ich damit den JTable füllen kann


----------



## trnoirnntbsdfg (16. Nov 2010)

Genauso wie du auch die Überschrifften erzeugt hast.
Du gehst durch dein resultStatement und ruffst dann die add funktion auf.


----------



## chawo87 (22. Nov 2010)

derzeit fülle ich die daten so


```
Vector<String> rowOne = new Vector<String>();
	        rowOne.addElement("mal");
	        rowOne.addElement("testen");
	        rowOne.addElement("ob");
	        rowOne.addElement("das");
	        rowOne.addElement("funktioniert");	        
	        Vector<String> rowTwo = new Vector<String>();
	        rowTwo.addElement("blabla");
	        rowTwo.addElement("noch");
	        rowTwo.addElement("viel");
	        rowTwo.addElement("mehr");
	        rowTwo.addElement("blabla");	        
	        Vector<Vector> rows = new Vector<Vector>();
	        rows.addElement(rowOne);
	        rows.addElement(rowTwo);
```

das ganze soll aber per resultset funktionieren ich komme jedoch nicht drauf wie ich das machen soll vllt kann mir jemand mal einen denkanstoss geben


----------



## ARadauer (22. Nov 2010)

> drauf wie ich das machen soll vllt kann mir jemand mal einen denkanstoss geben



naja du iterierst über dein Resultset und erzeugt dir für jede Zeile einen Vector und fügt dort die Spalten ein die du brauchst... ich finde das aber nichit so schön...

du ließt ja eigenlich ein Fachobjekt... mach dir ein Objekt das eine Zeile repräsentiert, dann ließ diese Objekte und halte sie in einer Liste...


```
ArrayList<Kunde> kundenList = new ArrayList<Kunde>();
      while (rs.next()) {
         Kunde kunde = new Kunde();
         kunde.setName(rs.getString("name"));
         ...
         ...
         ...
         kundenList(kunde);
        
      }
```

Dann würde ich mir ein, eigenes Table Model Machen, das von AbstractTableModel ergbt, dieses liefert dann mit der getValueAt aufgrund der entsprechen der zeile und Spalte, das richtige Objekt und daraus die richte Eigenschaft zurück... gibt in der FAQ ein paar gute Tutorials zu dem Thema...


http://www.java-forum.org/java-faq-beitraege/7035-jtable-teil-2-kommen-daten-tabelle.html


----------



## Gast2 (22. Nov 2010)

Du solltest es über ein TableModel machen, zum Beispiel so:


```
JTable table = new JTable();
		
		ResultSet resultSet = getResultSet();
		List<String[]> rows = new ArrayList<String[]>();
		Object[] columnheaders = new Object[3];
		try {
			String columnName1 = resultSet.getMetaData().getColumnName(1);
			String columnName2 = resultSet.getMetaData().getColumnName(2);
			String columnName3 = resultSet.getMetaData().getColumnName(3);
			columnheaders[0] = columnName1;
			columnheaders[1] = columnName2;
			columnheaders[2] = columnName3;
			
			while (resultSet.next()) {
				String[] row = new String[3];
				String column1 = resultSet.getString(1);
				String column2 = resultSet.getString(2);
				String column3 = resultSet.getString(3);
				row[0] = column1;
				row[1] = column2;
				row[2] = column3;
				rows.add(row);
			}

		} catch (SQLException e) {
			e.printStackTrace();
		}
		Object[][] data = new Object[rows.size()][];
		for (int i = 0; i < rows.size(); i++) {
			data[i] = rows.get(i);
		}
		
		DefaultTableModel m = new DefaultTableModel(data,columnheaders);
		table.setModel(m);
```

EDIT:// zu langsam - und ja, mit Object[][] rumzubasteln ist nicht schön...besser ARadauers Tip folgen und eine eigene Klasse dafür nehmen.


----------



## ARadauer (22. Nov 2010)

fassy hat gesagt.:


> und ja, mit Object[][] rumzubasteln ist nicht schön...besser ARadauers Tip folgen und eine eigene Klasse dafür nehmen.



man ist vielleicht mit den Object[][] schneller... aber wenn man bedenkt das wir als Entwickler viel mehr Zeit für Fehlersuche verschwenden als mit Neuentwicklungen, dann sind die 30 Minuten die man für das Objekt und das eigene Modell braucht, gut investiert...


----------



## chawo87 (25. Nov 2010)

hallo zusammen

dass mit dem einlesen der datenbank daten funktioniert 
danke für die tipps

aber es gibt ein neues problem...
wie muss ich den löschen-befehl gestalten damit ich die ausgewählte zeile löschen kann
mein jetziger befehl

DELETE * FROM testtabelle WHERE ID=?

kann ich bei id einfach getSelectedRow benutzen?


----------



## ARadauer (25. Nov 2010)

> kann ich bei id einfach getSelectedRow benutzen?


kommt drauf an...

1. Hast du da irgendwie mit der JTable rum sortiert?
2. Entwpricht die zeilennummer deiner id? Denke nicht...
2. Wie machst du nun dein Model?

Wie ich oben beschrieben hast, hast du ja eine Liste mit Objekten in deinem Model. Diese Fachobjekte können ja als Eigenschaft die ID aus der DB haben, auch wenn sie nicht angezeigt wird...
Also falls du nun herum sortiert hast musst du dir mit table.convertRowIndexToModel den "echten" index deiner zeile besorgen und dann kannst du dir einfach dein Objekt hohlen...


----------



## chawo87 (25. Nov 2010)

1. nein es wird nichts sortiert
2. ja erst is der columname dannach kommen die ids also
    ID
    1
    2
    3     usw

3.hab die object[][] variante von fassy benutzt


----------

