Web-basierte Verbuchung eines Wareneingangs Alois Schütte http://www.fbi.fh-darmstadt.de/~schuette/ Inhalt Problemstellung Projekt „Wertpapiergeschäft - Erfassen und Buchen“ Analyse Konzeption Realisierung Diskussion Prof. Dr. Alois Schütte 1 Problemstellung Eine Bank braucht eine Anwendung, bei der eine Einlieferung von Wertpapieren (Wareneingang) z.B. 100 Apple-Aktion (mengenmäßig) zum aktuellen Kurs (wertmäßig) in ein Kundendepot über ein Web-Frontend von einem Bankmitarbeiter für einen Bank-Kunden durchgeführt werden kann. Die IT-Abteilung der Bank gibt vor, dass die Anwendung über eine bestehende 3-Ebenen-Architektur auf die Backend-Daten (Depots, Kunden, ...) zugreift. Die Datenhaltung soll in der Anwendung selbst in einer eigenen relationalen freien Datenbank erfolgen. Die Schnittstelle zu den Bank-eigenen Systemen erfolgt durch die Bank. Live Demo http://hal.local/WP/php/ Prof. Dr. Alois Schütte 2 Analyse Aus den Anforderungen resultiert folgende Anwendungsarchitektur: ApplicationServer Datenbank Server BackendSysteme Visualisierung Anwendungslogik Speicherung Wir als Softwarehaus haben Erfahrung mit Php und MySql Aus der Problemstellung leiten sich 3 Komponenten ab: Visualisierung mittels HTML in einem Web-Browser (keine JavaAnwendung) Anwendungslogik per Php auf einem Anwendungs-Server (keine J2EE Anwendung) Speicherung in einer MySql-Datenbank Prof. Dr. Alois Schütte 3 Analyse Beteiligte Projektmitarbeiten werden benötigt aus den Bereichen: Design (HTML-Masken) Programmierung (Php) Datenbankspezialisten (MySql) Der Kern der Anwendung ist ein Datenmodell, dass die Speicherung von WP-Transaktionen für Kunden abbilden kann. Prof. Dr. Alois Schütte 4 Konzeption: ER-Modell Der konzeptionelle Entwurf ist der Vorgang, bei dem das konzeptionelle Modell aus der Realität abgeleitet wird. Er mündet im konzeptionellen Datenmodell. Als Modell für die konzeptionelle Phase verwenden wird das EntityRelationship Modell. Es definiert die Entitäten einer Anwendung zusammen mit ihren Beziehungen: Entity (Objekttyp): Rechteck Kunde Relationship (Beziehungstyp): Raute besitzt Attribute: Ovale Beziehungsart KuNr 1 Prof. Dr. Alois Schütte n 5 Konzeption: ER-Modell (Ausschnitt) - Entitäten Kunde KuNr Name Adresse Prof. Dr. Alois Schütte 6 Konzeption: Kunde ER-Modell (Ausschnitt) - Entitäten Depot KuNr DeNr Name Abr-Konto Adresse Prof. Dr. Alois Schütte Wert Auf eine valutengerechte Betrachtung wird der Einfachheit halber verzichtet. 7 Konzeption: ER-Modell (Ausschnitt) - Entitäten Kurs Bez. WKN Wertpapier Kunde Depot KuNr DeNr Name Abr-Konto Adresse Prof. Dr. Alois Schütte Wert Auf eine valutengerechte Betrachtung wird der Einfachheit halber verzichtet. 8 Konzeption: ER-Modell (Ausschnitt) - Beziehungen Kurs 1 zu n Bez. WKN Wertpapier Kunde 1 besitzt n Depot KuNr DeNr Name Abr-Konto Adresse Prof. Dr. Alois Schütte Wert Auf eine valutengerechte Betrachtung wird der Einfachheit halber verzichtet. 9 Konzeption: ER-Modell (Ausschnitt) - Beziehungen Kurs n zu m Bez. WKN Wertpapier m Kunde 1 besitzt n Depot n KuNr DeNr Name Abr-Konto Adresse Prof. Dr. Alois Schütte Wert beinhaltet Anzahl Auf eine valutengerechte Betrachtung wird der Einfachheit halber verzichtet. 10 Konzeption: ER-Modell (Ausschnitt) - Beziehungen Kurs 3 stellig Anzahl Bez. OrderNr WKN m ordert kauft/verkauft n Wertpapier m Kunde 1 besitzt n Depot n KuNr DeNr Name Abr-Konto Adresse Prof. Dr. Alois Schütte Wert beinhaltet Anzahl Auf eine valutengerechte Betrachtung wird der Einfachheit halber verzichtet. 11 Konzeption: ER-Modell -> Relationalen Modell Verfahren: ER-Modell -> Relationenmodell: Abbildung von Entity-Typen auf Relationenschematas Abbildung von Beziehungstypen auf Relationenschemata Attribute werden zu Attributen des Relationenschemas Schlüssel werden übernommen Wenn möglich: Verschmelzung von Relationenschemata von Entityund Beziehungstypen Einführung von Fremdschlüsseln in verbleibenden Relationenschemata zur Referenzierung der Entities Normalisierung des entstandenen Schemas Prof. Dr. Alois Schütte 12 Konzeption: Entität Kunde KuNr ER-Modell -> Relationalen Modell Relation Name Kunde Attribut:Type KuNr: Integer Name: String Adresse: String Name Adresse Prof. Dr. Alois Schütte 13 Konzeption: ER-Modell -> Relationalen Modell Beziehung Relation Kurs Bez. WKN Wertpapier m Depot n beinhaltet DeNr Abr-Konto Anzahl Name beinhaltet (WpBestand) Attribut:Type DeNr: Integer WKN: String Anzahl: Integer Wert Prof. Dr. Alois Schütte 14 Konzeption: Relationenschema Relationenschema insgesamt (nach Vereinfachung und Normalisierung) Name Attribut_ Typ Kunde KuNr: Integer Name: String Adresse: String Depot DeNr: Integer KuNr: Kunde.KuNr Wert: String Wertpapier WKN: Integer Bezeichnung: String Kurs: Float WpBestand DeNr: Integer WKN: Wertpapier.WKN Anzahl: Integer WpUmsatz OrNr: Integer DeNr: Depot.DeNr Ausführung: Date Konto KoNr: Integer KuNr: Kunde.KuNr Saldo: Float GeldUmsatz UmNr: Integer KoNr: Kunde.KuNr Ausführung: Date Prof. Dr. Alois Schütte KoNr: Konto.KoNr WKN: Integer Anzahl: Integer Betrag: Float 15 Konzeption: Design Die Konzeption der Design-Komponente wird hier nicht näher betrachtet. Als einzigen Aspekt wird die Anforderung nach Validierung von Formularfeldern erörtert: In Formularfelder soll die Benutzereingabe auf korrekte Typen sinnvolle Werte geprüft werden. Zur Anzeige wird der QuickTime™ Dekompressor „TIFF (LZW)“ benötigt. Prof. Dr. Alois Schütte 16 Konzeption: Anwendungslogik Php bietet die Möglichkeit, objektorientiert zu programmieren. Somit sind die elementaren Bestandteile in Klassen zu „verpacken“. Grundlegende Funktionalitäten, z.B.: Allgemeiner Datenbankzugriff Benutzerauthentifizierung Kursimport Klassen für Entitäten, Beziehungen und Anwendungsfunktionalitäten, z.B.: Kunde Buchen Der Zugriff auf eine MySQL-Datenbank erfolgt über Php spezifische API‘s. Prof. Dr. Alois Schütte 17 Realisierung: Datenbank Aus dem Relationenschema wird nach dem konzeptionellen Entwurfs eine Datenbank erzeugt, die dann Ausgangspunkt für die Implementierung ist. SQL-Anweisungen: create table kunde ( KuNr integer primary key, Name varchar(100), Adresse varchar(100) ) type=innodb; Zur Anzeige wird der QuickTime™ Dekompressor „TIFF (LZW)“ benötigt. create table konto ( KoNr integer primary key, KuNr integer not null references kunde.KuNr on delete cascade, Saldo float ) type=innodb; ... Prof. Dr. Alois Schütte 18 Realisierung: Anwendungslogik - Grundlage Php Die Anwendungslogik wird in Php realisiert. Im praktischen Umfeld würde man große Teile allerdings in PL/SQL als Stored-Procedure umsetzen. Php ist Server-seitig ausführbarer Kode, der in HTML-Seiten eingefügt ist und vom Server ausgeführt wird, wenn die HTML Seite aufgerufen wird. Das Ergebnis ist eine an der aufrufenden Browser zurück gelieferte HTML-Seite. Php Beispiel:http://hal.local/WP/php/erstesProgramm.php <html> <head><title>Beispiel</title> </head> <body> <p>php start </p> <?php echo "Hallo, ich bin ein PHP-Skript!"; ?> <p>php end</p> </body> </html> Prof. Dr. Alois Schütte 19 Realisierung: Anwendungslogik - Datenbankzugriff Der Zugriff auf unsere Datenbank erfolgt mittels eine selbst definierten Php-Klasse über Php-API‘s zum Zugriff auf eine MySql Datenbank: <?php class var var var var DB { $host = "localhost"; $user = "jenni"; $passwd = "lopez"; $database = "wp"; function connect() { // Verbindung zur Datenbank $db = mysql_pconnect($this->host, $this->user, $this->passwd) or die("Verbindung zum MySQL Server fehlgeschlagen!"); mysql_select_db($this->database, $db) or die("Verbindung mit $this->database fehlgeschlagen!<br>"); return $db; } function close($db) { // Verbindung zur Datenbank abbrechen mysql_close($db) ; } } ?> Prof. Dr. Alois Schütte 20 Realisierung: Anwendungslogik - Erzeugung dynamischer Inhalte Als Beispiel für den Zugriff auf Daten in der Datenbank betrachten wir die Kursabfrage (//hal.local/WP/php/): require_once("class/db.php"); // Datenbank Klasse $wpDB = new DB; $db = $wpDB->connect(); // DB Query definieren $sql_query = "SELECT wkn, bezeichnung, kurs " ."FROM wertpapier “; // Query an Datenbank $result = mysql_query($sql_query, $db); echo "<table>"; echo " <tr>"; echo " <td>WKN</td><td>Bezeichnung</td><td>Kurs</td>"; echo " </tr>"; while ($row = mysql_fetch_array($result)) { echo " <tr>"; echo " <td>".$row["wkn"]."</td>"; echo " <td>".$row["bezeichnung"]."</td>"; echo " <td>“.$row["kurs"]</td>"; echo " </tr>"; } // while echo "</table>"; Prof. Dr. Alois Schütte 21 Realisierung : Anwendungslogik - Buchen, Php-Klasse definieren Die eigentliche Buchungslogik ist als Php-Klasse realisiert, in der es Methoden für Wp- und Geld-Transaktionen gibt. Dabei ist z.B. in der Methode WpKauf, die Geld- und Stückeseite zusammengefasst, so dass die buchhalterischen Einzelaktionen in einer Transaktion gekapselt sind. class Buchung { ... function wpKauf($kunr, $denr, $wkn, $anzahl) { ... // Stückebuchung $resWp = $this->wpOrder($kunr, $denr, $wkn, $anzahl); $sql_query = "select konr from depot " // Geld-Konto zum Depot ... $sql_query = "select kurs from wertpapier " // WP Kurs zur WKN ... $kurs = $row[kurs]; ... $betrag = $anzahl * $kurs; // Geldbuchung $resGeld = $this->belastung($kunr, $konr, $betrag); ... Prof. Dr. Alois Schütte 22 Realisierung : Anwendungslogik - Buchen, Php-Klasse verwenden Verwendung der Klasse „buchen“, um WP-Kauf durchzuführen (//hal.local/WP/php/): <body> <?php Zur Anzeige wird der QuickTime™ Dekompressor „TIFF (LZW)“ require_once("class/buchen.php"); benötigt. $kunr = $HTTP_POST_VARS["kunr"]; // Werte vom Aufruf der Seite ... // Bestaetigungstext echo "<span style='font-family: Verdana;'>"; echo $kuname.",<br><br>"; echo "Sie haben folgende <b>WP Kauf</b> abgeschlossen:<br>"; echo "Ihr Depot: ".$denr."<br>"; echo "Wertpapier: ".$wpinfo."<br>"; echo "Anzahl: ".$anzahl."<br><br>"; // Buchen durchfuehren mit Methode der Klasse Buchung $buchung = new Buchung(); $resultat = $buchung->wpKauf($kunr, $denr, $wkn, $anzahl); if ($resultat) echo "Der Kauf ist gebucht!"; else echo "Kauf wg. techn. Probleme nicht gebucht!"; ?> </body> Prof. Dr. Alois Schütte 23 Realisierung: Die der Die Design Realisierung der Design-Komponente betrachtet nur die Thematik Validierung von Formularelementen. Validierung kann Client-seitig oder Server-seitig erfolgen: Client-seitig ohne Server-Zugriff mit JavaScript Server-seitig mit Php http://hal.local/WP/php/ Prof. Dr. Alois Schütte 24 Realisierung: Design - Validierung von Formulardaten, JavaScript Funktionsdefinition in JavaScript <html> <head> <script language="JavaScript"> function testeZahl(str) { var reg = /^[0-9]+$/; if (!reg.exec(str) || str <= 0 ) return false; return true; } function add(x ,y) { var res; if (!(testeZahl(x) && testeZahl(y))) { alert("Bitte pos. Zahl eingeben!"); } res = parseInt(x) + parseInt(y); return res; Zur Anzeige wird der QuickTime™ } Dekompressor „TIFF (LZW)“ </script> benötigt. </head> <body> ... Prof. Dr. Alois Schütte 25 Realisierung: Design - Validierung von Formulardaten, JavaScript Funktionsaufruf in JavaScript <html> <head> <script language="JavaScript"> ... </script> </head> <body> ... <form method="get" name="Bestand"> <input type="button" value="berechne" name="rechnen" onclick="document.Bestand.neu.value = add(document.Bestand.alt.value, document.Bestand.veraenderung.value );" > </form> Zur Anzeige wird der QuickTime™ </body> Dekompressor „TIFF (LZW)“ benötigt. </html> Prof. Dr. Alois Schütte 26 Realisierung: Design - Validierung von Formulardaten, Php Formularanzeige <html> <head> </head> <body> ... <form method="get" name="Bestand" action="Bestandsrechner.php"> ... <input type="submit" value="berechne" name="rechnen"> </form> </body> </html> Zur Anzeige wird der QuickTime™ Dekompressor „TIFF (LZW)“ benötigt. Prof. Dr. Alois Schütte 27 Realisierung: Design - Validierung von Formulardaten, Php Von Php neu erzeugte Ergebnisseite <html> <head></head> <body> <?php $alt = $HTTP_GET_VARS["alt"]; $ver = $HTTP_GET_VARS["veraenderung"]; if (isset($alt) && isset($ver)) {// Wurde Formular bereits ausgefüllt, // dann erfolgt hier Verarbeitung // der gesendeten Daten $neu = $alt + $ver; echo "Neuer Bestand: " . $neu; } else // zeige Formular { ?> <form method="get" name="Bestand" action="Bestandsrechner.php"> ... </form> <?php } Zur Anzeige wird der QuickTime™ Dekompressor „TIFF (LZW)“ ?> benötigt. </body> </html> Prof. Dr. Alois Schütte 28 Diskussion Test und Going Live sind wichtige Phasen, die wir hier unberücksichtigt lassen. Vielen Dank für Ihre Aufmerksamkeit! ?? Prof. Dr. Alois Schütte 29