Datenbanksysteme für TI INHALT Einführung Architektur, Datenbankverbund Benutzung Konzepte/Begriffe Datenbanklebenszyklus Datenbankentwurf Access als Entwicklungssystem für Anwendungen mit Oberfläche, Programme, Datenbank Relationales Datenmodell/SQL Entwicklung SQL86, SQL89, SQL92; SQL99 Standardbenutzeroberflächen Datenbankprogrammierung lokal GUI Visualisierung Datenbankprogrammierung im Internet GUI mit HTML und JSP TFH Berlin/Steyer DBSTI Ablauf SS 2007 +02.04.: Organisatorisches, Inhalt, Leistung +09.04.: frei (Ostermontag) +16.04.: Datenbankentwurf/Normalisierung/Aufgabe1 +23.04.: Datenbank-Architektur +30.04.: frei (vor 1.5.) +07.05.: Datenbank-Konzepte, Access-Anfang/Aufgabe2 -14.05.: Access: Datenbanken, Tabellen, Abfragen -21.05.: Access: Formulare, Berichte, Makros, Module /Aufgabe3 -28.05.: frei (Pfingstmontag) -04.06.: SQL in Access, einfaches SQL -11.06.: komplexes SQL /Aufgabe4 -18.06.: Java-Anwendungsprogrammierung/GUI -25.06.: Java-Anwendungsprogrammierung/Aufgabe5 -02.07.: Datenbank und Java im Internet -09.07.: Klausurvorbereitung -16.07.: Klausur -23.07.: Klausurrückgabe LEISTUNGEN Vorübung: einloggen unter Windows, Access Aufgabe1: Datenbankentwurf Aufgabe2: Access-Anwendungssystem Aufgabe3: einfaches SQL Aufgabe4: komplexes SQL Aufgabe5: Java-GUI-Anwendungsprogramm (Kontoabfrage) Klausur Jede Aufgabe ergibt maximal 5 Punkte. (6*5 = 30 Punkte) Diue Klausur ergibt maximal 70 Punkte. 100 Punkte ergeben 1.0 51 Punkte ergeben 4.0 TFH Berlin/Steyer TEILNEHMER DBS-TI SS2007 Name Mat-Nr Albrecht Baumann Becker Berg Choinka 736580 734861 734143 736845 740920 Dittwald Eckstein Erler Essien Gluszczynski 733626 736573 732207 735105 736807 Hampel Haselbach Havemann Kranz Korican 735100 733531 735123 736781 736174 Lamine Lüpnitz Miemietz Naperkowski Nguyen 736743 737812 744366 736760 732215 Paasch Pries Rosin Schumann Sidykh 734343 737803 736797 732303 740962 Siedler Stapelfeld Tsavdaridis Zawadski 732295 732184 734785 732257 TFH Berlin/Steyer Auf1 Auf2 Auf3 Auf4 Auf5 Auf6 SumAuf Klausur SumGes Note Vorübung - in XP einloggen - in Access: Datenbank, Tabelle, Abfrage, SQL-Kommando-Anzeige. - konkreter evtl. Access-Anwendungssystem mit Tabelle, Formular, Navigation TFH Berlin/Steyer Aufgabe 1: Datenbankentwurf Erstellen Sie Entity-Relationship-Diagramme mit Objekten, einigen Attributen und Beziehungen für folgende Weltausschnitte: 1 Reisebüro: Kunden buchen Hotels. Die Hotels haben Adressen. 2 Einzelhandel: Lieferanten liefern Artikel an Filialen. 3 Immobilien: Firmen planen, bauen, verkaufen, vermieten Häuser. Entwerfen Sie mögliche Tabellen. TFH Berlin/Steyer Lösungen zu Aufgabe 1: 1 Reisebüro: Kunde Buchung Hotel Adressen 2 Einzelhandel: Lieferant Artikel liefert Filiale 3 Immobilien: Firmen planen bauen verkaufen vermieten create table kunde (knr integer, kname char(20)) create table buchung (bnr integer, knr integer, hnr integer) create table hotel (hnr integer, hname char(20)) create table lieferant (lnr integer, lname char(20)) create table artikel (anr integer, aname char(20)) create table filiale (fnr integer, fname char(20)) create table liefert (linr integer, lnr integer, anr integer, fnr integer) create table firmen (fnr integer, fname char(20)) create table häuser (hnr integer, hname char(20)) create table planen (pnr integer, fnr integer, hnr integer) create table bauen (bnr integer, fnr integer, hnr integer) create table verkaufen (vknr integer, fnr integer, hnr integer) create table vermieten (vmnr integer, fnr integer, hnr integer) TFH Berlin/Steyer Häuser Aufgabe 2: Access-Anwendungssystem - Legen Sie eine Datenbank 'lager' an. - Erzeugen Sie die Tabelle 'artikel': artikelnr artikelname menge (Neue Tabelle, kein Primärschlüssel) - Tragen Sie die Zeilen ein: 11 12 13 14 15 16 17 18 Fahrrad Lenker Rahmen Laufrad Nabe Speichen Felge Schlauch 5 30 25 3 150 300 45 65 - Erstellen Sie eine Abfrage: alle Spalten ausgeben nach artikelnr aufsteigend sortieren keine Kriterien - Erstellen Sie eine Abfrage: artikelname und menge ausgeben nach menge absteigend sortieren Kriterium >=5 - Formular zu Artikel (Einspaltige Darstellung, alle Felder) - Formular zu Artikel (Tabellarische Darstellung, Felder artikelname menge) - Bericht zu Artikel (Einspaltige Darstellung, alle Felder, Sortierung nach artikelname) - Bericht zu Artikel (Tabellarische Darstellung, artikelname, menge, sortiert nach artikelname) - Erzeugen Sie ein Formular "Artikelverwaltung" mit Kontrollelementen (Buttons), mit denen man die erstellten Abfragen, Formulare und Berichte aufrufen kann. - Legen Sie über das Formular "Artikelverwaltung" ein weiteres (Titel: "Firma"), das als Unterpunkte noch "Kundenverwaltung" und "Lieferantenverwaltung" enthält. Geben Sie für die noch nicht realisierten Zweige vernünftige Meldungen (x) aus. - Legen Sie über das Formular "Firma" ein Log-in-Formular, das Benutzername und Passwort abfragt und bei Button-Klick ihr Vorhandensein in einer Tabelle „User“ überprüft. Wenn ja, wird das Formular „Firma“ geöffnet, sonst erscheint eine Fehlermeldung. Login: Firma: Artikelverwaltung Kundenverwaltung X TFH Berlin/Steyer Lieferantenverwaltung X Aufgabe 3: Einfaches SQL Tabelle/View/einfügen/ändern/löschen/lesen - Erzeugen Sie eine Datenbank (z.B. mit Ihrem Namen), die Sie ab jetzt benutzen und immer wieder auswählen. - Erzeugen Sie dort die Tabelle 'kunde': kundennr nachname vorname kalter Tragen Sie die Zeilen ein: 21 22 23 24 25 - Karl Anna Fritz Monika Hans 22 35 47 32 22 Erzeugen Sie die Tabelle 'artikel': artikelnr, artikelname, menge, nettopreis Tragen Sie die Zeilen ein: 11 12 13 14 - Meier Müller Schulze Lehmann Schiller Fahrrad Lenker Rahmen Laufrad 20 30 25 45 400.00 70.00 120.00 50.50 Erzeugen Sie die Tabelle 'bestellt': kundennr, artikelnr, menge Tragen Sie die Zeilen ein: Bestellungen soll es nur von existierenden Kunden für existierende Artikel geben. 21 22 22 25 12 12 13 14 4 7 12 20 - Erstellen Sie eine Abfrage zu kunde: vorname und nachname ausgeben nach nachname absteigend sortieren, kalter zwischen 30 und 50 - Erstellen Sie eine Abfrage zu artikel: artikelname und menge ausgeben nach menge absteigend sortieren, nur die Artikel mit der Menge < 40 - Lagerwert: Summe von Menge*Nettopreis für alle Zeilen der Artikeltabelle - Join: Wer bestellt was (mit Kunden- und Artikelname, Menge). - Die Preise für alle Artikel werden verdoppelt. - Die Bestellung der Rahmen durch Müller wird gelöscht. - Es wird eine View v1 angelegt mit einer neuen Spalte (nettopreis mit 16 % Aufschlag), nur die Spalten artikelname (neue Überschrift: Artikel) und bruttopreis > 100 (neue Überschrift: Verkaufspreis) TFH Berlin/Steyer Artikel Verkaufspreis Fahrrad Rahmen 464.00 139.20 Lösungen zu Aufgabe 3: create table kunde (kundennr integer, nachname char(12), vorname char(12), kalter integer) insert into kunde values (21, 'Meier', 'Karl', 22) insert into kunde values (22, 'Müller', 'Anna', 35) insert into kunde values (23, 'Schulze', 'Fritz', 47) insert into kunde values (24, 'Lehmann', 'Monika', 32) insert into kunde values (25, 'Schiller', 'Hans', 22) create table artikel (artikelnr integer, artikelname char(12), menge integer, nettopreis currency) insert into artikel values (11, 'Fahrrad', 20, 400.00) insert into artikel values (12, 'Lenker', 30, 70.00) insert into artikel values (13, 'Rahmen', 25, 120.00) insert into artikel values (14, 'Laufrad', 45, 50.50) create table bestellt (kundennr integer, artikelnr integer, menge integer) insert into bestellt values (21, 12, 4) insert into bestellt values (22, 12, 7) insert into bestellt values (22, 13, 12) insert into bestellt values (25, 14, 20) select * from kunde select * from artikel select * from bestellt select vorname, nachname from kunde where kalter between 30 and 50 order by nachname desc select artikelname, menge from artikel where menge < 40 order by menge desc select sum (menge* nettopreis) from artikel select nachname, artikelname from kunde, bestellt, artikel where kunde.kundennr = bestellt.kundennr and bestellt.artikelnr = artikel.artikelnr update artikel set nettopreis = nettopreis*2; delete from bestellt where kundennr = (select kundennr from kunde where nachname = 'Müller') and artikelnr = (select artikelnr from artikel where artikelname = 'Rahmen'); create view v1 (Artikel,Verkaufspreis) as select artikelname, nettopreis*1.16 from artikel where nettopreis*1.16 > 100; TFH Berlin/Steyer Aufgabe 4: Komplexes SQL Prozeduren/Trigger/materialisierte View - Den letzten Befehl der Aufgabe 3 (Wer bestellt was (mit Kunden- und Artikelname, Menge)). in eine (parameterlose) Prozedur verpacken (p1) - Parameterlose Prozedur, die für jede Artikelnr die Menge verdoppelt (p2) - Prozedur mit einem Parameter, die für alle Artikel den Nettopreis um einen bestimmten Prozentsatz erhöht (p3) Erzeugen Sie einen Trigger zu der obigen Artikeltabelle, der beim INSERT ausser dem Tabelleneintrag noch eine Zahl in der Tabelle „insertzähler“ hochzählt. Beginn ist bei 0. Tragen Sie die folgenden Beispielzeilen ein. 15 16 17 18 Nabe Speichen Felge Schlauch 150 300 45 65 12 3 24 8 Was steht in „insertzähler“ ? View und materialisierte View: - 1.Fall: Erzeugen Sie eine Sicht "Artikelbrutto1" mit allen Artikelspalten und der virtuellen Spalte "Mehrwertsteuer" auf dem SQL Server. - 2.Fall: Erzeugen Sie aus dieser Sicht eine Tabelle "Artikelbrutto2" mit allen Artikelspalten und der virtuellen Spalte "Mehrwertsteuer" auf dem SQL Server. Was muss im ersten Fall getan werden, wenn ein neuer Artikel hinzukommt ? Schreiben Sie eine Prozedur (p4) für den 2. Fall, die die materialisierte View aktualisiert. TFH Berlin/Steyer Lösungen zu Aufgabe 4: create procedure p1 as select nachname, artikelname from kunde, bestellt, artikel where kunde.kundennr = bestellt.kundennr and bestellt.artikelnr = artikel.artikelnr create procedure p2 as update artikel set menge = menge * 2 create procedure p3(@prozentsatz int) update artikel set nettopreis = nettopreis+nettopreis/100*@prozentsatz; create table insertzaehler (counter int); insert into insertzaehler values (0); create trigger t after insert on artikel for each row update insertzaehler set counter = counter+1; create view artikelbrutto1 (artikelnr,artikelname,menge,nettopreis,bruttopreis) as select artikelnr,artikelname,menge,nettopreis,nettopreis*1.16 from artikel; create table artikelbrutto2 (artikelnr integer,artikelname char(12),menge integer,nettopreis decimal(5,2),bruttopreis decimal(5,2)); insert into artikelbrutto2 select * from artikelbrutto1; create procedure p4() delete from artikelbrutto2 insert into artikelbrutto2 select * from artikelbrutto1 TFH Berlin/Steyer Aufgabe 5: GUI (Java und Datenbank) Schreiben Sie ein Javaprogramm, das eine GUI erzeugt und nach Eingabe von Kundenname und PIN den Kontostand und die dazu addierte Überziehung anzeigt. Legen Sie dazu in der Datenbank eine entsprechende Tabelle (s.u.) an und richten Sie dafür eine Datasource ein, die das Javaprogramm benutzt. TFH Berlin/Steyer Lösung Aufgabe 5 import java.awt.*; import java.awt.event.*; import java.sql.*; public class verfuegbarSQLServer extends Frame { Panel ein = new Panel(new GridLayout(0,2)); TextField nam = new TextField(); TextField pin = new TextField(); TextField kon = new TextField(); TextField ver = new TextField(); Button go; String drv = "sun.jdbc.odbc.JdbcOdbcDriver"; public verfuegbarSQLServer() { add("Center", ein); ein.add(new Label("Name")); ein.add(nam); ein.add(new Label("PIN")); ein.add(pin); ein.add(new Label("Kontostand")); ein.add(kon); ein.add(new Label("verfügbar")); ein.add(ver); ein.add(go = new Button("ermittle")); setSize(400,250); setVisible(true); try { Class.forName(drv); } catch (Exception ex) {ex.printStackTrace();} addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); }} ); go.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { ermittle();}}); } private void ermittle() { try { Connection c = DriverManager.getConnection("jdbc:odbc:sqlserverdb", "", ""); Statement s = c.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); ResultSet rs; String q = "SELECT kundenname, pin, kontostand, kontostand+überziehung FROM kunde WHERE kundenname = '" + nam.getText() + "' and pin = '" + pin.getText() + "'"; System.out.println(q); rs = s.executeQuery(q); rs.first(); nam.setText(rs.getString("Kundenname")); pin.setText(rs.getString("PIN")); kon.setText(rs.getString("Kontostand")); ver.setText(rs.getString(4)); } catch (Exception ex) {ex.printStackTrace();} } public static void main(String[] args) { new verfuegbarSQLServer(); } } Steyer: Datenbanksysteme für TI Vorschlag Datenbanksysteme für TI 1. Datenbankgrundlagen Konzepte/Begriffe (Persistente Datenhaltung, Tabellen, Befehle, Transaktion, View, Benutzer, Datenintegrität, Mehrbenutzerfähigkeit, Client/Server-Datenbanken) 2. Datenbankentwurf Datenmodellierung (ER-Modellierung, Normalisierung) 3. Access als Gesamtsystem Umfang eines Anwendungssystems (Oberfläche, Programme, Datenbank) 4. SQL Standard-Benutzeroberflächen (SQL-Editor, Formulare, Berichte, Programme) Zwei konkrete Systeme (mit Characters und Windows) 5. Anwendungsprogrammieren C/C++ und embedded SQL ODBC Internet-Anwendungen 6. speziell für TI Stücklisten in SQL Sensoren/Aktoren ansprechen und archivieren TFH Berlin/Steyer