Prozessknoten implementieren
Allgemein
Nachdem ein Prozessknoten und sein erstes Formular durch die Aktionfunktionen prtask_aktualisiereknoten und prtask_generiereformular erzeugt wurde, muss er implementiert werden. Dafür sind bestimmte Regeln einzuhalten. Im folgenden wird außerdem der allgemeine Aufbau eines Prozessknotens beschrieben.
Struktur eines Prozessknotens
Ein Prozessknoten dokumentiert den Lebenszyklus einer Aufgabe. Mit erfolgreicher Beendigung der Aufgabe wird in der Regel das funktionale Modell aktualisiert. Grundsätzlich gibt es folgende Phasen:
- Aufgabe beginnen
- Aufgabe ausführen
- Aufgabe beenden
Während der Ausführung der Aufgabe kann diese beliebig oft pausiert und angehalten werden. Das wird benutzt, damit die effektive Arbeitszeit für die Bearbeitung einer Aufgabe berechnet werden kann, welche von der Gesamtzeit von Beginn bis Ende der Aufgabe stark abweichen kann.
Aufgabe beginnen
Für das Beginnen der Aufgabe müssen nur die richtigen Voraussetzungen vorhanden sein; der Benutzer muss in der Lage sein, die Aufgabe auszuführen. Dies ist der Fall, wenn der Benutzer mit der zugehörigen prTask Instanz verknüpft ist. Die Auto Oberfläche übersetzt automatisch den Autobenutzer zur zugehörigen prPerson Instanz.
Der Task beginnt durch das Ausführen der Aktionfunktion aubeginnen am Prozessknoten.
Aufgabe ausführen
Dies ist der Variable Teil des Prozessknotens.
Beispiel: Ändern von Attributen
Ein typisches Beispiel wäre das Ändern von Attributen an einem Knoten. Das folgende Beispiel gilt für eine Implementierung vom Prozessknoten ge00001 - "geObjekt Ausdehnung ändern".
Der Knoten geObjekt beschreibt ein 3D-Objekt im Graphmodul ge, welches ein Modell eines Gebäudes darstellt. Jedes Objekt hat die Attribute breite, laenge und hoehe. Mit dem Prozessknoten sollen diese Attribute geändert werden können. Außerdem ist gewünscht, dass die alten Werte im Prozessknoten archiviert werden.
Als erstes wird der Knotenknoten ge00001_geobjekt (1n) angelegt. Danach werden an ge00001 die Attribute breitealt, laengealt, hoehealt sowie breite, laenge und hoehe angelegt. Außerdem wird ein Alias mit dem Namen ge00001_geobjekt auf geobjekt_name angelegt.
Nun wird eine Aktionfunktion ge00001_geobjekt geschrieben, welche durch ge00001_geobjekt und ge00001_prstatus getriggert wird:
$ge00001_prstatus=attribut($node_guid,'ge00001_prstatus');
if($ge00001_prstatus != 'begonnen'){
return 1;
}
$geobjekt_guid=knoten($node_guid,'geobjekt');
$geobjekt=attribute($geobjekt_guid,'geobjekt','breite, laenge, hoehe');
setze($node_guid,'ge00001_breitealt',$geobjekt['breite']);
setze($node_guid,'ge00001_breite',$geobjekt['breite']);
setze($node_guid,'ge00001_laengealt',$geobjekt['laenge']);
setze($node_guid,'ge00001_laenge',$geobjekt['laenge']);
setze($node_guid,'ge00001_hoehealt',$geobjekt['hoehe']);
setze($node_guid,'ge00001_hoehe',$geobjekt['hoehe']);
return 1;
Wie man sehen kann, wird diese Aktionfunktion nur ausgeführt, wenn der Status des Prozessknotens "begonnen" ist. Wenn die Aufgabe noch nicht begonnen oder schon beendet ist, wird die Aktionfunktion nicht ausgeführt. Danach werden die Attribute breite, laenge und hoehe in die 6 Attribute geschrieben.
Nun kann der Benutzer die Werte der Attribute breite, laenge und hoehe ändern. Die anderen drei (breitealt, laengealt und hoehealt) sollen nicht geändert werden, da sie so archiviert werden. Das Formular zu dem Prozessknoten soll so geändert werden, dass nach prPerson die 1-Link Komponente zu geObjekt angezeigt wird, welche schreibgeschützt ist, wenn nicht gilt, dass das Attribut aubeendbar gesetzt ist. Danach kommen 3 Label für breitealt, laengealt und hoehealt. breite, laenge und hoehe werden in einer Komponente "Textfeld" dargestellt werden, welche schreibgeschützt sind, wenn nicht gilt, dass das Attribut aubeendbar gesetzt ist.
Damit ist das Ausführen vollständig implementiert.
Aufgabe beenden
Das Beenden der Aufgabe wird durch die Aktionfunktion aubeenden durchgeführt. Diese prüft einige Dinge ab und ruft, wenn die Voraussetzungen erfüllt sind die Aktionfunktion prbeenden auf. Diese wiederum prüft einige Dinge und ruft zuerst die Aktionfunktion validieren auf und danach die Aktionfunktion projizieren.
Aktionfunktion prvalidieren
Die Aktionfunktion prvalidieren soll prüfen, ob die gemachten Eingaben gültig sind, z.B. ob Werte regelkonform angegeben wurden. Ist dies nicht der Fall, wird eine Fehlermeldung in das Attribut prfehler geschrieben. Das Validieren darf nur stattfinden, wenn das Attribut prstatus nicht auf "beendet" steht. Das bedeutet, dass zum Beginn folgender Code stehen sollte (am Beispiel ge00001):
$ge00001_prstatus=attribut($node_guid,'ge00001_prstatus');
if($ge00001_prstatus == 'beendet'){
return 1;
}
$fehler = [];
In der Folge wird ein individueller Code erzeugt, der die gemachten Eingaben prüft, z.B. für ge00001:
if(!$ge00001['breite']){
$fehler[]="Breite ist nicht festgelegt";
}
if (!$ge00001['laenge']){
$fehler[]="Länge ist nicht festgelegt";
}
if (!$ge00001['hoehe']){
$fehler[]="Höhe ist nicht festgelegt";
}
Am Ende der Aktionfunktion werden dann möglichen Fehlermeldungen in das Attribut prfehler geschrieben, hier wieder für ge00001:
setze($node_guid,'ge00001_prfehler',implode("\n",$fehler)); return 1;
In der Folge kann die Aktionfunktion prüfen, ob beim validieren Fehler aufgetreten sind.
Aktionfunktion prprojizieren
Sind beim Validieren keine Fehler aufgetreten, werden die Änderungen am funktionalen Modell durchgeführt. Wie bei der Aktionfunktion prvalidieren, wird als erstes geprüft, ob die Aktion grundsätzlich ausgeführt werden darf (wieder am Beispiel ge00001):
$ge00001_prstatus=attribut($node_guid,'ge00001_prstatus');
if($ge00001_prstatus != 'beendet'){
return 1;
}
$geobjekt_guid=knoten($node_guid,'geobjekt');
if(!$geobjekt_guid){
return 1;
}
Der erste Teil ist bei jedem Prozessknoten notwendig, der zweite prüft, ob der Zielknoten verknüpft ist, der verändert werden soll.
Sind die Voraussetzungen erfüllt, werden die Änderungen in das funktionale Modell geschrieben und die Aktionfunktion beendet:
$ge00001=attribute($node_guid,'ge00001','breite, laenge, hoehe'); setze($geobjekt_guid,'geobjekt_breite',$ge00001['breite']); setze($geobjekt_guid,'geobjekt_laenge',$ge00001['laenge']); setze($geobjekt_guid,'geobjekt_hoehe',$ge00001['hoehe']);
Wurde die Aktionfunktion prprojizieren aufgerufen, ist die Aufgabe abgeschlossen.