Entscheidungstabelle
Entscheidungstabellen sind ein weiterer Typ von Geschäftsregeln, die verwaltet und geändert werden können. Entscheidungstabellen kommen in der Regel zum Einsatz, wenn eine konsistente Anzahl von Bedingungen ausgewertet und eine bestimmte Gruppe von Aktionen ausgelöst werden muss, falls die Bedingungen erfüllt werden.
Entscheidungstabellen haben Ähnlichkeit mit Entscheidungsbäumen, weisen jedoch eine gleichmäßige Verteilung auf. Entscheidungstabellen enthalten immer dieselbe Anzahl auszuwertender Bedingungen und auszuführender Aktionen. Dies ist unabhängig davon, welche Gruppe von Verzweigungen mit dem Ergebnis 'true' aufgelöst werden. Bei einem Entscheidungsbaum kann es sein, dass eine Verzweigung mehr auszuwertende Bedingungen enthält als eine andere Verzweigung.
Entscheidungstabellen sind als Baumstruktur mit Knoten aufgebaut und werden durch ein Element TreeBlock definiert. Das Element TreeBlock besteht aus verschiedenen Elementen TreeNode. Elemente TreeNode können Bedingungsknoten oder Aktionsknoten sein. Bedingungsknoten stellen die Auswertungsverzweigungen dar. Am Ende der Verzweigungen gibt es Aktionsknoten mit den entsprechenden Baumaktionen, die auszulösen sind, falls alle Bedingungen mit 'true' ausgewertet werden. Es kann eine beliebige Anzahl von Ebenen mit Bedingungsknoten geben, jedoch nur eine einzige Ebene von Aktionsknoten.

Entscheidungstabellen können außerdem mit einer Initialisierungsregel (init rule) versehen sein, die ausgegeben werden kann, bevor die Bedingungen in der Tabelle geprüft werden.
Die Klasse DecisionTable stellt Methoden bereit, die Folgendes unterstützen:
- Baumblock der Baumknoten (Bedingungs- und Aktionsknoten) abrufen
- Initialisierungsregelinstanz abrufen
- Initialisierungsregelschablone abrufen (falls definiert)

Das Element TreeBlock einer Entscheidungstabelle enthält die unterschiedlichen Bedingungs- und Aktionsknoten. Jeder Bedingungsknoten (ConditionNode) enthält eine Begriffsdefinition (TreeConditionTermDefinition) und 1 bis n Fallkanten, die auch 'Case Edges' genannt werden (CaseEdge). Die Begriffsdefinition enthält den linken Operanden für den Bedingungsausdruck. Die Case Edges enthalten die Wertdefinitionen. Dies sind die verschiedenen rechten Operanden, die im Bedingungsausdruck verwendet werden sollen. Beispiel: Im Ausdruck (status == 'gold') ist 'status' die Begriffsdefinition und 'gold' die Wertdefinition im Case Edge. Alle Case Edges in einem Bedingungsknoten verwenden dieselbe Begriffsdefinition und unterscheiden sich nur im Wert (TreeConditionValueDefinition). Fortführung des obigen Beispiels: Ein weiterer Case Edge im Bedingungsknoten hat den Wert 'silver'. Auch dies wird in einem Ausdruck verwendet (status == 'silver'). Die einzige Ausnahme für dieses Verhalten tritt auf, falls für den Bedingungsknoten eine Klausel 'otherwise' definiert wurde. Bei einer Klausel 'otherwise' gibt es keine Wertdefinition, da sie verwendet wird, wenn alle anderen Case Edges im Bedingungsknoten mit 'false' ausgewertet werden. Eine Klausel 'otherwise' ist zwar kein Case Edge, enthält jedoch ein Element TreeNode, das abgerufen werden kann.

