A web application for human resources administration

Werbung
Diplomarbeit aus Telematik, TU Graz
Institut fuer Informationsverarbeitung und Computergestuetzte neue Medien
A web application for human
resources administration
Daniel Gschliesser
i
Gutachter: O.Univ.-Prof. Dr.phil. Dr.h.c Hermann Maurer
Betreuer: Dipl.-Ing. Thomas Dietinger
Graz, im Februar 2001
Ich versicherem, diese Arbeit selbständig verfaßt, andere als die angegebenen Quellen und
Hilfsmittel nicht benutzt und mich auch sonst keiner unerlaubten Hilfsmittel bedient zu
haben.
ii
Danksagung
Ich möchte mich an dieser Stelle bei allen Mitarbeitern des IICM, sowie der Firma SILVA
System Services GmbH, die mich bei der Durchführung dieser Arbeit unterstützt haben
und stets bemüht haben, meine Fragen zu beantworten, herzlich bedanken.
Besonderer Dank gebührt auch meiner Freundin für ihr Vertändnis und ihre aufopfernde Hilfe.
Abstract
The starting point of this thesis was the need of an online tool for human resources
administration of the company SILVA Services GmbH. The subject of this thesis is to
describe the implementation and usage of this web based application for human resources
administration. The Application gives customers the possibility to book trainers for courses
online. There exists an online calender where trainers are able to enter the times they have
time to train. The system tries to compute the best trainer for each customer query with
that user inputs. It searches for possible dates for the course and takes care about the
abilities of every trainer.
Furthermore the customer is able to give some feedback to system how he liked the
trainer and the course itself. These feedbacks are used for finding the proper trainer.
The software design uses a three tier system model which makes the system scalable.
Furthermore the implemented objects and the underlying objects can be used in other
software projects later on.
Zusammenfassung
Ausgehend von der Problematik der Trainerverwaltung der SILVA Personaldienstleistung
Ges.m.b.H wurde eine Datenbank erstellt, die alle relevanten Daten für eine human resources Verwaltung enthält. Als Front End dient ein beliebiger Web Browser. Das GUI
wurde für den Microsoft IIS 4.0 und Microsoft Windows NT 4.0 entwickelt. Die Web Applikation stellt eine Verbindung zwischen Kunden und Trainern dar. Kunden können über
das Internet direkt von SILVA Kurse buchen und bekommen automatisch den passenden Trainer zugewiesen. Weiters soll dieses Dokument zeigen, inwieweit das erarbeitete
Konzept auf andere Anwendungsgebiete übertragbar ist. Beim Design der Software wurde
insbesondere auf die Erweiterbarkeit geachtet, sodass es leicht möglich ist, eine spezielle
Lösung einfach zu entwickeln. Ein weiterer Punkt ist die Verwendung von Mobiltelephonen als Eingabemedium. Die Trainer sollen die Möglichkeit haben, ihre Verfügbarbarkeit
direkt über ein Handy an die Datenbank zu übermitteln. Auch der umgekehrte Weg ist
möglich. Das System informiert die Trainer via SMS über neue Termine und gibt ihnen
Bescheid, ob ein Kunde sie gebucht hat.
Inhaltsverzeichnis
1 Einleitung
2
1.1
Allgemein . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2
Klassische Bewertung eines freien Mitarbeiters nach den verursachten Kosten am Beispiel der Fa. NaviConsult . . . . . . . . . . . . . . . . . . . . . .
2 Definition
2
3
4
2.1
Allgemein . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.2
Klassische Methoden (Telefon) . . . . . . . . . . . . . . . . . . . . . . . . .
4
2.3
Forderungen an ein “human resources administration tool” . . . . . . . . . .
6
2.3.1
Verfügbarkeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.3.2
Fähigkeiten “Abilities” . . . . . . . . . . . . . . . . . . . . . . . . . .
8
2.4
Kundenfeedback . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.5
Datenflussdiagramme und Use Cases . . . . . . . . . . . . . . . . . . . . . . 10
2.6
Fixe Kurszeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.6.1
2.7
Diagramme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Entgültige Trainerauswahl . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3 Algorithmus zur Trainerauswahl
15
3.1
Allgemein . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2
Fähigkeiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2.1
Erste Auswahl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.2.2
Bewertungen des Trainers miteinbeziehen . . . . . . . . . . . . . . . 16
3.2.3
Gewichtung des Alters von Beurteilungen . . . . . . . . . . . . . . . 16
3.2.4
Definition der Einbindung der Referenzbewertung . . . . . . . . . . 19
3.2.5
Setzen von Prioritäten bei Auswahl der Kombinationen . . . . . . . 20
3.2.6
Unterschiedliche Fähigkeiten . . . . . . . . . . . . . . . . . . . . . . 20
3.2.7
Gleichmäßiges Aufteilen der Aufträge unter dem Personal . . . . . . 20
i
INHALTSVERZEICHNIS
ii
4 Verwendete Technologien und Produkte
4.1
4.2
4.3
4.4
22
Web Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
4.1.1
CGI (Common Gateway Interface) . . . . . . . . . . . . . . . . . . . 22
4.1.2
ISAPI (Internet Server Application Programming Interface) . . . . . 24
4.1.3
ASP (Active Server Pages) . . . . . . . . . . . . . . . . . . . . . . . 26
Business Layer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.2.1
Allgemein . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
4.2.2
Microsoft Transaktion Server . . . . . . . . . . . . . . . . . . . . . . 27
4.2.3
COM+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Datenbank
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.3.1
ADO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.3.2
Microsoft SQL Server 7.0 . . . . . . . . . . . . . . . . . . . . . . . . 32
Perfomance Vergleich . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.4.1
Testumgebung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.4.2
Test 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.4.3
Test 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.4.4
Test 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.5
Schlußfolgerungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.6
Entwicklungstools
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
5 Software Design
36
5.1
Allgemein . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5.2
Business Logic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.2.1
Objekt Relationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
5.2.2
OFFER.DLL - Details . . . . . . . . . . . . . . . . . . . . . . . . . . 37
6 Die Datenbank von rent@trainer
6.1
42
Erläuterungen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6.1.1
Tabelle PLZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6.1.2
Tabelle COURSEBEGINTIME . . . . . . . . . . . . . . . . . . . . . 44
7 System Requirements
46
7.1
Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
7.2
Software Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
8 Installation von rent@trainer
47
INHALTSVERZEICHNIS
9 Bedienung der Web Site
iii
48
9.1
Allgemein . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
9.2
Public Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
9.3
Trainer Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
9.4
9.3.1
Ändern der persönlichen Daten . . . . . . . . . . . . . . . . . . . . . 50
9.3.2
Eintragen von Kurswünschen . . . . . . . . . . . . . . . . . . . . . . 50
9.3.3
Online Kalender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Customer Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
9.4.1
Feedback Formular . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
9.4.2
Kursinfos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
9.4.3
Die Buchung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
10 Ausblick
60
10.1 Katastrophendienste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
10.1.1 Allgemein . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
10.1.2 Bergrettung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
10.2 Interne Personalbeurteilung . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
10.2.1 Notwendige Änderungen . . . . . . . . . . . . . . . . . . . . . . . . . 62
A Tabellen
63
B Views in der Datenbank
71
C Der Algorithmus zur Trainerauswahl
75
D Die Business Logik
78
D.1 Allgemein . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
D.2 CAL.DLL (Interface: Calendar) . . . . . . . . . . . . . . . . . . . . . . . . . 78
D.3 CUST.DLL (Interface: Customer) . . . . . . . . . . . . . . . . . . . . . . . . 81
D.4 MISC.DLL (Interface : Misc) . . . . . . . . . . . . . . . . . . . . . . . . . . 81
D.5 SEC.DLL (Interface Security) . . . . . . . . . . . . . . . . . . . . . . . . . . 83
D.6 TRAIN.DLL (Interface: Trainer) . . . . . . . . . . . . . . . . . . . . . . . . 84
D.7 BOOKINGS.DLL (Interface: Booking) . . . . . . . . . . . . . . . . . . . . . 85
D.8 OFFERS.DLL (Interface Offer) . . . . . . . . . . . . . . . . . . . . . . . . . 88
D.8.1 Methoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
D.9 ORDERS.DLL (Interface: ORDER) . . . . . . . . . . . . . . . . . . . . . . 89
D.10 MSG.DLL (Interface: Messager) . . . . . . . . . . . . . . . . . . . . . . . . . 89
Abbildungsverzeichnis
91
INHALTSVERZEICHNIS
Tabellenverzeichnis
1
93
Kapitel 1
Einleitung
1.1
Allgemein
Das Ein Lösungsansatz für das Problem von Betrieben und Institutionen geeignetes Personal effektiv zu verwalten ist der Inhalt dieses Dokuments. Der klassische Ansatz, wie
es noch vielerorts gehandhabt wird, besteht in der Verwendung von Telefonisten, die die
Aufgabe haben, Kundenanfragen entgegenzunehmen. Diese Person soll dann ad hoc die
Trainer koordinieren und geeignetes Personal dem Kunden zur Verfügung zu stellen. Das
ließ die Firma SILVA Personaldienstleistung GmbH ein Projekt initieren, dass sich mit dieser Problematik befassen sollte. Es sollte die Möglichkeit geschaffen werden, Kunden die
Möglichkeit zu geben, Trainer direkt und unkompliziert buchen zu lassen. Der gewaltige
Verwaltungsaufwand geeignete Trainer zu finden, soll vollautomatisiert ablaufen. Trainer
können über das Internet einen Online Terminkalender zur Bekanntgabe Ihrer Verfügbarkeit benützen. Das System wertet diese Angaben aus und liefert innerhalb von Sekunden
für jeden Kunden den richtigen Trainer. Dieser kann dann die so erhaltenen Angebote
direkt online buchen. Umgekehrt garantiert das System durch seine Auswahlalgorithmen
keinen Trainer, der gewisse Mindestanforderungen erfüllt, zu benachteiligen. Die Algorithmen wurden so entwickelt, dass im Mittel alle Trainer, deren Fähigkeiten vergleichbar sind,
auch gleich oft gebucht werden. Resultat der Arbeit soll ein System sein, das eine konkrete Implementierung einer Personalverwaltung über das Internet erlaubt. Die entwickelten
Komponenten sollen aber auch in anderen, vergleichbaren Szenarien einsetzbar sein.
2
KAPITEL 1. EINLEITUNG
1.2
3
Klassische Bewertung eines freien Mitarbeiters nach
den verursachten Kosten am Beispiel der Fa. NaviConsult
(Info: Heike Pratter, Personalwesen, 1999)
Um zu zeigen, dass das Problem der Personalbeurteilung nicht nur auf die Firma
SILVA beschränkt ist, wird die Vorgehensweise in der Firma NaviConsult beschrieben. Es
ist zu sehen, dass die automatisierte Beurteilung noch in den Kindeschuhen steckt, bzw.
nicht vorhanden ist. Die Motivation für die Entwicklung einer automatisierten “human
resource” Verwaltung ist nicht nur für den konkreten Anwendungsfall “SILVA” gegeben,
sondern spiegelt sich auch in anderen Firmen wieder.
Die Fa. NaviConsult entwickelt EDV Systemlösungen. Im konkreten wird eine große
Buchhaltungssoftware, die auch das Personalwesen abdeckt, kundenspezifisch weiterentwickelt und vermarktet. Die Fa. NaviConsult rundet Ihr Angebot durch Hardwareinstallationen für die Software, sowie Schulungen und Workshops ab. NaviConsult beschäftigt
ca. 100 Mitarbeiter österreichweit.
Es wird intern keine qualitative Bewertung von den freien Mitarbeitern vorgenommen,
im Sinne von rent@trainer. Es werden lediglich alle Kosten, die ein Mitarbeiter verursacht
auf ein eigenes projektbezogenes Konto gebucht. Diese Kosten, die auch Spesen und sonstige Aufwendungen abdecken, werden den, dem Kunden verrechneten Kosten, entgegen
gestellt. Weiters wird noch festgehalten, wie viele nicht verrechenbare Stunden der Mitarbeiter bei einem Kunden gearbeitet hat. Aus den Verhältnissen “verrechenbare Stunden
/ Kosten” und “verrechenbare Stunden / nicht verrechenbare Stunden” wird dann eine
Beurteilung des Mitarbeiters gewonnen. Zufriedenheit des Kunden und Qualität der geleisteten Arbeit gehen in diese Beurteilung nicht ein. Ein Kunde gilt als zufrieden, wenn
die gestellte Rechnung akzeptiert wird. Erst bei einer Beschwerde eines Kunden wird die
Qualität des Mitarbeiters näher, auch in persönlichen Gesprächen, beleuchtet.
Kapitel 2
Definition
2.1
Allgemein
Um über Human resources administration sprechen zu können, muss man das Problem
zunächst klassifizieren.
Prinzipiell geht es darum, Personal für eine bestimmte Aufgabe zu finden. Um diese
Aufgabe erfüllen zu können, werden bestimmte Fähigkeiten gefordert. Neben der Kenntnis
bestimmter Fähigkeiten wird noch die Verfügbarkeit der human resource gefordert. Ein
dritter Punkt, der in dieser Arbeit diskutiert wird, ist das Feedback vom Kunden. Dieses
Feedback muss in die Auswahl der human resource einfließen. Diese Beurteilung fällt aber
nicht direkt unter den Aspekt Fähigkeiten. Aus diesem Grund wird es hier als eigener
Punkt diskutiert.
Diese Arbeit nimmt als Beispiel eine Schulungsfirma. Überlegungen, die direkt Bezug
auf ein Schulungsunternehmen nehmen, können analog auch auf andere Bereiche übetragen
werden.
2.2
Klassische Methoden (Telefon)
In unserem Szenario werden Trainer, die als freie Mitarbeiter für das Schulungsunternehmen tätig sind, den Kunden vermittelt. Die Trainer stellen dann für geleistete Schulungen
ein Honorar. Diese Form der Zusammenarbeit impliziert, dass die Trainer vor Ort nicht
verfügbar sind. Die Trainer haben in der Regel einen weiteren Job und halten bei Bedarf Schulungen ab. D.h. die Trainer der Schulungsfirma sind auf ganz Österreich bzw.
in Europa verteilt. Ein weiteres Problem neben dem Lokalitätsproblem ist die eigentliche
Verfügbarkeit der Trainer.
Da diese freie Mitarbeiter sind und in der Regel anderen Geschäften nachgehen, ist es
4
KAPITEL 2. DEFINITION
5
der Schulungsfirma oft nicht möglich, einen Kundenwunsch sofort positiv zu beantworten,
weil sie einfach nicht weiß, ob der Trainer zu dem gegebenen Zeitpunkt auch wirklich verfügbar ist. Trainer müssen daher eine Art Verfügbarkeitsplan erstellen, an dem Sie bereit
sind, Schulungen abzuhalten. Kann der Trainer an einem Tag nicht unterrichten, obwohl er
sich dafür in dem Verfügbarkeitsplan eingetragen hat, so muss er dies umgehend der Zentrale melden. Dies geschieht im Allgemeinen per Telefon zwischen Tür und Angel. Damit
ist für den Trainer der Fall erledigt. Er hat ja seine Verfügbarkeit oder seine “Nichtverfügbarkeit” gemeldet. Nun liegt der Ball bei dem Mitarbeiter der Schulungsfirma, der den
Anruf erhalten hat. Er muss nun die Verfügbarkeit des Trainers auf dessen Plan abändern.
Für diesen Plan gibt es kein EDV System, sodass hier auf dem Plan aus klassischem Papier
mehr oder weniger oft herumgestrichen wird. Je länger im Voraus der Plan jetzt existiert,
desto wahrscheinlicher werden auch auf diesem Termine geändert.
Neben dem Problem der Verfügbarkeit muss natürlich noch die Befähigung des Trainers für die Schulung festgestellt werden. Hiezu gibt es wieder einen Plan, auf dem, vom
Personalchef verifiziert, alle möglichen Schulungen für einen Trainer festgelegt sind. Eine
weitere Unterteilung stellt die Sprache dar. Da die Anforderung von meist größeren Firmen besteht, die Schulungen in Englisch oder in einer anderen Sprache zu halten, ist es
notwendig, festzuhalten, welcher Trainer welche Schulung in welcher Sprache halten kann.
Der Mitarbeiter der Schulungsfirma muss nun anhand zweier unabhängiger Aufstellungen überprüfen, welcher Trainer für die Schulung in Frage kommt. Manuell fast unlösbar
wird dieses Problem bei einer genügend hohen Anzahl an Trainern durch die Randbedingung des Terminwunsches: Schulungen gehen im Allgemeinen über mehrere Tage. Das
bedeutet, dass Sonn- und Feiertage berücksichtigt werden müssen. Größte Probleme wird
der Mitarbeiter der Schulungsfirma haben, wenn ein Kunde mehrere Trainer für einen Kurs
buchen möchte, der über mehrere Tage dauert. In diesem Fall müssen die Trainer untereinander koordiniert werden. Die Komplexität dieser Aufgabe wird im folgenden Kapitel
genauer erläutert.
Ein wichtiger Aspekt in der Auswahl der Trainer ist aber noch nicht angesprochen
worden. Neben der Ausbildung und rethorischen Fähigkeiten zählen auch Erfahrung und
Kundenpreferenzen. War ein Kunde mit einem Trainer zufrieden, wird er den gleichen
Trainer für kommende Schulungen wieder zugewiesen bekommen. Umgekehrt kann ein
Kunde verlangen, dass bestimmte Trainer für ihn aufgrund schlechter Erfahrungen nicht
mehr in Frage kommen.
Zusammengenommen kann man festhalten, dass die oben beschriebenen Probleme ohne
den Einsatz geeigneter Software nicht oder nur sehr schwer bzw. umständlich handzuhaben
sind. Es wird nun versucht, obige Probleme formaler zu beschreiben und Algorithmen für
KAPITEL 2. DEFINITION
6
deren Lösung anzugeben.
2.3
Forderungen an ein “human resources administration tool”
2.3.1
Verfügbarkeit
Der klar scheinende Begriff “Verfügbarkeit” muss zunächst genau definiert werden. Ja nach
Standpunkt, bekommt er eine unterschiedliche Bedeutung. Aus der Sichtweise des Trainers
bedeutet er, die Zeit die der Trainer insgesamt zur Verfügung steht. In diesem Fall sind
eventuelle Fahrzeiten mitberücksichtigt. Hat ein Trainer zum Beispiel an einem Tag von
08:00 Uhr bis 12:00 Uhr Zeit, so bedeutet das, dass die effektive Kursdauer 4h minus der
Anfahrtszeit beträgt. Vom Standpunkt des Kunden aus bedeutet der Begriff Verfügbarkeit,
die Zeit in der der Trainer bei ihm vor Ort ist.
Wir definieren:
Verfügbarkeit := reale Zeit, die die human resource zur Verfügung steht.
Kundenzeit := die effektive Zeitdauer, in der die human resource dem Kunden
zur Verfügung steht.
Ein EDV System, dass Schulungen und Trainer verwalten soll, muss dieser Unterscheidung Rechnung tragen. In dieser Arbeit wurden die Wohnorte bzw. die momentanen Trainerschulungen gespeichert und die Entfernung daraus berechnet. Mittels einer empirisch
gewählten Geschwindigkeit wurde dann die notwendige Dauer für die Anreise berechnet.
Neuerdings ist es ist möglich, diese Zeitdauer auch von Routenplanern errechnen zu lassen.
Hiezu benötigt man Routenplaner, die über ein geeignetes API automatisierte Abfragen
zulassen. Als Geschwindigkeit wurde für diese Implementierung
v := 70Km/h
gewählt.
Für die folgenden Betrachtungen gilt folgendes:
n := Anzahl an Kalendereinträgen für alle Trainer, die in der Datenbank gespeichert sind. Ein Kalendereintrag entspricht in dieser Implementierung einer
Zeitdauer, die beliebig lang sein kann.
t := Anzahl der Trainer, die bei der Firma beschäftigt sind.
m := Kursdauer in Tagen, diese müssen nicht aufeinanderfolgend sein.
KAPITEL 2. DEFINITION
7
k := Anzahl an Trainern, die für den Kurswunsch benötigt werden.
p := Zeitperiode in Tagen, in der der Kurs stattfinden soll (z.B. innerhalb eines
Monats ).
Die Verfügbarkeit eines Trainers wird als Liste von Kalendereinträgen gespeichert.
Diese Einträge enthalten eine Start- und Endzeit. Um einen Terminwunsch zu überprüfen,
muss das System diese Liste durchsuchen. Die Liste wird in einer Datenbank gespeichert,
wobei diese nach der Zeit indiziert ist. Das bedeutet, die Abfrage, ob ein Trainer zu einer
bestimmten Zeit zur Verfügbar ist, ist von der Ordnung [Alg98, Seite 236]:
Tn = O (log (n))
(2.1)
Dauert ein Kurs m Tage, so benötigt man O(m+log n) Zeit. m ist dabei gegen n sehr
klein und kann in der Praxis als Konstante angesehen werden.
Tm,n = O (m + log (n))
(2.2)
Hat man insgesamt t Trainer zur Verfügung und benötigt man für einen Kurs k Trainer,
so ergibt sich für die Komplexität:
Tm,n,k,t = O
t
∗ (m + log (n))
k
(2.3)
Fordert man vom System nun die Funktion selbständig nach freien Terminen zu suchen, wobei man als Randbedingung die Periode p vorgibt, innerhalb derer die Schulung
stattfinden muss, ergibt sich für die Komplexität [Bar99, Seiten 78,79]:
Tm,n,k,p,t = O
p
∗
m
t
∗ (m + log (n))
k
(2.4)
Beispiel:
Die Schulungsfirma habe 100 Trainer. Für jeden Trainer existieren 100 Kalendereinträge
über seine Verfügbarkeit. Ein Kunde benötige für eine Schulung, die fünf Tage dauern soll,
drei Trainer. Das System soll einen Termin innerhalb von drei Wochen finden.
Sei:
m = 5, n = 100, p = 21, t = 100, k = 3
Dann ergebe sich nach obiger Formel
T = 23.033.033.100
KAPITEL 2. DEFINITION
8
Geht man davon aus, dass eine elementare Operation (Kalenderzugriff, Vergleich, etc)
10− 6 s benötigt, dann käme man auf
T = 23.033.033.100 − > 23.033, 0331s − > 6, 3h
Dieser Rechnungsaufwand ist nicht vertretbar. Das Ziel eines “human administration
tool” ist es, sofort reagieren zu können. Eine Wartezeit von über sechs Stunden, wie in
diesem Fall, ist nicht geeignet. Ein Ziel dieser Arbeit ist es, Methoden aufzuzeigen, wie
man durch Ausnützen spezieller Eigenschaften den Rechnenaufwand reduzieren kann.
2.3.2
Fähigkeiten “Abilities”
Wie eingangs erwähnt, benötigt man für die positive Erledigung einer Aufgabe bestimmte
Fähigkeiten. Es gilt nun, diese benötigten Fähigkeiten zu klassifizieren, sodass diese als Eigenschaften der human resource herangezogen werden können, um entscheiden zu können,
ob jemand die Aufgabe erledigen kann oder nicht.
Die Fähigkeit eine bestimmte Aufgabe erfüllen zu können, ist im Allgemeinen hinreichend komplex und sehr spezifisch. Dieser Umstand macht diese Fähigkeit (fast) nicht
auf andere Aufgaben übertragbar. Es wird vielmehr eine Liste von Basisfähigkeiten gespeichert. Um eine Aufgabe positiv abschließen zu können, benötigt man daher auch eine
Anzahl von verschiedenen Basisfähigkeiten. Besitzt eine Person alle geforderten Fähigkeiten in ausreichendem Maße, dann kann sie zur Lösung der Aufgabe herangezogen werden.
Spezifische Fähigkeiten setzen sich also aus einer oder mehreren dieser Basisfähigkeiten zusammen. Diese Basisfähigkeiten sind auch leicht verwaltbar, da sie zwischen den
Aufgaben austauschbar sind.
Das Anforderungsprofil aller möglichen Aufgaben (z.B.: aller angebotenen Dienstleistungen) stellt sich dann als Anforderungsmatrix A dar. Die Spalten der Matrix spezifizieren
die Basisfähigkeiten, die Zeilen der Matrix stellen die einzelnen Aufgaben dar.
Durch Setzen der einzelnen Felder in der Matrix wird festgelegt, welche Fähigkeiten
für welche Aufgabe notwendig sind.



