Fachhochschule Brandenburg University of Applied Sciences Fachbereich: Wirtschaft Studiengang: Wirtschaftsinformatik Fach: Datenbank II Dozent: Dr. Michael Höding Projektdokumentation Lehrveranstaltung Datenbanken II Wir haben uns als Projektziel gesetzt, Börsendaten in eine Datenbank einzubringen und diese am Ende über das Web auswerten zu können. Das entsprechende E-R-Modell sieht folgendermaßen aus: WKN, A_Name, U_Name Zeitpunkt, Börsenplatz WKN, Wert, Kurs-ID Aktie N 1 hat N Kurs hat 1 AG U_Name, Adresse, Ort, Größe, Tätigkeit Daraus ergibt sich folgendes relationales Schema: AG (U_Name, Adresse, Ort, Größe, Tätigkeit) 1
Aktie (WKN, A_Name, U_Name) Kurs (Kurs-ID, Wert, WKN, Zeitpunkt, Börsenplatz) Nach eingehenden Diskussionen haben wir die Stringdaten als char() Datentypen deklariert, die Zahlen als Number() und das Datum mit dem entsprechenden speziellen Datentyp Date. Daraus ergeben sich folgende Tabellen in unserer Datenbank: Tabelle ag : Name Null? Type ----------------------------------------- -------- ---------------------------- U_NAME NOT NULL CHAR(30) ADRESSE CHAR(80) ORT CHAR(20) GROESSE NUMBER(7) PLZ NUMBER(5) BRANCHE NOT NULL CHAR(20) Tabelle kurs : Name Null? Type ----------------------------------------- -------- ---------------------------- KURS_ID NOT NULL NUMBER(8) WERT NOT NULL NUMBER(9,4) WKN NUMBER(6) ZEITPUNKT DATE BOERSENPLATZ CHAR(20) Tabelle aktie : Name Null? Type ----------------------------------------- -------- ---------------------------- WKN NOT NULL NUMBER(6) A_NAME NOT NULL CHAR(30) U_NAME CHAR(30) Die Projektgruppe ist in 5 Gruppen unterteilt. Gruppe 0 Projektleitung Gruppe 1 Erfassung und Einbringen der Börsendaten in die Datenbank Gruppe 2 Aktiensuchprogramm incl. Chartdarstellung Gruppe 3 Tages hoch/tief und Verlierer/Gewinner (Tag, Woche, Monat) Gruppe 4 Verwaltung der Stammdaten Gruppe 1 - Erfassung und Einbringen der Börsendaten in die Datenbank Der Grundgedanke war die Börsenkurse des DAX-30 mittels PHP-Script zu erfassen und zur weiteren Bearbeitung in die Oracle Datenbank einzubringen. 2
Dazu soll der Börsenwert der DAX-30 Aktien ausgelesen werden von der SPIEGEL.de Seite für Börsenkurse: http://213.137.199.112/kl.php?std_id=2 Die ausgelesenen Werte dann in die Datenbank eingetragen und zwar in der Form: aktiensequenz.nextval,$p,716460,sysdate,'xetra' Der erste Wert ist die Kurs_ID, welche fortlaufend ist, da nn der eigentliche Wert, dann die WKN welche fest im Script eingetragen ist. Dann folgt das Systemdatum des DB-Servers und der Handelsplatz, hier XETRA welcher auch fest im Script eingetragen ist. <html> <head> <title> INDEX.PHP --> BOERSE </title></head> <body> <?php putenv ("ORACLE_HOME=/opt/oracle/product/8.1.7"); $connid = ocilogon("boerse","nemax50","db2.fhbrandenburg.de"); echo "<b>current status: <b>"; if ($connid > 0 ) {echo "connected to the database [boerse] <br>";; if ($connid < 1 ) {echo "not connected to the database [boerse] <br>";; Diese Teilfunktion spezifiziert den Namen der HTML-Seite, dies ist der einzigste Eintrag im HEAD Befehl. Danach folgt der Aufbau der Datenbankverbindung zu db2.fhbrandenburg.de mit den Benutzerdaten. Statusmeldungen werden bei erfolgreichen Connect sowie fehlgeschlagenen Connect ausgegeben. function readpage() { $fcontents = join('', file ('http://213.137.199.112/kl.php?std_id=2')); # $fcontents = join('', file ('spiegel.html')); return $fcontents; function readwert($wert) { global $fcontents; $muster ="<nobr>$wert</nobr>\n"; #$file = file ('http://213.137.199.112/kl.php'); #$fcontents = join ('', $file); // get a web page into a string $wpos = strpos($fcontents, "<nobr>$wert</nobr>"); $rowend = strpos($fcontents, "</tr>",$wpos); $row=substr($fcontents, $wpos, $rowend); $valpos=strpos($row," </td>"); $vbefore=substr($row,$valpos-10,10); echo "<br>"; echo "<b>$wert </b> "; if (ereg ("([0-9,]{1,7)", $vbefore, $regs)) { $preis=$regs[1]; else { echo "Invalid format: ###$vbefore###"; $preis = strtr($preis,",","."); ## return $preis ; $fcontents = readpage(); Diese Funktion liest die Spiegel.de Seite ein. Bei diesem Teil wird eine Funktion readwert deklariert, bei der für die Variable $wert angebenen Aktie der nächstliegende String mit einem Euro Zeichen gesucht wird. Mittels der PHP-Funktion strpos wird dieses realisiert. Die PHP Funktion substr gibt dann den Teil des Strings wieder, den man mit strpos ausgelesen hat und zwar in der Form Text, Start und Länge. Danach wird der ausgelesene Wert umgewandelt. Die Kommas werden durch Punkte ersetzt. Dies ist dann die eigentliche Aktion, in welcher die Funktion readwert für 3
$p = readwert('sap AG '); $sql="insert into Kurs values (aktiensequenz.nextval,$p,716460,sysdate,'xetra')"; $stmt = OCIParse($connID, $sql); OciExecute($stmt); den bestimmten Wert(hier SAP AG) aufgerufen wird und mittels SQL- Statement in die Oracle Datenbank eingebracht wird. Gruppe 2 Aktiensuchprogramm incl. Chartdarstellung In unserem Eingabeformular hat man die Möglichkeit, den Aktiennamen oder die WKN -Nummer durch ein entsprechend vordefiniertes Feld auszuwählen. Abb.1: Auswahlfeld Aktie Nachdem die gewünschte Aktie bzw. WK N gefunden wurde, hat man weiterhin die Möglichkeit, einen Zeitraum für die Abfrage anzugeben. Hier bedienten wir uns wieder der Auswahlmöglichkeit. Abb.2: Eingabeformular 4
Die Anfrage an die Datenbank wurde mittels einer Schaltfläche / eines Buttons mit dem Namen "Abschicken" realisiert. Nach Betätigen des Buttons wurden die Daten vom Anfrageformular zum Auswertungsformular übermittelt. Das Auswertungsformular stellte eine Verbindung zur der Datenbank von Oracle her. Als nächstes wird der SQL-Befehl vorbereitet und verarbeitet. Darauf werden die gefundenen Datensätze ermittelt und ausgegeben. Im letzen Schritt werden die benötigten Ressourcen freigegeben sowie die Datenbankverbindung geschlossen. Abb.3: Auswertung der Anfrage 5
In unserem Beispiel wurde die Aktie "SAP AG" ausgewählt. Der Zeitraum wurde vom 20.12.2001 bis 22.12.2001 gewählt. In der Auswertung werden der Aktienname, die WKN -Nummer, der Aktienwert, das Datum, der Unternehmensnamen und der Börsenplatz ausgegeben. Abschließend haben wir den Chartverlauf der ausgewählten Aktie dargestellt. 6
Abb.4: Chartverlauf der Aktie Gruppe 3 - Tages hoch/tief und Verlierer/Gewinner (Tag, Woche, Monat)??? Gruppe 4 - Verwaltung der Stammdaten Der Grundgedanke war, ein Webbasiertes Tool zu programmieren, mit dem man die Stammdaten der Aktien in der Datenbank verwalten kann. Dazu wird per Dropdownmenü aus der Liste, der in der Datenbank enthaltenen Aktien, eine ausgewählt und Anhand des Listeneintrags werden dann die Daten aus der Datenbank gelesen und angezeigt. Nun können die Daten verändert werden. Zu den Stammdaten gehören der Unternehmensname, die Straße, der Ort, die Größe des Unternehmens (Zahl der Beschäftigten), die PLZ und die Branche. Das Tool besteht aus 3 Komponenten Index.html - ReadOC.php (DropdownMenue mit direkter Verknüpfung zu Datenbank) 7
- InfoList.php (Formular in das die Daten eingelesen werden und editiert werden können) - SaveOC.php (Speicherung der aktualisierten Daten erfolgt hier) Index.html <html> <frameset rows="120,*,60" scrolling="no" border="0"> <frame src="readoc.php" name="upfr" noresize> <frame src="blank.php" name="mifr" noresize> <frame src="blank.php" name="dofr" noresize> </frameset> <body> </body> </html> Diese HTML Seite dient ausschließlich dazu die PHP- Skripte in in der richtigen Reihenfolge zu positionieren Das erfolgt mit Frames. ReadOC.php <?php print "<BODY bgcolor=\"#003366\">"; print "<b><basefont size=\"5\" color=\"#ffcc00\" face=\"verdana\"><u><center>verwaltung der Stammdaten</u></Center></font></b>"; putenv("oracle_home=/opt/oracle/product/8.1.7"); $connid = OCILogon("boerse","nemax50", "db2.fhbrandenburg.de"); $sql = "select U_NAME from ag"; (PHP-Skript zum Auslesen der Daten aus der Datenbank) (Beginn des PHP-Skriptes) Deklaration der Hintergrundfar be und der Überschrift (Umgebungsvriablen deklariert und SQL Statement angegeben) $stmt = OCIParse( $connid, $sql ); ($stmt); if ($error = OCIError($stmt)) { die("<b>error!!!</b><p>\n"); $anzspalten = OCINumCols($stmt); for ($i=1; $i <= $anzspalten; $i++) { OCIExecute Statement wird mit Wertten gefüllt und ausgeführt- Sollte ein Error auftreten, so wird eine Fehlermeldung ausgegeben print "<center>"; print "<form action=\"infolist.php\"target=\"mifr\">"; print "<select name=\"boersenname\" size=\"1\">"; while (OCIFetch($stmt)) { for ($i=1; $i <= $anzspalten; $i++) { print "<option selected>".ociresult( $stmt, OCIColumnName($stmt, $i))."</option>"; Hier wird das Dropdown Menü erstellt und die Daten aus der Datenbank in das Menü geladen. 8
print "</select>"; print "<input type=\"submit\" value=\" Absenden \">"; print "</form>"; print "</center>"; print </BODY> ;?> (Ende der Php-Skriptes) InfoList.php (PHP-Skript zum Editieren der Ausgelesenen Daten über ein Formular) <? (Beginn des PHP-Skriptes) print "<body bgcolor=\"#003366\">"; putenv ("ORACLE_HOME=/opt/oracle/product/8.1.7"); $connid = OCILogon("boerse","nemax50", "db2.fhbrandenburg.de"); if ($connid > 0) { print "<basefont size=\"1\" color=\"#ffcc00\" face=\"verdana\">status : Connected to Database </font> <P>\n";; $sql = "select * from ag where U_Name LIKE '$BoersenName'"; $stmt = OCIParse( $connid, $sql); OCIExecute ($stmt); if ($error = OCIError($stmt)) { die("<b>error!!!</b><p>\n"); while (OCIFetch($stmt)) { $plz = OCIResult($stmt,"PLZ"); $ort = OCIResult($stmt,"ORT"); $gro = OCIResult($stmt,"GROESSE"); $bra = OCIResult($stmt,"BRANCHE"); $adr = OCIResult($stmt,"ADRESSE"); print "<center>"; print "<form action=\"saveoc.php\" target=\"mifr\">"; print "<table border=\"0\">"; face=\"verdana\"><b>unternehmensname:</b></font></td>"; (Umgebungsvriablen deklariert und SQL Statement angegeben) $BoersenName ist die Trägervariable von ReadOC.php (übermittelt den U_Namen) Statement wird mit Werten gefüllt und ausgeführt- Sollte ein Error auftreten, so wird eine Fehlermeldung ausgegeben Das SQL Staement wird benutzt um die zum $BoersenNamen gehörenden Komponenten auszulesen (PLZ, ORT, GROESSE, BRANCHE, ADRESSE) Formularteil: Die Daten werden in die dafür vorgesehen Textboxen eingelesen um dann editiert werden zu können. Wenn man dann auf den Button klickt werden die Daten in der Datenbank geupdatet. 9
print "<td><center><input type=\"text\" name=\"una\" value=\"$boersenname\"></center></td>"; face=\"verdana\"><b>adresse:</b></font> </td>"; print "<td><input type=text name=adr value=\"$adr\"></td>"; face=\"verdana\"><b>ort:</b></font></td>"; print "<td><input type=text name=ort value=\"$ort\"></td>"; face=\"verdana\"><b>groesse:</b></font></td>"; print "<td><input type=text name=gro value=\"$gro\"></td>"; face=\"verdana\"><b>plz:</b></font></td>"; print "<td><input type=text name=plz value=\"$plz\"></td>"; face=\"verdana\"><b>branche:</b></font> </td>"; print "<td><input type=text name=bra value=\"$bra\"></td>"; print "<td><align=\"center\"><input type=submit value=\"abschicken\"></td>"; print "</table>"; print "</font>"; print "</form>"; 10
print "</center>"; print "</body>";?> (Ende des PHP-Skriptes) SaveOC.php (PHP-Skript zum Updaten der Editierten Daten) <? Beginn der Php-Skriptes print "<body bgcolor=\"#003366\">"; putenv ("ORACLE_HOME=/opt/oracle/product/8.1.7"); $connid = OCILogon("boerse","nemax50", "db2.fhbrandenburg.de"); (Umgebungsvriablen deklariert und SQL Statement angegeben) Hier wird auch die Update-Statement initialisiert. Die im nächsten Schritt durchgeführt wird. $sql = "UPDATE AG SET PLZ = '$plz', U_Name = '$una', BRANCHE = '$bra', GROESSE = '$gro', ORT = '$ort', ADRESSE = '$adr' WHERE U_Name LIKE '$una'"; $stmt = OCIParse($connID, $sql); OCIExecute ($stmt); if ($error = OCIError($stmt)) { die("<b>error!!!</b><p>\n"); print "<basefont size=\"2\" color=\"#ffcc00\" face=\"verdana\"><center>datenbestand erfolgreich aktualisiert</center></font><p>\n"; Statement wird mit Werten gefüllt (connid und SQL - Statement) und ausgeführt- Sollte ein Error auftreten, so wird eine Fehlermeldung ausgegeben Ausgabe : Wenn erfolgreich aktualisiert wurde print "</body>"?> Ende der Php-Skriptes 11