Feature Rules
Feature Rules (Regeln) sind Software seitige Trigger die beim einfügen, ändern oder löschen von Datensätzen ausgeführt werden wenn die Klasse "Feature" genutzt wird.
Der Vorteil von Software seitigen Triggern gegenüber Datenbank seitigen Triggern ist das diese nur einmal geschrieben werden müssen und mit allen Datenbank Typen Oracle, Postgres, SQLIte, SQLServer etc gleichermasen funktionieren.
Wenn Sie reine SQL Befehle benutzen werden Feature Rules nicht ausgeführt!
Beispiele für Feature Rules
Auto Labels
Wenn in der Label Definition Automatische Labels eingestellt sind dann sorgt die "Auto Label Feature Rule" dafür das wenn ein Datensatz eingefügt wird automatisch auch ein Label Feature erzeugt wird.
Relationen
Die "Relationen Feature Rule" sorgt dafür das wenn ein Datensatz gelöscht wird das je nach Einstellung der Relation auch abhängige Featutre gelöscht werden oder ggf auch das löschen verweigert wird wenn die Relation dies nicht erlaubt.
Topologie nachführen
Diese Feature Rule führt die Topologie nach.
Karte aktualisieren
Diese Feature Rule sorgt dafür das die Karte nach dem ändern eines Feature automatisch aktualisiert wird.
Änderungsdatum und Bearbeiter
Diese Featurerule sorgt dafür das die Felder DATE_CREATED, USER_CREATED, DATE_MODIFIED etc gefüllt werden.
Logging
Wenn das Logging eingeschalten ist sorgt diese Feature Rule dafür das Änderungen protokoliert werden.
Weitere Feature Rules
Es gibt je Fachschale weitere Feature Rules, zum Beispiele beim Aufsplitten von Objekten etc.
Eigene Feature Rules
Sie können mit der MapEdit API auch eigene Feature Rules schrieben.
Hier ein Beispiel Gerüst für eine Feature Rule. Sie müssen nur eine FeatureRule klasse anlegen und von FeatureRuleBase ableiten. MapEdit weis dann automatisch das es diese laden soll. Sie müssen diese nicht weiter Registrieren.
Überschrieben Sie die Funktion "Applies" um festzulegen ob die Feature Rule ausgeführt werden soll.
Beachten Sie das wenn ihr Plugin in einem Projekt geladen wird das dann auch ihre Feature Rule für alle Aktionen aller Tabellen ausgeführt wird wenn sie dies nicht bei "Applies" einschränken.
using System;
using System.Collections.Generic;
using System.Linq;
using Mum.Geo.DataAccess;
using XSystem;
namespace IhrNamespace
{
public class MyFeatureRule : FeatureRuleBase, IFeatureRuleAfter, IFeatureRuleBefore
{
public override int Priority
{
get
{
return 99999; //Steuert die Reihenfolge aller Regeln
}
}
public override string Description
{
get
{
return "Meine Feature Rule, beschreiben was diese macht";
}
}
public override bool Applies(FeatureRuleEventType frEvent, DbTableDefinition table)
{
return true; //Wichtig, hier festlegen ob die Regel ausgeführt werden soll.
//Beispiel: Wenn die Regel nur auf eine bestimmete Tabelle ausgeführt werden soll
//return (table.Name == "MY_TABLE")
//Wenn eine Regel nur mit einem Bestimmten Datenmodell ausgefuhert werden soll
//können über table.Schema.DataModels die Datenmodel Codes ausgewertet werden.
}
public bool ExecuteBefore(long id, DateTime timestamp, FeatureRuleEventType frEvent, Feature f)
{
//Be aware, this can fire multiple Times for the exact same Feature (because there can be some rounds of changes by other feature rules)
//Execute if Insert or Update
if ((frEvent == FeatureRuleEventType.Insert) || (frEvent == FeatureRuleEventType.Update))
{
if (f.Table.Columns.Contains("SO_UND_SO"))
{
//Read Value of a Column
string myValue = f.GetStringEx("SO_UND_SO");
if (myValue == "GRUEN")
{
//Write Value of a Column
myValue = "BLAU";
f.SetValue("SO_UND_SO", myValue);
}
}
}
return true;
}
public void ExecuteAfter(long id, DateTime timestamp, FeatureRuleEventType frEvent, Feature f)
{
//
}
}
}
Feature Rules Konfigurieren
Wenn Sie Feature Rule konfigurierbar machen wollen, also nicht fix im Code festlegen wollen bei welchen Tabellen diese ausgelöst werden soll, dann können Sie diese in den Tabellen ME_RULE und ME_RULE_PARAMETER einstellen.
SQL> select * from ME_RULE
ID TABLE_NAME RULE_NAME PLUGIN_NAME
-- ---------- --------- -----------
0 rows selected.
SQL> select * from ME_RULE_PARAMETER
ID RULE_ID PARAMETER_NAME PARAMETER_VALUE
-- ------- -------------- ---------------
0 rows selected.
Diese Tabellen gibt es nur im MapEdit Datenmodell. Sie können bei Bedarf händisch diese beiden Tabellen mit der gleichen Datenstruktur in Topobase/Map Datenmodellen anlegen. Diese werden in Topobase aber erst ab MapEdit Version 23.2.202 gelesen.
Beispiel:
Ihre DLL heist Sindelfingen.Alkis.dll
Die Klasse sieht so aus:
namespace Sindelfingen.Alkis
{
public class MeineFeatureRule : FeatureRuleBase, IFeatureRuleAfter, IFeatureRuleBefore
{
In der Tabelle ME_RULE dann eintragen:
TABLE_NAME = Tabellenname in Grossbuchstaben
PLUGIN_NAME = "Sindelfingen.Alkis.dll"
RULE_NAME = "Sindelfingen.Alkis.MeineFeatureRule"
(also Namespace plus Klassennamen, und gross/klein Schreibung beachten)
In der API kann man die Informationen dann wieder auslesen und im "Applies" dann entscheiden ob man es ausführen will.
public override bool Applies(FeatureRuleEventType frEvent, DbTableDefinition table)
{
foreach (var item in table.Schema.FeatureRules)
{
if (item.PlugInName == "Sindelfingen.Alkis.dll" && item.TableName == vbla
&& item.RuleName == "Sindelfingen.Alkis.MeineFeatureRule") return true
}
return false;
}