A=

a11
..
.
a12
..
.
···
..
.
an1
an2
· · · anm
a1m
..
.





Beispiel:
Die Schulungsfirma bietet drei verschiedene Kurse in deutsch und englisch an (Zeilen):
• HTML Grundkurs (Deutsch)
• HTML Grundkurs (Englisch)
KAPITEL 2. DEFINITION
9
• Homepage Design (Gestalten ansprechender Sites) (Deutsch)
• Homepage Design (Gestalten ansprechender Sites) (Englisch)
• Einführung in Macromedia Dreamweaver (Deutsch)
• Einführung in Macromedia Dreamweaver (Englisch)
Es werden folgende Basisfähigkeiten definiert (Spalten):
• Unterrichten
• HTML
• Homepage Design
• Macromedia Dreamweaver
• Englisch
• Deutsch
Die Anforderungsmatrix A sieht wird dann

1 1 0


 1 1 0


 1 1 1
A=

 1 1 1


 1 0 0

1 0 0
wie folgt aus:

1 0 1


1 1 0 


1 0 1 


1 1 0 


1 0 1 

1 1 0
Bemerkenswert ist die erste Spalte. Unterrichten wird als zusätzliche Basiseigenschaft
festgelegt. Das bedeutet, dass es der Firma nicht genügt, wenn sich jemand gut in HTML
auskennt. Um unterrichten zu dürfen, muss er zum Beispiel pädagogische Kurse oder bereits Erfahrungen im Unterrichten gesammelt haben.
Um jetzt festzustellen, ob ein Trainer für einen Kurs geeignet ist, werden einfach die
Werte der entsprechenden Zeile der Anforderungsmatrix mit den Eigenschaften des Trainers verglichen. Der Trainer muss alle Fähigkeiten besitzen, die in der Zeile gesetzt sind.
Die Felder der Matrix werden nun nicht mehr nur als bool’sche Werte betrachtet, sondern als Zahlenwerte. Diese Zahlenwerte geben einen Schwellwert an. Dieser Schwellwert
definiert die Mindestanforderungen, die an das Personal für diese Fähigkeit für diese Aufgabe gestellt werden. Es werden die analogen Werte der Fähigkeiten immer auf 1 normiert.
Die Werte der Matrix liegen also zwischen 0 (keine Kenntnis) und 1 (Top).
KAPITEL 2. DEFINITION
10
Im obigen Beispiel bedeutet das, dass ein Trainer für den HTML Grundkurs grundlegende Kenntnisse in Macromedias Dreamweaver haben muss. Für den Dreamweaverkurs
wird aber gefordert, dass der Trainer perfekt mit der Software umgehen kann.
Für die Kurse HTML Grundkurs und Macromedia Dreamweaver (beide in Deutsch)
ergibt sich folgendes:

A=
0, 8 0, 9
0, 8
0, 2
0, 9 0, 2
0, 6
0
0, 8
0, 91 0
0, 8


