Universität Ulm, Fakultät für Mathematik und Wirtschaftswissenschaften, SAI

Lösung zu Blatt 6 --- Software Engineering Praxis (SS 2002)

Nur ein paar Adressen

#!/usr/local/bin/perl -Tw

use CGI;
use DBI;
use Mysql::Admin qw(dbi_connect);
use strict;

my ($dbdir, $host, $prj, $login, $auth) =
   ('/home/thales/melzer/mysql/data', 'localhost', 'project',
   '', '');
my $db = DBI->connect(dbi_connect($dbdir, $host, $prj), "$login", "$auth");
die unless defined $db; # Man koennte auch eine nette Meldung ausgeben.
my %abt = (); # Lese alle Abteilungen ein
my $query = $db->prepare('select abtid, name from Abteilungen;');
$query->execute;
foreach (@{$query->fetchall_arrayref([0, 1])}) {
   $abt{$_->[0]} = $_->[1];
}
$query->finish;
my $q = new CGI; # Der uebliche Prolog
print $q->header, $q->start_html("Eine kleine Personendatenbank"),
   $q->h1("Eine kleine Personendatenbank");
if (defined $q->param('pwd') && $q->param('pwd') ne "Passwort") {
   print $q->p('Das Passwort war leider falsch!'), "\n";
   print $q->hr(), "Ingo Melzer",  $q->end_html;
   $db->disconnect;
   exit;
}
my %kinds = qw(search Suche insert Eingabe change Änderungen);
my $kind = $q->param('kind') || "first";
if ($kind eq "insert") { # Datensatz einfuegen
   my ($name, $tel, $abt) =
      ($q->param('name'), $q->param('tel'), $q->param('abt'));
   if (defined $abt) {   # Wurden schon Daten eingetragen? Ja -> Insert
      my $query =
         $db->prepare('insert into Angestellte values (NULL, ?, ?, ?);');
      $query->execute($name, $tel, $abt);
      $query->finish;
      print $q->p("$name wurde eingefügt!"), $q->hr, "\n";
   }
   print $q->h3('Person einfügen:'), "\n"; # Sonst Daten erfragen
   print $q->start_form();
   print $q->p('Name:    ',
      $q->textfield(-name => "name", -size => 30, -maxlength => 255,
	 -default => '', -override => 1));
   print $q->p('Telefon: ', 
      $q->textfield(-name => "tel", -size => 30, -maxlength => 255,
      -default => '', -override => 1));
   print $q->p($q->scrolling_list(-name => "abt", -values => [keys %abt],
      -labels => \%abt, -default => 'SAI'));
} elsif ($kind eq "search") { # Suche eine Person
   my ($name) = $q->param('name');
   if (defined $name and $name =~ /^(\w|\s)+$/) {
      my $query =
         $db->prepare('select name, telefon, abtid from Angestellte where '.
	    'name like ?;');
      $query->execute($name . '%');
      my @results = ();
      while (defined(my $record = $query->fetch())) {
	 push @results, [@{$record}[0, 1], $abt{$record->[2]}];
      }
      $query->finish; # Den map muss man nicht verstehen.
      print $q->table({-border => 1 }, $q->caption('Ergebnis der Suche:'),
         $q->Tr({-align => 'CENTER', -valign => 'TOP'}, [
	    $q->th(['Name', 'Telefon','AbtID']),
	    map {$q->td($_)} @results
	 ]));
   }
   print $q->start_form();
   print $q->p('Anfang des gesuchten Namen: ',
      $q->textfield(-name => "name", -size => 30, -maxlength => 255,
	 -default => '', -override => 1));
} elsif ($kind eq "change") { # Aendern
   my ($name) = $q->param('name');
   print $q->start_form();
   if (defined $name and $name =~ /^(\w|\s)+$/) {
      my ($persid, $tel, $abt) =
	 ($q->param('persid'), $q->param('tel'), $q->param('abt'));
      unless (defined $persid and $persid =~ /^\d+$/) { #Person noch unbekannt?
	 my $query =
	    $db->prepare('select persid, telefon, abtid from Angestellte '.
	       'where name = ?;');
	 $query->execute($name);
	 unless ($query->rows) {
	    print $q->p("Die Person gibt es leider nicht!"), "\n";
	 } else { # OK, Daten erfragen und mit defaults fuellen
	    ($persid, $tel, $abt) = $query->fetchrow_array;
	    print $q->hidden(-name => 'persid', -value => $persid);
	    print $q->p('Name:    ',
	       $q->textfield(-name => "name", -size => 30, -maxlength => 255,
		  -default => $name));
	    print $q->p('Telefon: ', 
	       $q->textfield(-name => "tel", -size => 30, -maxlength => 255,
	       -default => $tel));
	    print $q->p($q->scrolling_list(-name => "abt",
	       -values => [keys %abt], -labels => \%abt, -default => $abt));
	 }
      } else { # Alles bekannt, jetzt nur noch in die Datenbank
	 my $query =
	    $db->prepare('replace into Angestellte values (?, ?, ?, ?);');
	 $query->execute($persid, $name, $tel, $abt);
	 $query->finish;
	 print $q->p("$name wurde geändert!"), $q->hr, "\n";
      }
   } else { # Wen wollen wir aendern?
      print $q->p('Name der zu bearbeitenden Person: ',
	 $q->textfield(-name => "name", -size => 30, -maxlength => 255,
	    -default => '', -override => 1));
   }
} else { # OK, Startauswahl
   print $q->start_form();
   print $q->p('Aufgabe: ', $q->radio_group(-name => "kind",
      -values => [keys %kinds], -labels => \%kinds, -default => 'search'));
   print $q->p('Passwort: ', $q->password_field(-name => "pwd", -size => 8,
      -maxlength => 8, -default => '')); #Achtung: Nur eine Pruefung
}
print $q->hidden(-name => 'kind', -value => $kind);
print $q->submit(), $q->end_form(), "\n";
print $q->hr(), "Ingo Melzer",  $q->end_html;
$db->disconnect;

Universität Fakultät SAI

Ingo Melzer, 30. Mai 2002