Warning: include_once(/var/www/html/pmwiki-2.2.86/cookbook/soap4pmwiki/soap4pmwiki.php): failed to open stream: No such file or directory in /var/www/html/fields/dbp09/local/config.php on line 4

Warning: include_once(): Failed opening '/var/www/html/pmwiki-2.2.86/cookbook/soap4pmwiki/soap4pmwiki.php' for inclusion (include_path='.:/opt/php/lib/php') in /var/www/html/fields/dbp09/local/config.php on line 4

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/fields/dbp09/local/config.php:4) in /var/www/html/pmwiki-2.2.86/pmwiki.php on line 1250
Datenbankpraktikum SS 2009 - Gruppe 3 - Veranstaltungsverwaltung

Veranstaltungsverwaltung

von Anita Brankova und Antje Siemer

Inhalt:

Einführung


Die Klasse Veranstaltung ist die Oberklasse der Klassen Seminar und Vorlesung. Es handelt sich hierbei um eine vollständige Spezialisierung, d.h. eine Veranstaltung muss entweder Seminar oder Vorlesung sein. Eine Veranstaltung verfügt über die Attribute VeranstaltungsID, Titel, Semestertyp, Semesterjahr und die maximale Anzahl an teilnehmenden Studenten. Bei der VeranstaltungsID handelt es sich um eine künstlich eingeführte Nummer, über die die jeweilige Veranstaltung eindeutig identifiziert werden kann. Diese ID ist also der Primärschlüssel einer Veranstaltung. Außerdem ist das Attribut Titel in Kombination mit Semestertyp und Semesterjahr unique, d.h. 'dieselbe' Veranstaltung darf nicht mit unterschiedlicher VeranstaltungsID mehrfach in der Datenbank eingefügt werden.

Die Klasse Vorlesung besitzt zusätzlich zu den Attributen einer Veranstaltung noch folgende bei der Bewertung der Übungszettel zusammenhängende Attribute: einen Enum-Wert proZettel, der angibt, ob der angegebene Prozentsatz pro Zettel oder über die Summe aller Zettel erreicht werden muss, einen Prozentsatz, die Anzahl der Freiversuche, jeweils eine Angabe zur minimalen und maximalen Gruppengröße und die Gesamtanzahl der Übungszettel.
Die Klasse Seminar besitzt keine zusätzlichen Attribute zur Veranstaltung.

Aktionen


  • Für die Veranstaltungsverwaltung sind folgende Aktionen notwendig:
    • Anzeigen von einzelne Veranstaltungen bzw Ausgabe einer Liste aller Veranstaltungen
    • eine Veranstaltung muss neu angelegt werden können (muss aber dabei als Seminar oder Vorlesung gekennzeichnet werden)
    • Änderung von bestehenden Veranstaltungen
    • Tutoren/Uebungsleiter müssen den entsprechenden Veranstaltungen zugeordnet werden bzw sie müssen auch auch wieder geändert oder ausgetragen werden können
    • Löschen von bestehenden Veranstaltungen

Models


Veranstaltung

  • Die Klasse Veranstaltung erbt von der abstrakten Klasse 'Model'.
  • Alle Attribute aus der Datenbank werden in einem assoziativen Array properties gespeichert. Die VeranstaltungsID ist hierbei allerdings eine Ausnahme, sie wird in einem extra Array keys gespeichert.
    • Die Attribute werden getrennt, da die VeranstaltungsID nicht manuell gesetzt werden soll, sondern in der Datenbank durch Auto-Inkrement ermittelt wird.
  • Im Konstruktor werden die übergebenen Attribute zunächst im entsprechenden Array gespeichert.

Zur Umsetzung der Aktionen werden folgende Funktionen benötigt:

statische Funktionen:

  • get_veranstaltungen($env): liefert alle in der Datenbank enthaltenen Veranstaltungen zurück
  • get_veranstaltung($verid, $env): liefert die zur VeranstaltungID zugehörige Veranstaltung zurück
  • get_some_veranstaltungen($ver_ids, $env): liefert bei Übergabe eines Arrays von VeranstaltungIDs die Liste der ausgewählten Veranstaltungen zurück
  • rolle($ver_id, $login, $env): gibt bei Übergabe einer VeranstaltungsID und eines Logins die 'Rolle' der Person in der ausgewählten Veranstaltung zurück
    • Bsp:Unterscheidung zwischen Tutor und Tutor und Student
    ...else {
       $query="SELECT * FROM betreuen AS b
               WHERE  b.VerID= ".$ver_id." 
               AND b.Login='".$login."' 
    	   AND '".$login."' NOT IN 
    	     (SELECT Login from besuchen AS be
    	      WHERE be.VerID=".$ver_id.")";
       $result =$env->verbindung()->execute_query($query);
     
         if(count($result) > 0) {
    	    $rolle[]='Tutor';
    	    return $rolle;	
         }
         else{$query="SELECT * FROM betreuen AS b
    	          WHERE  b.VerID= ".$ver_id." 
    		  AND b.Login='".$login."' 
    		  AND '".$login."' IN 
    		    (SELECT Login FROM besuchen AS be
    	 	     WHERE be.VerID=".$ver_id.")";
    	   $result =$env->verbindung()->execute_query($query);
         }
         if(count($result) > 0){
          $rolle[]='Tutor';$rolle[]='Student';
         }
         else {...
  • exists_static($verid, $env):liefert einen Boolean-Wert zurück, je nachdem ob die übergebene ID in der Datenbank vorhanden ist
  • gleiche_ver($titel, $semestertyp, $semesterjahr, $env): testet, ob Titel und Semestertyp und -jahr schon in der Form in der Datenbank existieren
  • besuchen($ver_id, $env): liefert ein Array aller Studenten zurück, die diese Veranstaltung besuchen
  • update($verid, $titel, $semestertyp, $semesterjahr, $maxstudenten, $env): ändert die Werte einer Veranstaltung
  • typ($verid, $env): gibt für die Veranstaltung zurück, ob es sich um eine Vorlesung oder ein Seminar handelt
    • Bsp:Vorlesung
    ..if(Veranstaltung::exists_static($verid, $env)){
        $sql="SELECT COUNT(*)AS anzahl FROM Veranstaltungen AS v, Vorlesungen AS vo
              WHERE v.VerID=vo.VerID
              AND v.VerID=".$verid;
        $result=$env->verbindung()->execute_query($sql);
           if ($result[0]['anzahl']>0) {
    	   $typ['Typ']='Vorlesung';
           }..
  • test_max($maxstud): überprüft, ob die eingegebene Anzahl von Studenten zulässig ist (Bsp:Es dürfen keine negativen Werte eingegeben werden)

nicht-statische Funktionen:

  • __get($property): sucht in den beiden assoziativen Arrays 'properties' und 'keys' nach der übergebenen Variable und gibt dann den passenden Wert zurück, falls die Variable in einem der beiden Arrays vorhanden ist
  • __set($property,$value): sucht analog zu __get($property) die Variable und setzt dann den entsprechenden Wert
  • insert(): Falls die Veranstaltung noch nicht vorhanden ist(siehe exists_ver()) und die eingebenen Werte zulässig sind(siehe test_ver()), wird sie in die Datenbank eingefügt. Die VeranstaltungsID zu dieser Veranstaltung wird dadurch ermittelt, dass die höchste ID, also die der zuletzt eingefügten Veranstaltung, aus der Datenbank geholt wird.
  • exists_v(): liefert einen Boolean-Wert zurück, je nachdem ob die ID der aktuellen Veranstaltung in der Datenbank vorhanden ist
  • exists_ver(): testet, ob Titel und Semestertyp und -jahr der aktuellen Veranstaltung schon in der Form in der Datenbank existieren
  • delete(): löscht die aktuelle Veranstaltung
  • test_ver(): überprüft, ob die eingegebene Anzahl von Studenten zulässig ist

Vorlesung

  • Die Klasse Vorlesung erweitert die Klasse Veranstaltung.
  • Die zusätzlich Attribute werden in einem Array v_properties gespeichert.
  • Im Konstruktor wird das Array der übergebenen Argumente zunächst aufgeteilt. Je nachdem, ob sich die Variable im Array 'keys','properties' oder 'v_properties' befindet, werden die Werte in unterschiedlich Arrays ($args_veranstaltung,$args_vorlesung) gespeichert.Die VeranstaltungsID wird direkt gesetzt. Des Weiteren wird dem Konstruktor der Oberklasse das Array '$args_veranstaltung'übergeben. Die Attribute aus '$args_vorlesung' werden hier im Vorlesungs-Konstruktor gesetzt. Falls die Veranstaltung in der Datenbank noch nicht vorhanden ist, wird im Konstruktor die Funktion insert() aufgerufen.

Zur Umsetzung der Aktionen werden folgende Funktionen benötigt:

statische Funktionen:

  • get_vorlesung($verid, $env): liefert bei Übergabe einer VeranstaltungsID die entsprechende Vorlesung zurück. (Es werden die Attribute einer Vorlesung und einer Veranstaltung aus der Datenbank geholt.)
  • get_some_vorlesungen($verids, $env): gibt eine Liste der ausgewählten Vorlesungen zurück
  • get_vorlesungen($env): gibt alle in der Datenbank enthaltenen Vorlesungen zurück
  • vorlesung_update($verid, $titel, $semestertyp, $semesterjahr, $maxstudeten, $prozettel, $prozentsatz, $anzfreiversuche, $mingruppe, $maxgruppe, $anzueb, $env): Es wird zunächst mit den entsprechenden Attributen die Methode update(...) aus der Oberklasse aufgerufen. Mit den übrigen Attributen wird ein UPDATE in 'Vorlesungen' in der Datenbank durchgeführt.
  • test_static($prozs,$anzfr,$anzueb,$mingruppe,$maxgruppe): Es wird geprüft, ob die eingegebenen Werte zulässig sind, beispielsweise darf die Anzahl der Freiversuche nicht größer sein als die Anzahl der Übungsblätter.

nicht-statische Funktionen:

  • __get($property): sucht in den drei assoziativen Arrays 'v_properties','properties' und 'keys' nach der übergebenen Variable und gibt dann den passenden Wert zurück, falls die Variable in einem der drei Arrays vorhanden ist
  • __set($property,$value): sucht analog zu __get($property) die Variable und setzt dann den entsprechenden Wert
  • vorlesung_insert(): In dieser Methode wird zunächst die insert()-Funktion aus der Oberklasse aufgerufen, d.h. es wird erst eine Veranstaltung in die Datenbank eingefügt. Da in dieser Methode auch die VeranstaltungsID der neu eingefügten Veranstaltung aus der Datenbank geholt wird, kann nun in vorlesung_insert() eine Vorlesung mit der passenden ID eingefügt werden.
  • delete_vorlesung(): Es wird erst die delete()-Methode aus Veranstaltung ausgeführt, dann wird in delete_vorlesung die aktuelle Vorlesung aus der Tabelle Vorlesungen in der Datenbank gelöscht.
  • test(): Es werden alle in die Datenbank einzufügenden Werte auf Korrektheit überprüft, d.h. es dürfen zum Beispiel keine negativen Werte eingefügt werden. (analog zu test_static)

Seminar

  • Die Klasse Seminar erweietert die Klasse Veranstaltung.
  • Da ein Seminar aber keine zusätzlichen Attribute zu einer Veranstaltung besitzt wird im Konstruktor lediglich der Konstruktor der Oberklasse aufgerufen.

Zur Umsetzung der Aktionen werden folgende Funktionen benötigt:

statische Funktionen:

  • get_seminar($verid, $env): Es wird das ausgewählte Seminar zurückgeliefert.
  • get_some_seminare($verids, $env): In dieser Methode wird eine Liste der ausgewählten Seminare ausgegeben.
  • get_seminare($env): Es wird eine Liste aller in der Dantenbank enthaltenen Seminare zurückgegeben.

nicht-statische Funktionen:

  • __get($property): Wie schon in Veranstaltung wird auch hier in den beiden Arrays properties und keys nach der übergebenen Variable gesucht und dann, falls vorhanden, der passende Wert zurückgegeben.
  • __set($property, $value): Es wird analog zu __get($property) nach der Variable gesucht und dann der entsprechende Wert gesetzt.
  • insert(): Falls das Seminar noch nicht vorhanden ist, wird zunächst die insert()-Methode aus Veranstaltung aufgerufen und dann die entsprechende VeranstaltungsID in die Tabelle Seminare in der Datenbank eingefügt.
  • delete_seminar(): Diese Methode löscht ein Seminar, indem erst die Veranstaltung und dann das Seminar aus der Datenbank gelöscht wird.

Controller


Veranstaltung_Controller:

Es besteht die Möglichkeit zwischen folgenden Aktionen zu wählen:

  • action_show(): zeigt alle Informationen zu einer ausgewählten Veranstaltung
  • action_list(): zeigt eine Liste mit allen Veranstaltungen
  • action_new(): legt eine neue Veranstaltung an
  • action_edit(): bearbeitet eine bestehende Veranstaltung
  • action_delrequest(): fragt nach, ob eine Veranstaltung wirklich gelöscht werden soll
  • action_delete(): löscht eine Veranstaltung
  • action_(): Default-Aktion, die aufgerufen wird, wenn keine Aktion ausgewählt wurde

Views


Für die oben genannten Aktionen werden folgende Views benötigt:

  • veranstaltung_view: zeigt alle Details einer Veranstaltung
  • veranstaltung_list: zeigt eine Liste aller Veranstaltungen
  • veranstaltung_insert: gibt ein Formular zur Eingabe einer Veranstaltung aus
  • veranstaltung_edit: gibt ein Formular zur Bearbeitung einer Veranstaltung aus

Aktion veranstaltung_edit():


  • Für eine bestehende Veranstaltung werden die aktuellen Werte geändert und neu in die Datenbank geschrieben.
  • Diese Aktion kann nur von Übungsleitern und Tutoren ausgeführt werden.

Abb. 1: Das Formular für Veranstaltung bearbeiten.

Realisierung:

  • Zunächst werden über die aktuelle VeranstaltungsID alle Werte der Veranstaltung aus der Datenbank geholt.
  • Es werden zusätzlich die zu dieser Veranstaltung eingetragenen Übungsleiter und Tutoren geholt.
    ...$sql_u="SELECT p.Vorname, p.Nachname, p.Login FROM Personen p,halten b,Angestellte a
               WHERE p.Login=b.Login
               AND a.Login=p.Login
               AND a.Rolle='Uebungsleiter' 
    	   AND b.VerID=".$_REQUEST['verid'];
    		$result_u=$this->env->verbindung()->execute_query($sql_u);	 
    		$this->env->templateEngine()->assign('leiter', $result_u); 
     
       $sql_t="SELECT p.Vorname, p.Nachname, p.Login FROM Personen p, betreuen b
               WHERE p.Login=b.Login AND b.VerID=".$_REQUEST['verid'];
    	        $result_t=$this->env->verbindung()->execute_query($sql_t);
    		$this->env->templateEngine()->assign('tutoren', $result_t);
    ...
  • Im Formular werden die aktuellen Werte der Veranstaltung ausgeben. Diese können nun in den entsprechenden Feldern geändert und wieder gespeichert werden.
  • Bei Tutoren können wie bei action_new ggf noch zusätzlich Tutoren hinzugefügt werden.
  • Die Tutoren und Übungsleiter werden wie bei action_new per Autocomplete in das Formular eingefügt.
  • Bei den Veranstaltungsattributen können die Änderungen einfach über ein update() in der Datenbank durchgeführt werden. Bei den Tutoren und Übungsleitern ist dies allerdings nicht möglich, da bei einer Änderung Schlüssel betroffen wären. Deshalb werden bei dieser Aktion alle vorhandenen Tutoren und Übungsleiter zunächst gelöscht und erst danach werden die eingetragenen Personen neu in die Datenbank eingetragen.
    //lösche alle Uebungsleiter
      foreach($result_u as $uebl ){
         $halten=new Halten(array('Verid'=>$_REQUEST['verid'],'Login'=>$uebl['Login']),$this->env);
         $halten->delete();				
       }
    //lösche alle Tutoren
      foreach($result_t as $tutor){
        $betreuen=new Betreuen(array('VerID'=>$_REQUEST['verid'],'Login'=>$tutor['Login']),$this->env,$insert=FALSE);
        $betreuen->delete();				
       }	
    //Uebungleiter eintragen					
      for($i = 1; $i <= 2; $i++) {
       if(!empty($_REQUEST['uebungsleiter_login_'.$i]) && (!empty($_REQUEST['uebungsleiter_'.$i]))) {
         $uebungsleiter = new Halten(array("Login" => $_REQUEST['uebungsleiter_login_'.$i], "Verid" => $_REQUEST['verid']), $this->env);
        }
       }
    //Tutoren eintragen
    for($j=1; $j<=$_REQUEST['tutor_count']; $j++){	
      if((!empty($_REQUEST['tutor_login_'.$j]))&& (!empty($_REQUEST['tutor_'.$j])))
       $tutor = new Betreuen(array("Login" => $_REQUEST['tutor_login_'.$j], "VerID" => $_REQUEST['verid']), $this->env, $insert = TRUE);
    ...

Nach oben


Page last modified on August 24, 2009, at 10:26 AM