Für die Begriffsdefinition kann die Benutzerdarstellung abgerufen und in Clientanwendungen verwendet werden. Die Darstellung der Begriffsdefinition ist normalerweise nur eine Darstellung des linken Operanden (im obigen Beispiel 'status') und enthält keine Platzhalter. Bei den Case Edges kann eine Schablone verwendet werden, um die Wertdefinition festzulegen (TreeConditionValueTemplate). Eine Instanz einer Schablonenwertdefinition (TemplateInstanceExpression) enthält die Parameterwerte, die für die Ausführung verwendet und geändert werden können. Falls versucht wird, die Wertschablonendefinition für ein Element TreeConditionValueDefinition abzurufen, das nicht mit einer Schablone definiert wurde, wird ein Nullwert zurückgegeben. Falls keine Schablone verwendet wurde, um die Wertbedingung zu definieren, kann dennoch eine Benutzerdarstellung abgerufen und in Clientanwendungen verwendet werden, sofern sie beim Authoring angegeben wurde.
- Stammknoten der Baumstruktur abrufen
- Begriffsdefinitionen der Bedingung für den Baumblock abrufen
- Begriffsdefinitionen der Aktion für den Baumblock abrufen
- Ermittlung ausführen, ob ein Knoten eine Klausel 'otherwise' darstellt
- Übergeordneten Knoten des aktuellen Baumknotens (Bedingungs- oder Aktionsknoten) abrufen
- Stammknoten der Baumstruktur mit dem aktuellen Baumknoten abrufen
- Case Edges abrufen
- Begriffsdefinition abrufen
- Klausel 'otherwise' abrufen
- Schablonen für die Wertbedingungen der Case Edges für den Bedingungsknoten abrufen
- Auf einer Schablone basierenden Bedingungswert zum Knoten hinzufügen
- Auf einer Schablone basierenden Bedingungswert entfernen
- Liste der für die Wertdefinition verfügbaren Wertschablonen abrufen
- Untergeordneten Knoten (Bedingungs- oder Aktionsknoten) abrufen
- Instanz der Schablonendefinition abrufen, die der Wertdefinition zugeordnet ist
- Wertdefinition direkt ohne Abruf der Schablone abrufen
- Wert für die Definition zur Verwendung einer bestimmten Schabloneninstanzdefinition festlegen
- Für den Bedingungsknoten definierte Wertdefinitionsschablonen abrufen
- Benutzerdarstellung des Bedingungsbegriffes abrufen
- Begriffsdefinition für den Bedingungsknoten abrufen
- Bedingungswertdefinitionen für den Bedingungsknoten aus allen Case Edges abrufen
- Ausrichtung (Zeile oder Spalte) abrufen
- Speziellen, für den Wert definierten Schabloneninstanzausdruck abrufen
- Benutzer abrufen
- System-ID für die Schablone abrufen
- Namen der Schablone abrufen
- Für die Schablone definierte Parameter abrufen
- Darstellung für die Schablone abrufen
- Neue Schablonenbedingungswertinstanz erstellen
- Parameter für die Schabloneninstanz abrufen
- Schablone (TreeConditionValueTemplate im Fall eines Case Edge in einer Entscheidungstabelle) abrufen, mit der die Instanz definiert wurde

