RSET
-Tabelle gibt
Über die Eigenschaft Setting
können die Einstellungen zur Laufzeit abgefragt und ggf. verändert werden. Welche Einstellungen vorgesehen sind, wird in einer zentralen Liste (RSET
) festgehalten. Welche dieser potentiellen Einstellungen in dem jeweiligen Baustein verwendet werden, und ob diese auch verändert werden können, wird in der Schnittstellenbeschreibung des Bausteins festgelegt. ExpEdge berücksichtigt diese Angaben und erzeugt den Abschnitt Setting
für den jeweiligen Baustein entsprechend dieser Angaben.
Die Laufzeiteinstellungen werden in der Windows-eigene Registry gesucht und abgelegt. Dabei wird unterschieden zwischen Systemeinstellungen, die unterhalb von Software\TAA
abgelegt werden, und allgemeine Einstellungen, die unter Software\<ID>
abgelegt werden, wobei ID
das Kürzel des Mandanten entspricht. Das Kürzel wird typischerweise in der Registry unter Software\TAA\Company\Abbrev
eingetragen und gefunden.
Die in der Registry gespeicherten Einstellungen können logisch jedoch an bis zu vier verschiedenen Stellen untergebracht sein, benutzerspezifisch oder für alle Benutzer gleich, und dort jeweils wiederum umgebungsspezifisch oder umgebungsübergreifend. Details sind hier beschrieben. Grundsätzlich gilt, dass ein vorhandener Eintrag an der Stelle verändert wird, wo diese aufzufinden ist. Wenn der Eintrag noch nicht vorhanden ist, wird sie an der ersten schreibbaren Stelle untergebracht.
Wenn eine Einstellung geboten wird, so hat diese die Eigenschaften Exist
und Value
. Mit der Eigenschaft Exist
kann abgefragt werden, ob für die Einstellung einen spezifischen Wert eingetragen ist. Mit der Eigenschaft Value
kann der Wert der Eigenschaft abgefragt, und je nach Angaben in der Schnittstelle des Bausteins, auch verändert werden. Der Typ der Value
Eigenschaft entspricht den Angaben für die Eigenschaft aus der zentralen RSET
-Tabelle und kann somit String
, DateTime
, Boolean
oder UInt32
sein.
Wenn eine Einstellung für einen erweiterten Kontext in der RSET
-Tabelle markiert ist, so ist die Einstellung nicht ein einzelnes Feld im Abschnitt Setting
, sondern eine Aufzählung. Die möglichen resp. vorhandenen Einträge können über einen IEnumerable<>
aufgezählt werden, und einen einzelnen Eintrag kann mit einem String
als Argument für den Indexer direkt angesprochen werden.
Wenn eine Einstellung einen Kontext benötigt hat, ist dieser als Zeichenfolge Context
an der Einstellung abfragbar. In den folgenden Fällen hat eine Einstellung einen Kontext:
Application
). In diesem Fall ist der Context
der Name der Anwendung.Module
). In diesem Fall ist der Context
die vollständige Bezeichnung des Bausteins, bestehend aus Anwendung, Typ und Namen des Bausteins, jeweils durch einen Punkt getrennt.
Nachfolgend wird beschrieben, wie man eine Einstellung in der RSET
-Tabelle definiert, wie diese anschließend in der Schnittstelle zur Verwendung markiert wird, und anschließend wie die Einstellung im Code benutzt werden kann.
Als Beispiel nehmen wir die Einstellung Config\BcLockDir
. Die TAA kennt diese Einstellung für die Konfiguration eines zentralen Verzeichnisses für Sperrdateien, um arbeitsplatzübergreifende Sperren implementieren zu können. Um diesen Eintrag auch im Anwendungscode kontrolliert benutzen zu können, muss diese zuerst in der RSET
-Tabelle eingetragen werden resp. worden sein.
Wir tragen als Beispiel diese Einstellung mit dem Namen Sperrverzeichnis
und der Umschreibung Zentrales Verzeichnis für Sperrdateien ein, und setzen folgende Flags:
Readonly (0x00000001)
: weil der Wert grundsätzlich zentral verwaltet wird, für alle Benutzer gilt und nicht verändert werden sollSystem (0x00000008)
: weil die Einstellung unterhalb der TAA, und nicht mandantenspezifisch zu finden ist
Als sog. Affinity
wird Config (0x00000004)
eingetragen, weil die Einstellung im Config
-Abschnitt abgelegt wird. Außerdem wird als Entry BcLockDir
angegeben, weil die Angabe in der Registry so benannt wird. Man beachte, dass keine spezifischen Angaben in den Flags zum Typ der Einstellung gemacht wurden. Damit ist diese Einstellung grundsätzlich als Zeichenfolge benutzbar.
Die Zeile in der RSET
-Tabelle sieht nun wie folgt aus:
Name | Bezeichnung | Flags | Affinity | Default | Entry |
---|---|---|---|---|---|
Sperrverzeichnis | Zentrales Verzeichnis für Sperrdateien | 9 | 4 | NULL | BcLockDir |
Hiermit ist die Einstellung zur Benutzung definiert und kann in der Schnittstellenbeschreibung benutzt werden. Dazu kann man beispielsweise das Werkzeug InterfEdge
starten und in die Laufzeiteinstellungen
-Sicht wechseln1):
Durch das Ändern der Rolle von NOP
auf REF
wird diese Einstellung als benutzbar für den Baustein vorgemerkt und kann im Anwendungscode angesprochen werden2). Man beachte, dass die Rolle MOD
gar nicht erst von der Oberfläche angeboten wird, weil diese Einstellung in der RSET
-Tabelle als Readonly
markiert wurde. Diese Einstellung könnte nun im Code wie folgt angesprochen werden:
if (this.Setting.Sperrverzeichnis.Exist && Directory.Exists(this.Setting.Sperrverzeichnis.Value)) { // arbeite mit daten im sperrverzeichnis }
Es ist natürlich im obigen Beispiel nicht unbedingt nötig, vorher den Exist
abzufragen. Wenn der Eintrag nicht vorhanden ist, wird ein Defaultwert geliefert, die auch wiederum in der RSET
-Tabelle festgelegt werden kann. Natürlich ist auch hier wiederum IntelliSense
hilfreich:
Die Systemeinstellung für die Einstellung zum zwischenspeichern der Daten aus gewissen Datenquellen soll abfragbar für die Anwendung werden. Da die betroffene Datenquelle nicht direkt aus dem Laufzeitkontext abgeleitet werden kann, soll diese als zusätzlicher Kontext übergeben werden. Dazu kann in der RSET
-Tabelle folgender Eintrag vorgenommen werden:
Name | Bezeichnung | Flags | Affinity | Default | Entry |
---|---|---|---|---|---|
Caching | Werden DB-Ergebnisse zwischengespeichert | 1310853) | 16 | 0 | NULL |
Im Anwendungscode könnte die Einstellung für eine bestimmte Datenquelle damit wie folgt abgefragt werden:
if (this.Setting.Caching["db2r"].Value) { ... }
Da es sich hier um eine Einstellung mit erweitertem Kontext handelt, kann die Einstellung auch aufgezählt werden. So könnte bspw. folgender Code folgende Ausgabe produzieren:
foreach (var item in this.Setting.Caching) { Console.WriteLine(item.Context + " = " + item.Value); } // console output: // // Access = False // db2r = False // PeapDb0 = False // PkEdge = False // RefMDB = True
Es soll eine Laufzeiteinstellung Umsetzung
eingerichtet werden, die pro Baustein gesetzt sein kann. Die Einstellung ist keine Systemeinstellung seitens der TAA, sondern eine mandantenspezifische Einstellung. Die Einstellung soll zentral vorgenommen und nicht vom Anwendungscode angepasst werden können. Außerdem soll die Einstellung nur für Testzwecke verwendet werden dürfen. In einer nicht-Test Umgebung soll immer der Vorgabewert „VB“
gelten. Dazu kann in der RSET
-Tabelle folgender Eintrag vorgenommen werden:
Name | Bezeichnung | Flags | Affinity | Default | Entry |
---|---|---|---|---|---|
Umsetzung | Art der Umsetzung des Bausteins | 3 | 1 | VB | NULL |
Im Anwendungscode könnte diese Einstellung dann bspw. wie folgt benutzt werden:
this.State.Active = this.Setting.Umsetzung.Value == "C#" ? StateEnum.Ok : StateEnum.Vb6;