Anmerkung: Die Werte in der Matrix stellen lediglich ein Beispiel dar und werden in
der Praxis natürlich unterschiedlich sein.
2.4
Kundenfeedback
Neben der eigentlichen Qualifikation spielen die individuelle Preferenzen von Kunden eine
große Rolle. Kommt ein Trainer bei einem Kunden sehr gut an, dann kann es sein, dass
sein Kontakt mit dem Kunden mehr wiegt als seine fachliche Qualifikation. Gerade im
Trainingsbereich spielen derartige Sonderwünsche von Kunden eine große Rolle.
Es wird nun versucht, diese Kundenpreferenzen mit einem Feedback-Formular zu erfassen. Der Kunde muss bestimmte Fragen zum Trainer und zum Kurs beantworten. Diese
Benotung fließt nun direkt in die zukünftige Auswahl von Trainern ein. Diese Kundenfeedbacks stellen eine Art Akt über den Trainer dar. Da Einträge “ein Leben lang” gespeichert
werden, muss eine Möglichkeit geschaffen werden, dass ein Trainer alte, negative Beurteilungen ausbessern kann.
2.5
Datenflussdiagramme und Use Cases
Im Folgenden sollen nun die eben gemachten Überlegungen in Datenflussdiagrammen visualisiert werden. Diese Diagramme sind ein wichtiger Bestandteil beim Erstellen des Softwaredesigns. Im einfachsten Fall wird ein Trainer für einen Kurs benötigt.
Für größere Projekte benötigt man jedoch meist mehr Personal. Hier genügt es nicht,
obiges Schema wiederholt auszuführen, da eine erfolgreiche Antwort des Systems nur erfolgen darf, wenn die geforderte Anzahl an Personen auch zur Verfügung gestellt werden
kann. Werden für einen Auftrag sieben Programmierer benötigt, es stehen aber für den
angegebenen Zeitraum nur 3 zur Verfügung, so muss das System eine negative Antwort
ausgeben. Außerdem müssen alle Personen zu den selben Zeitperioden Zeit haben. Diese
müssen also intern koordiniert werden. Obiges Schema muss also um einen Input Parameter erweitert werden. “Count” legt fest, wie viel Personal das System für diese Anfrage
suchen muss.
KAPITEL 2. DEFINITION
11
[ht]
Abbildung 2.1: Datenfluss für einen benötigten Trainer
2.6
Fixe Kurszeiten
Im Gegensatz zum bisher beschriebenen Szenario, wo nach Verfügbarkeit der Trainer gesucht wird, und der Termin entsprechend der Verfügbarkeit des Personen angepasst wird,
werden Kurse auch mit fixen Zeiten angeboten. Kunden können sich in diesem Fall in
einen Kurs einschreiben. Hier wird also nicht explizit eine Anzahl von Personal für eine
bestimmte Aufgabe gesucht. Die Anzahl der geforderten Trainer ergibt sich implizit aus
der Anzahl der Anmeldungen für einen Kurs. Die Aufgabe des Systems liegt nun darin,
eine Anmeldung zu verbuchen, oder, falls kein Trainer zur Verfügung steht, die Anmeldung
zurückzuweisen. Das System muss dafür sorgen, dass das Verhältnis Trainer/Kunde in einem einstellbaren Verhältnis bleibt. Ist der Kurs mit der gegebenen Anzahl an Trainern
ausgebucht, so kann das System entweder einen weiteren Trainer anfordern oder falls die
maximale Kursteilnehmerzahl erreicht ist, die Anmeldung zurückweisen.
Die Lösung dieser Aufgabe ist im Allgemeinen weniger komplex als das Suchen von
freien Terminen für mehrere Trainer, da die Termine ja bereits vom Benutzer vorgegeben
werden. Diese Termine richten sich eher nach Kundenwünschen als nach Trainerwünschen.
Für die Komplexität zum Suchen eines Trainers ergibt sich aus [2.2] multipliziert mit der
Anzahl der Trainer t, da die Berechnung für jeden Trainer extra gemacht werden muss.
KAPITEL 2. DEFINITION
12
[ht]
Abbildung 2.2: Datenfluss für mehr benötigte Trainer
k := Anzahl an Trainern, die für den Kurswunsch benötigt werden.
m := Kursdauer in Tagen, diese müssen nicht aufeinanderfolgend sein.
n := Anzahl an Kalendereinträgen für alle Trainer, die in der Datenbank gespeichert sind. Ein Kalendereintrag entspricht in dieser Implementierung einer
Zeitdauer, die beliebig lang sein kann.
t := Anzahl der Trainer, die bei der Firma beschäftigt sind.
Tm,n,t = O (t ∗ (m + log (n)))
(2.5)
Für den gesamten Kurs (bei k benötigten Trainern) ergibt sich für die Komplexität:
Tm,n,k,t = O (k ∗ t ∗ (m + log (n)))
(2.6)
Erklärung:
Bei diesem Szenario wird [2.5] für jeden Trainer hintereinander angewandt, da ja im
Bedarfsfall jeweils immer nur ein Trainer benötigt wird und sich der Berechnungsaufwand
für die einelnen Trainer nur addiert.
KAPITEL 2. DEFINITION
2.6.1
13
Diagramme
Die Randbedingungen werden vom Verantwortlichen eingangs gesetzt, bevor ein Kursangebot publik wird.
[ht]
Abbildung 2.3: Datenfluss für fixe Kurszeiten
Der Verantwortliche legt den Kurstermin fest. Ein Kurs setzt sich dabei aus mehreren
Tagen zusammen. Für jeden Tag wird die Startzeit und die Dauer festgelegt. Es ist dabei
möglich, dass Tage nicht aufeinanderfolgend sein müssen.
2.7
Entgültige Trainerauswahl
Die Trainerauswahl muss, wie oben beschrieben, alle drei Punkte, Verfügbarkeit, Qualifikation und Kundenfeedback in genügendem Maße berücksichtigen. Idealerweise werden
beiden Parameter, Qualifikation und Kundenfeedback, derartig miteinander verknüpft, sodass ein Ranking der Trainer für diese Aufgabe entsteht. Der Algorithmus muss die beiden
Parameter derartig ineinander abbilden, dass es möglich ist, eine Funktion
ranking = f (f eedback, qualif iacation)
(2.7)
zu erhalten. Die Auswahl eines Trainers kann nun anhand dieses Rankings erfolgen. Dies
bedeutet, dass jeder Kunde den für ihn optimalen Trainer erhält.
KAPITEL 2. DEFINITION
14
Bei dieser scheinbar optimalen Lösung muss nun aber bedacht werden, dass ein guter
Trainer immer vor einem schlechteren Trainer (ein Trainer mit einem schlechteren Ranking) ausgewählt wird. Dies hat zur Folge, dass diese schlechter beurteilten oder schlechter
qualifiziertern Trainer selten zu einer Schulung kommen und daher auch keine Möglichkeit
erhalten, sich zu verbessern. Umgekehrt wird ein guter Trainer aufgrund guten Feedbacks
immer hoher im Ranking sein. Es kann nun aber seitens der Schulungsfirma gefordert
sein, dass alle verfügbaren Trainer in gewisser Regelmäßigkeit ausgewählt werden müssen,
um diese “bei Laune” zu halten. Diese Forderung steht nun zunächst im Widerspruch mit
der Forderung, Kundenanfragen optimal zu lösen. Später in diesem Dokument wird eine
Methode vorgestellt, die dieses Problem zu umgehen versucht.
Kapitel 3
Algorithmus zur
Trainerauswahl
3.1
Allgemein
In diesem Kapitel soll nun die Implementierung für die gestellten Anforderungen detailiert
erörtert werden. Dieser Abschnitt soll als Grundlage für alternative Implementierungen
dienen. Es wird gezeigt, wie man der hohen Komplexität (Gleichung 2.4), mit geschickter
Implementierung Herr werden kann. Ausserdem wird versucht, die Algorithmen derart
allgemein zu halten, dass alle besprochenen Aspekte abgedeckt werden können.
3.2
3.2.1
Fähigkeiten
Erste Auswahl
Zunächst werden alle Trainer selektiert, die den angegebenen Kurs in der angegebenen
Sprache mit einem minimalen Wissensstand MinKnowledgefaktor halten können. Diese
Information wird aus der Tabelle “ABILITY” (Feld Knowledgefaktor ) geholt. Über Knowledgefaktor kann der Administrator die Qualitäten eines Trainers festlegen. Dieser Wert
soll als erste Information dienen, wie der Trainer intern eingestuft wird. Durch Setzen von
Knowledgefaktor hat der Administrator zum Beispiel die Möglichkeit Trainer für einen
Kurs zu sperren, indem er Knowledgefaktor auf einen Wert, der unter Minknowledgefaktor liegt, setzt. Zusätzlich werden alle Trainer herausgefiltert, die die Länge der Anfahrt
nicht in Kauf nehmen wollen, und dies als eine Eigenschaft in der Web Site eingetragen
haben.
Für alle so ermittelten Trainer wird anhand der Kalendereinträge überprüft, welcher
15
KAPITEL 3. ALGORITHMUS ZUR TRAINERAUSWAHL
16
Trainer Zeit hat. Übrig bleibt ein Anzahl von Trainern, die grundsätzlich in der Lage
wären, die gestellten Anforderungen zu erfüllen. Das Ziel eines solchen automatischen
Systems ist,alle Beteiligten zufrieden zu stellen. Das bedeutet, dass Kunden nur Trainer
erhalten, mit denen sie bereits positive Erfahrungen gemacht haben. Weiters soll dafür
gesorgt werden, dass alle Trainer möglichst gleichmäßig ausgelastet werden.
3.2.2
Bewertungen des Trainers miteinbeziehen
Um die gestellten Anforderungen zu erfüllen, wurde der Ansatz eines Protokolls gewählt.
In dieses Protokoll werden alle Anmerkungen den Trainer und seine Arbeit betreffend,
festgehalten. Im konkreten Fall von rent@trainer ist dies ein Feedbackformular, welches
die Kunden nach abgeschlossenen Kurs ausfüllen sollen. Dieses Feedbackformular wird
online zur Verfügung gestellt und speichert die Angaben des Kunden unmittelbar in die
Datenbank (Tabellen FEEDBACK und TRAINERFEEDBACK ). Die Beurteilung von
Trainern in einem Protokoll zu speichern, bietet gegenüber einem starren Wert den Vorteil,
dass die Leistungen eines Trainers über einen Zeitraum hinweg genau verfolgt werden
können. Es wurde ein Algorithmus entwickelt, der ältere Beurteilungen mitberücksichtigt.
Erhält ein Trainer von einem Kunden zum Beispiel ein vernichtendes Urteil, so hat er
zukünftig die Möglichkeit, diese “Scharte” aus seiner Geschichte auszumerzen.
Es muss noch die Notenskala der Beurteilung definiert werden. Auf der Web Site wird
mit dem Schulnotensystem wegen der intuitiven Bedienung gearbeitet. Die Beurteilung
muss aber laut Definition immer zwischen 0 und 1 liegen, wobei 1 die höchste Bewertung
ist. Das bedeutet, dass unabhängig von der Anzeige im UI (z.B.: Schulsystem 1 bis 5)
Beurteilungen intern immer zwischen 0 und 1 angenommen wird. Es muss also vom UI
eine Umsetzung auf das interne Bewertungssystem vorgenommen werden (Normierung).
Aus allen Beurteilungen, die ein Trainer im Verlauf seiner Laufbahn bei rent@trainer
erhalten hat, wird nun ein Mittelwert gebildet. Dabei können Beurteilungen von anderen
Kursen und anderen Kunden unterschiedlich gewichtet werden. Außerdem bietet sich die
Möglichkeit, ältere Beurteilungen weniger ins Gewicht fallen zu lassen. Dieser gewichtete
Mittelwert wird im folgenden mit “Ranking” bezeichnet.
3.2.3
Gewichtung des Alters von Beurteilungen
Durch den Parameter feedbackageweight kann man die Gewichtungskurve beeinflussen. Ein
Wert von 0 würde alle Beurteilungen vom Alter her gleich gewichten. Die Trainer werden
in der Reihenfolge ihres Rankings für die Auswahl herangezogen. Da auch Beurteilungen
anderer Kunden berücksichtigt werden, tritt das Problem auf, dass ein Trainer, der einmal
von irgendeinem Kunden eine positive Beurteilung erhalten hat, immer vor einem Trainer
KAPITEL 3. ALGORITHMUS ZUR TRAINERAUSWAHL
17
gereiht wird, der noch keine Beurteilung hat.
Um dieses Problem zu lösen, wird einem neuen Trainer zunächst ein Standard Ranking zugeordnet. Dies soll so bemessen sein, dass ein neuer Trainer vor einem Trainer mit
schlechter Bewertung, aber hinter einem Trainer mit guter Bewertung liegen wird. Dieser
Standardwert wird mit der Eigenschaft “booking.EmptyRanking” festgelegt. Erhält nun ein
Trainer von einem anderen Kunden eine positive Beurteilung und liegt diese auch weit
zurück, falls sie die einzige ist bildet sie allein die Bewertung, da der Mittelwert eines Wertes immer der Wert selber ist, egal wie man die Gewichtung der Werte setzt. Das würde
bedeuten, dass eine positive Beurteilung genügt, um vor einem Neuling gereiht zu werden. Dies wird zum Problem, da neue Trainer nur dann zum Zuge kommen würden, wenn
alle anderen Trainer entweder keine Zeit oder schlechte Beurteilungen bekommen hätten. Da dieser Fall bei einem eingeschwungenen System bei ausreichender Traineranzahl
im Allgemeinen nicht vorkommen wird, hieße dies effektiv, dass ein neuer Trainer überhaupt nie unterrichten könnte. Abhilfe schafft ein sogenannte Referenzbewertung, die zu
den anderen Bewertungen addiert wird. Diese Referenzbewertung wird durch ihre Gewichtung, ihren Wert, sowie ihrem Datum festgelegt (Die Properties: booking.ReferenceWeight,
booking.ReferenceValue und booking.ReferenceTime). Dieser Referenzwert wird nun unter
dem Standard Ranking festgesetzt und wird nur wirksam, wenn ein Trainer bereits reale
Beurteilungen erhalten hat. Das bedeutet, dass der Trainer zunächst einmal diese negative
Referenzbeurteilung ausbessern muss, um vor einem Neuling zu gelangen. Durch geschicktes Setzen der einzelnen Parameter, kann man das System so einstellen, dass zwar eine
positive Bewertung des aktuellen Kunden genügt, um vor einem Neuling zu stehen, aber
mehrere Beurteilungen von anderen Kunden.
er := EmptyRanking
okw := OtherCustomerFeedbackWeight
ocw := FeedbackOtherCoursesWeight
w := FeetBackAgeWeight
rw := ReferenceWeight
ra := ReferenceAge
rv :=ReferenceValue
rd := Today
d_n := Fedbackdate_n
fan := FeedbackRanking für gleichen Kurs, gleichen Kunden
fbn := FeedbackRanking für anderen Kurs, gleichen Kunden
fcn := FeedbackRanking für gleichen Kurs, anderen Kunden
fdn := FeedbackRanking für anderen Kurs, anderen Kunden
KAPITEL 3. ALGORITHMUS ZUR TRAINERAUSWAHL
18
N := Anzahl der Bewertungen.
raw =
aw =
N
X
n=1
[
1
(rd − ra)w ∗ rv
1
(f an + f bn ocw + f cn okw + f dn ocw okw)] + raw rv rw
(rd − dn )w
ranking = PN
aw
1
n=1 (rd−dn )w
+ raw
(3.1)
Erklärung:
Obige Formel den im Text beschriebenen gewichteten Mittelwert dar. Die Gewichtung wird
je nach Alter, Kurs und Kunde getroffen. rd − ra stellt dabei das Alter des Feedbacks in
Tagen dar. Mit
1
(rd−ra)w
wird nun das Alter gewichtet, wobei der Parameter w die Alterung
bestimmt. Ist w = 0, so werden alle Beurteilungen unabhängig vom Alter bewertet.
Im Gegensatz zu einem “normalen” Mittelwert wird hier nicht durch die Anzahl N der
Gewichtungen dividiert, sondern durch die Summe der Altersgewichte selber. Der Effekt
läßt sich am besten durch ein Beispiel erklären.
rv=0 (Keine Referenz-Bewertung)
w := 1
rd-ra := 5 (Alter der Bewertung in Tagen)
N := 1
fa1 := 1
Bei einer Division durch die Anzahl N wäre Ranking = 0, 2. D.h. nur durch des Alters
des Gewichtes würde der Trainer schlechter werden. Er würde mit jedem neuen Tag weiter
abgewertet.
Dividiert man aber durch die Summe der Altersgewichte, bleibt das Ranking konstant
auf 1. Es wird also nicht allein durch das Altern verändert. Erst durch einen neues Feedback, mit einem neuen Datum, verändert die Bewertung des Trainers.
Beispiel für eine solche Parameterschar:
EmptyRanking := 0,7
OtherCustomerFeedbackWeight := 0,1
FeedbackOtherCoursesWeight
FeetBackAgeWeight := 0,5
ReferenceWeight := 0,25
ReferenceAge := 200 Tage
ReferenceValue := 0,5
:= 0,5
KAPITEL 3. ALGORITHMUS ZUR TRAINERAUSWAHL
19
In diesem Fall genügt eine einzelne Bewertung des aktuellen Kunden für den aktuell
geforderten Kurs von 0,75, um mit einem Neuling gleichzuziehen, falls die Bewertung
ebenfalls 200 Tage zurückliegt. Sollte die Bewertung jünger sein, dann ist der Trainer
schon vor einem neuen Trainer gereiht. Aber einer Bewertung von 1 eines anderen Kunden
für einen anderen Kurs, die lediglich einen Monat zurückliegt, reicht nicht aus, um vor
einen Neuling zu gelangen. Um die idealen Werte für rent@trainer zu finden, existiert
ein Microsoft Excel Macro, mit dem man die verschiedenen Auswirkungen der Parameter
leicht ausprobieren und überprüfen kann.
3.2.4
Definition der Einbindung der Referenzbewertung
Der eingesetzte Referenzwert löst das Problem, dass neue Trainer nicht zum Zuge kommen
würden. Betrachtet man ein eingeschwungenes System, wo alle Trainer bereits Kurse gehalten haben und bereits eine Reihe von Bewertungen protokolliert wurden, verschwindet
die Wirkung des Referenzwertes, da sein Wert bei steigender Anzahl von Beurteilungen
naturgemäß immer weniger ins Gewicht fällt.
Mit dem Knowledgefaktor und dem Ranking bestehen also zwei Möglichkeiten einen
Trainer qualitativ zu beurteilen. In der aktuellen Implementierung wird Knowledgefaktor
nur als Schwellwert verwendet, unter welchem ein Trainer auf keinen Fall mehr unterrichten
darf. Es ist aber auch denkbar, diesen Wert mit in das Ranking einzubeziehen. Beispielsweise könnte man den Knowledgefaktor analog der Referenzbeurteilung in die Berechnung
einbeziehen. Ein anderer Ansatz wäre, Knowledgefaktor direkt als Referenzbeurteilung
zu verwenden. Diese Erweiterungen ändern aber nicht das Prinzip der Beurteilungen, da
man sowohl die Referenzbeurteilung als auch den Knowledgefaktor als eigene Beurteilungen speichern könnte. Man würde sich dadurch die explizite Ausführung dieser Parameter
zwar ersparen, aber die Übersichtlichkeit des Algorithmus würde darunter leiden.
Für die Komplexität der Berechnung des Rankings gilt:
Tb,B,n = O ((b + log (B)) ∗ n)
(3.2)
b = Anzahl an Bewertungen des Trainers
B = Anzahl aller Bewertungen aller Trainer
n = Anzahl benötigter Trainer
Anmerkung:
log(B) ergibt sich aus dem Datenbankzugriff, welcher indiziert in O(log B) erfolgen kann.
[Alg98, Seite 236]
KAPITEL 3. ALGORITHMUS ZUR TRAINERAUSWAHL
3.2.5
20
Setzen von Prioritäten bei Auswahl der Kombinationen
Hat man mehrere Personen zur Auswahl bleibt noch das Problem, der Möglichkeiten,
Personen zu kombinieren.
Es bestehen zwei Möglichkeiten durch Setzen von Prioritäten die Auswahl der Trainer zu beeinflussen. Entweder es versucht, die möglichst besten Trainer für die Auswahl
zu erreichen, oder die Aufgabenstellung verlangt den ehest möglichen Termin. Je nach
Aufgabenstellung muss man also zuert die Termine oder die Trainer permutieren.
3.2.6
Unterschiedliche Fähigkeiten
Es sind aber auch Aufgabenstellungen denkbar, die Personal mit verschiedenen Fähigkeiten benötigen. In diesem Fall ist obiger Algorithmus für alle gewünschten Fähigkeiten
wiederholt anzuwenden. Das System muss die gesammelten Ergebnisse auswerten und eine negative Antwort retournieren, falls nicht Personal mit allen geforderten Fähigkeiten
gefunden werden kann.
3.2.7
Gleichmäßiges Aufteilen der Aufträge unter dem Personal
Mit dem Errechnen des Rankings und der Einbeziehung eines Wissensfaktors hat man probate Werkzeuge immer den besten Trainer für einen Kurs zu finden. Die Konsequenz der
Auswahl von besten Trainern ist aber der Umstand, dass Trainer mit geringeren Rankings
nicht mehr für einen Kurs ausgewählt werden. Wird ein Trainer mit schlechtem Ranking
nicht mehr für einen Kurs ausgewählt, so hat er aber auch nicht mehr die Möglichkeit, sein
Ranking zu verbessern. Das bedeutet, dass eine einzige negative Beurteilung einen Trainer
für immer aus dem Verkehr ziehen kann. Betrachtet man wieder ein eingeschwungenes
System, so ergibt sich folgender Zustand: Einige wenige Trainer teilen sich alle einkommenden Aufträge unter sich auf, während andere Trainer nie gebucht werden. Trainer, die
von rent@trainer nie gebucht werden, werden aber über kurz oder lang die Firma verlassen
und die Konkurrenz aufsuchen, was natürlich nicht im Sinne eines Personaldienstleistungsbetriebes sein kann.
Eine einfache Lösung gleichmäßiger Aufteilung wäre, alle Trainer, deren Ranking über
dem Minranking liegt, nicht nach dem Ranking, sondern nach dem Datum des letzten
gehaltenen Kurses zu reihen. Mit dieser Methode wäre gewährleistet, dass alle qualifizierten
Trainer im Mittel gleich oft gebucht wird.
Schulungsunternehmen sind in der Regel darauf bedacht, dass Kunden immer denselben Trainer zugewiesen bekommen, da sich dieser bereits mit den Gepflogenheiten des
Kunden auskennt und im Allgemeinen seine Arbeit zielgerechter und dadurch effektiver
durchführen kann. In der Diskussion mit Verantwortlichen von Silva stellte sich heraus,
KAPITEL 3. ALGORITHMUS ZUR TRAINERAUSWAHL
21
dass diese Forderung sehr wichtig, ja erfolgskritisch für ein Schulungsunternehmen sein
kann.
Diese Forderung würde durch den oben beschriebenen “Ranking” Algorithmus erfüllt,
jedoch steht sie im Widerspruch zu der Forderung alle Trainer gleichmäßig auszulasten.
Die Lösung besteht in einer Kombination beider Algorithmen. In einem ersten Durchlauf
wird nach Stammtrainern gesucht. Ein Stammtrainer ist per Definition ein Trainer, der bei
einem Kunden bereits unterrichtet hat und dabei sehr hohe Bewertungen erhalten hat. Zu
Qualifizierung eines Stammtrainers wird ein Stammtrainerranking herangezogen. Dieses
Stammtrainerranking errechnet sich gleich dem oben beschriebenen Ranking Algorithmus
mit dem Unterschied, dass othercustomerfeedbackweight auf 0 und othercoursefeedbackweight auf 1 gesetzt wird. Es werden also alle Bewertungen anderer Kunden ignoriert. Weiters wird ein neuer Schwellwert eingeführt (MinDefaultTrainerRanking). Dieser Schwellwert gibt das minimale Stammtrainerranking an, ab wann ein Trainer als Stammtrainer
gewertet wird.
Zu beachten ist auch, dass bei der Berechnung des Stammtrainerranking die Referenzbeurteilung nicht benötigt wird. Sollte ein Trainer einmal bei einem Kunden gewesen
sein und dort gute Kritiken erhalten haben, so genügt das, um ihn wieder diesem Kunden zuzuweisen. Hier wäre es sogar ein Nachteil, das Ranking gegen einen tieferen Wert
hinzugewichten, da dann unter Umständen (je nach Parametervorgabe) mehrere gute Beurteilungen notwendig sind, um einen Trainer zu einem Stammtrainer zu machen. Da die
Trainerauswahl bei nicht Vorhandensein eines Trainers nicht mehr ausschließlich vom Ranking abhängt, sondern von den Buchungszeiten, würden dann mehrere Trainer abwechselnd
diesem Kunden zugewiesen werden, solange bis eben einer den Status eines Stammtrainers erreicht. Erhält ein Kunde bei seinen ersten drei Buchungen aber drei verschiedene
Trainer, so wird dies für seine Einstellung gegenüber dem Schulungsunternehmen nicht
unbedingt positiv sein.
Wird ein Trainer gefunden, dessen Stammtrainerranking höher als MinDefaultTrainerRanking ist, so wird dieser Trainer gebucht. Dieser Trainer wird unabhängig vom Datum
seines letzten Einsatzes gebucht. Wird kein derartiger Trainer gefunden, so werden aus allen verbleibenden Trainern, die ja laut Ranking ebenfalls für diese Aufgabe geeignet sind,
derjenige gewählt, dessen letzte Buchung am weitesten zurück liegt.
Aus Performancegründen wird die Berechnung von Stammtrainer im selben Durchlauf
wie das “normale” Ranking durchgeführt. (Die Daten brauchen in diesem Fall nur einmal
aus der Datenbank gelesen werden)
Für den Algorithmus siehe Anhang C.
Kapitel 4
Verwendete Technologien und
Produkte
4.1
Web Interface
Aus der Vorgabe der Firma Silva eine Internet Applikation für den MS IIS zu schreiben, stellte sich zunächst die Frage nach den zu verwendeten Technologien. Grundsätzlich
gibt es für den MS IIS 4.0 drei grundsätzliche Möglichkeiten, dynamische Webseiten zu
generieren.
4.1.1
CGI (Common Gateway Interface)
Das Common Gateway Interface (Allgemeine Vermittlungsrechner-Schnittstelle) ist eine
Möglichkeit, Programme im WWW bereitzustellen, die von HTML-Dateien aus aufgerufen
werden können und die selbst HTML-Code erzeugen und an einen WWW-Browser senden
können.
Wenn Sie im WWW eine Suchdatenbank benutzen, Pizza oder Büstenhalter bestellen,
sich in ein Gästebuch eintragen, oder einen Zähler mit Zugriffszahlen sehen, dann steckt
CGI oder eine CGI vergleichbare Schnittstelle dahinter.
CGI - das sind Programme, die auf einem Server-Rechner im Internet liegen und bei
Aufruf bestimmte Daten verarbeiten. Die Datenverarbeitung geschieht auf dem ServerRechner. CGI-Programme können auf dem Server-Rechner Daten speichern, zum Beispiel,
wie oft auf eine WWW-Seite zugegriffen wurde, oder, was ein Anwender in ein Gästebuch
geschrieben hat. Bei entsprechendem Aufruf kann ein CGI-Programm gespeicherte Daten
auslesen und daraus HTML-Code generieren. Dieser “dynamisch” erzeugte HTML-Code
wird an den aufrufenden WWW-Browser eines Anwenders übertragen und kann dort in-
22
KAPITEL 4. VERWENDETE TECHNOLOGIEN UND PRODUKTE
23
dividuelle Daten in HTML-Form anzeigen, zum Beispiel den aktuellen Zugriffszählerstand
einer WWW-Seite oder die bisherigen Einträge in einem Gästebuch.
Die sogenannte CGI-Schnittstelle muss von der WWW-Server-Software unterstützt
werden. Aus Sicht des Mieters von Speicherplatz auf einem WWW-Server steht die CGISchnittstelle in Form eines bestimmten Verzeichnisses zur Verfügung. Meistens hat dieses
Verzeichnis den Namen cgi-bin. In diesem Verzeichnis können Programme abgelegt werden,
die CGI-Aufgaben übernehmen. Falls Sie unsicher sind, fragen Sie Ihren Provider, ob er
Ihnen eine CGI-Schnittstelle zur Verfügung stellt. Bei preiswerten oder gar kostenlosen
Homepage-Vermittlern wie CompuServe, AOL usw. steht Ihnen normalerweise keine CGISchnittstelle zur Verfügung.
Es gibt keine Vorschriften dafür, in welcher Programmiersprache ein CGI-Programm
geschrieben ist. Damit das Programm auf dem Server-Rechner ausführbar ist, muss es
entweder für die Betriebssystem-Umgebung des Servers als ausführbares Programm kompiliert worden sein, oder es muss auf dem Server ein Laufzeit-Interpreter vorhanden sein,
der das Programm ausführt. Wenn der Server zum Beispiel ein Unix-Rechner ist, führt
er C-Programme aus, die mit einem Unix-C-Compiler zu einer ausführbaren Datei kompiliert wurden. Wenn der Server ein Windows-NT-Rechner ist, können CGI-Scripts auch
EXE-Dateien sein, die mit 32-Bit-Compilern für C, Pascal, Visual Basic usw. erzeugt wurden. Die meisten heutigen CGI-Programme sind in der Unix-Shell-Sprache oder in Perl
geschrieben. Die Unix-Shell-Sprache wird von allen Unix-Rechnern interpretiert. Für Perl
muss ein entsprechender Interpreter installiert sein. Fragen Sie hierzu Ihren Provider.
Das folgende Beispiel zeigt eine typische CGI-Situation, wie sie zum Beispiel für Suchdienste im WWW erforderlich ist.
Abbildung 4.1: CGI Struktur
In dem Beispiel kann der Anwender in einer angezeigten HTML-Datei in einem Formular Daten eingeben, zum Beispiel eine Suche in einer Datenbank formulieren. Nach
dem Abschicken des Formulars an den Server-Rechner wird ein CGI-Programm aufge-
KAPITEL 4. VERWENDETE TECHNOLOGIEN UND PRODUKTE
24
rufen. Das CGI-Programm setzt die vom Anwender eingegebenen Daten in eine Datenbankabfrage um. Wie das genau funktioniert, hängt von der Datenbank ab. Es gibt eine
international standardisierte Datenbankabfragesprache, SQL, die hierbei sehr häufig zum
Einsatz kommt. Die Datenbankanwendung liefert die Suchergebnisse an das aufrufende
CGI-Programm zurück (oder schreibt sie in eine Datei, die das CGI-Programm dann auslesen kann). Das CGI-Programm erzeugt nun HTML-Code, wobei es die Suchergebnisse als
Daten in den HTML-Code einbaut. Den HTML-Code sendet das CGI-Programm an den
WWW-Browser, der die Suchabfrage gestartet hat. Am Bildschirm des Anwenders verschwindet die WWW-Seite mit dem Suchformular. Stattdessen erscheint eine neue Seite
mit den Suchergebnissen, dynamisch generiert von dem CGI-Programm.
Dies stellt die klassische Methode dar, einem Web Server Funktionalität hinzuzufügen. Vorteil dieser Methode ist die weite Verbreitung. Ein CGI ist generell auf allen Web
Servern einer Plattform, die den Standard erfüllen, lauffähig. Da unter Windows NT aber
fast ausschließlich der MS IIS zum Einsatz kommt, ist eine derartige Flexibilität nicht notwendig. Nachteil von CGI’s ist, dass für jeden HTTP Request ein eigener Server Prozess
gestartet werden muss. Das Erzeugen eines Prozesses ist für einen Web Server eine zeitaufwendige Prozedur. Aus diesem Grund schneiden CGI’s in Performancevergleichen im
Allgemeinen schlechter ab als ISAPI oder ASP Anwendungen [CT991]. Der größte Nachteil ergibt sich aber in mangelnden Möglichkeiten zum Debuggen der Anwendung während
der Entwicklung. Man ist hier auf das Ausgeben von Text in Files angewiesen. Was die
Entwicklungszeit drastisch erhöhen kann.
4.1.2
ISAPI (Internet Server Application Programming Interface)
ISAPI ist eine Entwicklung von Microsoft, die den Nachteil von CGI’s, immer neue Prozesse
starten zu müssen, kompensieren will. ISAPI Anwendungen sind DLL’s, mit standardisierten Interfaces zur Kommunikation mit dem MS IIS. Mit ISAPI startet der IIS jeweils nur
einen neuen Thread für jeden Request. Das Erzeugen und Zerstören von Threads geht
wesentlich schneller als das Starten von eigenen Prozessen. In der Praxis ergab sich ein
Performancegewinn bei rechenintensiven Routinen bei mittlerer Serverlast von 600 %. Ein
weiterer Vorteil von ISAPI ist die Möglichkeit des Debuggens. Man hat die Möglichkeit,
gängige Compiler (Microsoft Visual C++ 6.0 bzw. Borland Delphi 4.03) als Host Applikationen für die ISAPI Extentions zu definieren. Durch diese Einstellung wird bei einem http
Request automatisch der Debugger der verwendeten Entwicklungsumgebung gestartet und
man hat die Möglichkeit , den Source Code zu debuggen.
KAPITEL 4. VERWENDETE TECHNOLOGIEN UND PRODUKTE
25
Kommunikation zwischen ISAPI Extentions und dem IIS
Der Server erzeugt eine ECB Datenstruktur. In dieser Datenstruktur werden alle relevanten Daten, die zum Handling eines Requests notwendig sind, gespeichert. Das Erzeugen
dieser Datenstruktur ist natürlich viel schneller als das Erzeugen eines eigenen Prozesses,
dem man die Servervariablen, etc. über den Standardinput mitgibt. Für jeden HTTP Request wird nun, wie gesagt, kein eigener Prozess gestartet, sondern nur ein neuer Thread
erzeugt, was viel schneller geht. Das Konzept birgt jedoch auch Gefahren. So kann eine
abstürzende DLL den ganzen Server mit in die Tiefe reißen, da ja beide im selben Prozessraum laufen. Aus diesem Grund bietet der IIS die Möglichkeit, sogenannte ”Applications”
zu definieren. Applications sind in diesem Zusammenhang Gruppen von ISAPI DLL’s oder
SKRIPTS (werden weiter unten behandelt). Eine Gruppe von Dateien ist ein Verzeichnis.
Also kann man jedes virtuelle Verzeichnis des IIS als ”Application” definieren. Alle ISAPI
DLL’S, die unter diesem Verzeichnis liegen, gehören dann zu dieser Applikation. Die wichtigste Eigenschaft so eines Applikationsverzeichnisses ist ”Run in seperate memory Space”.
Dabei ist garantiert, dass eine “unhandled Exception” in einer ISAPI DLL nicht den gesamten Server zum Absturz bringt. So kann man durch Definieren mehrerer ”Application
Directories” die richtige Mischung aus Performance und Sicherheit (Serverstabilität) finden. Je mehr eigene Prozessräume man definiert, desto weniger beeinflussen sich die ISAPI
DLL’S. Umgekehrt müssen dann aber wiederum Prozesse erzeugt und terminiert werden,
was Zeit kostet.
Man hat nur dann die Möglichkeit über die Management Console alle Dll’s einer Application zu terminieren, indem der Server die ISAPI DLL’S unloaded (ISAPI Exit Function
”TerminateExtention”), wenn diese in einem eigenen Prozessraum laufen. Auch dieses wichtige Feature ist nicht über das Web Interface erreichbar, sondern nur über die Management
Console. Das Problem beim Entwickeln einer ISAPI Extension ist nun aber das Debuggen.
Während man beim Debuggen von simplen CGI Programmen noch über die Kommandozeile Tests durchführen kann, ist dies bei DLL’s natürlich nicht möglich. Ein weiterer
Vorteil beim Debuggen von CGI Programmen ist, dass wenn ein CGI Programm abstürzt,
es zwar im Speicher hängen bleibt, der Server aber trotzdem ”ungehindert” weiterläuft.
Ungehindert ist deshalb nicht 100% richtig, da das hängengebliebene CGI Programm Speicher, und schlimmer noch, Rechenleistung in Anspruch nimmt.
Man hat da aber immer noch die Möglichkeit, einige weitere Testläufe zu fahren, bis
der Server komplett zu ist, um dann erst den Server neu zu starten bzw. mit dem MS
Ressource Kit den Prozess zu killen. Bei einer ISAPI Extension muss man nach jedem
fehlgeschlagenen Testlauf (die DLL hängt noch im Server Prozessraum) versuchen, den
Server zu überreden, die DLL zu entladen. Nur wenn dies gelingt, kann man einen neuen
KAPITEL 4. VERWENDETE TECHNOLOGIEN UND PRODUKTE
26
Compilerlauf starten und die alte DLL überschreiben, da sie sonst vom System als geöffnet
erkannt wird und keine Schreibzugriffe auf diese Datei gestattet werden. Das Unloaden
einer abgestürzten DLL funktioniert aber nicht immer, was bedeutet, dass man früher
oder später um einen Reboot nicht umhinkommt.
Das Laufzeitverhalten von ISAPI Anwendungen ist momentan das beste aller möglichen Techniken der Internetprogrammierung [Pro98]. Der Nachteil von ISAPI ist aber,
analog zu CGI, dass keine klare Trennlinie zwischen User Interface (HTML Code) und der
Funktionalität der Anwendungen möglich ist. Sollen größere Projekte zum Beispiel mehrsprachig entwickelt werden, so leidet die Wartbarkeit des entstandenen Codes erheblich.
4.1.3
ASP (Active Server Pages)
ASP [MSO] schließlich ist eine Scriptsprache des IIS, die intern als ISAPI realisiert ist. Die
direkte Programmierung einer ISAPI Extentions wird daher in der Regel immer schneller
sein. Das UI wurde mit ASP programmiert. Die Programmierung mit Scripts bringt den
Vorteil, dass das Layout der Anwendung später leichter geändert werden kann. Jedoch
ist es mit ASP ab einer gewissen Komplexität nicht möglich, lesbaren Code zu schreiben. Versucht man z.B. zusätzlich zur Eingabeüberprüfung von HTML Formularen noch
ein wenig Logik in die Scripts zu programmieren, so endet dieser Ansatz unweigerlich in
Spaghetti Code [DevJ1]. Aus diesem Grund wurde jegliche Business Logik in COM+ Objekten realisiert. ASP bietet die Möglichkeit, sehr einfach und unkompliziert auf jegliche
im System registrierten Objekte zuzugreifen. Aber auch der umgekehrte Ansatz etwas vom
UI in die COM+ Objekte zu packen, birgt die Gefahr, dass Layoutänderungen später nur
schwer und aufwendig zu realisieren sind [MSO2] [Bün00] [Buc00]. Aus diesem Grund war
unbedingt darauf zu achten, hier eine exakte Trennlinie einzuhalten [Qui99] [Gam95].
4.2
4.2.1
Business Layer
Allgemein
Scriptsprachen, wie JScript, sind aber nur bedingt dafür geeignet, komplexere Software zu
erstellen. Hier hakt Microsoft ein und bietet weitere Software an, die den Entwickler hier
unterstützen. Ein Ansatz, diesen Nachteil von Scriptsprachen zu umgehen, sind “ThreeTier Applications”. Gemeint ist, dass man ausgehend vom Zweischicht Modell (klassisches
Client / Server), eine dritte Schicht zwischen Client und Server einzieht, die die sogenannte
Business Logik beinhaltet.
KAPITEL 4. VERWENDETE TECHNOLOGIEN UND PRODUKTE
4.2.2
27
Microsoft Transaktion Server
Microsoft bietet für die Business Logic mit DCOM (Distributed Components Object Modell) auch gleich eine passende Technologie an. Man kann sogenannte DCOM Server entwickeln, die auf verschiedenen Rechnern liegen können. Diese DCOM Server übernehmen dann die Business Logik. DCOM Server sind quasi nicht sichtbare ActiveX Controls,
die Methoden und Properties besitzen [Cha96]. Mit dem Option Pack wird auch der MS
Transaktion Server (MTS) mit ausgeliefert. Dieser bildet eine Art Schutzhülle über DCOM
Komponenten, die man entwickelt hat. Diese Schutzhülle beinhaltet eine Transaktionskontrolle auf Datenbankzugriffe, eine kompfortable Schnittstelle zur Userverwaltung von MS
Windows NT, sowie eine Multi threading Umgebung. Der MTS sorgt dafür, dass man
eine Komponente single threaded entwickeln kann, diese erscheint aber nach außen hin
wie eine Multi Threaded Anwendung. Dies erlaubt kleine überschaubare Komponenten zu
entwickeln, und diese dann z.B. mit JScript zu einer größeren Applikation zu verbinden.
Der Einsatz von solchen kleinen überschaubaren Komponenten kann einem das Entwicklerleben sehr erleichtern.
4.2.3
COM+
Mit Windows 2000 wurde die MTS Technologie von COM Objekten neuerlich überarbeitet.
COM+ wurde dafür ausgelegt, bestehende Investitionen in COM, MTS und andere
COM-basierte Applikationen zu nutzen und möglichst leicht erweitern zu können. Es wird
erstmalig in Windows 2000 enthalten sein.
Auch in COM+ werden Dienste in Form von Komponenten verwaltet. Der Zugriff
und die Kontrolle dieser werden hier komplett vom Server übernommen. Dazu wurde ein
“Interception” -Mechanismus eingeführt. Im Unterschied zum “einfachen” COM, wo Server
und Client auf demselben Rechner angesiedelt waren (Abbildung 4.2), ist es mit COM+
ohne weiteres möglich, Dienste auf anderen Rechnern zu nutzen. Früher wurde dies mittels
“Remote Procedure Call” (RPC) gelöst. (Abbildung 4.3) Der MTS erweiterte dieses RPCPrinzip um eigene Kontext-Wrapper auf der Serverseite, welche Sicherheitsüberprüfung
übernahmen. (Abbildung 4.4) [DNJ100, Seite 55-56].
COM+ führt zur Sicherheitsüberprüfung sogenannte “Policy-Objekte” ein, wodurch die
Kontext-Wrapper des MTS entfallen. Diese Policy-Objekte werden sowohl auf Client- als
auch auf Serverseite plaziert, wo sie die bereits oben erwähnten Interceptions durchführen
können. Wie das ganze dann schematisch aussieht, zeigt die Abbildung 4.5.
Alle angebotenen Dienste müssen in COM+ als Applikation angemeldet werden. Es
werden dabei 2 Arten von Applikationen unterschieden. Zum ersten wäre da die Serverapplikation, was bedeutet, dass die Komponente zur Laufzeit in einen vom Client getrenn-
KAPITEL 4. VERWENDETE TECHNOLOGIEN UND PRODUKTE
28
Abbildung 4.2: Eine direkte Verbindung zu einem Objekt auf dem gleichen Computer, im
gleichen Adressraum und Apartment wie der Client
Abbildung 4.3: Eine indirekte Proxy/Stub-Verbindung zu einem Objekt, das an einem
anderen Ort existiert
ten Adressraum auf dem Server oder einem anderen beliebigen Rechner ausgeführt wird.
(Abbildung 4.6) Die zweite Form ist die Bibliotheksapplikation, bei der die Komponente
im Adressraum des Client ausgeführt wird.(Abbildung 4.7)
Wird von COM+ nun ein bestimmter Dienst angefordert, muss zunächst das entsprechende Objekt erstellt werden. Dazu wird zuerst geprüft, ob der geforderte Dienst
überhaupt registriert ist. Hierzu wird der interne COM+ Katalog nach der gewünschten Komponente durchsucht. Wurde die Komponente gefunden, wird sie gemäß ihren Eigenschaften (Bibliotheks- oder Serverapplikation) gestartet. Danach kann der Interceptor
eingerichtet werden. Anschließend wird auf der Clientseite ein Proxy inklusive eines RPCKanals eingerichtet. Zuletzt wird dem Client ein Zeiger auf den Proxy zurückgegeben.
Für das Beenden einer Applikation ist der Server verantwortlich; das Verhalten kann vom
Administrator eingestellt werden (z.B.: App. niemals beenden, App. nach xx Minuten beenden, usw.). Hier noch ein paar Bemerkungen zum oben erwähnten COM+ Katalog. Der
Katalog stellt eine Systemdatenbank dar, in welcher alle registrierten Applikationen mit
ihren Komponenten gespeichert werden können. Arbeiten kann man mit diesem Katalog
über sogenannte Dienstobjekte, welche unter anderem auch Skriptverarbeitung anbieten.
Zugriff auf die oberste Ebene des Kataloges bekommt man durch die Verwendung der
Komponente COMAdmin (ist in COM+ enthalten).
KAPITEL 4. VERWENDETE TECHNOLOGIEN UND PRODUKTE
29
Abbildung 4.4: Ein Kontext-Wrapper als eine separate Schicht im Microsoft Transaction
Server
Abbildung 4.5: Interception durch Policy-Objekte
Zuletzt noch ein paar Worte zur Sicherheit in COM+. Früher war die Erstellung von
guten Sicherheitscode schwierig und teuer. Heute kann man diese Aufgabe voll und ganz
COM+ überlassen, es kann die Sicherheitsinfrastruktur ererbt werden. Zu den angebotenen Diensten zählen die Authentifizierung und die Autorisierung. Die Authentifizierung
wird vom “Security Support Provider” (SSP) im Betriebssystem bereitgestellt. Er stellt
dazu verschiedene Authentifizierungsebenen bereit, die angeben, wie umfangreich das Sicherheitssystem arbeiten soll. Auf die einzelnen Ebenen soll an dieser Stelle nicht weiter
eingegangen werden. Die Autorisierung ist natürlich abhängig von der Authentifizierungsebene. Ist sie beispielsweise auf NONE eingestellt, entfällt die Autorisierung komplett.
Die Autorisierung selbst wird über sogenannte “Rollen” abgewickelt, wobei Rollen anwendungsbezogene Benutzergruppen sind.
Die neue Bezeichnung derartiger Objekte lautet nun COM+. Die herausragende Neuerung von COM+ ist, die Tatsache COM Objekte kontektbezogen zu entwickeln. Das bedeutet, dass sich ein COM Objekt bei entsprechender Implementierung je nach aufrufender
Applikation anders verhalten. Das Objekt verändert also sein Verhalten, wenn es z.B. über
KAPITEL 4. VERWENDETE TECHNOLOGIEN UND PRODUKTE
30
Abbildung 4.6: Eine Serverapplikation, die in einem separaten Adressraum ausgeführt wird
Abbildung 4.7: Eine Bibliotheksapplikation, die im Adressraum der Clientanwendung ausgeführt wird
den IIS aus dem Internet aufgerufen wird. Wird es von VBA aus Microsoft Excel aufgerufen, dann können andere Eigenschaften des Objektes zum Vorschein kommen.
4.3
4.3.1
Datenbank
ADO
Ob Veranstaltungskalender, Produktkatalog, Mitgliederdatenbank, Gästebuch, personalisierte Dienste oder allgemein veränderliche Daten - all dies läßt sich mit Hilfe der Kombination ASP Skripts auf der Webserver Seite und einer Datenbank auf der anderen Seite
verwirklichen.
Betrachten wir einmal das Bindeglied zwischen diesen beiden Technologien näher. Von
ASP aus greift man am einfachsten über ADO (ActiveX Data Objects) und das zugehörige
ADODB Objekt auf Datenquellen zu. Die Verbindung zwischen ADO (und der darunterliegenden OLE DB, Object Linking and Embedding Database) und der Datenbank wird
meist über ODBC (Open DataBase Connectivity) hergestellt, das Applikationen einen
weitgehend einheitlichen Zugriff auf verschiedenste Datenquellen erlaubt [Kol00] [MSO2].
ADO stellt die Objekte zur Verfügung, mit deren Hilfe ein ASP Skript eine Verbindung
zur Datenbank aufbauen und Daten auf vielfältigste Weise manipulieren kann.
KAPITEL 4. VERWENDETE TECHNOLOGIEN UND PRODUKTE
31
Die wichtigsten ADO Objekte sind:
• Connection (Datenbankverbindung) - Repräsentiert die Verbindung zur Datenquelle
.
• Recordset (Sammlung von Datensätzen) - Besteht aus den Datensätzen die aus einer
Datenbankabfrage stammen und dem zugehörigen Cursor, der auf den aktuellen
Datensatz zeigt.
• Field (Datenfeld) - Enthält Daten einer Datenbankspalte und Informationen über
diese Daten wie Datentyp, Datenlänge und Ähnliches. Das Recordset Objekt stellt
dabei die Fields Collection zur Verfügung, die alle Field Objekte eines Datensatzes
beinhaltet.
• Property (Eigenschaft) - Erlaubt den Zugriff auf dynamische Informationen eines
ADO Objektes, die von der Datenquelle oder der Datenanbindung (wie ODBC) zur
Verfügung gestellt werden.
• Error (Fehler) - Enthält ausführliche Fehlerinformationen bei Datenbankzugriffen.
Auf alle Fehler eines Datenbankzugriffes kann durch die Errors Collection zugegriffen
werden.
• Command (Befehl) - Erlaubt es, einzelne Datenbankabfragen zu definieren, sodass
ein mehrmaliger Einsatz mit verschiedenen Parametern rascher durchgeführt werden
kann .
• Parameter (Parameter) - Stellt einen einzelnen Parameter (Argument) eines Command Objektes für eine parametrisierte Abfrage oder einen Zugriff auf eine “Gespeicherte Datenbankprozedur” dar.
Wie sieht nun eine einfache Datenbankabfrage aus? Das folgende ASP Skript öffnet eine
Verbindung zur Nordwind Datenbank, die mit Microsoft Access 97/2000 und SQL Server
7.0 (deutsche Versionen) ausgeliefert wird. Weiters liest es die Datensätze der Tabelle
Artikel aus, die in die Kategorie Meeresfrüchte fallen, um die Werte der Spalten ArtikelNr und Artikelname schließlich im Browser anzuzeigen.
<%
Response.Expires=0
Response.AddHeader ’’Pragma’’,’’no-cache’’
Response.AddHeader ’’cache-control’’, ’’no-store’’
Response.Write ’’Abfrageergebnis:<br>’’ & vbcrlf
Set conn = Server.CreateObject(’’ADODB.Connection’’)
KAPITEL 4. VERWENDETE TECHNOLOGIEN UND PRODUKTE
32
conn.Open ’’DSN=NW;USR=sa;PWD=’’
strSQL = ’’SELECT Artikel.[Artikel-Nr], Artikel.Artikelname ’’
strSQL = strSQL & ’’FROM Artikel INNER JOIN Kategorien ’’
strSQL = strSQL &
’’ON Artikel.[Kategorie-Nr]=Kategorien.[Kategorie-Nr] ’’
strSQL = strSQL &
’
’WHERE Kategorien.Kategoriename = ’Meeresfrüchte’ ’’
Set rs = conn.Execute(strSQL)
Do While Not(rs.EOF)
Response.Write ’’’’ & rs(’’Artikel-Nr’’) & ’’ : ’’
Response.Write ’’’’ & rs(’’Artikelname’’) & ’’<BR>’’ & vbcrlf
rs.MoveNext
Loop
rs.Close
conn.Close
%>
4.3.2
Microsoft SQL Server 7.0
Für die Entwicklung des Datenbank Back end’s wurde MSDE gewählt. MSDE ist im MS
Office 2000 Paket enthalten und bietet SQL Kompatibilität zum MS SQL Server 7.0.
Außerdem benötigt die MSDE weniger Hardwaressourcen, was ebenfalls ein Kostenfaktor
ist. Aufgrund der 100% Kompatibilität zum MS SQL Server 7.0 lässt sich das System leicht
durch einen einfachen Upgrade der Datenbankengine skalieren. Bei der Entwicklung wurde
darauf geachtet, möglichst wenig herstellerspezifische SQL Statements zu verwenden. Dies
sollte es leicht möglich machen, gegebenenfalls gegen einen anderen SQL Server zu fahren.
Durch die Verwendung von ADO 2.1 ist es aber auch leicht möglich, die Software
dahingehend zu ändern, dass gegen jede relationale Datenbank (SQL) gefahren werden
kann. Bei der Verwendung von Windows 2000 als Betriebssystem kommt ADO 2.5 zur
Anwendung.
4.4
Perfomance Vergleich
ISAPI wurde eingeführt, um CGI Programme zu beschleunigen. Die Frage ist nun, wie es
mit der Performance im Vergleich mit ASP steht. Als erstes, weil dies ein Kernbereich der
Untersuchungen darstellt, wurde der Zugriff auf eine Tabelle einer Relationalen Datenbank
getestet.
KAPITEL 4. VERWENDETE TECHNOLOGIEN UND PRODUKTE
Task
ASP
ISAPI
Default Einstellungen
9sec
20sec
Isolated Process*
22sec
21sec
Buffer ASP Pages**
6sec
-
33
Tabelle 4.1: Ergebnisse Test 1
4.4.1
Testumgebung
• AMD K6 166
• 32MB Ram
• NT Server+Optionpack installiert (IIS 4.0)
• MS SQL Server Server installiert
• MS Office 97 installiert
• 10BaseT Netzwerk (PCI Netzwerkkarten)
4.4.2
Test 1
Zugriff auf eine Tabelle in einer Accessdatenbank. Access wurde gewählt, da die JET
Engine Ressourcen schonender als der MS SQL Server ist. Die Testkandidaten sollten
einfach die Felder aus der Access Tabelle in eine HTML Tabelle schreiben. Folgendes
Script musste gegen eine entsprechende ISAPI Extension antreten. Die ISAPI Extention
wurde mit Borland Delphi 4.0 entwickelt.
Ergebnisse von Test 1
Tabelle enthält ca. 2000 Datensätze. Es wurde mit einer Stoppuhr die Zeit, in der sich die
Fortschrittsanzeige (Balken in der Statusleiste) der Browser bewegt, gemessen. Außerdem
wurde die Abfrage zuvor einmal ohne Messung gestartet, um dem Server internes Caching
(welcher Art auch immer) zu ermöglichen.
* Option ”Run in Seperated Space” wurde aktiviert.
** Option ”Buffering ASP Pages” wurde aktiviert. Bedeutet, dass das Senden einer
ASP solange vom Server verzögert wird, bis sie fertig aufgebaut ist. Andernfalls
würde sie Zeile für Zeile abgearbeitet und Zeile für Zeile verschickt werden.
KAPITEL 4. VERWENDETE TECHNOLOGIEN UND PRODUKTE
Task
ASP
ISAPI
Buffer ASP Pages
10sec
Absturz
34
Tabelle 4.2: Ergebnisse Test 2
4.4.3
Test 2
Identisch mit Test1, nur dass zusätzlich noch eine kleine Berechnung aus den Daten der
selben Tabelle gefordert war.
Berechnung : ((oRs(2)/3.3) ∗ (oRs(2)/3.7))/(12/2.3)
Anmerkung: Bei einem Testlauf dieser ISAPI Extention war der Server abgestürzt.
Laut Taskmanager: “Prozessorauslastung 0
Dabei konnte der IIS nur durch ein Reboot der gesamten NT Maschine wieder zum
Leben erweckt werden. Der Server lieferte bei allen folgenden Requests nichts mehr zurück
(TimeOut).
4.4.4
Test 3
Neben dem Datenbankzugriff sollte nun auch die reine Ausführungsgeschwindigkeit gemessen werden. Zu diesem Zweck wurde folgendes Script getestet:
Hierzu benötigte der IIS 5 Sekunden. Als ”Gegner” musste wieder eine ISAPI DLL ins
Rennen. Diese brachte das Ergebnis ohne merkliche Verzögerung in den Browser. Da die
Ergebnisse handgestoppt wurden, kann bei einer derartigen kurzen Messdauer keine präzise
Zeit genannt werden, da der Seitenaufbau immer weniger als eine Sekunde benötigte.
4.5
Schlußfolgerungen
rent@trainer verwendet nun die Kombination ASP, COM+ und Microsofts SQL Server.
Die Entwicklung von Web Anwendungen mittels CGI oder ISAPI hat den großen Nachteil,
das die Trennung von Präsentation und Funktionalität nicht gegeben ist. Es bestünde zwar
die Möglichkeit, mittels Dokumentvorlagen eine Trennlinie einzufügen, diese kann in der
Praxis, wie die Erfahrung zeigt, aber nicht eingehalten werden. Beispielsweise muss man
in der Anwendung eine HTML-Auswahlbox mit Elementen aus der Datenbank füllen. Der
Code für die Auswahlbox kann dabei nur in im CGI bzw. ISAPI Code liegen, womit man
die Seperation von Präsentation und Funktionalität schon aufgegeben hat.
Die Verwendung von Scriptsprachen löst obiges Problem. Jedoch bekommt man bei der
Verwendung von ASP bei größeren Projekten das Problem, dass der Code schnell unüber-
KAPITEL 4. VERWENDETE TECHNOLOGIEN UND PRODUKTE
35
sichtlich wird. Dies liegt darin begündet, dass ASP Objektorientiertheit nur ansatzweise
bietet. Sehr schnell entwickelt sich das Script zu “Spagetti Code”.
Aus diesem Grund wurde folgende Vorgangsweise gewählt: Für die Präsentation der
Daten wird ASP verwendet. ASP greift nun nicht direkt auf die Datenbank zu, sondern auf
COM+ Objekte. Diese enthalten die gesamte Business Logic der Anwendung und stellen
auch die Verbindung zur Datenbank her. Die COM+ Objekte sind in Borlands Delphi
implementiert.
4.6
Entwicklungstools
Die MTS Objekte wurden mit Borland Delphi 4.03 entwickelt [Kos991] [Kos992]. Bereits
im späten Entwicklungsprozess, wo versucht wurde die Anwendung nach Windows 2000
zu portieren, musste festgestellt werden, dass mit Borland Delphi 4.03 unter Windows NT
4.0 entwickelte Objekt unter Windows 2000 nicht mehr funktionieren. Die kompilierten
Object Interfaces wurden von den verschiedenen Betriebssystemen nicht mehr verstanden.
Aus diesem Grund war eine Neukompilation des gesamten Source Codes auf der neuen Plattform notwendig. Da dieses Verhalten von Microsoft nicht dokumentiert ist, wird
angenommen, dass sich Borland Delphi 4.03 hier nicht 100% korrekten Compilate liefert
[...]. Die ASP und HTML Seiten wurden mit Macromedia Dreamweaver 2.0 erstellt. Die
erstellten Images kamen von einer Drittfirma. Die ASP Tags selber wurden mit einem
gewöhnlichem Texteditor, der HTML Syntaxhighlithing beherrscht, erstellt. Die Wahl fiel
hier auf das Shareware Programm UltraEdit32 v6.20b.
Kapitel 5
Software Design
5.1
Allgemein
Da die Software eine Web-Applikation ist, geht das Design von einer Client / Server Architektur aus. Den Client stellt ein HTML Browser. Die bekanntesten und am weitesten
verbreiteten Vertreter sind Microsoft’s Internet Explorer und Netscape’s Communicator.
Bei der Entwicklung von einer Web-Applikation ist, wie bei der Entwicklung aller Anwendungen, darauf zu achten, die “Presentation Layer” streng von der “Data Source Layer”
zu trennen. Diese Forderung wird im Allgemeinen von Scriptsprachen, wie ASP eine ist,
nicht erfüllt.
Eine zukünftige Alternative, die bereits Einzug in die neuesten Implementationen gehalten hat ist XML. XML verspricht die Möglichkeit, Daten und Präsentation derselben
trennen zu können.
Ein anderer Ansatz, der auch in dieser Arbeit angewandt wurde, ist das Einziehen einer
dritten Schicht auf dem Server. Diese Schicht wird “Application Layer” oder “Business
Layer” genannt. Die Aufgabe dieser Schicht ist das Bereitstellen von Funktionen, die nicht
direkt von der Datenbank geliefert werden, aber von der Präsentationsschicht benötigt
werden. In diese Schicht werden alle Algorithmen, die von der Applikation verwendet
werden, gepackt. Ein Beispiel dafür ist der Algorithmus zum Auswahl eines Trainers.
Die klassische Client/Server Architektur wird zur Multi Tier-, oder Three Tier Architektur.
Um die Entwicklung der Application Layer möglichst effektiv zu gestallten, bieten
verschiedene Hersteller Produkte her, die Transaktionen, Sicherheitsaspekte und Performanceaspekte, wie Load Balancing unterstützen. Eines dieser Produkte ist der in Windows
NT und Windows 2000 integrierte Transaction Server.
Soll die Applikation nicht auf einem Windows basierendem Server, sondern auf einem
36
KAPITEL 5. SOFTWARE DESIGN
37
Unix Derivat laufen, so sind die Produkte von Borland (Borland Application Server) oder
Sun (Sun Java Application Server) in Betracht zu ziehen.
Einen weiteren interessanten, vielversprechenden Ansatz bietet Hyperwave. Hyperwave
bietet mit seiner objektorientierten Datenbank und der damit verbundenen objektorientierten Scriptsprache, die an JavaScript angelehnt ist, die Möglichkeit auch große Projekte
durchgehend in Scriptsprachen zu entwickeln, ohne die Probleme der Unübersichtlichkeit
von ASP Code zu haben.
5.2
5.2.1
Business Logic
Objekt Relationen
Es folgen Diagramme über die Beziehungen der ASP Scripts mit den COM+ Objekten
(Abb 5.1 und Abb 5.2).
Man sieht, dass versucht wurde, eine strenge Trennung der einzelnen Layers zu erhalten.
Die COM+ Objekte stellen konsequent die mittlere Schicht zwischen User Interface und
Datenbank dar.
Eine genaue Beschreibung der Methoden der einzelnen Objekte findet sich im Anhang
D.
5.2.2
OFFER.DLL - Details
Motivation
Das zentrale Objekt dieser Arbeit stellt TOffer im File OFFER.DLL dar. Sie enthält
die Implementierung für die Auswahl der Trainer. Unter Kapitel 3 war die Komplexität
untersucht worden. Es wird nun gezeigt, wie man durch Ausnutzen maschinenspezifischer
Eigenschaften, die Performance erhöhen kann.
Schnelle Berechnung der Verfügbarkeit
Es wird ein Matrix erstellt, wobei die Spalten die Tage und die Zeilen die Personen darstellen. Es wird von dem angegebenen Startdatum stadat ausgegangen. Der Spaltenindex
i gibt den Tag relativ zum Startdatum an. Alle Einträge werden zu diesem Startdatum
genormt. Das bedeutet, dass eine Spalte bei allen Personen dem selben Tag entspricht.
Für die Abstraktion eines Tages wählt man einen Ganzzahlwert, dessen Bits Teile eines
Tages darstellen. Mit einer 24 Bitzahl kann man einen Tag Stundengenau auflösen. Die
Implementierung von rent@trainer verwendet einen 64 Bit Integer Typ. Das erlaubt eine
Auflösung von 30 Minuten, da von den 64 Bit momentan nur 48 genutzt werden. Eine Auf-
KAPITEL 5. SOFTWARE DESIGN
38
lösung von 30 Minuten erscheint noch recht grob, da aber bei rent@trainer Kurse nur ganze
Vielfache von Stunden dauern und nur zur jeweils halben oder vollen Stunde anfangen,
genügt eine Auflösung von 30 Minuten. Das Verwenden von 64 Bit Ganzzahlen hat zudem
den Vorteil gegenüber komplexen Datenstrukturen, dass Operationen auf diesen Zahlen
direkt von einem modernen Prozessor ausgeführt werden können. Damit beschränken sich
Vergleiche zwischen zwei Personen auf binäre UND Operationen, welche vom Prozessor
sehr schnell ausgeführt werden können.
Von allen potentiellen Personen werden alle Kalendereinträge, die die Verfügbarkeit
repräsentieren, aus der Datenbank gelesen. Jeder Tag wird in einem 64Bit Ganzzahlwert
gespeichert. Jedes Bit entspricht einer halben Stunde. Somit werden von den 64Bit 48Bit
effektiv genutzt. Für jede Person ergibt sich dadurch ein Array von 64 Bit Ganzzahlen.
Die Länge des Arrays m ergibt sich aus der Anzahl der Tage, für die Verfügbarkeit gesucht
wird. In der konkreten Implementation von rent@trainer wäre m=60. Man erhält also eine
Matrix M der Größe p*m. Wo die Zeilen den Tagen und Spalten den Personen entsprechen
.
Es wird eine Schablone für einen Tag erstellt. Diese Schablone ist eine 64 Bit Zahl wo
für jede benötigte halbe Stunde eine binäre 1 steht. Würde man Trainer von 8:00 Uhr bis
12:00 Uhr benötigen, ergäbe sich eine Zahl von
Binär 111111110000000000000000 = FF0000 = 16711680.
Ob zwei Trainer j1, j2 am Tag i von 8:00 Uhr bis 12:00 Uhr Zeit haben, ergibt sich wie
folgt:
if (M[i,j1] AND M[i,j2] AND FF0000 = FF0000) then begin
j1 and j2 have time
end;
Resultat
Als Resultat dieser Berechnungen erhält man eine Liste aller potentiellen Trainer, die alle
geforderten Ansprüche erfüllen. Trainer, die diese Mindestanforderungen nicht erfüllen,
sind ausgeschieden. Zusätzlich sind die ausgewählten Trainer nach ihrem Ranking sortiert.
Der “beste” Trainer steht am Beginn der Liste.
Nachdem die Fähigkeiten aller Trainer untersucht wurde, muss nun ein möglicher Termin für einen Kurs gefunden werden. Die Komplexität für die Berechnung der Fähigkeiten
(Gl. 3.2) liegt unter der, die für die Berechnung der Verfügbarkeit (Gl. 2.4). Aus diesem
Grund werden zuerst die Fähigkeiten errechnet, um so die Komplexität für die Berechnung
der Termine zu minimieren.
KAPITEL 5. SOFTWARE DESIGN
39
Würde durch obiges Verfahren 2/3 der Trainer eliminiert werden, so ergibt sich für die
Gesamtkomplexität folgender Wert.
m = 5 (Kursdauer),
n = 100 (Anzahl der Kalendereinträge),
p = 21 (Periode innerhalb der Kurs stattfinden muss,
t = 100 (Anzahl der Trainer),
k = 3 (Benötigte Trainer),
b = 25 (Anzahl Bewertungen für einen Trainer),
B = 2500 (Anzahl aller Bewertungen im System)
Geht man davon aus, dass eine elementare Operation (Kalenderzugriff, Vergleich, etc)
−
10 6 s benötigt, dann käme man nach Gl. 2.4 und Gl. 3.2 auf
T = 13M inuten
Dies entspricht einer Zeitersparnis von 2700 %.
Wählt man die Parameter so, dass nur mehr 10 Trainer übrigbleiben, dann kommt
man auf nach der genannen Formel auf:
T = 12sec
Die Berechnungsvorschrift findet sich in Anhang C.
KAPITEL 5. SOFTWARE DESIGN
40
[h][ht]
courselist.asp
editanswer.asp
TMisc
Datenbank
registration.asp
courseinfo.asp
TMisc
TCustomer
bookingform.asp
Datenbank
default.asp
TCustomer
Datenbank
editcustomer.asp
TTrainer
TCustomer
feedbackanswer.asp
Datenbank
TOrder
feedback.asp
Datenbank
TOrder
Datenbank
order.asp
TMessenger
Mail / SMS
TCustomer
TSecurity
Datenbank
registrationanswer.asp
TMessenger
Mail / SMS
Abbildung 5.1: Objekt Relationen Teil 1
KAPITEL 5. SOFTWARE DESIGN
41
[h][ht]
TCustomer
Datenbank
editanswer.asp
TMessanger
Mail / SMS
TOffer
TBooking
offer.asp
Datenbank
TOffer
Datenbank
orderverification.asp
TCalendar
newterminasnwer.asp
calendar.asp
Datenbank
newavailable.aspnewtermin.asp
edittrainer.asp
editanswer.asp
TTrainer
Datenbank
education.asp
wantercourseanswer.asp
Abbildung 5.2: Objekt Relationen Teil 2
Kapitel 6
Die Datenbank von
rent@trainer
6.1
Erläuterungen
Die Datenbank basiert im Prinzip auf drei Säulen: Den Trainern (Tabelle HUMANRESOURCE), den angebotenen Kursen (Tabelle COURSE) und den Kunden (Tabelle CUSTOMER). Diese Tabellen sind mit verschiedenen Untertabellen verknüpft. Die Untertabellen ergaben sich durch die Erstellung der 3. Normalform der Datenstruktur [Dat98]
Besonderheiten:
Normalerweise werden als Identity Felder “Autoincrement Integer Felder” verwendet. Bei
einigen Fällen wird jedoch darauf verzichtet und stattdessen das Primärschlüsselfeld mit
speziellen Funktionen versehen.
6.1.1
Tabelle PLZ
Hier ist das Primärschlüsselfeld die Postleitzahl. Die Verknüpfungen mit PLZ sind in
der derzeitigen Version nicht mit referentieller Integrität realisiert. Es kann nämlich sein,
dass ein User eine Postleitzahl und einen Ort eingibt, der noch nicht in der Datenbank
gespeichert ist. Sollte dies der Fall sein, so darf dieser User nicht abgewiesen werden,
sondern die angegebenen Daten müssen in die Datenbank übernommen werden. In der
Tabelle PLZ werden noch Längengrad und Breitengrad der Orte gespeichert. Mit diesen
Informationen wird mittels Pythagoras die Entfernung zwischen zwei Orten ermittelt, aus
der dann die Fahrtkosten errechnet werden. Da diese Entfernung nur die Luftlinie darstellt,
kann sie natürlich nicht ganz übereinstimmen. Aus diesem Grund wird die ermittelte
Luftlinie mit dem Faktor 1.2 multipliziert, um auf eine reale Straßenentfernung zu kommen.
42
KAPITEL 6. DIE DATENBANK VON RENT@TRAINER
Abbildung 6.1: Datenbankstruktur
43
KAPITEL 6. DIE DATENBANK VON RENT@TRAINER
44
Leider war es zur Entwicklungszeit nicht möglich, einen Routenplaner zu organisieren, der
über ein API, die wirkliche Entfernung zwischen zwei Orten einer anderen Applikation
zur Verfügung stellt. Alle erhältlichen Routenplaner verlangen eine händische Eingabe der
Orte.
6.1.2
Tabelle COURSEBEGINTIME
Das Primärschlüsselfeld gibt hier die Zeit in Minuten an. Dieses Format wurde deshalb
verwendet, um im Integer Bereich bleiben zu können. Ein Datumsfeld wird ja intern von
der Datenbank als FLOAT Typ gespeichert. Diese Tabelle wird benötigt um die Kursbeginnzeiten für den Kunden einzuschränken. Würde man hier dem Kunden freie Hand
lassen, so wäre im Allgemeinen nicht möglich, für einen Trainer zwei Halbtageskurse an
einem Tag zu halten. Bucht der Kunde zum Beispiel um 11:00 Uhr einen 4-Stunden Kurs,
so geht sich weder davor noch danach ein Kurs für denTrainer aus. Aus diesem Grund bietet man dem Kunden nur bestimmte Beginnzeiten an. Aus ähnlichem Grund wie bei den
Beginnzeiten von Kursen möchte man nur definierte Dauern von Kursen anbieten (4h , 1
Tag oder 2 Tage, etc.). Alle möglichen Dauern von Kursen werden in der Tabelle COURSEDURATION gespeichert. Auch die Tabelle COURSEDURATION besitzt ein spezielles
Primärschlüsselfeld. Dieses ist wie folgt definiert.
Coursedurationid := Anzahl Tage * 100 + Anzahl Stunden/Tag. Anzahl Tage := coursedurationid div 100 Anzahl Stunden := coursedurationid mod 100
Es liegt in der Verantwortung des Administrators hier sinnvolle Werte einzutragen. Es
wird hier seitens der Datenbank keine Plausibiltätskontrolle durchgeführt. Dies ist insofern
zu beachten, als dass ein fehlerhaftes Schlüsselfeld nicht visualisiert wird. Das bedeutet,
dass das Programm hier einfach falsch rechnet.
Als eigenständigen Teil muss man auch die Login Tabellen betrachten. Diese haben mit
der eigentlichen Verwaltung der Trainer und Kunden nichts zu tun. Sie dienen lediglich
dem Web Interface als Informationen über die Zugriffsberechtigungen der User.
Die Login Tabellen lauten wie folg:
• LOGIN
• LOGINGROUP
• LOGINHRMAPPING
• LOGINCUSTOMERMAPPING
• LOG
KAPITEL 6. DIE DATENBANK VON RENT@TRAINER
45
Die Tabelle LOGIN enthält die eigentlichen Zugangsdaten. Die Tabelle LOGINGROUP
speichert lediglich die verschiedenen Benutzergruppen, die auf das System Zugriff haben.
In der derzeitigen Implementierung sind dies nur “Trainer” und “Kunde”. Zu beachten
ist, dass die ID Werte der Zeilen “Trainer” und “Kunde” in der Tabelle LOGINGROUP
vom System reserviert sind. “Trainer” wird eine 1 zugeordnet; “Kunde” eine 2. Diese ID
Werte werden vom Web Server dazu verwendet, um schnell unterscheiden zu können, ob
ein gerade eingeloggter User ein Kunde oder ein Trainer ist. Die Tabelle LOG zeichnet
alle Logins auf. Mit dieser Tabelle ist es später möglich, eine statistische Auswertung des
Userverhaltens vorzunehmen.
Kapitel 7
System Requirements
7.1
Hardware
• Intel Pentium PC oder kompatibel.
• 64 MB Ram (Generell gilt je mehr Speicher, desto besser. Empfohlen werden min.
128 MB)
• 1 GB Festplatte
Die Datenbank, die COM Objekte, und die HTML Templates nehmen zusammen ca.
10 MB Festplattenspeicher in Anspruch. Sollte die Datenbank schnell wachsen, so ist hier
generell mehr Speicherplatz gefordert.
7.2
Software Requirements
• Microsoft Windows NT 4.0 + Service Pack3 mit Microsoft Option Pack 4.0 (IIS 4.0)
Alternativ dazu kann auch Microsoft Windows 2000 verwendet werden.
• Microsoft SQL Server 7.0 oder die dazu kompatible MSDE.
46
Kapitel 8
Installation von rent@trainer
Bevor mit der eigentlichen Installation begonnen werden kann, muss gewährleistet sein,
dass obige Systemvoraussetzungen erfüllt sind.
1. Das selbstentpackende Archiv hrsetup.exe ausführen. Als Zielordner wird der Ordner
angegeben, der später auch als Web Verzeichnis fungieren soll.
2. Die entpackte Datei “humanresource.adp” mit MS Access 2000 starten. Dann die
MSDE Datenbank wiederherstellen [MSACC1]. Die Datei der Sicherungskopie heißt
“humanresource.dat”.
3. In der Microsoft Management Console (MMC) ist ein neues Packages zu erstellen. Die
MMC ermöglicht dabei den Import bereits bestehender Packages. Beim Importieren
muss das Exportfile hr.PAK angegeben werden, welches ebenfalls entpackt wurde.
4. Schließlich sind noch alle entsprechenden Zugriffsrechte für die Verzeichnisse zu setzen, damit die Anwendung ihren Dienst aufnehmen kann.
5. Der Web folder, in den man alle ASP Files kopiert hat, muss als Applikation definiert
werden. Dies geschieht ebenfalls in der MMC.
6. Zum Schluss müssen noch alle Parameter für die Anwendung gesetzt werden. Dazu
wird auf die Kapitel Datenbankstruktur und Businesslogik verwiesen.
47
Kapitel 9
Bedienung der Web Site
9.1
Allgemein
Die Web Site gliedert sich in drei Abschnitte “Public Area” (Abbildung 9.1), “Trainer Area”
(Abbildung 9.2) und “Customer Area” (Abbildung 9.3). Die Public Area verschafft einen
groben Überblick über die Möglichkeiten und Angebote von rentatrainer. Die Trainer Area
bietet spezifische Funktionen für die Trainer an. Die Customer Area bietet dem Kunden
die Möglichkeit, die Angebote von rentatrainer auch interaktiv zu nutzen.
Die Navigation innerhalb der Site findet durchgehend am linken Bildschirmrand statt.
Diese Bedienung wird konsistent in allen Areas eingehalten. Die verschiedenen Areas unterscheiden sich erkennbar in der Farbe der Navigationsleiste. Die Public Area ist durchgehend
in Blautönen gehalten, die Trainer Area in Rot- und die Customer Area in Gelbtönen. Dies
soll dem User eine intuitive Navigation ermöglichen.
9.2
Public Area
Die Public Area dient als zentrale Informationsstelle für rentatrainer. Hier findet man
allgemeine Informationen zu rentatrainer. Außerdem wird man über Bedingungen und
etwaige Einschränkungen dieses Dienstes informiert. Außerdem war von der Firma SILVA
geplant ständig akutelle News auf der Startseite zu präsentieren.
Um das Angebot von rentatrainer nutzen zu können, ist eine einmalige Registrierung
in die Datenbank notwendig. Dies gilt sowohl für Trainer als auch für Kunden. Die Registrierung soll in beiden Fällen kostenlos sein. Für Trainer ist eine Registrierung sowieso
selbstverständlich. Von Kunden wird eine Registrierung gefordert, damit eine Überprüfung
der Identität vorgenommen werden kann. Da ein Kunde direkt Trainer buchen kann und
diese Trainer damit für den gewählten Termin für andere Kunden nicht verfügbar sind,
48
KAPITEL 9. BEDIENUNG DER WEB SITE
Abbildung 9.1: Public Area
49
KAPITEL 9. BEDIENUNG DER WEB SITE
Abbildung 9.2: Trainer Area
50
KAPITEL 9. BEDIENUNG DER WEB SITE
Abbildung 9.3: Trainer Area
51
KAPITEL 9. BEDIENUNG DER WEB SITE
52
Abbildung 9.4: Startseite
muss ein Missbrauch des Dienstes weitgehend verhindert werden.
Da der Einsatzzweck von rentatrainer kurzfristig gebuchte Schulungen sind, soll davon
abgesehen werden, im Buchungsvorgang selbst eine Identitätsüberprüfung einzubauen. Eine derartige Überprüfung würde den Buchungsvorgang ausbremsen, was der prompten
Erledigung von Buchungen widersprechen würde.
Zur Registrierung stehen zwei Buttons zur Verfügung. Einer für Trainer, sowie einer für
Kunden. Das Registrieren erschöpft sich im Ausfüllen eines Formulars. Bei erfolgter Registrierung erhält der User seine Zugangsdaten direkt per e-mail zugesandt. Die Korrektheit
der e-mail Adresse genügt also in der derzeitigen Implementierung für die Überprüfung der
Identität. Sollen weitere Überprüfungen stattfinden, so sind diese manuell von rentatrainer
durchzuführen. Registriert sich ein Trainer, so erhält dieser zwar Zugang zu der Trainer
Area, kann jedoch a priori noch nicht gebucht werden. Seine Kurswünsche müssen erst vom
Personalchef verifiziert werden. Dieser erhält bei jeder Änderung von Kurswünschen eine
e-mail, sodass er die Änderungen verfolgen kann. Trägt ein Trainer einen Kurswunsch ein,
so wird das Feld Knowledgefaktor in der Tabelle ABILITY standardmäßig auf 0 gesetzt.
Der Personalchef muss, damit der Trainer auch gebucht werden kann, diesen Wert auf
einen Wert größer als MinKnowledgefactor einstellen (Minknowledgefactor wird im Script
Offer.asp eingestellt).
KAPITEL 9. BEDIENUNG DER WEB SITE
Abbildung 9.5: Kunden Registrierung
Abbildung 9.6: Trainer Registrierung
53
KAPITEL 9. BEDIENUNG DER WEB SITE
54
Nach erfolgter Registrierung kann sich der User nach Erhalt der Zugangsdaten per email einloggen. Zu diesem Zweck stehen zwei Buttons zur Verfügung: Ein Login - Button
für die Trainer Area, der zweiter für die Customer Area. Diese Aufteilung hat lediglich
optischen Charakter. Man kommt von jedem Login- Dialog mit den entsprechenden Zugangsdaten zu beiden Areas.
Abbildung 9.7: Buchungsformular
Um zu verhindern, dass sich ein User zweimal registriert, kann sich ein User pro Sitzung
nur einmal registrieren. Eine erneute Registrierung ist nur dann möglich, wenn der Internet
Browser beendet und wieder gestartet wird. Durch diese Maßnahme wird auch verhindert,
dass durch ein Reload einer Seite eine erneute Registrierung vorgenommen wird. Es wurde
vereinbart, dass aus Sicherheitsgründen bereits existente Namen nicht abgewiesen werden. Dies würde Dritten die Möglichkeit bieten, zu erfahren, wer bei rentatrainer bereits
registriert ist.
9.3
Trainer Area
Gibt man gültige Login Daten eines Trainers ein, so gelangt man zur Startseite für Trainer.
Auf dieser Seite sieht der Trainer alle Buchungen, für die er eingeteilt ist. Von dieser
Seite aus kommt der Trainer auf verschiedene weitere Seiten, auf denen er verschiedene
KAPITEL 9. BEDIENUNG DER WEB SITE
55
Einstellungen treffen kann.
9.3.1
Ändern der persönlichen Daten
Ändert sich zum Beispiel die Anschrift des Trainers, so kann er über diese Seite seine Daten
ändern. Die Daten werden nach erfolgter Bestätigung sofort in die Datenbank übernommen. D.h. der Trainer trägt die volle Verantwortung über seine Eingaben. Diese sollten
daher stehts überprüft werden.
9.3.2
Eintragen von Kurswünschen
Auf dieser Seite kann der Trainer alle Kurse und Sprachen eintragen, die er unterrichten
will. Wie eingangs erwähnt, sollen sich komplexere Fähigkeiten aus mehreren Fähigkeiten
zusammensetzen. Bei Rent@trainer sind dies Fachkenntnisse über den zu unterrichtenden
Stoff und die Kenntnis der Sprachen.
Aber genau rent@trainer stellt eine Ausnahme dar. Da alle Trainer aus dem deutschsprachigen Raum kommen, werden vollkommen perfekte Sprachkenntnisse nicht angenommen. Vielmehr verlangen Kurse im IT Bereich spezielles Fachvokabular, dass für jeden Kurs
variieren kann. Aus diesem Grund genügt es nicht, einfach “Englisch” anzukreuzen, damit
man alle Kurse in Englisch halten kann. Es muss differentiert für alle Kurse angegeben
werden, in welcher Sprache man diesen halten kann.
Diese Vorgehensweise erhöht zwar den Tippaufwand für den Trainer, aber die Auswahl
des Trainers kann viel spezifischer erfolgen.
9.3.3
Online Kalender
Um die Verfügbarkeit verwalten zu können, müssen die Trainer ihre Verfügbarkeit erst
eintragen. Dies geschieht mit einem Online Kalender.
• Die Verfügbarkeit stellt sich durch einen dunkelblauen Bereich in der Wochenansicht
dar.
• Gebuchte Bereiche werden hellblau dargestellt.
• Andere Termine werden grün dargestellt.
Der Kalender ist jedoch nur prototypenhaft implementiert. Bis zum Zeitpunkt der
Fertigstellung konnte er leider noch nicht von der Firma SILVA evaluiert werden. Es wurde
daraufhin verzichtet, die Entwicklung in diesem Bereich fortzusetzen.
KAPITEL 9. BEDIENUNG DER WEB SITE
56
Abbildung 9.8: Trainer Kalender
Das Software Design des Kalenders ist aber so allgemein gehalten, dass eine Erweiterung des Kalenders leicht vorgenommen werden kann. Eine Monatsansicht wäre zum
Beispiel sehr wünschenswert.
Modifikationen, die das Layout des Kalenders betreffen, können durch Änderung der
ASP Scripts vorgenommen werden.
9.4
Customer Area
Der Kunde kann seine persönlichen Daten ändern, Kursinformationen abfragen und natürlich Kurse buchen.
Nachdem ein Kunde gültige Zugangsdaten eingegeben hat, gelangt er zu seiner Startseite. Hier sieht er alle abgeschlossenen gebuchten Kurse. Der Kunde kann dann diese
Kurse mittels einem Online Feedback Formular evaluieren. Dieses Feedback fliesst dann
direkt in zukünftige Auswahlen von Trainern ein.
9.4.1
Feedback Formular
Das Feedback, das der Kunde einzugeben hat, beinhaltet folgende Felder:
KAPITEL 9. BEDIENUNG DER WEB SITE
57
• Erwartungen
• Nutzen
• Inhalt
• Dauer
• Tempo
• Vorkenntnisse
• Unterlagen
• Gesamtnote
Diese Felder wurden von der Fa. SILVA G.m.b.H vorgegeben.
Die Eintragungen sind im Schulnotensystem einzugeben (“Sehr Gut” bis “Nicht Genügend”). Intern werden die Noten umgerechnet in Werte zwischen 0 (Nicht Genügend) und
1 (Sehr Gut).
9.4.2
Kursinfos
Der Kunde kann in einer eigenen Seite die Details aller angebotenen Kurse abfragen. Die
Details sind in dieser Implementierung als Hyperlink ausgeführt. D.h. Es obligt dem Systadministrator vor Ort die Links auf eine externe Site zu setzen, um hier die Informationen
anzeigen zu lassen.
Momentan wurde das Kursportfolio der Fa. SILVA G.m.b.h, welches in Microsoft Powerpoint vorlag, in JPEG Bilder convertiert und die Links auf die Bilder gesetzt.
Diese Vorgangsweise ist sicher nicht optimal, sie soll hier aber nur die Möglichkeiten
aufzeigen und als Prototyp dienen.
9.4.3
Die Buchung
Die Buchung erfolgt in mehreren Schritten. Zuerst muss das Buchungsformular (Abbildung
9.10) ausgefüllt werden. Es ist möglich, hier einen eigenen Ansprechpartner anzugeben, der
auf Kundenseite für die Abwicklung dieses Kurses verantwortlich ist. Standardmäßig wird
der eingeloggte User als Kontaktperson angenommen. Falls die Kontaktperson geändert
wird, ist auf eine korrekte e-mail Adresse zu achten, damit der geänderte User auch die
notwendigen Nachrichten vom System erhält.
Nach der Eingabe der Daten versucht der Server mit den zuvor beschriebenen Algorithmen, Vorschläge für Kurstermine zu finden. Diese Vorschläge werden dem User als
Antwort auf die Eingabe des Buchungsformulars präsentiert. Aus diesen Vorschlägen kann
KAPITEL 9. BEDIENUNG DER WEB SITE
Abbildung 9.9: Kursportfolio: Beispiel MS Visual Basic
Abbildung 9.10: Buchungsformular
58
KAPITEL 9. BEDIENUNG DER WEB SITE
59
der User nun einen auswählen. Bevor die Buchung nun wirksam wird, muss der User noch
auf einer Bestätigungsseite seine Eingaben kontrollieren.
Erst wenn der Kunde diese Seite bestätigt hat, wird die Anfrage im System als Buchung
gespeichert. Die entsprechenden Trainer werden daraufhin sofort mittels e-mail und SMS
verständigt.
Die SMS an die Trainer enthält nur die Nachricht, dass dieser gebucht ist. Genauere
Daten stehen in der übermittelten e-mail. Außerdem sieht der Trainer die Buchung in
seinem Online Termin Kalender.
Sollte der Kunde die Buchung abbrechen so bleibt trotzdem die Anfrage gespeichert.
Die Ausertung der Anfragen über einen gewissen Zeitraum hinweg, soll dann Rückschlüsse
auf das Kundenverhalten liefern.
Kapitel 10
Ausblick
10.1
Katastrophendienste
10.1.1
Allgemein
Hilfsorganisationen wie das rote Kreuz oder die österreichische Bergrettung haben ebenso
wie eine Schulungsfirma freie Mitarbeiter. Die Verwaltung dieses Personals wird momentan
noch manuell über das Telefon durchgeführt. Im folgenden Abschnitt soll nun diskutiert
werden, inwieweit ein Automatisierung in diesen Bereichen Sinn macht. Welche Vorteile
bietet eine automatische Personalverwaltung und kann diese über das Internet durchgeführt werden. Welche Vorteile bieten die klassischen, momentan eingesetzten, Verfahren
gegenüber neuen Modellen? Gibt es Möglichkeiten durch Hybridsysteme die Vorteile beider
Lager zu verbinden?
10.1.2
Bergrettung
Der Einsatzplan für die Verständigung der Retter ist bei der Bergrettung Österreichs eine
sogenannte Alarmierungskette. Wählt man die Nummer 144 gelangt man zur Zentrale des
österreichischen Bergrettungsdienstes (OEBRD). Ein Mitarbeiter in der Telefonzentrale
nimmt die Daten des Anrufers auf und alarmiert die zuständige Ortsgruppe. Der OEBRD
ist in Ortsgruppen eingeteilt, welche jeweils ein bestimmtes Gebiet abdecken. Das Alarmieren der Ortsgruppe funktioniert durch Alarmierung des dortigen Einsatzleiters bzw. einen
seiner Stellvertreter. Sobald einer der Einsatzleiter erreicht ist, liegt die weitere Planung
des Einsatzes in seiner Verantwortung. Für die Organisation des weiteren Einsatzes gibt es
zwei mögliche Szenarien. Der Einsatzleiter weiß, dass eine oder mehrere Personen in einem
mehr oder weniger großem Gebiet vermisst sind. Bei der Suche von Vermissten gilt die
Regel, je mehr Einsatzkräfte zur Verfügung stehen, desto besser. Der weitere Alarmierungs-
60
KAPITEL 10. AUSBLICK
61
plan sieht dann vor, dass der Einsatzleiter den nächsten in der Alarmierungsliste anruft.
Sollte dieser nicht erreichbar sein, so muss er versuchen, den nächsten zu erreichen. Diese
Prozedur ist solange durchzuführen, bis er wirklich eine Kraft erreicht hat. Dieser wird
nun Ort und Zeitpunkt des Treffpunktes bekanntgegeben. Nun liegt es an dieser Einsatzkraft den nächsten Retter zu alarmieren. Nach Beendigung der Alarmierung sind nun alle
möglichen, momentan verfügbaren Einsatzkräfte alarmiert. Als Erweiterung dieser Kette,
deren Durchführung sehr zeitaufwendig wäre, hat sich eingebürgert, auf Ortsgruppenebene drei parallel laufende Ketten zu haben. Der Einsatzleiter ruft in diesem Fall nicht nur
einen, sondern drei weitere Bergretter an. Diese rufen dann den nächsten in ihrer Kette
an. Die Alarmierungszeit wird dadurch auf ein Drittel reduziert. Wird die Bergrettung
über einen Unfall informiert, wo der Aufenthaltsort der Verunglückten bekannt ist, wo es
darum geht den oder die Vermissten zu bergen, so werden anderer Prioritäten gesetzt. Es
ist nicht mehr die Quantität der Retter entscheiden, sondern es werden für die Einsäte
spezifische Fähigkeiten gefordert. Muss ein Kletterer aus einer Wand geborgen werden, so
sind andere Kenntnisse erforderlich, als bei einem alpinen Rettungseinsatz im Winter. Bei
einem eingehenden Notruf verständigt die Zentrale nun den Einsatzleiter. Dieser hat nun
die Aufgabe den Einsatz derart zu koordinieren, dass er auswählt, welche Rettungskraft
und welches Gerät benötigt wird. In diesem Fall ist es nicht mehr möglich, drei parallele
Alarmierungsketten aufzubauen, da ansonsten die gesamten Einsatzinformationen an den
jeweils nächsten weitergegeben werden müssten, damit dieser weiß, wen er in der Folge
weiter informieren muss. Hier erfolgt die Alarmierung sequentiell. Das bedeutet, dass die
Dauer der Alarmierung länger dauern kann. Gerade bei einer Bergung kann verlorene oder
gewonnene Zeit Leben entscheiden. In jüngster Zeit werden in der Bergrettung Österreich
Pager eingesetzt. Bei einer Vermisstensuche kontaktiert die Zentrale direkt alle Retter.
Diese bestätigen den Empfang der eingehenden Message auf dem Pager mit einem Rückruf bei dem Einsatzleiter. Sollte die Anzahl der Rückrufe jedoch nicht genügend hoch sein,
so wird auf die konventionelle Telefonkette zurückgegriffen. Beim Bergungsszenario bekommt wieder der Einsatzleiter die Meldung von der Zentrale. Dieser wählt nun anhand
der geforderten Fähigkeiten, die entsprechenden Pagernummern seiner Leute an.
Bei den Recherchen unterstützt wurde ich vom Obmann der Bergrettung “Sektion
Gesäuse” Hans Peter scheb.
10.2
Interne Personalbeurteilung
Es ist aber nicht nur vorstellbar, dass Feedback von außen über die Qualität von Personal
bestimmt. Der Algorithmus für das Bilden des Trainerrankings kann auch dazu verwendet
werden, interne Beurteilungen zu verwalten. In einer Firma wird typischerweise vermerkt,
KAPITEL 10. AUSBLICK
62
welcher Arbeiter welchen Arbeitsschritt wann gemacht hat bzw. wie lange er dafür gebracht hat. Wenn man also sowieso die Arbeit protokolliert, dann ist es nur mehr ein
kleiner Schritt, diese Arbeit zu beurteilen. Bei rent@trainer wird das Feedback vom Kunden eingegeben und mit der entsprechenden Bestellung verknüpft. Verknüpft man nun das
Feedback mit einer internen Auftragsnummer oder besser direkt mit einem Arbeitsschritt,
so hat ein Verantwortlicher (z.B. Personalchef) die Möglichkeit, Arbeitsvorgänge genau
zu protokollieren und zu beurteilen. In der Folge kann man dann, bei ähnlich gelagerten
Aufträgen die ideale Arbeitskraft aus der Belegschaft extrahieren und so die Effektivität
erhöhen, was die Produktionskosten senken hilft. Wichtig für eine interne Personalbeurteilung ist aber, genauso wie für das Trainerbeurteilungssystem, dass die Bewertungen auch
der Realität entsprechen. Das heißt, dass
10.2.1
Notwendige Änderungen
Um so ein internes Beurteilungssystem mit bei ev. fixer Belegschaft einzusetzen, sind aber
noch einige Designänderungen vorzunehmen. Rent@trainer fordert in Anforderungsprofil
der Software, dass immer der bestmögliche Trainer ausgewählt wird. Sollte dieser bestmögliche Trainer erst Wochen nach einem anderen Trainer Zeit haben, so wird trotzdem
ein Angebot mit diesem Trainer erstellt, so lange der Termin innerhalb der eingestellten
Zeit ist (Property Booking.MaxSearchIntervall) ist. Erst wenn innerhalb dieses Zeitraumes
kein Angebot mehr möglich ist, wird zum nächstbesten Trainer gegriffen. Bei dem eben
beschriebenen internen Betriebsszenario sind die Prioritäten anders gesetzt. Hier wird gefordert, dass ein Arbeitsschritt umgehend erledigt wird. Es ist lediglich wichtig, dass der
Arbeiter die notwendigen Kenntnisse erfüllt (Property booking.minranking). Aus allen Arbeitern, die diese Anforderung erfüllen, wird nun der ausgewählt, der ehest möglich Zeit
hat.
“Zeit haben” bedeutet in diesem Fall, mit keiner anderen Arbeit beschäftigt sein. Standardmäßig hat ein Arbeiter innerhalb seiner Schicht immer Zeit, bis er eine Arbeit angefangen hat. Bei Beendigung derselben wird er wieder verfügbar. Um eine nahtlose Aneinanderreihung von Arbeiten für einen Arbeiter zu gewährleisten, muss man wissen, wie
lange die angefangene Arbeit voraussichtlich dauern wird. Erst dann ist es möglich, die
Verfügbarkeit der Arbeitskraft im vornhinein abzuschätzen. Die Information über die Dauer des Arbeitsschrittes kann hier aus bereits erledigten, protokollierten Arbeiten gewonnen
werden oder durch einfaches Abschätzen der Arbeitsdauer seitens des Verantwortlichen der
Fertigung.
Anhang A
Tabellen
LOGIN
• LOGINID ID Wert. Vom System automatisch generiert
• PASSWORD Das Passwort: Zusammen mit Loginid die Zugangsdaten.
• CREATION Datum der Erzeugung dieses Datensatzes
• LOGINGROUPID Fremdschlüssel LOGINGROUP.LOGINGROUPID
• VALIDBY Datumsfeld, bis wann der Account gilt. Wird das Datum überschritten,
so wird der Zugang für den User gesperrt. Um einen User explizit zu sperren, so
erreicht man dies durch setzen von VALIDBY auf ein vergangenes Datum. Dadurch
wird der User umgehend gesperrt
LOGINGROUP
• LOGINGROUPID ID Wert. Vom User zu vergeben. Da dies der Primärschlüssel der
Tabelle ist, muss der Administrator auf Eindeutigkeit achten. Da die Anzahl der
Datensätze aber sehr begrenzt ist (in der aktuellen Implementierung lediglich zwei),
dürfte dies aber kein Problem darstellen.
• Caption Die Bezeichnung der Benutzergruppe
LOGINCUSTOMERMAPPING
• loginid Fremdschlüssel LOGIN.LOGINID
• Customerid Fremdschlüssel CUSTOMER.CUSTOMERID
63
ANHANG A. TABELLEN
64
LOGINHRMAPPING
• Loginid Fremdschlüssel LOGIN.LOGINID
• humanresourceid Fremdschlüssel HUMANRESOURCE.humanresourceid
HUMANRESOURCE
• humanresourceid Primärschlüssel (Autowert)
• Firstname Vorname
• Lastname Nachname
• Title Titel
• Male Gibt an, ob Kunde (Kontaktperson) männlich ist oder nicht. Dies wirkt sich
auf die Anrede aus; “Herr” oder “Frau” sind hier möglich.
• Address Das Straßenfeld
• Plzid Die Postleitzahl des Wohnortes. Fremdschlüssel PLZ.PLZID. Hier wird aber
keine referentielle Integrität gefordert. Falls ein Postleitzahl eingetragen wurde, die
noch nicht existiert, muss das System darauf reagieren und darf den Trainer nicht
einfach abweisen. Genauere Beschreibung Siehe Tabelle PLZ
• Stateid Fremdschlüssel STATE.stateid
• Place Der Wohnort des Trainers
• Maxteachdistance Die maximale Distanz des Trainers, die er unterrichten will. Sollte
der Unterrichtsort weiter entfernt sein, so wird dieser Trainer ausgefiltert.
• Telephone1
• Telephone2
• Mobiletelephone
• Email
• Birth Geburtsdatum
• fax
• Skills Besondere Fähigkeiten, Ausbildung
• Jobs Erfahrungen, die der Trainer mitbringt
ANHANG A. TABELLEN
65
• interests Interessen des Trainers
• Firm Die Firma des Trainers, falls er bei einer anderen Firma beschäftigt ist, und
hier als Selbständiger auftritt.
• kmcost Die Fahrtkosten. Dies sind die Kosten, die der Firma SILVA pro gefahrenen
Kilometer des Trainers entstehen.
CALENDAR
• Calendarid Primärschlüssel (Autowert)
• Humanresourceid Fremdschlüssel HUMANRESOURCE.humanresourceid
• Starttime DatumsZeitfeld mit der Startzeit dieses Eintrags
• Endtime DatumsZeitfeld mit der Endzeit dieses Eintrags
• Calendarcategorieid Fremdschlüssel
CALENDARCATEGORIE.CALENDARCATEGORIEID
• Note Zusätzliche Bemerkung
• Title Titel des Eintrages
CALENDARCATEGORIE
• Calendarcategorieid Primärschlüssel (Autowert)
• caption Bezeichnung der Kategorie
ABILITY
• Humanresourceid Fremdschlüssel HUMANRESOURCE.humanresourceid
• Courseid Fremdschlüssel COURSE.courseid
• Languageid Fremdschlüssel LANGUAGE.languageid
• Knowledgefaktor Bewertung der Fähigkeit des Trainers (0.0 - 1.0)
LANGUAGE
• Languageid Primärschlüssel (Autowert)
• caption Bezeichnung der Sprache
ANHANG A. TABELLEN
66
COURSE
• Courseid Primärschlüssel (Autowert)
• Caption Bezeichnung des Kurses Informationlink Link zu einer HTML Seite, die
genauere Angaben über diesen Kurs enthält.
• Coursedurationid Fremdschlüssel COURSEDURATION.coursedurationid
• Priceperhour Preis dieses Kurses für eine Stunde
• Literaturprice Preis für eine Unterlage zu diesem Kurs
• available Wird dieses Flag gelöscht, so wird dieser Kurs nicht mehr im UI angezeigt.
COURSECATEGORIE
• Coursecategorieid Primärschlüssel (Autowert)
• caption Bezeichnung der Kategorie
COURSEDURATION
• Coursedurationid Primärschlüssel. Muss vom Administrator manuell eingetragen
werden. Dabei wird dieser Integerwert von der Software wie folg interpretiert:
Tage := coursedurationid div 100 \\
Stunden := coursedurationid mod 100\\
Ein Wert von 108 bedeutet also, daß der Kurs an einem Tag zu acht Stunden gehalten
wird
• Caption Bezeichnung der Kategorie
QUERY
• Queryid Primärschlüssel (Autowert)
• Customerid Fremdschlüssel CUSTOMER.customerid
• Contact Vorname und Nachname der Kontaktperson für diesen Kurs
• Email e-mail Adresse der Kontaktperson
• Telephone Telephonnummer der Kontaktperson
ANHANG A. TABELLEN
67
• courseid Fremdschlüssel COURSE.courseid
• Languageid Fremdschlüssel LANGUAGE.languageid
• Duration Fremdschlüssel COURSEDURATION.Coursedurationid (jedoch ohne referentielle Integrität)
• Wantedstart Datum, welches der Kunde im Online Formular eingetragen hat.
• Plzid Fremdschlüssel PLZ.plzid
• Address
• Place
• Stateid Fremdschlüssel STATE.stateid
• Literaturecount Anzahl der geforderten Unterlagen
• traineecount Anzahl der geforderten Trainer
• querytime Datum der Anfrage
STATE
• Stateid Primärschlüssel (Autowert)
• Caption Bezeichng des Staates
OFFER
• Offerid Primärschlüssel (Autowert)
• Queryid Fremdschlüssel QUERY.queryid
• Price Kurspreis
• Literatureprice Unterlagenpreis
• Offertime Datum der Anbotslegung
• Valid Gibt an, ob das Angebot noch gültig ist.
• Drivingprice Kosten für die Anreise des/der Trainer
ANHANG A. TABELLEN
HROFFER
• Hrofferid Primärschlüssel (Autowert)
• Offerid Fremdschlüssel offer.offerid
• Humanresourceid Fremdschlüssel HUMANRESOURCE.humanresourceid
• Payment Ausgaben für den Trainer
• drivingpayment Ausgaben für die Anreise des Trainers
OFFERTIMES
• Offertimesid Primärschlüssel (Autowert)
• Offerid Fremdschlüssel offer.offerid
• Offerstart Datums/Zeitfeld mit dem Start des Trainingstages
• offerend Datums/Zeitfeld mit dem Ende des Trainingstages
ORDERING
• Orderid Primärschlüssel (Autowert)
• Offerid Fremdschlüssel offer.offerid
• Ordertime Datum der Bestellung
FEEDBACK
• Feedbackid Primärschlüssel (Autowert)
• Offerid Fremdschlüssel offer.offerid
• Erwartungen
• Nutzen
• Inhalt
• Dauer
• Tempo
• Vorkenntnisse
• Unterlagen
• Gesamtnote
• Feedbacktime
68
ANHANG A. TABELLEN
69
TRAINERFEEDBACK
• trainerfeedbackid Primärschlüssel (Autowert)
• feedbackid Fremdschlüssel FEEDBACK.feDie Datenbankstruktur:
PLZ
• Plzid Primärschlüssel (Die Postleitzahl selber)
• Caption Bezeichnung des Ortes
• Latitude Breitengrad
• longitude Längengrad
COURSEBEGINTIME
• Coursebegintimeid Primärschlüssel. Dieser Wert muss vom Administrator manuell
eingegeben werden. Er gibt die Zeit in Minuten an. Ein Wert von 450 bedeutet 7:30,
300 eben 5:00 Uhr
• caption Die Zeit im Klartext
FIRMBRANCH
• Firmbranchid Primäschlüssel (Autowert)
• Caption Der Name der Branche
NOTICE
• Noticeid Primäschlüssel (Autowert)
• caption Bezeichnung
CUSTOMER
• customerid Primärschlüssel (Autowert)
• Firstname Vorname
• Lastname Nachname
• Title Titel
• Male Gibt an, ob Kunde (Kontaktperson) männlich ist oder nicht. Dies wirkt sich
auf die Anrede aus; “Herr” oder “Frau” sind hier möglich.
ANHANG A. TABELLEN
70
• Firmname
• Firmbranchid Fremdschlüssel FIRMBRANCH.firmbranchid
• Address
• Place
• Plzid Fremdschlüssel PLZ.plzid
• Homepage
• Stateid Fremdschlüssel STATE.stateid
• Telephone1
• Mobiletelephone
• Fax
• Email
• Noticeid Fremdschlüssel NOTICE.noticeid wantinformation Flag, das angibt, ob der
Kunde weitere Informationen erhalten will.
Anhang B
Views in der Datenbank
bookedtrainer
S ELECT OFFER.offerid, HROFFER.humanresourceid,
OFFERTIMES.offerstart, OFFERTIMES.offerend,
HUMANRESOURCE.firstname, HUMANRESOURCE.lastname,
ORDERING.orderid, CUSTOMER.firmname, LANGUAGE.caption,
COURSE.caption AS ccaption, HUMANRESOURCE.email,
HUMANRESOURCE.mobiletelephone
FROM OFFERTIMES INNER JOIN
OFFER ON OFFERTIMES.offerid = OFFER.offerid INNER JOIN
HROFFER ON OFFER.offerid = HROFFER.offerid INNER JOIN
HUMANRESOURCE ON
HROFFER.humanresourceid = HUMANRESOURCE.humanresourceid
INNER JOIN
ORDERING ON
OFFER.offerid = ORDERING.offerid INNER JOIN
QUERY ON OFFER.queryid = QUERY.queryid INNER JOIN
COURSE ON
QUERY.courseid = COURSE.courseid INNER JOIN
LANGUAGE ON
QUERY.languageid = LANGUAGE.languageid INNER JOIN
CUSTOMER ON QUERY.customerid = CUSTOMER.customerid
customerlogin
S ELECT LOGIN.loginid AS Expr1, LOGIN.password AS Expr2,
71
ANHANG B. VIEWS IN DER DATENBANK
CUSTOMER.*
FROM LOGIN INNER JOIN
LOGINCUSTOMERMAPPING ON
LOGIN.loginid = LOGINCUSTOMERMAPPING.loginid INNER JOIN
CUSTOMER ON
LOGINCUSTOMERMAPPING.customerid = CUSTOMER.custome
humanresourcelogin
S ELECT LOGIN.loginid AS Expr1, LOGIN.password AS Expr2,
HUMANRESOURCE.*
FROM LOGIN INNER JOIN
LOGINHRMAPPING ON
LOGIN.loginid = LOGINHRMAPPING.loginid INNER JOIN
HUMANRESOURCE ON
LOGINHRMAPPING.humanresourceid = HUMANRESOURCE.humanresourceid
humanresourcelogin
S ELECT OFFER.drivingprice, OFFER.offertime,
OFFER.literatureprice, OFFER.price, OFFER.offerid,
QUERY.contact, QUERY.email, QUERY.telephone,
LANGUAGE.caption, COURSE.caption AS ccaption,
STATE.caption AS scaption, QUERY.place, QUERY.address,
QUERY.literaturecount, QUERY.traineecount,
QUERY.plzid
FROM QUERY INNER JOIN
OFFER ON QUERY.queryid = OFFER.queryid INNER JOIN
LANGUAGE ON
QUERY.languageid = LANGUAGE.languageid INNER JOIN
COURSE ON
QUERY.courseid = COURSE.courseid INNER JOIN
STATE ON QUERY.stateid = STATE.stateid
72
ANHANG B. VIEWS IN DER DATENBANK
pastcourses
S ELECT ORDERING.orderid, COURSE.caption,
LANGUAGE.caption AS lcaption, QUERY.place,
QUERY.customerid
FROM ORDERING INNER JOIN
OFFER ON ORDERING.offerid = OFFER.offerid INNER JOIN
OFFERTIMES ON
OFFER.offerid = OFFERTIMES.offerid INNER JOIN
QUERY ON OFFER.queryid = QUERY.queryid INNER JOIN
COURSE ON
QUERY.courseid = COURSE.courseid INNER JOIN
LANGUAGE ON
QUERY.languageid = LANGUAGE.languageid
WHERE (ORDERING.orderid NOT IN
(SELECT orderid
FROM feedback))
possibletrainer
S ELECT query1.courseid, query1.languageid, query1.qlong,
query1.qlat, (humanrersouce1.hlong - query1.qlong)
* (humanrersouce1.hlong - query1.qlong)
* 12100 + (humanrersouce1.hlat - query1.qlat)
* (humanrersouce1.hlat - query1.qlat) * 5776 AS distance,
humanrersouce1.kmcost * humanrersouce1.kmcost * ((humanrersouce1.hlong
- query1.qlong) * (humanrersouce1.hlong - query1.qlong)
* 12100 + (humanrersouce1.hlat - query1.qlat)
* (humanrersouce1.hlat - query1.qlat) * 5776)
* 5.76 AS drivingcosts, query1.queryid, query1.plzid,
humanrersouce1.humanresourceid,
humanrersouce1.mobiletelephone, humanrersouce1.email,
humanrersouce1.firstname, humanrersouce1.lastname,
humanrersouce1.title, humanrersouce1.male,
query1.knowledgefactor, humanrersouce1.kmcost
FROM humanrersouce1 INNER JOIN
query1 ON
73
ANHANG B. VIEWS IN DER DATENBANK
humanrersouce1.humanresourceid = query1.humanresourceid
rankingcalc
S ELECT TRAINERFEEDBACK.*, QUERY.customerid AS Expr1,
QUERY.courseid AS Expr2,
QUERY.languageid AS Expr3
FROM QUERY INNER JOIN
OFFER ON QUERY.queryid = OFFER.queryid INNER JOIN
ORDERING ON
OFFER.offerid = ORDERING.offerid INNER JOIN
TRAINERFEEDBACK ON
ORDERING.orderid = TRAINERFEEDBACK.orderingid
74
Anhang C
Der Algorithmus zur
Trainerauswahl
Zum besseren Verständnis ist hier die Implementierung der Funktion abgedruckt, die die
Berechnung des Rankings aus den vergangenen Feedbacks vornimmt.
function Tbooking.calculateRanking(humanresourceid: integer;
var defaulttrainerranking:double): double;
var
cmd:string;
weight:double;
totalweight:double;
sum:double;
reference : double;
ageweight : double;
defsum:double;
deftotweight : double;
begin
cmd := ’SELECT * FROM rankingcalc WHERE humanresourceid=’+
inttostr(humanresourceid);
defsum := 0;
deftotweight := 0;
sum:=0;
totalweight:=0;
with coRecordSet.Create do begin
Open(cmd,getConnection,adOpenDynamic,
75
ANHANG C. DER ALGORITHMUS ZUR TRAINERAUSWAHL
adlockoptimistic,adCmdText);
while not eof do begin
weight:=1;
ageweight:=exp(-\_feedbackageweight*
ln((now - fields[’feedbackdatum’].value)));
if fields[’customerid’].value <> \_customerid then begin
weight := weight * \_OtherFeedbackWeight;
end else begin // calculate DefaultTrainer;
defsum:=defsum+ageweight*fields[’gesamtnote’].value;
deftotweight := deftotweight+ ageweight;
end;
if (fields[’courseid’].value <> courseid) or
(fields[’languageid’].value <> \_languageid) then begin
weight := weight * \_feedbackothercoursesweight;
end;
weight := weight* ageweight;
sum := sum+weight*fields[’gesamtnote’].value;
totalweight:=totalweight+weight;
movenext;
end;
close;
end;
if deftotweight > 0 then begin
defaulttrainerranking := defsum / deftotweight;
end else begin
defaulttrainerranking := 0;
end;
if totalweight > 0 then begin
reference:=\_referenceweight *
(1/exp(\_feedbackageweight * ln(now
- \_referenceage)));
totalweight:=totalweight+reference;
sum := sum + reference*\_referencevalue;
result := (sum / totalweight);
end else
result := \_emptyranking;
76
ANHANG C. DER ALGORITHMUS ZUR TRAINERAUSWAHL
end;
77
Anhang D
Die Business Logik
D.1
Allgemein
Wie in den vorigen Kapiteln erwähnt, wird für die Implementierung von Rent@trainer ein
“Three Tier” Software Design genommen. Im folgenden werden die Interfaces der Business
Logik beschrieben. Diese stellen den Kern der Arbeit dar. Auch wenn man dem Kunden
kein Webinterface zur Verfügung stellen will, können diese Objekte dennoch für ein internes System genutzt werden. Durch die Verwendung von COM+ können diese Objekte ja
nicht nur von ASP sondern auch z.B. von einer VBA Applikation, wie Microsoft Excel,
angesprochen werden.
D.2
CAL.DLL (Interface: Calendar)
Das Calendar Objekt kapselt alle Tabellen des Online Calendars. Es stehen folgende Methoden zur Verfügung.
procedure addEntry(trainerid: Integer; betreff: WideString;
categorieid: Integer; starttime,
endtime: TDateTime; note: WideString)
Erstellt einen neuen Termin für den angegebenen Trainer. Der Parameter trainerid
ergibt sich aus dem eingeloggtem user. Dieser wird vom IIS in seinem Session Objekt
gespeichert. Mit
Trainerid := Session(userid)}
erhält man den aktuellen user aus dem ASP Script. Categorieid entspricht dem Schlüssel der Tabelle COURSECATEGORIE. Dabei zu beachten ist, dass zwei Werte reserviert
78
ANHANG D. DIE BUSINESS LOGIK
79
sind. 1: verfügbar 2: gebucht Die Methode getCBCalendarCategorieOptions() liefert für eine HTML Combobox alle Options Felder direkt aus der Datenbank. Starttime und endtime
sind absolute Datumswerte. In Note kann man einen Kommentar dem Termin hinzufügen.
Rückgabewert:
Der Primärschlüssel des neuen Kalendereintrages (CALENDAR.calendarid)
Beispiel:
set calobj = Server.CreateObject(‘‘hr.calendar’’)
calendarid = calobj.addEntry(Session(‘‘userid’’),
request.Form(‘‘betreff’’),
request.form(‘‘categorie’’),
starttime, endtime,
request.form(‘‘note’’))
Erzeugt einen neuen Kalendereintrag in der Datenbank.
procedure changeEntry(calendarid: Integer;
betreff: WideString;
categorieid: Integer;
starttime, endtime: TDateTime;
note: WideString)
Ändert einen Termineintrag in der Datenbank Categorieid entspricht dem Schlüssel der
Tabelle COURSECATEGORIE. Dabei zu beachten ist, dass zwei Werte reserviert sind. 1:
verfügbar 2: gebucht
Die Methode getCBCalendarCategorieOptions() liefert für eine HTML Combobox alle
Options felder direkt aus der Datenbank.
Starttime und endtime sind absolute Datumswerte. In Note kann man einen Kommentar dem Termin hinzufügen.
Beispiel:
Set calobj = Server.CreateObject (‘‘hr.calendar’’)
calobj.changeEntry (calendarid, request.Form (‘‘betreff’’),
request.form (‘‘categorie’’),
starttime,
endtime,
request.form(‘‘note’’) )
Ändert den mit calendarid angegebenen Eintrag mit den übergebenen Parametern.
procedure removeEntry(calendarid: Integer)
ANHANG D. DIE BUSINESS LOGIK
80
Entfernt einen Kalendereintrag
procedure loadcurrentMonth(currentdate: TDateTime;
trainerid: Integer)
loadCurrentMonth lädt alle Termineinträge des angegebenen Trainers für den angegebenen Monat in den Speicher des Objektes.
Im Detail wird ein 43*24 Array angelegt, das für 43 Tage für jede Stunde die passende Farbe für die Wochenansicht speichert. Die Farbe wird aus CALENDARCATEGORIE.color geholt. Mit der Methode getColor() kann dann die entsprechende Zelle schnell
ausgelesen werden. Die Arraygrenzen sind [-6..36, 0..23]. Das bedeutet es werden 6 Tage
des Vormonats und 6 Tage des Folgemonats mitgespeichert. Dies ist notwendig, falls in
der Wochenansicht des Onlineterminkalenders gerade ein Monatssprung stattfindet.
function getUpcomingEntriesList(trainerid: Integer): recordset
Liefert ein ADO Recordset mit allen zukünftigen Termineinträgen des angegebenen
Trainers zurück. Dieses Recordset kann dann innerhalb des ASP Scriptes weiterverwendet werden. Der Grund, warum hier ein Recordset zurückgeliefert wurde, wodurch ja die
Middle Tier umgangen wird, ist einfach: Einerseits soll dem ASP Script volle Kontrolle
über das Layout überlassen werden, anderseits ist es in diesem einfachen Fall nicht notwendig, eine künstliche Zwischenschicht zwischen dem ADO Recordset und dem ASP Script
einzuziehen.
function getCellColor(day, hour: Integer): Integer
Liefert die Farbe für die angegebenene, zuvor von loadCurrentMonth() geladende, Zelle
zurück. Diese Funktion liefert nur dann korrekte Werte, falls vor dem ersten Aufruf von
getCellColor() loadCurrenMonth() aufgerufen wurde.
function getCBCalendarCategorieOptions(
selected: Integer): WideString
Liefert alle möglichen Kalenderkategorien in einem String zurück. Dieser String ist
bereits vorformatiert, um in einem HTML Option field zum Einsatz zu kommen. Selected
gibt den Primärschlüssel des defaultmäßig ausgewählten Eintrages an. Ist selected = 0,
dann wird kein Eintrag ausgewählt. Beispiel : (Rückgabewert für selected=12):
<option value= ‘‘12’’ SELECTED>Gebucht<//option>
<option value= ‘‘13’’>Verfügbar<//option>
ANHANG D. DIE BUSINESS LOGIK
81
Es wird in diesem Beispiel ersichtlich, dass alle getCBxxx Methoden direkten HTML
code zurückliefern. Diese ist eine Ausnahme. Alle anderen Methoden liefern nur Rohdaten
zurück, die von einer upper Layer (ASP Scripts in dieser Implementierung) erst präsentiert
werden müssen.
function load(calendarid: Integer): Recordset
Liefert einen ADO Recordset, der nur den mit calendarid angegebenen Eintrag enthält,
zurück. Diese Funktion wird zum Editieren bereits vorhandener Einträge benötigt. Im
entsprechenden ASP Script werden die Form Elemente mit den hier zurückgegebenen
Werten aufgefüllt.
D.3
CUST.DLL (Interface: Customer)
Kapselt einen Kunden. Da der Umgang mit einem Kunden sich im Grunde auf Datenbankabfragen beschränkt, wurde das Objekt auch entsprechend einfach gehalten. Die notwendige Funktionalität bietet in diesem Fall ADO. Zusätzlich benötigte Hilfsfunktionen,
wie das Anzeigen eines Option Formobjektes mit Firmenbranchen, sind im Objekt Misc
hinterlegt.
function load(customerid: Integer): Recordset
Liefert einen ADO Recordset zurück, der den Kunden mit der angegebenen Customerid enthält. Die Customerid erhält man innerhalb des ASP Scriptes durch das Session
Objectes (Session(“userid”)). Mit dem zurückgelieferten Recordset kann man Kundendaten
verändern, sowie einen neuen Kunden anlegen.
procedure addMapping(loginid, customerid: Integer)
Registriert sich ein neuer Kunde, so erzeugt das security object die Zugangsdaten. Unter
Zuhilfenahme der Methode load() wird dann ein neuer Kunden angelegt. Die Methode
addMapping erzeugt nun eine Relation, die die Verbindung zwischen Kundendaten und
Login herstellt. Wichtig ist, dass vor dem Aufruf von AddMapping die Parameter loginid
und customerid gültige Primärschlüssel der Tabellen LOGIN und CUSTOMER sind.
D.4
MISC.DLL (Interface : Misc)
function getCBStateOptions(stateid: Integer): WideString
Liefert alle möglichen Staaten für eine HTML Combobox zurück. Stateid gibt an,
welcher Eintrag ausgewählt sein soll. 0 bedeutet, dass kein Eintrag ausgewählt wird.
ANHANG D. DIE BUSINESS LOGIK
82
function getCourseList(optional categorieid: Integer): Recordset
Liefert einen ADO Recordset zurück, der alle Kurse der angegebenen Kategorie zurückliefert. Zum genaueren Verständnis welche Daten genau in diesem Recordset sind, ist
hier der SQL Querystring cmd abgebildet.
cmd := ’Select course.*, courseduration.caption as cc ’+
’from course, courseduration ’+
’WHERE course.coursedurationid=courseduration.’+
’coursedurationid and course.available=1’;
if categorieid >0 then
cmd := cmd+’ and coursecategorieid=’+inttostr(categorieid);
cmd := cmd +’ ORDER BY course.caption’;
function getLanguageList: Recordset
Liefert einen ADO Recordset mit allen gespeicherten Sprachen zurück.
function getCBBranchOptions(selected: Integer): WideString
Liefert alle gespeicherten Branchen als Option Felder für eine HTML Combobox zurück. Selected gibt an, welcher Eintrag ausgewählt sein soll. 0 bedeutet, dass kein Eintrag
ausgewählt wird.
function getCBNoticeOptions(selected: Integer): WideString
Liefert alle gespeicherten Orte zurück, die angeben, woher ein Kunde diese Site kennt,
als Option Felder für eine HTML Combobox zurück. Selected gibt an, welcher Eintrag
ausgewählt sein soll. 0 bedeutet, dass kein Eintrag ausgewählt wird.
function getCourseCategorieList: Recordset
Liefert einen ADO Recordset mit allen gespeicherten Kurskategorien zurück. function getCBCourseOptions(selected: Integer): WideString Liefert alle gespeicherte Kurse als
Option Felder für eine HTML Combobox zurück. Selected gibt an, welcher Eintrag ausgewählt sein soll. 0 bedeutet, dass kein Eintrag ausgewählt wird.
function getCBLanguageOptions(selected: Integer): WideString
Liefert alle gespeicherten Sprachen als Option Felder für eine HTML Combobox zurück. Selected gibt an, welcher Eintrag ausgewählt sein soll. 0 bedeutet, dass kein Eintrag
ausgewählt wird.
ANHANG D. DIE BUSINESS LOGIK
83
function getCBStartTimeOptions(selected: Integer): WideString
Liefert alle möglichen gespeicherten Startzeiten als Option Felder für eine HTML Combobox zurück. Selected gibt an, welcher Eintrag ausgewählt sein soll. 0 bedeutet, dass kein
Eintrag ausgewählt wird.
function getCBDurationOptions(selected: Integer): WideString
Liefert alle gespeicherten Möglichkeiten für eine Kursdauer als Option Felder für eine HTML Combobox zurück. Selected gibt an, welcher Eintrag ausgewählt sein soll. 0
bedeutet, dass kein Eintrag ausgewählt wird.
D.5
SEC.DLL (Interface Security)
Das Security Objekt stellt Methoden zur Verfügung, die es erlauben, den eingeloggten
Benutzer zu identifizieren, sowie neue Benutzer anzulegen. Das Security Objekt wurde so
entwickelt, dass es auch für andere Anwendungen einsetzbar ist. Bei der Eingabe seiner
Zugangsdaten,
function addLogin(usergroupid: Integer): Integer
erstellt einen neuen Datensatz in der Tabelle LOGIN. Es wird dabei ein zufälliges
Passwort erzeugt. Rückgabewert dieser Funktion ist die loginid.
function loadlogin(loginid, password: WideString): Integer
Sucht in der Datenbank, ob ein User mit obigen Zugangsdaten existiert. Rückgabewert:
userid > 0 falls Eingabe korrekt oder <0 falls eine falsche loginid oder ein falsches Passwort
eingetragen wurde.
function usergroup: Integer
Liefert die Usergroup des aktuell eingeloggten users zurück. Vor dem ersten Aufruf von
usergroup() muss loadLogin() aufgrufen worden sein.
function userid: Integer
Liefert die userid des aktuell eingeloggten Users zurück. Vor dem ersten Aufruf von
userid() muss loadLogin() aufgerufen worden sein. Die Userid ist dabei entweder HUMANRESOURCE.humanresourceid oder CUSTOMER.customerid je nach erfolgtem Login.
Es wird also das Mapping bereits mitberechnet.
ANHANG D. DIE BUSINESS LOGIK
D.6
84
TRAIN.DLL (Interface: Trainer)
function load(trainerid: Integer): recordset
Liefert von der Tabelle HUMANRESOURCE den ADO Recordset zurück wobei der
Cursor auf den Datensatz des übergebenen trainerid zeigt.
procedure addMapping(loginid, trainerid: Integer);
Registriert sich ein neuer Trainer, so erzeugt das security object die Zugangsdaten.
Unter Zuhilfenahme der Methode load() wird dann ein neuer Trainer angelegt. Die Methode addMapping erzeugt nun eine Relation, die die Verbindung zwischen Trainerdaten
und Login herstellt.
procedure setAbility(trainerid, courseid, languageid: Integer;
knowledgefaktor: Double
Setzt die Fähigkeiten, des mit trainerid angegeben Trainers. Eine Fähigkeit im Zusammenhang mit rent@trainer, ist immer die Fähigkeit einen Kurs in einer bestimmten
Sprache zu halten. Um die Fähigkeiten eines Trainers genauer zu differentieren, hat der
Administrator noch die Möglichkeit mittels Knowledgefaktor die Qualität dieses Trainers
für diesen Kurs in dieser Sprache anzugeben. Knowledgefaktor muss zwischen 0 und 1
liegen.
Bei der Auswahl eines Trainers kann man nun einen unteren Schwellwert als Parameter angeben, wie hoch der Knowledgefaktor mindestens sein muss, damit ein Trainer
überhaupt für einen Kurs berücksichtigt wird.
Sollte bereits ein Eintrag mit den angegebenen Daten existieren, so wird der alte Datensatz mit dem neuen Knowledgefaktor überschrieben.
procedure deleteAbility(
trainerid, courseid, languageid: Integer)
Löscht den angegbenen Eintrag aus der Datenbank
procedure loadAbilityList(trainerid: Integer)
Lädt alle Fähigkeiten des mit trainerid angegebenen Trainers aus der Datenbank in
den Speicher, um mit getAbility dann schnell abgerufen werden zu können.
function getAbility(
courseid, languageid: Integer): Double
ANHANG D. DIE BUSINESS LOGIK
85
Liefert den Knowledgefaktor des Trainers der angegebenen courseid und languageid
zurück. Vor dem ersten Aufruf von getAbility() muss loadAbilityList() aufgerufen worden
sein.
procedure clearAbilities(trainerid: Integer)
Löscht alle Fähigkeiten des mit trainerid angegebenen Trainers.
D.7
BOOKINGS.DLL (Interface: Booking)
function calculateOffers: Integer
Berechnet Angebote mit den angegebenen Parametern. Die Parameter müssen vor
dem Aufruf von calculateOffers() definiert werden. Diese Methode speichert alle errechneten Angebote in der Datenbank ab. Rückgabewert: Anzahl der erfolgreich errechneten
Angebote.
Im folgenden werden alle Parameter beschrieben. Diese sind als Properties definiert
und können, wenn nicht anders angegeben, geschrieben und gelesen werden.
CourseId : Integer
Gibt den gewünschten Kurs an. (COURSE.courseid)
languageid: Integer
Gibt die gewünschte Sprache an.
customerid: Integer
Gibt den Kunden an, der die Anfrage gemacht hat.
starttimeid: Integer
Gibt die gewünschte Startzeit an. Die Definition der Startzeit wurde bereits weiter
oben diskutiert.
durationid: Integer
Gibt die gewünschte Dauer des Kurses an. Die Definition der Dauer wurde bereits
weiter oben diskutiert.
Trainercount: Integer
Gibt die gewünschte Anzahl an Trainern an.
ANHANG D. DIE BUSINESS LOGIK
86
documentcount: Integer
Gibt die gewünschte Anzahl von Dokumenten an.
plz: Integer
Gibt die gewünschte Postleitzahl des Kursortes an.
place: WideString
Gibt den gewünschten Kursort an.
address: WideString
Gibt die Strasse des gewünschten Kursortes an.
contactperson: WideString
Gibt die Kontaktperson des Kunden an. Standardmäßig ist dies der eingeloggte User.
Dies kann aber vom User bei einer Anfrage noch geändert werden.
email: WideString
Gibt die e-mail der Kontaktperson an.
telephone: WideString
Gibt die Telephonnummer der Kontaktperson an.
stateid: Integer
Gibt den Staat des Kursortes an.
maxOffers: Integer
Gibt an, wieviel Angebote calculateOffer maximal errechnen soll.
minKnowledgefactor: Double
Gibt den minimalen Knowledgefaktor für einen Trainer an. Hat ein Trainer einen geringeren Wert als hier angegeben, wird er von vornherein nicht berücksichtigt.
maxSearchIntervall: Integer
Gibt die Zeit in Tagen an, wieweit in die Zukunft die Funktion calculateOffers() nach
freien Terminen suchen soll.
ANHANG D. DIE BUSINESS LOGIK
87
OtherCustomerFeedbackWeight: Double
Gibt die Gewichtung von Feedbacks anderer Kunden im Verhältnis des aktuellen Kunden an. Der Wert “0.5” für OtherCustomerFeedbackWeight bedeutet, dass andere Feedbacks nur halb so stark bewertet werden.
FeedbackAgeWeight: Double
Gibt die Gewichtung für ältere Feedbacks an.
ReferenceValue:double
Gibt den Wert für das Referenzranking an.
ReferenceWeight: Double
Gibt den Wert für die Gewichtung des Referenzrankings an.
ReferenceAge:TdateTime
Gibt den Zeitpunkt an, der für das Referenzranking angenommen wird.
MinDefaultTrainerRanking : double
Gibt das minimale Ranking eines Trainers aus den Feedbacks an, sodass dieser als
Stammtrainer für den aktuellen Kunden gilt.
minranking: Double
Gibt das minimale Ranking eines Trainers aus den Feedbacks an, sodass dieser für
das aktuelle Angebot berücksichtigt wird. FeedbackOtherCoursesWeight: Double Gibt die
Gewichtung von Feedbacks anderer Kurse im Verhältnis zu diesem Kurs an. Der Feedbacks
des aktuellen Kurs hat die Gewichtung “1”.
startdate: TdateTime
Gibt das Datum an, ab wann calculateOffers nach freien Terminen suchen soll.
notescount: Integer
Gibt die Anzahl von Unterlagen an, die für diesen Kurs benötigt werden.
EmptyRanking:Double
Gibt das Ranking eines Trainers an, der noch keine Beurteilung erhalten hat. Dies wird
für die gleichmäßige Aufteilung von Trainern benötigt.
ANHANG D. DIE BUSINESS LOGIK
88
function getOfferCount: Integer
Nach dem Aufruf von calculateOffers() kann man mit getOfferCount die Anzahl der
errechneten Angebote erhalten.
Function getOffer(index: Integer): offer
Liefert ein Angebot Objekt zurück. Index muss zwischen 0 und getOfferCount-1 liegen.
D.8
OFFERS.DLL (Interface Offer)
Das Object Offer sollte nicht explizit erzeugt werden. Das Object Booking erzeugt alle
möglichen Offer Objekte. Diese erhält man mit Booking.getOFfer()
D.8.1
Methoden
procedure addDay(day: Integer)
Fügt einen Kurstag zum Angebot hinzu. Eine explizite Speicherung aller Kurstage ist
notwendig, da ein Kurs über mehrere Tage gehen kann, und die Kurse auch an nicht aufeinanderfolgenden Tagen stattfinden können. Diese Funktion wird vom User im Allgemeinen
nicht direkt aufgerufen. Sie wird ausschließlich vom Booking Objekt aufgerufen.
function daycount: Integer
Liefert die Anzahl der Kurstage für dieses Angebot zurück. procedure store(courseid,
queryid, trainercount, notescount: Integer; startdate: TDateTime; durationid, starttimeid:
Integer; drivingprice: Double) Speichert dieses Angebot in die Datenbank. Diese Funktion
wird nur intern vom Bookingobjekt aufgerufen.
procedure addTrainer(humanresourceid: Integer)
Fügt einen Trainer zum Angebot hinzu. Diese Funktion wird nur intern vom Bookingobjekt aufgerufen.
function offerid: Integer
Liefert die Angebotsnummer dieses Angebots zurück.
function getDay(index: Integer): TdateTime
Liefert den, mit index angegebenen Kurstag zurück.
function getDrivingPrice: Double
ANHANG D. DIE BUSINESS LOGIK
89
Gibt die verrechneten Fahrtkosten dieses Angebots an.
function getTeachingPrice: double
Gibt die verrechneten Kurskosten dieses Angebots an.
function getNotesPrice: Double
Gibt die verrechneten Unterlagenkosten dieses Angebots an.
D.9
ORDERS.DLL (Interface: ORDER)
function makeorder(offerid: Integer): Integer
Generiert aus dem angegebenen Angebot eine verbindliche Buchung. Aus einer Anfrage
entstehen also mehrere Angebote. Aus diesen Angeboten wird nun genau eine Buchung.
Beim Erstellen der Buchung werden alle Angebote als abgelaufen markiert. Dies ist notwendig, falls ein Kunde auf den Back Button des Browsers klickt, um alle erhaltenen
Angebote aus dem Browser Cache wieder anzuzeigen. Es muss nun verhindert werden,
dass der Kunde durch erneutes Drücken des “Buchen Links” erneut bucht. Durch das Markieren der Angebote kann nun überprüft werden, ob ein Kunde eine Buchung doppelt
klickt.
D.10
MSG.DLL (Interface: Messager)
Messager übernimmt die e-mail Kommunikation. Nach rein objekt-orientierten Gesichtspunkten müssten die Objekte Trainer, Customer und Order die Methoden von Messager
aufrufen, da diese für die Registrierung von Usern bzw. für das Abwickeln von Buchungen zuständig sind. Anwendung wurde aber so designed, dass alle Methodenaufrufe nur
von ASP Scripts durchgeführt werden. Dadurch ist gewährleistet, dass man die Parameter
SMTPHost , from und fromaddress später leicht ändern kann.
procedure sendMail(const SMTPHost, fromaddress, from,
toAddress,
tobcc, subject, body: WideString); safecall;
Sendet eine e-mail über SMTPHost an toAddress und tobcc. From gibt den Namen
des Absenders, fromaddress die e-mail Adresse desselben an.
procedure sendSMS(prenumber, mainnumber: Integer;
const subject:WideString); safecall;
ANHANG D. DIE BUSINESS LOGIK
90
Sendet eine sms an die angegebene Nummer. prenumber gibt die Vorwahl des Handys
an (0664, 0669, 0676). Mainnumber steht für die eigentliche Nummer. Subject ist schließlich
der Text, der via SMS versandt werden soll.
Abbildungsverzeichnis
2.1
Datenfluss für einen benötigten Trainer . . . . . . . . . . . . . . . . . . . . 11
2.2
Datenfluss für mehr benötigte Trainer . . . . . . . . . . . . . . . . . . . . . 12
2.3
Datenfluss für fixe Kurszeiten . . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.1
CGI Struktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.2
Eine direkte Verbindung zu einem Objekt auf dem gleichen Computer, im
gleichen Adressraum und Apartment wie der Client
4.3
. . . . . . . . . . . . . 28
Eine indirekte Proxy/Stub-Verbindung zu einem Objekt, das an einem anderen Ort existiert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.4
Ein Kontext-Wrapper als eine separate Schicht im Microsoft Transaction
Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.5
Interception durch Policy-Objekte . . . . . . . . . . . . . . . . . . . . . . . 29
4.6
Eine Serverapplikation, die in einem separaten Adressraum ausgeführt wird
4.7
Eine Bibliotheksapplikation, die im Adressraum der Clientanwendung aus-
30
geführt wird . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
5.1
Objekt Relationen Teil 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
5.2
Objekt Relationen Teil 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
6.1
Datenbankstruktur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
9.1
Public Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
9.2
Trainer Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
9.3
Trainer Area . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
9.4
Startseite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
9.5
Kunden Registrierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
9.6
Trainer Registrierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
9.7
Buchungsformular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
9.8
Trainer Kalender . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
9.9
Kursportfolio: Beispiel MS Visual Basic . . . . . . . . . . . . . . . . . . . . 58
91
ABBILDUNGSVERZEICHNIS
92
9.10 Buchungsformular . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Tabellenverzeichnis
4.1
Ergebnisse Test 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
4.2
Ergebnisse Test 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
93
Literaturverzeichnis
[MSO]
http://www.mircosoft.com
[Bün00]
Uwe Bünning: PC Intern. Dynamische Webseiten mit ASP, Data Becker 2000
[Buc00]
Greg Buczek: ASP Developers Guide - Active Server Pages für Entwickler, Franzis 2000
[Dat98]
Chris J. Date: SQL-Der Standard, Addison-Wesley 1998
[Cha96]
David Cappel: ActiveX and OLE, Microsoft Press 1996
[Hof96]
Manfred Hofbauer: ACCESS 7 für Windows 95, SYBEX 1996
[DNJ100] Jon Honeyball: Developer Network Journal, MSDN July/August 2000
[CT991] c’t Magazin 8/99. CGI aber schnell, Heise Verlag 1999
[Bar99]
Hans-Jochen Bartsch: Taschenbuch Mathematischer Formeln, Fachbuchverlag
Leibnitz 18. Auflage 1999
[Kol00]
ADO
und
ASP
-
Datenbanken
einmal
näher
betrachtet:
http://www.aspheute.com/artikel/19990825.htm 2000
[MSO2]
ADO Programming Model:
http://www.microsoft.com/data/ado/prodinfo/progmod.htm, 1997
[Dob00]
Walter Doberenz, Thomas Kowalski: Borland Delphi 5 Grundlagen und Profiwissen, Verlag Carl Hanser 2000
[Kos991] Andreas Kosch: Client/Server Datenbankentwicklung mit Delphi, Software und
Support Verlag 1999
[Kos992] Andreas Kosch: COM/DCOM mit Delphi, Software und Support Verlag 1999
[Qui99]
Klaus Quibeldey-Cirkel: Entwurfsmuster. Design Patterns in der objektorientierten Softwaretechnik, Springer-Verlag Berlin Heidelberg 1999
94
LITERATURVERZEICHNIS
95
[Gam95] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Design Patterns,
Addison-Wesley 1995
[Alg98]
Robert Sedgewick: Algorithmen, Addison-Wesley, 1992
Herunterladen