Wenn ein neuer Case Edge zu einem Bedingungsknoten hinzugefügt wird, muss der neue Case Edge eine Schablone verwenden, um den Wert zu definieren. Beispiel: Falls der neue Case Edge 'bronze' zur Prüfen von 'status' hinzugefügt werden soll, muss die entsprechende Schablone (TreeConditionValueTemplate) verwendet werden, um ein neues Element 'TemplateInstanceExpression' zu erstellen, bei dem der Parameterwert auf 'bronze' gesetzt wird.
Wenn ein neuer Case Edge hinzugefügt wird, wird ihm außerdem automatisch ein neuer untergeordneter Bedingungsknoten hinzugefügt. Dieser untergeordnete Bedingungsknoten enthält Case Edges, die auf den Case-Edge-Definitionen basieren, die für Bedingungsknoten auf derselben Ebene definiert wurden. Falls in Case Edges Schablonen oder fest codierte Werte verwendet werden, werden diese dann ebenfalls in den Case Edges des untergeordneten Bedingungsknotens verwendet. Für den untergeordneten Bedingungsknoten, der automatisch hinzugefügt wird, werden ebenfalls eigene untergeordnete Bedingungsknoten erstellt. Diese untergeordneten Bedingungsknoten besitzen ebenfalls untergeordnete Bedingungsknoten usw., bis alle Ebenen von Bedingungsknoten erneut erstellt wurden.
Neben den Bedingungsknoten enthält eine Entscheidungstabelle und insbesondere ein Baumblock außerdem eine Ebene von Aktionsknoten (ActionNode). Die Aktionsknoten sind Blattknoten und befinden sich am Ende der Verzweigung von Bedingungsknoten und Case Edges. Falls alle Bedingungswerte in einer Linie mit 'true' aufgelöst werden, wird ein Aktionsknoten erreicht. Für den Aktionsknoten ist mindestens eine Aktion (TreeAction) definiert. Für die Aktion gibt es eine Begriffsdefinition und eine Wertdefinition. Wie bei den Bedingungsknoten befindet sich die Begriffsdefinition (TreeActionTermDefinition) auf der linken Seite des Ausdrucks und die Wertdefinition (TemplateInstanceExpression) auf der rechten Seite des Ausdrucks. Für die unterschiedlichen Bedingungsknoten, die den Status prüfen, könnte es beispielsweise Aktionen zum Definieren des Rabatts geben. Lautet die Bedingung (status == 'gold'), kann die Aktion (discountValue = 0.90) sein. Für die Aktion ist 'discountValue' die Begriffsdefinition und '= 0.90' die Wertdefinition.
Die Begriffsdefinition einer Baumaktion wird mit anderen Baumaktionen in anderen Aktionsknoten gemeinsam genutzt. Da jede Verzweigung von Case Edges eine Aktion erreicht, werden dieselben Begriffsdefinitionen verwendet. Die Wertdefinitionen können jedoch für jede Baumaktion und jeden Aktionsknoten verschieden sein. Die Aktion 'discountValue' für den Status 'gold' kann beispielsweise '0.90' lauten, für den Status 'silver' hingegen '0.95'.
Aktionsknoten können mehrere Baumaktionen mit einer separaten Begriffsdefinition und einer separaten Wertdefinition besitzen. Beispiel: Falls der Rabatt für einen Mietwagen ermittelt wurde, könnte neben dem Festlegen von 'discountValue' auch die Zuordnung einer bestimmten Wagenklasse gewünscht werden. In diesem Fall könnte eine weitere Baumaktion erstellt werden, um den Begriff 'carSize' mit 'full size' festzulegen, falls der Status 'gold' lautet, sowie um '0.90' für 'discountValue' festzulegen.
Die Wertdefinition in einer Baumaktion kann aus einer Schablone (TreeActionValueTemplate) erstellt werden. Die Schablonendefinition enthält einen Ausdruck (TemplateInstanceExpression), der die Parameter für den Ausdruck enthält.
Es können nicht nur die Parameter, sondern die gesamte Wertdefinition mit einer neuen Wertdefinitionsinstanz geändert werden, die mit einer anderen Schablone erstellt wird, die für die Baumaktion definiert wurde.
Falls eine Wertdefinition nicht mit einer Schablone erstellt wird, kann sie nicht geändert werden. Bei Clientanwendungen kann die Benutzerdarstellung in der Anzeige verwendet werden, falls sie beim Authoring angegeben wurde.
Falls für Begriffsdefinitionen in Baumaktionen eine Benutzerdarstellung angegeben wurde, kann sie ebenfalls von Clientanwendungen verwendet werden.
Wenn ein neuer Case Edge zu einem Bedingungsknoten hinzugefügt wird und die verschiedenen untergeordneten Bedingungsknoten erstellt werden, werden ebenfalls Aktionsknoten erstellt. Im Gegensatz zu den untergeordneten Bedingungsknoten und Case Edges, die auf der Grundlage der Definition für diese auf dieser Ebene bereits definierten Case Edges erstellt werden, erben Aktionsknoten nicht automatisch einen vorhandenen Entwurf. Im Aktionsknoten werden nur leere Platzhalter TreeActions erstellt. Zur Vervollständigung der Aktionsdefinition muss eine Schablone (TreeActionValueTemplate) verwendet werden, indem ein Element TemplateInstanceExpression für mindestens eine Begriffsdefinition des Aktionsknotens erstellt wird. Bis die Baumaktion mit einem Element TemplateInstanceExpression festgelegt wird, sind in der Baumaktion Nullwerte für den Benutzerdarstellungswert und den Schabloneninstanzwert angegeben.
Beim Erstellen einer neuen Bedingung, die zu neuen Aktionsknoten führt, werden die Aktionsknoten rechts neben vorhandenen Aktionen für den direkt übergeordneten Bedingungsknoten hinzugefügt. Beispiel: Falls der Status 'ruby' zu einer Entscheidungstabelle hinzugefügt wird und einen bestimmten Rabatt aufweisen soll, wird die Bedingung zum Prüfen des Status rechts neben 'gold', 'silver' und 'bronze' hinzugefügt. Der Aktionsknoten für den Rabatt von 'ruby' wird rechts neben den Aktionsknoten hinzugefügt, die den Case Edges von 'gold', 'silver' und 'bronze' entsprechen.
Beim Festlegen von neuen Aktionen für Aktionsknoten gibt ein Algorithmus, der nach dem Aktionsknoten ganz rechts für den niedrigsten Case Edge sucht, den Aktionsknoten mit einer leeren Baumaktion zurück. Die Baumaktion kann außerdem daraufhin überprüft werden, ob sie Nullwerte für die Benutzerdarstellung und den Schabloneninstanzwert enthält. Sobald die Baumaktion erhalten wurde, kann sie mit der richtigen Instanz eines Elements TreeActionValueTemplate festgelegt werden.

