<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.graph-it.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hschlabach</id>
	<title>Graph-IT Wiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.graph-it.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Hschlabach"/>
	<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/Spezial:Beitr%C3%A4ge/Hschlabach"/>
	<updated>2026-06-02T06:18:39Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Lxdhost-Server&amp;diff=34</id>
		<title>Lxdhost-Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Lxdhost-Server&amp;diff=34"/>
		<updated>2019-03-17T08:40:43Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ziel dieser Anleitung ist eines ausfallsicheren LXDHost. Die Anleitung basiert auf der Anleitung [[Server-Basissystem]]. Das System hat zwei zusätzliche Festplatten auf denen die LXD-Container abgelegt werden. Die Festplatten sind mit LVM zu einer Volume-Group zusammengefasst. In dieser wird ein Logical-Volume vom Typ &amp;lt;code&amp;gt;raid1&amp;lt;/code&amp;gt; angelegt. Als Dateisystem wird wieder BTRFS eingesetzt. Das Netzwerk wird so konfiguriert, das die LXD-Container direkten Zugriff auf das Netz haben und von dort per DHCP mit IP-Adressen versorgt werden können. Dazu wird das in der vorhergehenden Anleitung konfigurierte Interface &amp;lt;code&amp;gt;eno1&amp;lt;/code&amp;gt; durch die Bridge &amp;lt;code&amp;gt;lxdbr0&amp;lt;/code&amp;gt; ersetzt.&lt;br /&gt;