- Liste der definierten Baumaktionen abrufen
- Liste der verfügbaren Wertschablonen abrufen, die für die Baumaktion definiert sind
- Begriffsdefinition abrufen
- Für die Baumaktion definierte Wertschabloneninstanz abrufen
- Benutzerdarstellung für den Wert abrufen, falls keine Wertschablone verwendet wurde
- Überprüfung ausführen, ob die Aktion ein SCA-Serviceaufruf ist (Methode isValueNotApplicable)
- Wertschabloneninstanz durch eine neue Instanz ersetzen
- Benutzerdarstellung für die Begriffswertdefinition abrufen
- Liste der für die Baumaktion verfügbaren Wertschablonen abrufen
- Überprüfung ausführen, ob die Aktion ein SCA-Serviceaufruf ist (Methode isTermNotApplicable)
- System-ID für die Schablone abrufen
- Namen der Schablone abrufen
- Für die Schablone definierte Parameter abrufen
- Darstellung für die Schablone abrufen
- Neue Wertschabloneninstanz aus der Schablonendefinition erstellen
- Parameter für die Schabloneninstanz abrufen
- Schablone (TreeActionValueTemplate im Fall einer Baumaktion in einer Entscheidungstabelle) abrufen, mit der die Instanz definiert wurde

Die Definition einer Initialisierungsregel für eine Entscheidungstabelle folgt derselben Struktur wie eine Regel in einer Regelmenge. Die Initialisierungsregel kann mit einer Schablone (DecisionTableRuleTemplate) definiert werden.
Falls beim Authoring keine Initialisierungsregel erstellt wurde, kann sie nach der Implementierung der Regel nicht mehr hinzugefügt werden.
- Namen der Regel abrufen
- Benutzerdarstellung für die Regel abrufen
- Benutzerdarstellung für die Regel mit verschiedenen für die Regel eingegebenen Parametern abrufen
- Baumblock abrufen, der die Initialisierungsregel enthält
- Entscheidungstabelle abrufen, die die Schablone enthält