&lt;br /&gt;
==Voraussetzungen==&lt;br /&gt;
Funktionsfähiges [[Server-Basissystem]]&lt;br /&gt;
&lt;br /&gt;
Die Dateien lxdh-setup und lxdh-config-example aus den git-Repository [[https://github.com/heiko-schlabach/Server-Basissystem]]&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;br /&gt;
Der Server wird gebootet und der Benutzer &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; meldet sich am System an. Nun werden die Skripte aus dem Git-Repository abgerufen.&lt;br /&gt;
 apt install git &lt;br /&gt;
 git clone https://github.com/heiko-schlabach/Server-Basissystem&lt;br /&gt;
 cd Server-Basissystem&lt;br /&gt;
&lt;br /&gt;
Zunächst muss eine Konfigurationsdatei für das Skript &amp;lt;code&amp;gt;lxdh-setup&amp;lt;/code&amp;gt; angelegt werden:&lt;br /&gt;
&lt;br /&gt;
 cp lxdh-config-example lxdh-config&lt;br /&gt;
 nano lxdh-config&lt;br /&gt;
&lt;br /&gt;
Nun kann das Skript lxdh-setup aufgerufen werden:&lt;br /&gt;
&lt;br /&gt;
  ./lxdh-setup lxdh-config&lt;br /&gt;
&lt;br /&gt;
Während der Abarbeitung wird der Benutzer nach dem Passwort für den LXD-Deamon gefragt. Anschliessend kann das System neu gestartet werden.&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Graphmodul_li_-_LightPi&amp;diff=33</id>
		<title>Graphmodul li - LightPi</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Graphmodul_li_-_LightPi&amp;diff=33"/>
		<updated>2019-03-15T09:24:00Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: Die Seite wurde neu angelegt: „Das Graphmodul li - LightPi bildet alles rund um den LightPi im Graphen ab. Mit dem LightPi können Gebäudeautomatisierungen durchgeführt werden.“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Das Graphmodul li - LightPi bildet alles rund um den LightPi im Graphen ab. Mit dem LightPi können Gebäudeautomatisierungen durchgeführt werden.&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Hauptseite&amp;diff=32</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Hauptseite&amp;diff=32"/>
		<updated>2019-03-15T09:22:22Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: /* Graphmodule */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Allgemein==&lt;br /&gt;
In diesem Wiki werden Werkzeuge beschrieben, die von Graph-IT zu Verfügung gestellt werden, um eine durchgängige Digitalisierung zu erreichen.&lt;br /&gt;
&lt;br /&gt;
==Graph==&lt;br /&gt;
&lt;br /&gt;
[[Graph | Der Graph]]&lt;br /&gt;
&lt;br /&gt;
[[Graphmodul]]&lt;br /&gt;
&lt;br /&gt;
===Graphmodule===&lt;br /&gt;
&lt;br /&gt;
[[Graphmodul pr - Prozesse | pr - Prozesse]]&lt;br /&gt;
&lt;br /&gt;
[[Graphmodul li - LightPi | li - LightPi]]&lt;br /&gt;
&lt;br /&gt;
==technische Infrastruktur==&lt;br /&gt;
&lt;br /&gt;
[[Server-Basissystem]]&lt;br /&gt;
&lt;br /&gt;
[[Lxdhost-Server]]&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Lxdhost-Server&amp;diff=29</id>
		<title>Lxdhost-Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Lxdhost-Server&amp;diff=29"/>
		<updated>2019-03-14T06:19:24Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: /* Voraussetzungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ziel dieser Anleitung ist eines ausfallsicheren LXDHost. Die Anleitung basiert auf der Anleitung [[Server-Basissystem]]. Das System hat zwei zusätzliche Festplatten auf denen die LXD-Container abgelegt werden. Die Festplatten sind mit LVM zu einer Volume-Group zusammengefasst. In dieser wird ein Logical-Volume vom Typ &amp;lt;code&amp;gt;raid1&amp;lt;/code&amp;gt; angelegt. Als Dateisystem wird wieder BTRFS eingesetzt. Das Netzwerk wird so konfiguriert, das die LXD-Container direkten Zugriff auf das Netz haben und von dort per DHCP mit IP-Adressen versorgt werden können. Dazu wird das in der vorhergehenden Anleitung konfigurierte Interface &amp;lt;code&amp;gt;eno1&amp;lt;/code&amp;gt; durch die Bridge &amp;lt;code&amp;gt;lxdbr0&amp;lt;/code&amp;gt; ersetzt.&lt;br /&gt;
&lt;br /&gt;
==Voraussetzungen==&lt;br /&gt;
Funktionsfähiges Server Basissystem&lt;br /&gt;
&lt;br /&gt;
Die Dateien lxdh-setup und lxdh-config-example aus den git-Repository [[https://github.com/heiko-schlabach/Server-Basissystem]]&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Server-Basissystem&amp;diff=28</id>
		<title>Server-Basissystem</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Server-Basissystem&amp;diff=28"/>
		<updated>2019-03-14T06:17:36Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: /* Voraussetzungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Allgemein==&lt;br /&gt;
Das Ziel dieser Anleitung ist ein Ubuntu-Minimal-System mit folgenden Eigenschaften: Das System hat zwei System-Festplatten. Fällt eine der beiden Festplatten aus, so funktioniert das System trotzdem ohne Beeinträchtigung weiter. Dies umfasst auch den Neustart. Ein Hot-Swap der Festplatten ist ebenfalls möglich.&lt;br /&gt;
&lt;br /&gt;
Ich habe keine Möglichkeit gefunden unter Ubuntu zwei EFI-Partionen synchron zu halten. Aus diesem Grund muss das System mit BIOS oder UEFI-Legacy gebootet werden.&lt;br /&gt;
&lt;br /&gt;
Als Partitionstabelle habe ich GPT gewählt. Für die zweite Stufe von GRUB braucht man dann eine zusätzliche kleine Partition vom Typ &amp;quot;BIOS boot&amp;quot;. Diese muss auf beiden Festplatten angelegt werden. Es wird eine Größe von 1MB empfohlen. Ein Dateisystem darf in dieser Partition nicht angelegt werden. Die Partion wird unter Ubuntu bei Installation und Update des Bootloaders automatisch aktualisiert und synchron gehalten.&lt;br /&gt;
&lt;br /&gt;
Die zweite Partition umfasst jeweils den Rest der Festplatte. Sie sollte den Typ &amp;quot;Linux LVM&amp;quot; haben. Die beiden großen Partition werden in einer LVM-Volume-Group zusammengefasst. In der Volume-Group wird dann ein Logical-Volume vom Typ raid1 angelegt. Das Logical-Volume muss nicht sehr groß sein, da nur ein Minimal-System installiert werden soll. Sollte der Platz knapp werden, so kann man das Logical-Volume und das enthaltene Dateisystem bis zu der Größe der kleineren Festplatte erweitern&lt;br /&gt;
&lt;br /&gt;
Als Dateisystem für das Logical-Volume wird BTRFS verwendet. Dies gestattet es, vor umfangreicheren Änderungen am Betriebsystem, Snapshots anzulegen.&lt;br /&gt;
&lt;br /&gt;
Das System wird nicht von einem Installationsmedium sondern mit debootstrap installiert. Deshalb kann zur Installation irgendein System verwendet werden, das mit den notwendigen Tools ausgestattet ist. Ich habe den Rechner mit dem Live-System von einem &amp;quot;Ubuntu Desktop 18.04&amp;quot;-Stick gebootet. So kann man einerseits beim Systemstart das Tastaturlayout wählen und andererseite diese Anleitung in einem Browser öffnen. &lt;br /&gt;
&lt;br /&gt;
==Voraussetzungen==&lt;br /&gt;
&lt;br /&gt;
[[Server]] mit 2 Systemfestplatten SSD im Wechselrahmen&lt;br /&gt;
&lt;br /&gt;
USB Stick mit Ubuntu 18.04 Desktop zum Installieren&lt;br /&gt;
&lt;br /&gt;
Netzwerk mit DHCP und Internetverbindung&lt;br /&gt;
&lt;br /&gt;
Die Dateien basy-bootstrap, basy-setup und basy-config.example aus dem GitHub Repository [[https://github.com/heiko-schlabach/Server-Basissystem]]&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Graphmodul&amp;diff=27</id>
		<title>Graphmodul</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Graphmodul&amp;diff=27"/>
		<updated>2019-03-14T06:02:58Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: Die Seite wurde neu angelegt: „Ein Graphmodul ist die Sammlung von Knoten, Verknüpfungen, Datenfunktionen und Aktionfunktionen, die logisch zusammen gehören. Graphmodule werden durch den K…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Graphmodul ist die Sammlung von Knoten, Verknüpfungen, Datenfunktionen und Aktionfunktionen, die logisch zusammen gehören. Graphmodule werden durch den Knoten graphmodul im Graphen definiert.&lt;br /&gt;
&lt;br /&gt;
Ein Graphmodul hat ein Attribut &amp;quot;prefix&amp;quot;, welches aus zwei Zeichen besteht. Jeder Knoten, der zu diesem Graphmodul gehört, muss mit diesen zwei Zeichen beginnen.&lt;br /&gt;
&lt;br /&gt;
Ein Graphmodul hat ein Attribut &amp;quot;name&amp;quot;, welches den Namen des Graphmoduls in menschenlesbarer Form enthält. Aus dem Namen sollte das Prefix abgeleitet werden, indem die ersten beiden Buchstaben des Namens verwendet werden. Beispiel: Das Graphmodul Finanzwesen hätte das Prefix &amp;quot;fi&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Ist das Prefix schon vergeben, dann wird der erste Buchstabe genommen, im Beispiel für &amp;quot;Finanzwesen&amp;quot; das f und der erste freie Buchstabe des Alphabets, für den gilt, dass das Prefix noch frei ist. Also z.B. fa, ist fa schon belegt, dann wird fb genommen. Ist fz belegt, wird ga benutzt.&lt;br /&gt;
&lt;br /&gt;
Es sind nur die Buchstaben a-z erlaubt, keine Umlaute und nur Kleinbuchstaben.&lt;br /&gt;
&lt;br /&gt;
Graphmodule können lokal sein, das bedeutet, dass sie nur im lokalen Graphen existieren. Diese Graphmodule im Prefix an der zweiten Stelle eine Ziffer, also z.B. f0.&lt;br /&gt;
&lt;br /&gt;
Die Buchstaben x und y sind an der ersten Stelle des Prefix reserviert, damit der Namespace später dort möglicherweise erweitert werden kann.&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Hauptseite&amp;diff=26</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Hauptseite&amp;diff=26"/>
		<updated>2019-03-14T05:53:00Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: /* Graph */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Allgemein==&lt;br /&gt;
In diesem Wiki werden Werkzeuge beschrieben, die von Graph-IT zu Verfügung gestellt werden, um eine durchgängige Digitalisierung zu erreichen.&lt;br /&gt;
&lt;br /&gt;
==Graph==&lt;br /&gt;
&lt;br /&gt;
[[Graph | Der Graph]]&lt;br /&gt;
&lt;br /&gt;
[[Graphmodul]]&lt;br /&gt;
&lt;br /&gt;
===Graphmodule===&lt;br /&gt;
&lt;br /&gt;
[[Graphmodul pr - Prozesse | pr - Prozesse]]&lt;br /&gt;
&lt;br /&gt;
==technische Infrastruktur==&lt;br /&gt;
&lt;br /&gt;
[[Server-Basissystem]]&lt;br /&gt;
&lt;br /&gt;
[[Lxdhost-Server]]&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Server&amp;diff=25</id>
		<title>Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Server&amp;diff=25"/>
		<updated>2019-03-14T05:51:12Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: Die Seite wurde neu angelegt: „Ein Server ist ein PC-System, auf dem ein Virtualisierungsdienst läuft.  ==Anforderungen== Server bilden einen wichtigen Baustein für die gesamte digitale In…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ein Server ist ein PC-System, auf dem ein Virtualisierungsdienst läuft.&lt;br /&gt;
&lt;br /&gt;
==Anforderungen==&lt;br /&gt;
Server bilden einen wichtigen Baustein für die gesamte digitale Infrastruktur. Server sollen grundsätzlich gewisse Anforderungen erfüllen:&lt;br /&gt;
&lt;br /&gt;
*19&amp;quot; Gehäuse, damit sie in Serverschränke eingebaut werden können&lt;br /&gt;
*2.5&amp;quot; Wechselrahmen für alle Festplatten&lt;br /&gt;
*ausschließlicher Einsatz von SSDs&lt;br /&gt;
*möglichst viele CPU-Kerne&lt;br /&gt;
*möglichst viel Hauptspeicher&lt;br /&gt;
*Desktop PC oder Gaming PC Hardware für Mainboard ist o.k.&lt;br /&gt;
*2x kleine SSD, welche dann im Software Raid1 als Bootmedium benutzt werden, siehe [[Server-Basissystem]]&lt;br /&gt;
*mindestens 1 Paar SSD möglichst groß für die Daten/virtuellen Systeme&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Server-Basissystem&amp;diff=24</id>
		<title>Server-Basissystem</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Server-Basissystem&amp;diff=24"/>
		<updated>2019-03-14T05:42:15Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Allgemein==&lt;br /&gt;
Das Ziel dieser Anleitung ist ein Ubuntu-Minimal-System mit folgenden Eigenschaften: Das System hat zwei System-Festplatten. Fällt eine der beiden Festplatten aus, so funktioniert das System trotzdem ohne Beeinträchtigung weiter. Dies umfasst auch den Neustart. Ein Hot-Swap der Festplatten ist ebenfalls möglich.&lt;br /&gt;
&lt;br /&gt;
Ich habe keine Möglichkeit gefunden unter Ubuntu zwei EFI-Partionen synchron zu halten. Aus diesem Grund muss das System mit BIOS oder UEFI-Legacy gebootet werden.&lt;br /&gt;
&lt;br /&gt;
Als Partitionstabelle habe ich GPT gewählt. Für die zweite Stufe von GRUB braucht man dann eine zusätzliche kleine Partition vom Typ &amp;quot;BIOS boot&amp;quot;. Diese muss auf beiden Festplatten angelegt werden. Es wird eine Größe von 1MB empfohlen. Ein Dateisystem darf in dieser Partition nicht angelegt werden. Die Partion wird unter Ubuntu bei Installation und Update des Bootloaders automatisch aktualisiert und synchron gehalten.&lt;br /&gt;
&lt;br /&gt;
Die zweite Partition umfasst jeweils den Rest der Festplatte. Sie sollte den Typ &amp;quot;Linux LVM&amp;quot; haben. Die beiden großen Partition werden in einer LVM-Volume-Group zusammengefasst. In der Volume-Group wird dann ein Logical-Volume vom Typ raid1 angelegt. Das Logical-Volume muss nicht sehr groß sein, da nur ein Minimal-System installiert werden soll. Sollte der Platz knapp werden, so kann man das Logical-Volume und das enthaltene Dateisystem bis zu der Größe der kleineren Festplatte erweitern&lt;br /&gt;
&lt;br /&gt;
Als Dateisystem für das Logical-Volume wird BTRFS verwendet. Dies gestattet es, vor umfangreicheren Änderungen am Betriebsystem, Snapshots anzulegen.&lt;br /&gt;
&lt;br /&gt;
Das System wird nicht von einem Installationsmedium sondern mit debootstrap installiert. Deshalb kann zur Installation irgendein System verwendet werden, das mit den notwendigen Tools ausgestattet ist. Ich habe den Rechner mit dem Live-System von einem &amp;quot;Ubuntu Desktop 18.04&amp;quot;-Stick gebootet. So kann man einerseits beim Systemstart das Tastaturlayout wählen und andererseite diese Anleitung in einem Browser öffnen. &lt;br /&gt;
&lt;br /&gt;
==Voraussetzungen==&lt;br /&gt;
&lt;br /&gt;
[[Server]] mit 2 Systemfestplatten SSD im Wechselrahmen&lt;br /&gt;
&lt;br /&gt;
USB Stick mit Ubuntu 18.04 Desktop zum Installieren&lt;br /&gt;
&lt;br /&gt;
Netzwerk mit DHCP und Internetverbindung&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Server-Basissystem&amp;diff=23</id>
		<title>Server-Basissystem</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Server-Basissystem&amp;diff=23"/>
		<updated>2019-03-14T05:37:55Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: /* Voraussetzungen */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Allgemein==&lt;br /&gt;
Das Ziel dieser Anleitung ist ein Ubuntu-Minimal-System mit folgenden Eigenschaften: Das System hat zwei System-Festplatten. Fällt eine der beiden Festplatten aus, so funktioniert das System trotzdem ohne Beeinträchtigung weiter. Dies umfasst auch den Neustart. Ein Hot-Swap der Festplatten ist ebenfalls möglich.&lt;br /&gt;
&lt;br /&gt;
Ich habe keine Möglichkeit gefunden unter Ubuntu zwei EFI-Partionen synchron zu halten. Aus diesem Grund muss das System mit BIOS oder UEFI-Legacy gebootet werden.&lt;br /&gt;
&lt;br /&gt;
Als Partitionstabelle habe ich GPT gewählt. Für die zweite Stufe von GRUB braucht man dann eine zusätzliche kleine Partition vom Typ &amp;quot;BIOS boot&amp;quot;. Diese muss auf beiden Festplatten angelegt werden. Es wird eine Größe von 1MB empfohlen. Ein Dateisystem darf in dieser Partition nicht angelegt werden. Die Partion wird unter Ubuntu bei Installation und Update des Bootloaders automatisch aktualisiert und synchron gehalten.&lt;br /&gt;
&lt;br /&gt;
Die zweite Partition umfasst jeweils den Rest der Festplatte. Sie sollte den Typ &amp;quot;Linux LVM&amp;quot; haben. Die beiden großen Partition werden in einer LVM-Volume-Group zusammengefasst. In der Volume-Group wird dann ein Logical-Volume vom Typ raid1 angelegt. Das Logical-Volume muss nicht sehr groß sein, da nur ein Minimal-System installiert werden soll. Sollte der Platz knapp werden, so kann man das Logical-Volume und das enthaltene Dateisystem bis zu der Größe der kleineren Festplatte erweitern&lt;br /&gt;
&lt;br /&gt;
Als Dateisystem für das Logical-Volume wird BTRFS verwendet. Dies gestattet es, vor umfangreicheren Änderungen am Betriebsystem, Snapshots anzulegen.&lt;br /&gt;
&lt;br /&gt;
Das System wird nicht von einem Installationsmedium sondern mit debootstrap installiert. Deshalb kann zur Installation irgendein System verwendet werden, das mit den notwendigen Tools ausgestattet ist. Ich habe den Rechner mit dem Live-System von einem &amp;quot;Ubuntu Desktop 18.04&amp;quot;-Stick gebootet. So kann man einerseits beim Systemstart das Tastaturlayout wählen und andererseite diese Anleitung in einem Browser öffnen. &lt;br /&gt;
&lt;br /&gt;
==Voraussetzungen==&lt;br /&gt;
&lt;br /&gt;
Server mit 2 Systemfestplatten SSD im Wechselrahmen&lt;br /&gt;
&lt;br /&gt;
USB Stick mit Ubuntu 18.04 Desktop zum Installieren&lt;br /&gt;
&lt;br /&gt;
Netzwerk mit DHCP und Internetverbindung&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Lxdhost-Server&amp;diff=22</id>
		<title>Lxdhost-Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Lxdhost-Server&amp;diff=22"/>
		<updated>2019-03-13T13:12:09Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ziel dieser Anleitung ist eines ausfallsicheren LXDHost. Die Anleitung basiert auf der Anleitung [[Server-Basissystem]]. Das System hat zwei zusätzliche Festplatten auf denen die LXD-Container abgelegt werden. Die Festplatten sind mit LVM zu einer Volume-Group zusammengefasst. In dieser wird ein Logical-Volume vom Typ &amp;lt;code&amp;gt;raid1&amp;lt;/code&amp;gt; angelegt. Als Dateisystem wird wieder BTRFS eingesetzt. Das Netzwerk wird so konfiguriert, das die LXD-Container direkten Zugriff auf das Netz haben und von dort per DHCP mit IP-Adressen versorgt werden können. Dazu wird das in der vorhergehenden Anleitung konfigurierte Interface &amp;lt;code&amp;gt;eno1&amp;lt;/code&amp;gt; durch die Bridge &amp;lt;code&amp;gt;lxdbr0&amp;lt;/code&amp;gt; ersetzt.&lt;br /&gt;
&lt;br /&gt;
==Voraussetzungen==&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Lxdhost-Server&amp;diff=21</id>
		<title>Lxdhost-Server</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Lxdhost-Server&amp;diff=21"/>
		<updated>2019-03-13T13:07:25Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: Leere Seite erstellt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Hauptseite&amp;diff=20</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Hauptseite&amp;diff=20"/>
		<updated>2019-03-13T13:07:10Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Allgemein==&lt;br /&gt;
In diesem Wiki werden Werkzeuge beschrieben, die von Graph-IT zu Verfügung gestellt werden, um eine durchgängige Digitalisierung zu erreichen.&lt;br /&gt;
&lt;br /&gt;
==Graph==&lt;br /&gt;
&lt;br /&gt;
[[Graph | Der Graph]]&lt;br /&gt;
&lt;br /&gt;
===Graphmodule===&lt;br /&gt;
&lt;br /&gt;
[[Graphmodul pr - Prozesse | pr - Prozesse]]&lt;br /&gt;
&lt;br /&gt;
==technische Infrastruktur==&lt;br /&gt;
&lt;br /&gt;
[[Server-Basissystem]]&lt;br /&gt;
&lt;br /&gt;
[[Lxdhost-Server]]&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Server-Basissystem&amp;diff=19</id>
		<title>Server-Basissystem</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Server-Basissystem&amp;diff=19"/>
		<updated>2019-03-13T10:27:29Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: Die Seite wurde neu angelegt: „==Allgemein== Das Ziel dieser Anleitung ist ein Ubuntu-Minimal-System mit folgenden Eigenschaften: Das System hat zwei System-Festplatten. Fällt eine der beid…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Allgemein==&lt;br /&gt;
Das Ziel dieser Anleitung ist ein Ubuntu-Minimal-System mit folgenden Eigenschaften: Das System hat zwei System-Festplatten. Fällt eine der beiden Festplatten aus, so funktioniert das System trotzdem ohne Beeinträchtigung weiter. Dies umfasst auch den Neustart. Ein Hot-Swap der Festplatten ist ebenfalls möglich.&lt;br /&gt;
&lt;br /&gt;
Ich habe keine Möglichkeit gefunden unter Ubuntu zwei EFI-Partionen synchron zu halten. Aus diesem Grund muss das System mit BIOS oder UEFI-Legacy gebootet werden.&lt;br /&gt;
&lt;br /&gt;
Als Partitionstabelle habe ich GPT gewählt. Für die zweite Stufe von GRUB braucht man dann eine zusätzliche kleine Partition vom Typ &amp;quot;BIOS boot&amp;quot;. Diese muss auf beiden Festplatten angelegt werden. Es wird eine Größe von 1MB empfohlen. Ein Dateisystem darf in dieser Partition nicht angelegt werden. Die Partion wird unter Ubuntu bei Installation und Update des Bootloaders automatisch aktualisiert und synchron gehalten.&lt;br /&gt;
&lt;br /&gt;
Die zweite Partition umfasst jeweils den Rest der Festplatte. Sie sollte den Typ &amp;quot;Linux LVM&amp;quot; haben. Die beiden großen Partition werden in einer LVM-Volume-Group zusammengefasst. In der Volume-Group wird dann ein Logical-Volume vom Typ raid1 angelegt. Das Logical-Volume muss nicht sehr groß sein, da nur ein Minimal-System installiert werden soll. Sollte der Platz knapp werden, so kann man das Logical-Volume und das enthaltene Dateisystem bis zu der Größe der kleineren Festplatte erweitern&lt;br /&gt;
&lt;br /&gt;
Als Dateisystem für das Logical-Volume wird BTRFS verwendet. Dies gestattet es, vor umfangreicheren Änderungen am Betriebsystem, Snapshots anzulegen.&lt;br /&gt;
&lt;br /&gt;
Das System wird nicht von einem Installationsmedium sondern mit debootstrap installiert. Deshalb kann zur Installation irgendein System verwendet werden, das mit den notwendigen Tools ausgestattet ist. Ich habe den Rechner mit dem Live-System von einem &amp;quot;Ubuntu Desktop 18.04&amp;quot;-Stick gebootet. So kann man einerseits beim Systemstart das Tastaturlayout wählen und andererseite diese Anleitung in einem Browser öffnen. &lt;br /&gt;
&lt;br /&gt;
==Voraussetzungen==&lt;br /&gt;
&lt;br /&gt;
Server mit 2 Systemfestplatten SSD im Wechselrahmen&lt;br /&gt;
USB Stick mit Ubuntu 18.04 Desktop zum Installieren&lt;br /&gt;
Netzwerk mit DHCP und Internetverbindung&lt;br /&gt;
&lt;br /&gt;
==Installation==&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Hauptseite&amp;diff=18</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Hauptseite&amp;diff=18"/>
		<updated>2019-03-13T09:37:54Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Allgemein==&lt;br /&gt;
In diesem Wiki werden Werkzeuge beschrieben, die von Graph-IT zu Verfügung gestellt werden, um eine durchgängige Digitalisierung zu erreichen.&lt;br /&gt;
&lt;br /&gt;
==Graph==&lt;br /&gt;
&lt;br /&gt;
[[Graph | Der Graph]]&lt;br /&gt;
&lt;br /&gt;
===Graphmodule===&lt;br /&gt;
&lt;br /&gt;
[[Graphmodul pr - Prozesse | pr - Prozesse]]&lt;br /&gt;
&lt;br /&gt;
==technische Infrastruktur==&lt;br /&gt;
&lt;br /&gt;
[[Server-Basissystem]]&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Prozessknoten_implementieren&amp;diff=17</id>
		<title>Prozessknoten implementieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Prozessknoten_implementieren&amp;diff=17"/>
		<updated>2019-03-10T12:57:36Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: /* Aktionfunktion prvalidieren */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Allgemein==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Struktur eines Prozessknotens==&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
*Aufgabe beginnen&lt;br /&gt;
*Aufgabe ausführen&lt;br /&gt;
*Aufgabe beenden&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Aufgabe beginnen==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Task beginnt durch das Ausführen der Aktionfunktion aubeginnen am Prozessknoten.&lt;br /&gt;
&lt;br /&gt;
==Aufgabe ausführen==&lt;br /&gt;
Dies ist der Variable Teil des Prozessknotens.&lt;br /&gt;
&lt;br /&gt;
===Beispiel: Ändern von Attributen===&lt;br /&gt;
Ein typisches Beispiel wäre das Ändern von Attributen an einem Knoten. Das folgende Beispiel gilt für eine Implementierung vom Prozessknoten ge00001 - &amp;quot;geObjekt Ausdehnung ändern&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nun wird eine Aktionfunktion ge00001_geobjekt geschrieben, welche durch ge00001_geobjekt und ge00001_prstatus getriggert wird:&lt;br /&gt;
&lt;br /&gt;
 $ge00001_prstatus=attribut($node_guid,&#039;ge00001_prstatus&#039;);&lt;br /&gt;
 if($ge00001_prstatus != &#039;begonnen&#039;){&lt;br /&gt;
   return 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 $geobjekt_guid=knoten($node_guid,&#039;geobjekt&#039;);&lt;br /&gt;
 $geobjekt=attribute($geobjekt_guid,&#039;geobjekt&#039;,&#039;breite, laenge, hoehe&#039;);&lt;br /&gt;
 setze($node_guid,&#039;ge00001_breitealt&#039;,$geobjekt[&#039;breite&#039;]);&lt;br /&gt;
 setze($node_guid,&#039;ge00001_breite&#039;,$geobjekt[&#039;breite&#039;]);&lt;br /&gt;
 setze($node_guid,&#039;ge00001_laengealt&#039;,$geobjekt[&#039;laenge&#039;]);&lt;br /&gt;
 setze($node_guid,&#039;ge00001_laenge&#039;,$geobjekt[&#039;laenge&#039;]);&lt;br /&gt;
 setze($node_guid,&#039;ge00001_hoehealt&#039;,$geobjekt[&#039;hoehe&#039;]);&lt;br /&gt;
 setze($node_guid,&#039;ge00001_hoehe&#039;,$geobjekt[&#039;hoehe&#039;]);&lt;br /&gt;
 return 1;&lt;br /&gt;
&lt;br /&gt;
Wie man sehen kann, wird diese Aktionfunktion nur ausgeführt, wenn der Status des Prozessknotens &amp;quot;begonnen&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;Textfeld&amp;quot; dargestellt werden, welche schreibgeschützt sind, wenn nicht gilt, dass das Attribut aubeendbar gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
Damit ist das Ausführen vollständig implementiert.&lt;br /&gt;
&lt;br /&gt;
==Aufgabe beenden==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===Aktionfunktion prvalidieren===&lt;br /&gt;
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 &amp;quot;beendet&amp;quot; steht. Das bedeutet, dass zum Beginn folgender Code stehen sollte (am Beispiel ge00001):&lt;br /&gt;
 $ge00001_prstatus=attribut($node_guid,&#039;ge00001_prstatus&#039;);&lt;br /&gt;
 if($ge00001_prstatus == &#039;beendet&#039;){&lt;br /&gt;
   return 1;&lt;br /&gt;
 }&lt;br /&gt;
 $fehler = [];&lt;br /&gt;
&lt;br /&gt;
In der Folge wird ein individueller Code erzeugt, der die gemachten Eingaben prüft, z.B. für ge00001:&lt;br /&gt;
&lt;br /&gt;
 if(!$ge00001[&#039;breite&#039;]){&lt;br /&gt;
   $fehler[]=&amp;quot;Breite ist nicht festgelegt&amp;quot;;  &lt;br /&gt;
 }&lt;br /&gt;
 if (!$ge00001[&#039;laenge&#039;]){&lt;br /&gt;
   $fehler[]=&amp;quot;Länge ist nicht festgelegt&amp;quot;;    &lt;br /&gt;
 } &lt;br /&gt;
 if (!$ge00001[&#039;hoehe&#039;]){&lt;br /&gt;
   $fehler[]=&amp;quot;Höhe ist nicht festgelegt&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Am Ende der Aktionfunktion werden dann möglichen Fehlermeldungen in das Attribut prfehler geschrieben, hier wieder für ge00001:&lt;br /&gt;
&lt;br /&gt;
 setze($node_guid,&#039;ge00001_prfehler&#039;,implode(&amp;quot;\n&amp;quot;,$fehler));&lt;br /&gt;
 return 1;&lt;br /&gt;
&lt;br /&gt;
In der Folge kann die Aktionfunktion prüfen, ob beim validieren Fehler aufgetreten sind.&lt;br /&gt;
&lt;br /&gt;
===Aktionfunktion prprojizieren===&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
 $ge00001_prstatus=attribut($node_guid,&#039;ge00001_prstatus&#039;);&lt;br /&gt;
 if($ge00001_prstatus != &#039;beendet&#039;){&lt;br /&gt;
   return 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 $geobjekt_guid=knoten($node_guid,&#039;geobjekt&#039;);&lt;br /&gt;
 if(!$geobjekt_guid){&lt;br /&gt;
   return 1;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Der erste Teil ist bei jedem Prozessknoten notwendig, der zweite prüft, ob der Zielknoten verknüpft ist, der verändert werden soll.&lt;br /&gt;
&lt;br /&gt;
Sind die Voraussetzungen erfüllt, werden die Änderungen in das funktionale Modell geschrieben und die Aktionfunktion beendet:&lt;br /&gt;
&lt;br /&gt;
 $ge00001=attribute($node_guid,&#039;ge00001&#039;,&#039;breite, laenge, hoehe&#039;);&lt;br /&gt;
 setze($geobjekt_guid,&#039;geobjekt_breite&#039;,$ge00001[&#039;breite&#039;]);&lt;br /&gt;
 setze($geobjekt_guid,&#039;geobjekt_laenge&#039;,$ge00001[&#039;laenge&#039;]);&lt;br /&gt;
 setze($geobjekt_guid,&#039;geobjekt_hoehe&#039;,$ge00001[&#039;hoehe&#039;]);&lt;br /&gt;
&lt;br /&gt;
Wurde die Aktionfunktion prprojizieren aufgerufen, ist die Aufgabe abgeschlossen.&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Prozessknoten_implementieren&amp;diff=16</id>
		<title>Prozessknoten implementieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Prozessknoten_implementieren&amp;diff=16"/>
		<updated>2019-03-10T11:34:50Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Allgemein==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Struktur eines Prozessknotens==&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
*Aufgabe beginnen&lt;br /&gt;
*Aufgabe ausführen&lt;br /&gt;
*Aufgabe beenden&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Aufgabe beginnen==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Task beginnt durch das Ausführen der Aktionfunktion aubeginnen am Prozessknoten.&lt;br /&gt;
&lt;br /&gt;
==Aufgabe ausführen==&lt;br /&gt;
Dies ist der Variable Teil des Prozessknotens.&lt;br /&gt;
&lt;br /&gt;
===Beispiel: Ändern von Attributen===&lt;br /&gt;
Ein typisches Beispiel wäre das Ändern von Attributen an einem Knoten. Das folgende Beispiel gilt für eine Implementierung vom Prozessknoten ge00001 - &amp;quot;geObjekt Ausdehnung ändern&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nun wird eine Aktionfunktion ge00001_geobjekt geschrieben, welche durch ge00001_geobjekt und ge00001_prstatus getriggert wird:&lt;br /&gt;
&lt;br /&gt;
 $ge00001_prstatus=attribut($node_guid,&#039;ge00001_prstatus&#039;);&lt;br /&gt;
 if($ge00001_prstatus != &#039;begonnen&#039;){&lt;br /&gt;
   return 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 $geobjekt_guid=knoten($node_guid,&#039;geobjekt&#039;);&lt;br /&gt;
 $geobjekt=attribute($geobjekt_guid,&#039;geobjekt&#039;,&#039;breite, laenge, hoehe&#039;);&lt;br /&gt;
 setze($node_guid,&#039;ge00001_breitealt&#039;,$geobjekt[&#039;breite&#039;]);&lt;br /&gt;
 setze($node_guid,&#039;ge00001_breite&#039;,$geobjekt[&#039;breite&#039;]);&lt;br /&gt;
 setze($node_guid,&#039;ge00001_laengealt&#039;,$geobjekt[&#039;laenge&#039;]);&lt;br /&gt;
 setze($node_guid,&#039;ge00001_laenge&#039;,$geobjekt[&#039;laenge&#039;]);&lt;br /&gt;
 setze($node_guid,&#039;ge00001_hoehealt&#039;,$geobjekt[&#039;hoehe&#039;]);&lt;br /&gt;
 setze($node_guid,&#039;ge00001_hoehe&#039;,$geobjekt[&#039;hoehe&#039;]);&lt;br /&gt;
 return 1;&lt;br /&gt;
&lt;br /&gt;
Wie man sehen kann, wird diese Aktionfunktion nur ausgeführt, wenn der Status des Prozessknotens &amp;quot;begonnen&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;Textfeld&amp;quot; dargestellt werden, welche schreibgeschützt sind, wenn nicht gilt, dass das Attribut aubeendbar gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
Damit ist das Ausführen vollständig implementiert.&lt;br /&gt;
&lt;br /&gt;
==Aufgabe beenden==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===Aktionfunktion prvalidieren===&lt;br /&gt;
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 &amp;quot;beendet&amp;quot; steht. Das bedeutet, dass zum Beginn folgender Code stehen sollte (am Beispiel ge00001):&lt;br /&gt;
 $ge00001_prstatus=attribut($node_guid,&#039;ge00001_prstatus&#039;);&lt;br /&gt;
 if($ge00001_prstatus == &#039;beendet&#039;){&lt;br /&gt;
   return 1;&lt;br /&gt;
 }&lt;br /&gt;
 $fehler = [];&lt;br /&gt;
&lt;br /&gt;
In der Folge wird ein individueller Code erzeugt, der die gemachten Eingaben prüft, z.B. für ge00001:&lt;br /&gt;
&lt;br /&gt;
 if(!$ge00001[&#039;breite&#039;]){&lt;br /&gt;
   $fehler[]=&amp;quot;Breite ist nicht festgelegt&amp;quot;;  &lt;br /&gt;
 }&lt;br /&gt;
 if (!$ge00001[&#039;laenge&#039;]){&lt;br /&gt;
   $fehler[]=&amp;quot;Länge ist nicht festgelegt&amp;quot;;    &lt;br /&gt;
 } &lt;br /&gt;
 if (!$ge00001[&#039;hoehe&#039;]){&lt;br /&gt;
   $fehler[]=&amp;quot;Höhe ist nicht festgelegt&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Am Ende der Aktionfunktion werden dann möglichen Fehlermeldungen in das Attribut prfehler geschrieben, hier wieder für ge00001:&lt;br /&gt;
&lt;br /&gt;
setze($node_guid,&#039;ge00001_prfehler&#039;,implode(&amp;quot;\n&amp;quot;,$fehler));&lt;br /&gt;
return 1;&lt;br /&gt;
&lt;br /&gt;
In der Folge kann die Aktionfunktion prüfen, ob beim validieren Fehler aufgetreten sind.&lt;br /&gt;
&lt;br /&gt;
===Aktionfunktion prprojizieren===&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
 $ge00001_prstatus=attribut($node_guid,&#039;ge00001_prstatus&#039;);&lt;br /&gt;
 if($ge00001_prstatus != &#039;beendet&#039;){&lt;br /&gt;
   return 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 $geobjekt_guid=knoten($node_guid,&#039;geobjekt&#039;);&lt;br /&gt;
 if(!$geobjekt_guid){&lt;br /&gt;
   return 1;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Der erste Teil ist bei jedem Prozessknoten notwendig, der zweite prüft, ob der Zielknoten verknüpft ist, der verändert werden soll.&lt;br /&gt;
&lt;br /&gt;
Sind die Voraussetzungen erfüllt, werden die Änderungen in das funktionale Modell geschrieben und die Aktionfunktion beendet:&lt;br /&gt;
&lt;br /&gt;
 $ge00001=attribute($node_guid,&#039;ge00001&#039;,&#039;breite, laenge, hoehe&#039;);&lt;br /&gt;
 setze($geobjekt_guid,&#039;geobjekt_breite&#039;,$ge00001[&#039;breite&#039;]);&lt;br /&gt;
 setze($geobjekt_guid,&#039;geobjekt_laenge&#039;,$ge00001[&#039;laenge&#039;]);&lt;br /&gt;
 setze($geobjekt_guid,&#039;geobjekt_hoehe&#039;,$ge00001[&#039;hoehe&#039;]);&lt;br /&gt;
&lt;br /&gt;
Wurde die Aktionfunktion prprojizieren aufgerufen, ist die Aufgabe abgeschlossen.&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Prozessknoten_implementieren&amp;diff=15</id>
		<title>Prozessknoten implementieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Prozessknoten_implementieren&amp;diff=15"/>
		<updated>2019-03-10T11:32:11Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Allgemein==&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Struktur eines Prozessknotens==&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
*Aufgabe beginnen&lt;br /&gt;
*Aufgabe ausführen&lt;br /&gt;
*Aufgabe beenden&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
==Aufgabe beginnen==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Der Task beginnt durch das Ausführen der Aktionfunktion aubeginnen am Prozessknoten.&lt;br /&gt;
&lt;br /&gt;
==Aufgabe ausführen==&lt;br /&gt;
Dies ist der Variable Teil des Prozessknotens.&lt;br /&gt;
&lt;br /&gt;
===Beispiel: Ändern von Attributen===&lt;br /&gt;
Ein typisches Beispiel wäre das Ändern von Attributen an einem Knoten. Das folgende Beispiel gilt für eine Implementierung vom Prozessknoten ge00001 - &amp;quot;geObjekt Ausdehnung ändern&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
Nun wird eine Aktionfunktion ge00001_geobjekt geschrieben, welche durch ge00001_geobjekt und ge00001_prstatus getriggert wird:&lt;br /&gt;
&lt;br /&gt;
 $ge00001_prstatus=attribut($node_guid,&#039;ge00001_prstatus&#039;);&lt;br /&gt;
 if($ge00001_prstatus != &#039;begonnen&#039;){&lt;br /&gt;
   return 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 $geobjekt_guid=knoten($node_guid,&#039;geobjekt&#039;);&lt;br /&gt;
 $geobjekt=attribute($geobjekt_guid,&#039;geobjekt&#039;,&#039;breite, laenge, hoehe&#039;);&lt;br /&gt;
 setze($node_guid,&#039;ge00001_breitealt&#039;,$geobjekt[&#039;breite&#039;]);&lt;br /&gt;
 setze($node_guid,&#039;ge00001_breite&#039;,$geobjekt[&#039;breite&#039;]);&lt;br /&gt;
 setze($node_guid,&#039;ge00001_laengealt&#039;,$geobjekt[&#039;laenge&#039;]);&lt;br /&gt;
 setze($node_guid,&#039;ge00001_laenge&#039;,$geobjekt[&#039;laenge&#039;]);&lt;br /&gt;
 setze($node_guid,&#039;ge00001_hoehealt&#039;,$geobjekt[&#039;hoehe&#039;]);&lt;br /&gt;
 setze($node_guid,&#039;ge00001_hoehe&#039;,$geobjekt[&#039;hoehe&#039;]);&lt;br /&gt;
 return 1;&lt;br /&gt;
&lt;br /&gt;
Wie man sehen kann, wird diese Aktionfunktion nur ausgeführt, wenn der Status des Prozessknotens &amp;quot;begonnen&amp;quot; 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.&lt;br /&gt;
&lt;br /&gt;
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 &amp;quot;Textfeld&amp;quot; dargestellt werden, welche schreibgeschützt sind, wenn nicht gilt, dass das Attribut aubeendbar gesetzt ist.&lt;br /&gt;
&lt;br /&gt;
Damit ist das Ausführen vollständig implementiert.&lt;br /&gt;
&lt;br /&gt;
==Aufgabe beenden==&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
===Aktionfunktion prvalidieren===&lt;br /&gt;
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 &amp;quot;beendet&amp;quot; steht. Das bedeutet, dass zum Beginn folgender Code stehen sollte (am Beispiel ge00001):&lt;br /&gt;
 $ge00001_prstatus=attribut($node_guid,&#039;ge00001_prstatus&#039;);&lt;br /&gt;
 if($ge00001_prstatus == &#039;beendet&#039;){&lt;br /&gt;
   return 1;&lt;br /&gt;
 }&lt;br /&gt;
 $fehler = [];&lt;br /&gt;
&lt;br /&gt;
In der Folge wird ein individueller Code erzeugt, der die gemachten Eingaben prüft, z.B. für ge00001:&lt;br /&gt;
&lt;br /&gt;
 if(!$ge00001[&#039;breite&#039;]){&lt;br /&gt;
   $fehler[]=&amp;quot;Breite ist nicht festgelegt&amp;quot;;  &lt;br /&gt;
 }&lt;br /&gt;
 if (!$ge00001[&#039;laenge&#039;]){&lt;br /&gt;
   $fehler[]=&amp;quot;Länge ist nicht festgelegt&amp;quot;;    &lt;br /&gt;
 } &lt;br /&gt;
 if (!$ge00001[&#039;hoehe&#039;]){&lt;br /&gt;
   $fehler[]=&amp;quot;Höhe ist nicht festgelegt&amp;quot;;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Am Ende der Aktionfunktion werden dann möglichen Fehlermeldungen in das Attribut prfehler geschrieben, hier wieder für ge00001:&lt;br /&gt;
&lt;br /&gt;
setze($node_guid,&#039;ge00001_prfehler&#039;,implode(&amp;quot;\n&amp;quot;,$fehler));&lt;br /&gt;
return 1;&lt;br /&gt;
&lt;br /&gt;
In der Folge kann die Aktionfunktion prüfen, ob beim validieren Fehler aufgetreten sind.&lt;br /&gt;
&lt;br /&gt;
===Aktionfunktion prprojizieren===&lt;br /&gt;
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):&lt;br /&gt;
&lt;br /&gt;
 $ge00001_prstatus=attribut($node_guid,&#039;ge00001_prstatus&#039;);&lt;br /&gt;
 if($ge00001_prstatus != &#039;beendet&#039;){&lt;br /&gt;
   return 1;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 $geobjekt_guid=knoten($node_guid,&#039;geobjekt&#039;);&lt;br /&gt;
 if(!$geobjekt_guid){&lt;br /&gt;
   return 1;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Der erste Teil ist bei jedem Prozessknoten notwendig, der zweite prüft, ob der Zielknoten verknüpft ist, der verändert werden soll.&lt;br /&gt;
&lt;br /&gt;
Sind die Voraussetzungen erfüllt, werden die Änderungen in das funktionale Modell geschrieben und die Aktionfunktion beendet:&lt;br /&gt;
&lt;br /&gt;
 $ge00001=attribute($node_guid,&#039;ge00001&#039;,&#039;breite, laenge, hoehe&#039;);&lt;br /&gt;
 setze($geobjekt_guid,&#039;geobjekt_breite&#039;,$ge00001[&#039;breite&#039;]);&lt;br /&gt;
 setze($geobjekt_guid,&#039;geobjekt_laenge&#039;,$ge00001[&#039;laenge&#039;]);&lt;br /&gt;
 setze($geobjekt_guid,&#039;geobjekt_hoehe&#039;,$ge00001[&#039;hoehe&#039;]);&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Prozessknoten_implementieren&amp;diff=14</id>
		<title>Prozessknoten implementieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Prozessknoten_implementieren&amp;diff=14"/>
		<updated>2019-03-10T10:36:31Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: Die Seite wurde neu angelegt: „Dieser Beitrag ist nicht freigegeben.“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Beitrag ist nicht freigegeben.&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Knoten_prtask&amp;diff=13</id>
		<title>Knoten prtask</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Knoten_prtask&amp;diff=13"/>
		<updated>2019-03-10T10:35:56Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Allgemein==&lt;br /&gt;
Der Knoten prTask dient dazu Aufgabentypen zu definieren. Ein prTask gehört immer zu einem bestimmten Graphmodul und kann so zwischen Graphen über den Aktualisierungsprozess ausgetauscht werden. Der Name des prTasks wird aus dem Präfix des Graphmoduls und einer pro Graphmodul vorlaufenden Nummer erzeugt. Der prTask hat darüber hinaus eine Menschen lesbare Bezeichnung. Diese ist als kurze Überschrift zu dem Task zu verstehen. Sie wird von den Templates verwendet um Formular und Grid Beschriftungen zu generieren. Ein prTask hat eine oder mehrere prTaskversionen. Der Knoten prTaskversion enthält das Attribut Beschreibung in welchem die einzelnen Arbeitsschritte der Aufgabe in von Menschen lesbarer Form gespeichert werden. Dies ist die eigentliche Definition des Aufgabe. Ein prTask gilt als aktiv, wenn genau eine verknüpfte prTaskversion aktiv ist. Dies bedeutet das neue Aufgaben nach dieser Definition abgearbeitet werden sollen. Die prTaskversionen zu einem prTask sollten sich nicht allzu sehr unterscheiden. Weicht eine gewünschte Aufgabendefinition sehr von der bestehenden ab, so sollte besser eine neue prTask-Instanz angelegt werden.&lt;br /&gt;
&lt;br /&gt;
Nach dem Anlegen einer prTask-Instanz folgt die [[Prozessknoten implementieren | Implementierung]] den durch die Instanz erzeugten Knotens. Der Knoten ist Bestandteil des Prozessteils des Graphen und nicht des funktionalen Modells.&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Knoten_prtask&amp;diff=12</id>
		<title>Knoten prtask</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Knoten_prtask&amp;diff=12"/>
		<updated>2019-03-10T10:29:27Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: Die Seite wurde neu angelegt: „Dieser Beitrag ist nicht freigegeben“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Beitrag ist nicht freigegeben&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Graphmodul_pr_-_Prozesse&amp;diff=11</id>
		<title>Graphmodul pr - Prozesse</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Graphmodul_pr_-_Prozesse&amp;diff=11"/>
		<updated>2019-03-10T10:28:54Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: /* Der Knoten prTask(version) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Allgemein==&lt;br /&gt;
&lt;br /&gt;
Das Graphmodul pr - prozesse stellt Knoten zur Verfügung um Aufgabentypen zu definieren und zu versionieren, und den Kreis der Personen festzulegen die Aufgaben dieses Typs ausführen dürfen. Es stellt Templates bereit mit denen zu Aufgabentypen erweiterbare Knoten und Formulare generiert werden können. Es bietet außerdem die Möglichkeit allgemeine Ereignisse die während der Abarbeitung einer Aufgaben auftreten zu protokollieren und aus diesem Protokoll Laufzeiten zu berechnen.&lt;br /&gt;
&lt;br /&gt;
==Die Aufgabe==&lt;br /&gt;
&lt;br /&gt;
Eine Aufgabe ist eine Tätigkeit die von einer Person in einem Zug ohne Unterbrechung durchgeführt wird. Die Aufgabe hat einen bestimmten Typ der von einem bestimmten Personenkreis ausgeführt werden darf. Sie wird zu einem Zeitpunkt A begonnen und zu einem späteren Zeitpunkt B beendet.&lt;br /&gt;
&lt;br /&gt;
==Der Knoten prTask(version)==&lt;br /&gt;
&lt;br /&gt;
Der Knoten [[Knoten prtask | prTask]] dient dazu Aufgabentypen zu definieren. Ein prTask gehört immer zu einem bestimmten Graphmodul und kann so zwischen Graphen über den Aktualisierungsprozess ausgetauscht werden. Der Name des prTasks wird aus dem Präfix des Graphmoduls und einer pro Graphmodul vorlaufenden Nummer erzeugt. Der prTask hat darüber hinaus eine Menschen lesbare Bezeichnung. Diese ist als kurze Überschrift zu dem Task zu verstehen. Sie wird von den Templates verwendet um Formular und Grid Beschriftungen zu generieren. Ein prTask hat eine oder mehrere prTaskversionen. Der Knoten prTaskversion enthält das Attribut Beschreibung in welchem die einzelnen Arbeitsschritte der Aufgabe in von Menschen lesbarer Form gespeichert werden. Dies ist die eigentliche Definition des Aufgabe. Ein prTask gilt als aktiv, wenn genau eine verknüpfte prTaskversion aktiv ist. Dies bedeutet das neue Aufgaben nach dieser Definition abgearbeitet werden sollen. Die prTaskversionen zu einem prTask sollten sich nicht allzu sehr unterscheiden. Weicht eine gewünschte Aufgabendefinition sehr von der bestehenden ab, so sollte besser eine neue prTask-Instanz angelegt werden.&lt;br /&gt;
&lt;br /&gt;
==Der Knoten prPerson==&lt;br /&gt;
&lt;br /&gt;
Im Knoten prPerson werden Personen definiert die Aufgaben eines bestimmten Typs ausführen dürfen. Die prPerson hat nur einen Namen und Verknüpfungen zu den prTask-Instanzen die diese Person durchführen darf. Die prPerson kann darüber hinaus mit einem Autobenutzer verknüpft werden. Diese Verknüpfung wird von den durch Templates generierten Knoten, Formularen und Aktionen dazu verwendet die prPerson-Instanz des Autobenutzer automatisch mit der bearbeiteten Aufgabe-Instanz zu verknüpfen.&lt;br /&gt;
&lt;br /&gt;
==Die Aufgabe-Knoten==&lt;br /&gt;
&lt;br /&gt;
Die Aktionfunktion prtask_aktualisiereknoten aktualisiert zu dem prTask gehörenden Aufgabe-Knoten. Der Name des prTask wird dabei als Knotentyp verwendet. Die Instanzen des generierten Knoten stellen dann Aufgaben des durch die prTask-Instanz definierten Aufgabentyps dar. Die generierten Aufgabe-Knoten haben zunächst folgende Attribute und Aktionen:&lt;br /&gt;
&lt;br /&gt;
    Die datetime Attribute ‚angelegtam‘, ‚begonnenam‘, ‚pausiertam‘, ‚fortgesetztam‘ und ‚beendetam‘&lt;br /&gt;
&lt;br /&gt;
    Das string Attribut ‚prstatus‘, welches die Werte ‚angelegt‘, ‚begonnen‘, ‚pausiert‘ und ‚beendet‘ annehmen kann&lt;br /&gt;
&lt;br /&gt;
    Das string Attribut ‚prperson‘, welches die prPerson-Instanz refenreziert, welche die Aufgabe durchgeführt hat&lt;br /&gt;
&lt;br /&gt;
    Das text Attribut ‚prfehler‘, in welchem Fehler ausgegeben werde können&lt;br /&gt;
&lt;br /&gt;
    Das string Attribut ‚pruuid‘, in welchem eine eindeutige ID für die Aufgabe abgelegt wird&lt;br /&gt;
&lt;br /&gt;
    Das string Attribut ‚name‘ ist ein Alias von ‚prangelegtam‘ solange das Attribut ‚pruuid‘ nicht gesetzt ist. Danach ist es ein Alias von ‚pruuid‘.&lt;br /&gt;
&lt;br /&gt;
    Die lifecycle-Aktion ‚pranlegen‘, welche durch das Attribut ‚name‘ getriggert wird. Die Aktion prüft zunächst, ob das Attribut ‚prstatus‘ leer ist. Ist dies nicht der Fall so bricht die Aktion ab. Die Attribute ‚prangelegtam‘ und ‚pruuid‘ werden initialisiert und das Attribut ‚prstatus‘ auf ‚angelegt‘ gesetzt.&lt;br /&gt;
&lt;br /&gt;
    Die lifecycle-Aktion ‚prbeginnen‘. Sie bricht ab wenn das Attribut ‚prStatus‘ nicht den Wert ‚angelegt‘ hat. Sie überprüft dann ob die durch das Attribut ‚prperson‘ referenzierte ‚prperson‘-Instanz die Aufgabe ausführen darf. Wenn ja dann wird das Attribut ‚prbegonnenam‘ gesetzt und das Attribut ‚prstatus‘ auf den Wert ‚begonnen‘ aktualisiert.&lt;br /&gt;
&lt;br /&gt;
    Die lifecycle-Aktion ‚prpausieren‘ bricht ab wenn das Attribut ‚prstatus‘ nicht den Wert ‚begonnen‘ hat. Sonst wird das Attribut ‚prpausiertam‘ gesetzt und das Attribut ‚prstatus‘ auf den Wert ‚pausiert‘ aktualisiert.&lt;br /&gt;
&lt;br /&gt;
    Die lifecycle-Aktion ‚prfortsetzen‘ bricht ab wenn das Attribut ‚prstatus‘ nicht den Wert ‚pausiert‘ hat. Sonst wird das Attribut ‚prfortgesetztam‘ gesetzt und das Attribut ‚prstatus‘ auf den Wert ‚begonnen‘ aktualisiert.&lt;br /&gt;
&lt;br /&gt;
    Die lifecycle-Aktion ‚prbeenden‘ bricht ab wenn das Attribut ‚prstatus‘ nicht den Wert ‚begonnen‘ hat. Sonst wird das Attribut ‚prbeendetam‘ gesetzt und das Attribut ‚prstatus‘ auf den Wert ‚beendet‘ aktualisiert.&lt;br /&gt;
&lt;br /&gt;
    Die Aktion ‚prvalidieren‘, welche durch die Aktion ‚prbeenden‘ getriggert wird. Ihre Aufgabe ist es zu prüfen ob die Werte in der Instanz gültig sind. Sind sie es nicht so muss sie das Attribut ‚prfehler‘ befüllen. Die Aktion darf nur lesend auf den Graphen zugreifen und darf bis auf das Setzen des Attributes ‚prfehler‘ keine Seiteneffekte haben.&lt;br /&gt;
&lt;br /&gt;
    Die Aktion ‚prprojizieren‘, welche durch die Aktion ‚prbeenden‘ getriggert wird. Ihre Aufgabe ist es die Werte in der Instanz auf den restlichen Graphen abzubilden. Sie darf aber keine Werte in der Instanz selbst ändern.&lt;br /&gt;
&lt;br /&gt;
    Die Aktion ‚prloeschen‘, welche durch die Aktion ‚loeschen‘ getriggert wird. Ihre Aufgabe ist es abhängige Instanzen der Aufgabe zu löschen.&lt;br /&gt;
&lt;br /&gt;
Die lifecycle-Aktionen und die Aktion ‚loeschen‘ erzeugen darüber hinaus jeweils eine ‚prereignis‘-Instanz, in welcher der Statuswechsel dokumentiert wird. Der Programmierer ergänzt und verwendet den Aufgabe-Knoten. Dies geschieht zunächst in den Aktionen ‚prvalidieren‘, ‚prprojizieren‘ und ‚prloeschen‘. Diese sind zunächst ungültig, da sie keinen Programmcode enthalten. Darüber hinaus können zusätzliche Attribute, Aktionen, Verknüpfungen und Hilfsknoten angelegt werden.&lt;br /&gt;
&lt;br /&gt;
    Die zusätzlichen Aktionen an dem Aufgabe-Knoten zerfallen in die zwei Kategorien ‚Vorbereiten‘ und ‚Projizieren‘&lt;br /&gt;
&lt;br /&gt;
    Die Aktionen der Kategorie ‚Vorbereiten‘ dürfen nur auf Instanzen arbeiten die nicht im Status ‚beendet‘ sind. Sie dürfen Verknüpfungen zu benachbarten Knoten herstellen und Daten aus dem Rest des Graphen in die Instanz kopieren. Sie dürfen an der Instanz Aktionen der Kategorie ‚Vorbereiten‘ ausführen. Sie dürfen keine anderen Änderungen am Graphen vornehmen. Konzeptionell gehört die Aktion ‚prvalidieren‘ in diese Kategorie.&lt;br /&gt;
&lt;br /&gt;
    Die Aktionen der Kategorie ‚Projizieren‘ dürfen nur auf Instanzen arbeiten die im Status ‚beendet‘ sind. Sie dürfen Verknüpfungen zu benachbarten Knoten herstellen, aber keine weiteren Änderungen an der Instanz durchführen. Sie dürfen an der Instanz Aktionen der Kategorie ‚Projizieren‘ ausführen. Die Aktionen der Kategorie ‚Projizieren‘ dürfen nur ein mal pro Instanz aufgerufen werden. Konzeptionell gehört die Aktion ‚prprojizieren‘ in diese Kategorie.&lt;br /&gt;
&lt;br /&gt;
    Für zusätzliche Datenfunktionen an dem Aufgabe-Knoten gilt, dass sie von den benachbarten Knoten nur das Primärattribut auslesen dürfen. Werden an dem Aufgabe-Knoten weitere Daten aus den benachbarten Knoten benötigt so müssen diese durch Aktionen aus der Kategorie ‚Vorbereiten‘ kopiert werden.&lt;br /&gt;
&lt;br /&gt;
    Aufgabe-Knoten dürfen nur in Aktionen und Datenfunktionen anderer Aufgabe-Knoten referenziert werden. Eine Instanz im Status ‚beendet‘ darf nicht verändert werden.&lt;br /&gt;
&lt;br /&gt;
    Hilfsknoten haben eine ‚zu 1‘-Verknüpfung zu ihren Aufgabe-Knoten. Sie sind konzeptionell identisch mit dem Aufgabe-Knoten und unterliegen damit gleichen Einschränkungen. Ihre Typ hat als Präfix den Typ des Aufgabe-Knoten.&lt;br /&gt;
&lt;br /&gt;
==Das Aufgabe-Fomular==&lt;br /&gt;
&lt;br /&gt;
Die Aktionfunktion prtask_generiereformular generiert zu dem prTask ein Formular in der Auto-Oberfläche. Dieses kann als Ausgangspunkt für das Aufgabe-Fomular dienen. Es hat bereits Schaltflächen für die lifecycle-Aktionen ‚beginnen‘, ‚pausieren‘, ‚fortsetzen‘ und ‚beenden‘. Die Schaltfläche ‚beginnen‘ ruft die neue Aktion ‚aubeginnen‘ auf, welche versucht zu dem aktuellen Autobenutzer ein prPerson-Instanz zu ermitteln, deren Name in das Attribut ‚prperson‘ setzt und die Aktion ‚prbeginnen‘ aufruft. Um die Schaltflächen korrekt zu deaktivieren werden auch noch die Attribute ‚aubeginbar‘, ‚aupausierbar‘, ‚aufortsetzbar‘ und ‚aubeendbar‘ angelegt.&lt;br /&gt;
&lt;br /&gt;
==Die Knoten prAufgabe und prEreignis==&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Graphmodul_pr_-_Prozesse&amp;diff=10</id>
		<title>Graphmodul pr - Prozesse</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Graphmodul_pr_-_Prozesse&amp;diff=10"/>
		<updated>2019-03-10T07:38:02Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: Die Seite wurde neu angelegt: „==Allgemein==  Das Graphmodul pr - prozesse stellt Knoten zur Verfügung um Aufgabentypen zu definieren und zu versionieren, und den Kreis der Personen festzul…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Allgemein==&lt;br /&gt;
&lt;br /&gt;
Das Graphmodul pr - prozesse stellt Knoten zur Verfügung um Aufgabentypen zu definieren und zu versionieren, und den Kreis der Personen festzulegen die Aufgaben dieses Typs ausführen dürfen. Es stellt Templates bereit mit denen zu Aufgabentypen erweiterbare Knoten und Formulare generiert werden können. Es bietet außerdem die Möglichkeit allgemeine Ereignisse die während der Abarbeitung einer Aufgaben auftreten zu protokollieren und aus diesem Protokoll Laufzeiten zu berechnen.&lt;br /&gt;
&lt;br /&gt;
==Die Aufgabe==&lt;br /&gt;
&lt;br /&gt;
Eine Aufgabe ist eine Tätigkeit die von einer Person in einem Zug ohne Unterbrechung durchgeführt wird. Die Aufgabe hat einen bestimmten Typ der von einem bestimmten Personenkreis ausgeführt werden darf. Sie wird zu einem Zeitpunkt A begonnen und zu einem späteren Zeitpunkt B beendet.&lt;br /&gt;
&lt;br /&gt;
==Der Knoten prTask(version)==&lt;br /&gt;
&lt;br /&gt;
Der Knoten prTask dient dazu Aufgabentypen zu definieren. Ein prTask gehört immer zu einem bestimmten Graphmodul und kann so zwischen Graphen über den Aktualisierungsprozess ausgetauscht werden. Der Name des prTasks wird aus dem Präfix des Graphmoduls und einer pro Graphmodul vorlaufenden Nummer erzeugt. Der prTask hat darüber hinaus eine Menschen lesbare Bezeichnung. Diese ist als kurze Überschrift zu dem Task zu verstehen. Sie wird von den Templates verwendet um Formular und Grid Beschriftungen zu generieren. Ein prTask hat eine oder mehrere prTaskversionen. Der Knoten prTaskversion enthält das Attribut Beschreibung in welchem die einzelnen Arbeitsschritte der Aufgabe in von Menschen lesbarer Form gespeichert werden. Dies ist die eigentliche Definition des Aufgabe. Ein prTask gilt als aktiv, wenn genau eine verknüpfte prTaskversion aktiv ist. Dies bedeutet das neue Aufgaben nach dieser Definition abgearbeitet werden sollen. Die prTaskversionen zu einem prTask sollten sich nicht allzu sehr unterscheiden. Weicht eine gewünschte Aufgabendefinition sehr von der bestehenden ab, so sollte besser eine neue prTask-Instanz angelegt werden.&lt;br /&gt;
&lt;br /&gt;
==Der Knoten prPerson==&lt;br /&gt;
&lt;br /&gt;
Im Knoten prPerson werden Personen definiert die Aufgaben eines bestimmten Typs ausführen dürfen. Die prPerson hat nur einen Namen und Verknüpfungen zu den prTask-Instanzen die diese Person durchführen darf. Die prPerson kann darüber hinaus mit einem Autobenutzer verknüpft werden. Diese Verknüpfung wird von den durch Templates generierten Knoten, Formularen und Aktionen dazu verwendet die prPerson-Instanz des Autobenutzer automatisch mit der bearbeiteten Aufgabe-Instanz zu verknüpfen.&lt;br /&gt;
&lt;br /&gt;
==Die Aufgabe-Knoten==&lt;br /&gt;
&lt;br /&gt;
Die Aktionfunktion prtask_aktualisiereknoten aktualisiert zu dem prTask gehörenden Aufgabe-Knoten. Der Name des prTask wird dabei als Knotentyp verwendet. Die Instanzen des generierten Knoten stellen dann Aufgaben des durch die prTask-Instanz definierten Aufgabentyps dar. Die generierten Aufgabe-Knoten haben zunächst folgende Attribute und Aktionen:&lt;br /&gt;
&lt;br /&gt;
    Die datetime Attribute ‚angelegtam‘, ‚begonnenam‘, ‚pausiertam‘, ‚fortgesetztam‘ und ‚beendetam‘&lt;br /&gt;
&lt;br /&gt;
    Das string Attribut ‚prstatus‘, welches die Werte ‚angelegt‘, ‚begonnen‘, ‚pausiert‘ und ‚beendet‘ annehmen kann&lt;br /&gt;
&lt;br /&gt;
    Das string Attribut ‚prperson‘, welches die prPerson-Instanz refenreziert, welche die Aufgabe durchgeführt hat&lt;br /&gt;
&lt;br /&gt;
    Das text Attribut ‚prfehler‘, in welchem Fehler ausgegeben werde können&lt;br /&gt;
&lt;br /&gt;
    Das string Attribut ‚pruuid‘, in welchem eine eindeutige ID für die Aufgabe abgelegt wird&lt;br /&gt;
&lt;br /&gt;
    Das string Attribut ‚name‘ ist ein Alias von ‚prangelegtam‘ solange das Attribut ‚pruuid‘ nicht gesetzt ist. Danach ist es ein Alias von ‚pruuid‘.&lt;br /&gt;
&lt;br /&gt;
    Die lifecycle-Aktion ‚pranlegen‘, welche durch das Attribut ‚name‘ getriggert wird. Die Aktion prüft zunächst, ob das Attribut ‚prstatus‘ leer ist. Ist dies nicht der Fall so bricht die Aktion ab. Die Attribute ‚prangelegtam‘ und ‚pruuid‘ werden initialisiert und das Attribut ‚prstatus‘ auf ‚angelegt‘ gesetzt.&lt;br /&gt;
&lt;br /&gt;
    Die lifecycle-Aktion ‚prbeginnen‘. Sie bricht ab wenn das Attribut ‚prStatus‘ nicht den Wert ‚angelegt‘ hat. Sie überprüft dann ob die durch das Attribut ‚prperson‘ referenzierte ‚prperson‘-Instanz die Aufgabe ausführen darf. Wenn ja dann wird das Attribut ‚prbegonnenam‘ gesetzt und das Attribut ‚prstatus‘ auf den Wert ‚begonnen‘ aktualisiert.&lt;br /&gt;
&lt;br /&gt;
    Die lifecycle-Aktion ‚prpausieren‘ bricht ab wenn das Attribut ‚prstatus‘ nicht den Wert ‚begonnen‘ hat. Sonst wird das Attribut ‚prpausiertam‘ gesetzt und das Attribut ‚prstatus‘ auf den Wert ‚pausiert‘ aktualisiert.&lt;br /&gt;
&lt;br /&gt;
    Die lifecycle-Aktion ‚prfortsetzen‘ bricht ab wenn das Attribut ‚prstatus‘ nicht den Wert ‚pausiert‘ hat. Sonst wird das Attribut ‚prfortgesetztam‘ gesetzt und das Attribut ‚prstatus‘ auf den Wert ‚begonnen‘ aktualisiert.&lt;br /&gt;
&lt;br /&gt;
    Die lifecycle-Aktion ‚prbeenden‘ bricht ab wenn das Attribut ‚prstatus‘ nicht den Wert ‚begonnen‘ hat. Sonst wird das Attribut ‚prbeendetam‘ gesetzt und das Attribut ‚prstatus‘ auf den Wert ‚beendet‘ aktualisiert.&lt;br /&gt;
&lt;br /&gt;
    Die Aktion ‚prvalidieren‘, welche durch die Aktion ‚prbeenden‘ getriggert wird. Ihre Aufgabe ist es zu prüfen ob die Werte in der Instanz gültig sind. Sind sie es nicht so muss sie das Attribut ‚prfehler‘ befüllen. Die Aktion darf nur lesend auf den Graphen zugreifen und darf bis auf das Setzen des Attributes ‚prfehler‘ keine Seiteneffekte haben.&lt;br /&gt;
&lt;br /&gt;
    Die Aktion ‚prprojizieren‘, welche durch die Aktion ‚prbeenden‘ getriggert wird. Ihre Aufgabe ist es die Werte in der Instanz auf den restlichen Graphen abzubilden. Sie darf aber keine Werte in der Instanz selbst ändern.&lt;br /&gt;
&lt;br /&gt;
    Die Aktion ‚prloeschen‘, welche durch die Aktion ‚loeschen‘ getriggert wird. Ihre Aufgabe ist es abhängige Instanzen der Aufgabe zu löschen.&lt;br /&gt;
&lt;br /&gt;
Die lifecycle-Aktionen und die Aktion ‚loeschen‘ erzeugen darüber hinaus jeweils eine ‚prereignis‘-Instanz, in welcher der Statuswechsel dokumentiert wird. Der Programmierer ergänzt und verwendet den Aufgabe-Knoten. Dies geschieht zunächst in den Aktionen ‚prvalidieren‘, ‚prprojizieren‘ und ‚prloeschen‘. Diese sind zunächst ungültig, da sie keinen Programmcode enthalten. Darüber hinaus können zusätzliche Attribute, Aktionen, Verknüpfungen und Hilfsknoten angelegt werden.&lt;br /&gt;
&lt;br /&gt;
    Die zusätzlichen Aktionen an dem Aufgabe-Knoten zerfallen in die zwei Kategorien ‚Vorbereiten‘ und ‚Projizieren‘&lt;br /&gt;
&lt;br /&gt;
    Die Aktionen der Kategorie ‚Vorbereiten‘ dürfen nur auf Instanzen arbeiten die nicht im Status ‚beendet‘ sind. Sie dürfen Verknüpfungen zu benachbarten Knoten herstellen und Daten aus dem Rest des Graphen in die Instanz kopieren. Sie dürfen an der Instanz Aktionen der Kategorie ‚Vorbereiten‘ ausführen. Sie dürfen keine anderen Änderungen am Graphen vornehmen. Konzeptionell gehört die Aktion ‚prvalidieren‘ in diese Kategorie.&lt;br /&gt;
&lt;br /&gt;
    Die Aktionen der Kategorie ‚Projizieren‘ dürfen nur auf Instanzen arbeiten die im Status ‚beendet‘ sind. Sie dürfen Verknüpfungen zu benachbarten Knoten herstellen, aber keine weiteren Änderungen an der Instanz durchführen. Sie dürfen an der Instanz Aktionen der Kategorie ‚Projizieren‘ ausführen. Die Aktionen der Kategorie ‚Projizieren‘ dürfen nur ein mal pro Instanz aufgerufen werden. Konzeptionell gehört die Aktion ‚prprojizieren‘ in diese Kategorie.&lt;br /&gt;
&lt;br /&gt;
    Für zusätzliche Datenfunktionen an dem Aufgabe-Knoten gilt, dass sie von den benachbarten Knoten nur das Primärattribut auslesen dürfen. Werden an dem Aufgabe-Knoten weitere Daten aus den benachbarten Knoten benötigt so müssen diese durch Aktionen aus der Kategorie ‚Vorbereiten‘ kopiert werden.&lt;br /&gt;
&lt;br /&gt;
    Aufgabe-Knoten dürfen nur in Aktionen und Datenfunktionen anderer Aufgabe-Knoten referenziert werden. Eine Instanz im Status ‚beendet‘ darf nicht verändert werden.&lt;br /&gt;
&lt;br /&gt;
    Hilfsknoten haben eine ‚zu 1‘-Verknüpfung zu ihren Aufgabe-Knoten. Sie sind konzeptionell identisch mit dem Aufgabe-Knoten und unterliegen damit gleichen Einschränkungen. Ihre Typ hat als Präfix den Typ des Aufgabe-Knoten.&lt;br /&gt;
&lt;br /&gt;
==Das Aufgabe-Fomular==&lt;br /&gt;
&lt;br /&gt;
Die Aktionfunktion prtask_generiereformular generiert zu dem prTask ein Formular in der Auto-Oberfläche. Dieses kann als Ausgangspunkt für das Aufgabe-Fomular dienen. Es hat bereits Schaltflächen für die lifecycle-Aktionen ‚beginnen‘, ‚pausieren‘, ‚fortsetzen‘ und ‚beenden‘. Die Schaltfläche ‚beginnen‘ ruft die neue Aktion ‚aubeginnen‘ auf, welche versucht zu dem aktuellen Autobenutzer ein prPerson-Instanz zu ermitteln, deren Name in das Attribut ‚prperson‘ setzt und die Aktion ‚prbeginnen‘ aufruft. Um die Schaltflächen korrekt zu deaktivieren werden auch noch die Attribute ‚aubeginbar‘, ‚aupausierbar‘, ‚aufortsetzbar‘ und ‚aubeendbar‘ angelegt.&lt;br /&gt;
&lt;br /&gt;
==Die Knoten prAufgabe und prEreignis==&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Hauptseite&amp;diff=9</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Hauptseite&amp;diff=9"/>
		<updated>2019-03-10T07:33:04Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Allgemein==&lt;br /&gt;
In diesem Wiki werden Werkzeuge beschrieben, die von Graph-IT zu Verfügung gestellt werden, um eine durchgängige Digitalisierung zu erreichen.&lt;br /&gt;
&lt;br /&gt;
==Graph==&lt;br /&gt;
&lt;br /&gt;
[[Graph | Der Graph]]&lt;br /&gt;
&lt;br /&gt;
==Graphmodule==&lt;br /&gt;
&lt;br /&gt;
[[Graphmodul pr - Prozesse | pr - Prozesse]]&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Graph&amp;diff=5</id>
		<title>Graph</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Graph&amp;diff=5"/>
		<updated>2019-03-02T16:00:46Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wenn wir uns ein digitales Unternehmen vorstellen wie einen Menschen, dann stellt der Graph stellt das Gehirn des digitalen Unternehmens dar. Hier werden sowohl Informationen gespeichert als auch Entscheidungen getroffen. Damit der Graph mit der Umwelt kommunizieren kann, muss es eine Schnittstelle geben. Deshalb besteht der Graph aus zwei Teilen. Der erste Teil stellt den Kern des Graphen dar, das funktionale Modell. Der zweite Teil des Graphen bildet die Schnittstelle zur realen Welt, damit eine Interaktion mit dem Modell möglich wird. Dieser Teil ist der Prozessteil des Graphen. In diesem Kapitel wird beschrieben, wie das System generell funktioniert, während später auf die konkrete Implementierung eingegangen wird.&lt;br /&gt;
&lt;br /&gt;
==Idee==&lt;br /&gt;
&lt;br /&gt;
Ein Unternehmen ist ein sehr komplexes System. Es besteht aus vielen verschiedenen einzelnen Komponenten, welche miteinander und mit der Außenwelt kommunizieren. Außerdem ist ein Unternehmen durch innere und äußere Einflüsse einem permanenten Wandel unterzogen. Ein Beispiel hierfür ist ein einfacher Geschäftsvorfall, wie er in der Praxis üblich ist, wie eine Kundenbestellung. Diese Kommunikation mit der Außenwelt mit der Vertriebsabteilung erzeugt zahllose Aktivitäten im Unternehmen, welche eine Kommunikation innerhalb des Unternehmens und nach außen erzeugen. Bei dieser Kommunikation entstehen viele Daten, welche für das Unternehmen relevant sind. So führt die Kundenbestellung möglicherweise dazu, dass die Logistik den Auftrag zur Auslieferung bekommt, eine Bestellung beim Lieferanten ausgelöst wird und am Ende die Finanzabteilung die Zahlung des Kunden verbuchen muss. Außerdem verändert sich ein Unternehmen, es werden neue Produkte und Dienstleistungen angeboten, gesetzliche Rahmenbedingungen ändern sich, welche das Unternehmen betreffen oder eine Restrukturierung des Unternehmens wird durchgeführt, indem eine neue Abteilung mit neuen Aufgaben gegründet wird.&lt;br /&gt;
&lt;br /&gt;
Damit ein ausreichend genaues digitales Abbild des Unternehmens geschaffen werden kann, benötigt man eine passende Datenstruktur. Es gibt nun verschiedene Anforderungen, welche die Datenstruktur erfüllen muss. Die Daten müssen so abgelegt werden, dass man sie wiederfinden kann und die Struktur muss flexibel genug sein, dass man sie entsprechend der Notwendigkeit anpassen kann. Außerdem muss es eine Schnittstelle geben, mit der Informationen mit der Datenstruktur ausgetauscht werden können. Ein weiterer Aspekt ist, dass benötigte Informationen ausreichend schnell aus der Datenstruktur ausgelesen werden können.&lt;br /&gt;
&lt;br /&gt;
Das funktionale Modell des Graphen enthält alle Elemente, damit das digitale Abbild des Unternehmens hinreichend erzeugt werden kann und der Prozessteil des Graphen sorgt dafür, dass die Datenstruktur mit der Umwelt kommunizieren kann.&lt;br /&gt;
&lt;br /&gt;
==Das funktionale Modell==&lt;br /&gt;
&lt;br /&gt;
Funktionale Programmiersprachen bieten die Möglichkeit, sehr komplexe Datenstrukturen zu erschaffen, welche konsistent formuliert werden können. Das Modell ist damit wirkungsfrei. Probleme, welche die Skalierung von Datenstrukturen in herkömmlichen Systemen behindern, treten hier nicht auf. Die Grundidee des funktionalen Modells ist, das wir immer einen diskreten Zustand der Welt betrachten. Soll das Abbild geändert werden, so wird der nächste diskrete Zustand des Abbildes errechnet. Im wesentlichen kann das als Grundprinzip des funktionalen Modells betrachtet werden. Konkret besteht das funktionale Modell aus Knoten, die über Kanten, wir nennen sie Verknüpfungen, verbunden sind. Gibt es zwischen zwei Knoten eine Kante, so besteht diese aus zwei gerichteten Verknüpfungen. Jeder Knoten kann beliebig viele Attribute, wir nennen sie Attributknoten, besitzen. Ein Knoten ist jedoch typisiert, so dass  für einen bestimmten Knoten nur bestimmte Attributknoten und bestimmte Verknüpfungen zu anderen Knotentypen erlaubt sind. Die Verknüpfungen besitzen eine Kardinalität von 1 oder n. Eine Kardinalität von 1 bedeutet, dass ein bestimmter Knotentyp nur ein Mal mit einem bestimmten andern Knotentyp verknüpft sein kann. Eine Kardinalität von n bedeutet, dass ein bestimmter Knotentyp mit beliebig vielen anderen Knotentypen verknüpft sein kann. Ein Beispiel hierfür soll das digitale Abbild einer Rechnung sein. Mit dem bisher definierten System können wir folgendes formulieren:&lt;br /&gt;
&lt;br /&gt;
Es gibt Knoten vom Typ „Rechnung“ mit zwei Attributen, „Datum“ und „Rechnungsnummer“&lt;br /&gt;
&lt;br /&gt;
Es gibt einen Knoten vom Typ „Kunde“ mit dem Attribut „Name“&lt;br /&gt;
&lt;br /&gt;
Die Verknüpfung von „Rechnung zu Kunde“ hat die Kardinalität 1, das bedeutet, eine Rechnung kann immer nur einem Kunden zugeordnet werden.&lt;br /&gt;
&lt;br /&gt;
Die Verknüpfung von „Kunde zu Rechnung“ hat die Kardinalität n, das bedeutet, ein Kunde kann mehrere Rechnungen bekommen haben&lt;br /&gt;
&lt;br /&gt;
Damit lässt sich eine beliebige Datenstruktur darstellen. Das Selbe kann man natürlich auch mit einer relationalen Datenbank oder einem objektorientierten Modell erreichen.&lt;br /&gt;
&lt;br /&gt;
So weit haben wir erst einmal die Beschreibung der Datenstruktur und dann die Datenstruktur selbst. Die Beschreibung der Datenstruktur ist im funktionalen Modell selbst enthalten, sie ist also selbstreflektiv. Es gibt einen Knoten vom Typ Knoten, der einen Knoten beschreibt, in unserem Beispiel z.B. die Rechnung.&lt;br /&gt;
&lt;br /&gt;
Nun möchten wir in unserem Beispiel wissen, wie viele Rechnungen ein Kunde bereits bekommen hat. Dafür fügen dem Knoten Kunde einen weiteres Attribut „Anzahl Rechnungen“ hinzu. Dafür definieren wir in unserem funktionalen System eine Datenfunktion. Das Attribut „Anzahl Rechnungen“ wird nun über eine Funktion definiert, nämlich die Anzahl der Verknüpfungen vom Typ „Kunde zu Rechnung“&lt;br /&gt;
&lt;br /&gt;
In Datenfunktionen sind alle herkömmlichen Programmierbefehle erlaubt, die keine Informationen von außen in das System einbringen. Die aktuelle Implementierung des Modells ist in PHP durchgeführt, so dass alle PHP Funktionen, bei welchen sich der Rückgabewert aus den Parametern berechnen lässt, erlaubt sind. Nicht erlaubt sind Funktionen, welche dem Modell Informationen hinzufügen, so z.B. date() oder rand(). Nun können, wenn wir komplexere Datenstrukturen bilden, Datenfunktionen wieder auf andere Datenfunktionen zugreifen, so dass eine Änderung des Systems eine Kaskade von Änderungen hervorrufen kann. Die Datenfunktion selbst (also ihre Beschreibung) ist nun selbstreflektiv im funktionalen Modell enthalten, damit ist sie ebenfalls Teil des funktionalen Systems.&lt;br /&gt;
&lt;br /&gt;
Bei jeder Änderung werden die Informationen über jedes einzelne Attribut, jede Verknüpfung und jeden Knoten gespeichert. Das Speichern der Änderung wiederum ruft möglicherweise die nächste Datenfunktion auf, welche einer weitere aufrufen könnte usw. So muss ein bestimmter Teilbaum des Graphen möglicherweise bei der Änderung neu ausgerechnet werden. In aller Regel ebbt diese Kaskade an Änderungen aber extrem schnell ab. Danach ist der neue Zustand des Modells konsistent gespeichert. Die „Zwischenergebnisse“, also die Werte der Attribute, welche durch eine Funktion definiert sind, werden jedoch abgespeichert, so dass diese zu einem späteren Zeitpunkt sofort verfügbar sind. Somit haben wir im Modell immer ein Abbild der Realität geschaffen, welches zu einem diskreten Zeitpunkt konsistent ist, nämlich nach der letzten Änderung. Primärdaten, welche nicht durch Funktionen berechnet werden, sind somit aus Modellsicht als Konstanten zu betrachten.&lt;br /&gt;
&lt;br /&gt;
Wird nun lesend auf die Struktur zugegriffen, so wird nur auf das gespeicherte Abbild des aktuellen Modells zugegriffen. Damit stellt das funktionale Modell eine rein funktionale Programmiersprache dar, was beträchtliche Auswirkungen auf die Fähigkeiten des Systems hat. Ohne an dieser Stelle weiter darauf einzugehen, somit kann sich das funktionale Modell mit bekannten Methoden der Informatik und Mathematik selbst manipulieren, ohne dass die Integrität der Daten gefährdet wird. Das ist vermutlich der bedeutendste Effekt des gesamten Systems.&lt;br /&gt;
&lt;br /&gt;
Es gibt noch weitere Elemente des funktionalen Modells, welche aber nur Variationen der bisher erläuterten Konzepte sind. Es ist neben der Änderung von Attributen möglich, Knoten zu erzeugen und zu vernichten, sowie Verknüpfungen herzustellen und zu entfernen. Darauf wird in den späteren Kapiteln noch weiter eingegangen.&lt;br /&gt;
&lt;br /&gt;
==Der Prozessteil==&lt;br /&gt;
Mit dem funktionalen System ist nun die Möglichkeit geschaffen worden, eine beliebig komplexe Datenstruktur aufzubauen, deren Konsistenz zu jedem (diskreten) Zeitpunkt sichergestellt ist und die jederzeit sehr schnell abgefragt werden kann, unabhängig davon, wie komplex die abgerufene Information entstanden ist.&lt;br /&gt;
&lt;br /&gt;
Es wurde auch herausgestellt, dass durch die Änderung einer Information der nächste diskrete Zustand des funktionalen Systems erzeugt wird.&lt;br /&gt;
&lt;br /&gt;
Es gibt nun neben der Abfrage von Daten aus dem funktionalen System nun noch zwei Wege der Kommunikation, nämlich das schon benannte Ändern der Information und außerdem die Möglichkeit, dass das funktionale System Änderungen an der Welt herbeiführen möchte.&lt;br /&gt;
&lt;br /&gt;
Betrachten wir nun als erstes die Änderung des Modells. Diese Interaktion ist recht einfach; es wird eine beliebige Information geändert, also ein Attribut wird geändert, ein Knoten wird erzeugt oder vernichtet oder eine Verknüpfung wird hergestellt oder entfernt. Aus Sicht des funktionalen Systems sind diese Änderungen alle gleichwertig, sie führen dazu, dass das gesamte System in den nächsten Zustand überführt wird. Konkret gibt es dafür Befehle, welche das Modell manipulieren, so z.B. der Befehl erzeuge(), welcher einen Knoten erzeugt oder setze() welcher ein Attribut ändert. Wird einer dieser manipulierenden Befehle aufgerufen, wird das funktionale Modell neu ausgerechnet.&lt;br /&gt;
&lt;br /&gt;
Möchte das Modell die Realität verändern, so wird geprüft, ob sich ein bestimmtes Attribut geändert hat. Ist dies der Fall wird eine Aktionfunktion ausgeführt, welche die Welt verändern kann. Das kann z.B. das Versenden einer E-Mail sein oder auch das Einschalten einer Beleuchtung.&lt;br /&gt;
&lt;br /&gt;
Damit unser Modell konsistent bleibt, werden die beiden Manipulationen außerhalb des funktionalen Modells durchgeführt. Für diesen Zweck gibt es den Prozessteil des Graphen. Im Prozessteil des Graphen, welcher nicht Teil des funktionalen Modells ist, auch wenn er selbst nur als Teil des funktionalen Modells formuliert ist, können auch von außerhalb Informationen in das System geschleust werden, außerdem gibt es hier die Aktionfunktionen, welche die Welt manipulieren. Er bildet also die Schnittstelle zur realen Welt.&lt;br /&gt;
&lt;br /&gt;
Der Prozessteil besteht aus Knoten, welche als Prozessknoten typisiert sind. Diese sind die einzigen, welche das Modell ändern dürfen und sie sind die einzigen, die von der Welt geändert werden dürfen. Die Änderung, welche die Prozessknoten am Modell durchführen, errechnen aber gleichzeitig auch den neuen Zustand aller Prozessknoten, so dass diese möglicherweise Manipulationen an der Welt durchführen können, welche durch die Veränderung von Informationen aus der Welt ausgelöst wurden.&lt;br /&gt;
&lt;br /&gt;
Da die Struktur des funktionalen Modells im Graphen selbstreflexiv abgebildet ist, kann der Umfang des Abbildes der Realität, also das digitale Modell des Unternehmens, jederzeit beliebig verändert werden. Dieser Vorgang ist aus Sicht des funktionalen Systems eine normale Änderung der Daten wie jede andere auch. Der Prozessteil führt in diesem Fall nur zusätzliche Manipulationen an der Welt aus, welche es ermöglichen, die geänderte Datenstruktur zu erzeugen. Die gespeicherten Daten sind aber nicht Teil des Modells sondern der Welt und somit vom Prozessteil des Graphen zu verwalten. Das mag nicht stimmig klingen, wenn man sich aber z.B. den Menschen ansieht, dann haben wir eine ähnliche Situation; der menschliche Verstand entspringt dem Gehirn, aber das Gehirn, in dem der Verstand entsteht ist nicht Teil des menschlichen Verstandes.&lt;br /&gt;
&lt;br /&gt;
Da sich die Welt kontinuierlich verändert, muss auch das Abbild er Realität, also das funktionale Modell permanent aktualisiert werden. Würde das immer hintereinander gemacht, wäre das System viel zu langsam und außerdem ineffizient, da jede kleine Änderung erst komplett neu errechnet werden müsste, bevor der nächste Zustand erreicht ist. Da wir aber ein rein funktionales System haben, können die Änderungen parallel im System aktualisiert werden. Die Kaskaden der Neuberechnung des Modells sind auch bei paralleler Abarbeitung so, das am Ende ein konsistentes Modell entsteht. Das muss noch genauer erforscht werden, aber in der Praxis treten auch bei massiven, parallel durchgeführten Änderungen im Referenzmodell keine Inkonsistenzen auf.&lt;br /&gt;
&lt;br /&gt;
Das funktionale Modell und der Prozessteil ergeben somit die Möglichkeit, ein sich aktualisierendes Abbild der Realität zu erschaffen, welches auch Informationen an die Welt zurück geben kann. Damit ist die theoretische Voraussetzung geschaffen, ein so komplexes System wie ein Unternehmen in beliebiger und sich ändernder Detaillierung digital abzubilden.&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Graph&amp;diff=4</id>
		<title>Graph</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Graph&amp;diff=4"/>
		<updated>2019-03-02T15:57:17Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: Die Seite wurde neu angelegt: „Wenn wir uns ein digitales Unternehmen vorstellen wie einen Menschen, dann stellt der Graph stellt das Gehirn des digitalen Unternehmens dar. Hier werden sowoh…“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wenn wir uns ein digitales Unternehmen vorstellen wie einen Menschen, dann stellt der Graph stellt das Gehirn des digitalen Unternehmens dar. Hier werden sowohl Informationen gespeichert als auch Entscheidungen getroffen. Damit der Graph mit der Umwelt kommunizieren kann, muss es eine Schnittstelle geben. Deshalb besteht der Graph aus zwei Teilen. Der erste Teil stellt den Kern des Graphen dar, das funktionale Modell. Der zweite Teil des Graphen bildet die Schnittstelle zur realen Welt, damit eine Interaktion mit dem Modell möglich wird. Dieser Teil ist der Prozessteil des Graphen. In diesem Kapitel wird beschrieben, wie das System generell funktioniert, während später auf die konkrete Implementierung eingegangen wird.&lt;br /&gt;
&lt;br /&gt;
==Idee==&lt;br /&gt;
Ein Unternehmen ist ein sehr komplexes System. Es besteht aus vielen verschiedenen einzelnen Komponenten, welche miteinander und mit der Außenwelt kommunizieren. Außerdem ist ein Unternehmen durch innere und äußere Einflüsse einem permanenten Wandel unterzogen. Ein Beispiel hierfür ist ein einfacher Geschäftsvorfall, wie er in der Praxis üblich ist, wie eine Kundenbestellung. Diese Kommunikation mit der Außenwelt mit der Vertriebsabteilung erzeugt zahllose Aktivitäten im Unternehmen, welche eine Kommunikation innerhalb des Unternehmens und nach außen erzeugen. Bei dieser Kommunikation entstehen viele Daten, welche für das Unternehmen relevant sind. So führt die Kundenbestellung möglicherweise dazu, dass die Logistik den Auftrag zur Auslieferung bekommt, eine Bestellung beim Lieferanten ausgelöst wird und am Ende die Finanzabteilung die Zahlung des Kunden verbuchen muss. Außerdem verändert sich ein Unternehmen, es werden neue Produkte und Dienstleistungen angeboten, gesetzliche Rahmenbedingungen ändern sich, welche das Unternehmen betreffen oder eine Restrukturierung des Unternehmens wird durchgeführt, indem eine neue Abteilung mit neuen Aufgaben gegründet wird.&lt;br /&gt;
&lt;br /&gt;
Damit ein ausreichend genaues digitales Abbild des Unternehmens geschaffen werden kann, benötigt man eine passende Datenstruktur. Es gibt nun verschiedene Anforderungen, welche die Datenstruktur erfüllen muss. Die Daten müssen so abgelegt werden, dass man sie wiederfinden kann und die Struktur muss flexibel genug sein, dass man sie entsprechend der Notwendigkeit anpassen kann. Außerdem muss es eine Schnittstelle geben, mit der Informationen mit der Datenstruktur ausgetauscht werden können. Ein weiterer Aspekt ist, dass benötigte Informationen ausreichend schnell aus der Datenstruktur ausgelesen werden können.&lt;br /&gt;
&lt;br /&gt;
Das funktionale Modell des Graphen enthält alle Elemente, damit das digitale Abbild des Unternehmens hinreichend erzeugt werden kann und der Prozessteil des Graphen sorgt dafür, dass die Datenstruktur mit der Umwelt kommunizieren kann.&lt;br /&gt;
&lt;br /&gt;
==Das funktionale Modell==&lt;br /&gt;
&lt;br /&gt;
Funktionale Programmiersprachen bieten die Möglichkeit, sehr komplexe Datenstrukturen zu erschaffen, welche konsistent formuliert werden können. Das Modell ist damit wirkungsfrei. Probleme, welche die Skalierung von Datenstrukturen in herkömmlichen Systemen behindern, treten hier nicht auf. Die Grundidee des funktionalen Modells ist, das wir immer einen diskreten Zustand der Welt betrachten. Soll das Abbild geändert werden, so wird der nächste diskrete Zustand des Abbildes errechnet. Im wesentlichen kann das als Grundprinzip des funktionalen Modells betrachtet werden. Konkret besteht das funktionale Modell aus Knoten, die über Kanten, wir nennen sie Verknüpfungen, verbunden sind. Gibt es zwischen zwei Knoten eine Kante, so besteht diese aus zwei gerichteten Verknüpfungen. Jeder Knoten kann beliebig viele Attribute, wir nennen sie Attributknoten, besitzen. Ein Knoten ist jedoch typisiert, so dass  für einen bestimmten Knoten nur bestimmte Attributknoten und bestimmte Verknüpfungen zu anderen Knotentypen erlaubt sind. Die Verknüpfungen besitzen eine Kardinalität von 1 oder n. Eine Kardinalität von 1 bedeutet, dass ein bestimmter Knotentyp nur ein Mal mit einem bestimmten andern Knotentyp verknüpft sein kann. Eine Kardinalität von n bedeutet, dass ein bestimmter Knotentyp mit beliebig vielen anderen Knotentypen verknüpft sein kann. Ein Beispiel hierfür soll das digitale Abbild einer Rechnung sein. Mit dem bisher definierten System können wir folgendes formulieren:&lt;br /&gt;
&lt;br /&gt;
Es gibt Knoten vom Typ „Rechnung“ mit zwei Attributen, „Datum“ und „Rechnungsnummer“&lt;br /&gt;
&lt;br /&gt;
Es gibt einen Knoten vom Typ „Kunde“ mit dem Attribut „Name“&lt;br /&gt;
&lt;br /&gt;
Die Verknüpfung von „Rechnung zu Kunde“ hat die Kardinalität 1, das bedeutet, eine Rechnung kann immer nur einem Kunden zugeordnet werden.&lt;br /&gt;
&lt;br /&gt;
Die Verknüpfung von „Kunde zu Rechnung“ hat die Kardinalität n, das bedeutet, ein Kunde kann mehrere Rechnungen bekommen haben&lt;br /&gt;
&lt;br /&gt;
Damit lässt sich eine beliebige Datenstruktur darstellen. Das Selbe kann man natürlich auch mit einer relationalen Datenbank oder einem objektorientierten Modell erreichen.&lt;br /&gt;
&lt;br /&gt;
So weit haben wir erst einmal die Beschreibung der Datenstruktur und dann die Datenstruktur selbst. Die Beschreibung der Datenstruktur ist im funktionalen Modell selbst enthalten, sie ist also selbstreflektiv. Es gibt einen Knoten vom Typ Knoten, der einen Knoten beschreibt, in unserem Beispiel z.B. die Rechnung.&lt;br /&gt;
&lt;br /&gt;
Nun möchten wir in unserem Beispiel wissen, wie viele Rechnungen ein Kunde bereits bekommen hat. Dafür fügen dem Knoten Kunde einen weiteres Attribut „Anzahl Rechnungen“ hinzu. Dafür definieren wir in unserem funktionalen System eine Datenfunktion. Das Attribut „Anzahl Rechnungen“ wird nun über eine Funktion definiert, nämlich die Anzahl der Verknüpfungen vom Typ „Kunde zu Rechnung“&lt;br /&gt;
&lt;br /&gt;
In Datenfunktionen sind alle herkömmlichen Programmierbefehle erlaubt, die keine Informationen von außen in das System einbringen. Die aktuelle Implementierung des Modells ist in PHP durchgeführt, so dass alle PHP Funktionen, bei welchen sich der Rückgabewert aus den Parametern berechnen lässt, erlaubt sind. Nicht erlaubt sind Funktionen, welche dem Modell Informationen hinzufügen, so z.B. date() oder rand(). Nun können, wenn wir komplexere Datenstrukturen bilden, Datenfunktionen wieder auf andere Datenfunktionen zugreifen, so dass eine Änderung des Systems eine Kaskade von Änderungen hervorrufen kann. Die Datenfunktion selbst (also ihre Beschreibung) ist nun selbstreflektiv im funktionalen Modell enthalten, damit ist sie ebenfalls Teil des funktionalen Systems.&lt;br /&gt;
&lt;br /&gt;
Bei jeder Änderung werden die Informationen über jedes einzelne Attribut, jede Verknüpfung und jeden Knoten gespeichert. Das Speichern der Änderung wiederum ruft möglicherweise die nächste Datenfunktion auf, welche einer weitere aufrufen könnte usw. So muss ein bestimmter Teilbaum des Graphen möglicherweise bei der Änderung neu ausgerechnet werden. In aller Regel ebbt diese Kaskade an Änderungen aber extrem schnell ab. Danach ist der neue Zustand des Modells konsistent gespeichert. Die „Zwischenergebnisse“, also die Werte der Attribute, welche durch eine Funktion definiert sind, werden jedoch abgespeichert, so dass diese zu einem späteren Zeitpunkt sofort verfügbar sind. Somit haben wir im Modell immer ein Abbild der Realität geschaffen, welches zu einem diskreten Zeitpunkt konsistent ist, nämlich nach der letzten Änderung. Primärdaten, welche nicht durch Funktionen berechnet werden, sind somit aus Modellsicht als Konstanten zu betrachten.&lt;br /&gt;
&lt;br /&gt;
Wird nun lesend auf die Struktur zugegriffen, so wird nur auf das gespeicherte Abbild des aktuellen Modells zugegriffen. Damit stellt das funktionale Modell eine rein funktionale Programmiersprache dar, was beträchtliche Auswirkungen auf die Fähigkeiten des Systems hat. Ohne an dieser Stelle weiter darauf einzugehen, somit kann sich das funktionale Modell mit bekannten Methoden der Informatik und Mathematik selbst manipulieren, ohne dass die Integrität der Daten gefährdet wird. Das ist vermutlich der bedeutendste Effekt des gesamten Systems.&lt;br /&gt;
&lt;br /&gt;
Es gibt noch weitere Elemente des funktionalen Modells, welche aber nur Variationen der bisher erläuterten Konzepte sind. Es ist neben der Änderung von Attributen möglich, Knoten zu erzeugen und zu vernichten, sowie Verknüpfungen herzustellen und zu entfernen. Darauf wird in den späteren Kapiteln noch weiter eingegangen.&lt;br /&gt;
&lt;br /&gt;
==Der Prozessteil==&lt;br /&gt;
Mit dem funktionalen System ist nun die Möglichkeit geschaffen worden, eine beliebig komplexe Datenstruktur aufzubauen, deren Konsistenz zu jedem (diskreten) Zeitpunkt sichergestellt ist und die jederzeit sehr schnell abgefragt werden kann, unabhängig davon, wie komplex die abgerufene Information entstanden ist.&lt;br /&gt;
&lt;br /&gt;
Es wurde auch herausgestellt, dass durch die Änderung einer Information der nächste diskrete Zustand des funktionalen Systems erzeugt wird.&lt;br /&gt;
&lt;br /&gt;
Es gibt nun neben der Abfrage von Daten aus dem funktionalen System nun noch zwei Wege der Kommunikation, nämlich das schon benannte Ändern der Information und außerdem die Möglichkeit, dass das funktionale System Änderungen an der Welt herbeiführen möchte.&lt;br /&gt;
&lt;br /&gt;
Betrachten wir nun als erstes die Änderung des Modells. Diese Interaktion ist recht einfach; es wird eine beliebige Information geändert, also ein Attribut wird geändert, ein Knoten wird erzeugt oder vernichtet oder eine Verknüpfung wird hergestellt oder entfernt. Aus Sicht des funktionalen Systems sind diese Änderungen alle gleichwertig, sie führen dazu, dass das gesamte System in den nächsten Zustand überführt wird. Konkret gibt es dafür Befehle, welche das Modell manipulieren, so z.B. der Befehl erzeuge(), welcher einen Knoten erzeugt oder setze() welcher ein Attribut ändert. Wird einer dieser manipulierenden Befehle aufgerufen, wird das funktionale Modell neu ausgerechnet.&lt;br /&gt;
&lt;br /&gt;
Möchte das Modell die Realität verändern, so wird geprüft, ob sich ein bestimmtes Attribut geändert hat. Ist dies der Fall wird eine Aktionfunktion ausgeführt, welche die Welt verändern kann. Das kann z.B. das Versenden einer E-Mail sein oder auch das Einschalten einer Beleuchtung.&lt;br /&gt;
&lt;br /&gt;
Damit unser Modell konsistent bleibt, werden die beiden Manipulationen außerhalb des funktionalen Modells durchgeführt. Für diesen Zweck gibt es den Prozessteil des Graphen. Im Prozessteil des Graphen, welcher nicht Teil des funktionalen Modells ist, auch wenn er selbst nur als Teil des funktionalen Modells formuliert ist, können auch von außerhalb Informationen in das System geschleust werden, außerdem gibt es hier die Aktionfunktionen, welche die Welt manipulieren. Er bildet also die Schnittstelle zur realen Welt.&lt;br /&gt;
&lt;br /&gt;
Der Prozessteil besteht aus Knoten, welche als Prozessknoten typisiert sind. Diese sind die einzigen, welche das Modell ändern dürfen und sie sind die einzigen, die von der Welt geändert werden dürfen. Die Änderung, welche die Prozessknoten am Modell durchführen, errechnen aber gleichzeitig auch den neuen Zustand aller Prozessknoten, so dass diese möglicherweise Manipulationen an der Welt durchführen können, welche durch die Veränderung von Informationen aus der Welt ausgelöst wurden.&lt;br /&gt;
&lt;br /&gt;
Da die Struktur des funktionalen Modells im Graphen selbstreflexiv abgebildet ist, kann der Umfang des Abbildes der Realität, also das digitale Modell des Unternehmens, jederzeit beliebig verändert werden. Dieser Vorgang ist aus Sicht des funktionalen Systems eine normale Änderung der Daten wie jede andere auch. Der Prozessteil führt in diesem Fall nur zusätzliche Manipulationen an der Welt aus, welche es ermöglichen, die geänderte Datenstruktur zu erzeugen. Die gespeicherten Daten sind aber nicht Teil des Modells sondern der Welt und somit vom Prozessteil des Graphen zu verwalten. Das mag nicht stimmig klingen, wenn man sich aber z.B. den Menschen ansieht, dann haben wir eine ähnliche Situation; der menschliche Verstand entspringt dem Gehirn, aber das Gehirn, in dem der Verstand entsteht ist nicht Teil des menschlichen Verstandes.&lt;br /&gt;
&lt;br /&gt;
Da sich die Welt kontinuierlich verändert, muss auch das Abbild er Realität, also das funktionale Modell permanent aktualisiert werden. Würde das immer hintereinander gemacht, wäre das System viel zu langsam und außerdem ineffizient, da jede kleine Änderung erst komplett neu errechnet werden müsste, bevor der nächste Zustand erreicht ist. Da wir aber ein rein funktionales System haben, können die Änderungen parallel im System aktualisiert werden. Die Kaskaden der Neuberechnung des Modells sind auch bei paralleler Abarbeitung so, das am Ende ein konsistentes Modell entsteht. Das muss noch genauer erforscht werden, aber in der Praxis treten auch bei massiven, parallel durchgeführten Änderungen im Referenzmodell keine Inkonsistenzen auf.&lt;br /&gt;
&lt;br /&gt;
Das funktionale Modell und der Prozessteil ergeben somit die Möglichkeit, ein sich aktualisierendes Abbild der Realität zu erschaffen, welches auch Informationen an die Welt zurück geben kann. Damit ist die theoretische Voraussetzung geschaffen, ein so komplexes System wie ein Unternehmen in beliebiger und sich ändernder Detaillierung digital abzubilden.&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
	<entry>
		<id>https://wiki.graph-it.com/index.php?title=Hauptseite&amp;diff=3</id>
		<title>Hauptseite</title>
		<link rel="alternate" type="text/html" href="https://wiki.graph-it.com/index.php?title=Hauptseite&amp;diff=3"/>
		<updated>2019-03-02T15:51:57Z</updated>

		<summary type="html">&lt;p&gt;Hschlabach: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Allgemein==&lt;br /&gt;
In diesem Wiki werden Werkzeuge beschrieben, die von Graph-IT zu Verfügung gestellt werden, um eine durchgängige Digitalisierung zu erreichen.&lt;br /&gt;
&lt;br /&gt;
[[Graph | Der Graph]]&lt;/div&gt;</summary>
		<author><name>Hschlabach</name></author>
	</entry>
</feed>