Beispiel 5 - Parameter aus Tabelle
Beispiel 5 - Parameter aus Tabelle
Aufgabe:
In Abhängigkeit von verschiedenen Statusinformationen, wie z.B. einer Geo-Fence-ID GEO_FENCE_ID
, einer Linien-Kennzeichnung im ÖPNV LINE
, dem laufenden Monat oder anderen Werten, sollen mehrere variable Parameter, z.B. eine Wartezeit, eine Vorzugsrichtung oder ein Einschaltbefehl, für nachfolgende Berechnungen aus einer Tabelle ausgelesen werden.
Lösung:
1. Erstellen der Tabelle
Sofern die Tabelle nicht zu umfangreich ist, kann sie direkt als Text-Ressource im Mathe-Modul zur Verfügung gestellt werden. Alternativ ist mit den Mitteln der Decoder-Ketten die Bereitstellung aus (komprimierten) Dateien oder base64 Quellen möglich.
Die folgende Tabelle sei unter dem Ressourcen-Tag "Tabelle" angelegt:
GF_ID ; LINE ; T_Wait ; Pref_Dir ; Cmd_On
----- ; ---- ; ------ ; -------- ; ------
12; S8; 20.5; left; true
14; S8; 45.0; left; false
28; S8; 12.0; right; true
*; S8; 18.0; right; true
12; U9; 18.5; right; true
26; U9; 5.2; right; true
37; U9; 9.2; right; true
42; U9; 5.2; left; false
100; *; 100.0; none; false;
2. Implementierung im Formeltext
_rowIdx = selectRow(GEO_FENCE_ID, LINE, {
table: 'Tabelle' // verpflichtend
, keys: ['GF_ID', 'LINE'] // verpflichtend
, colSep: ';' // optional
, anyKey: '*' // optional
});
_TWait = getField(_rowidx, {table: 'Tabelle', field: 'T_Wait', notFound: 10.0});
_PrefDir = getField(_rowidx, {table: 'Tabelle', field: 'Pref_Dir', notFound: 'none'});
_CmdOn = getField(_rowIdx, {table: 'Tabelle', field: 'Cmd_On'});
Verwendete Funktionen
Erläuterung:
Die Tabelle wird zeilenweise gelesen. Leerzeilen oder solche, die mit 3 gleichen "Linien"-Zeichen (hier z.B. '---') beginnen, werden übersprungen. Die Zeilen werden an dem definierten Trennzeichen (siehe colSep) auseinander geschnitten, vorne und hinten von überflüssigen Leerzeichen befreit und als Variant interpretiert. Die erste Zeile liefert die Bezeichnungen für die Spalten (= Felder). Alle weiteren Zeilen die Datenelemente zum Vergleichen oder Auslesen.
Diese Vorbereitung passiert nur ein einziges Mal mit einer selectRow()
Funktion im Formeltext, danach steht die Tabelle unter dem gegebenen Namen allen weiteren Funktionen zur Verfügung. Die Angabe für den Spaltentrenner colSep: ';' ist optional. Als Default werden als Regular-Expression ein einzelnes Komma, Semikolon, Tabulator oder '|' akzeptiert. Die Angabe von anyKey ist ebenso optional und bezeichnet einen Tabelleneintrag (Text), der mit jedem angebotenen Schlüsselwert übereinstimmt.
Mit selectRow()
wird nun in der Tabelle eine passende Zeile gesucht und deren Index als Ergebniswert zurückgegeben. Dazu werden Schlüsselwerte, hier z.B. GEO_FENCE_ID
als <int>
und LINE
als <str>
, in den mittels keys definierten Feldern GF_ID und LINE gesucht. Da die Suche bei Änderung der Schlüsselwerte Zeilenweise von oben nach unten erfolgt, müssen die Einträge mit anyKey immer am Ende eines entsprechenden Datenblocks einsortiert werden. Im Beispiel hat die Suche mit "S8" und Geo-Fence-ID 14 den Treffer vor beliebiger Geo-Fence-ID und diese beliebige Geo-Fence-ID wiederum Vorrang vor dem Eintrag mit Geo-Fence-ID 100 und beliebiger Linie. Diese Priorisierung kann man durch eine entsprechende Sortierung der Zeilen beeinflussen.
Mittels der getField()
Funktion werden aus der gleichen Tabelle passende Einträge aus der bezeichneten Spalte (field) ausgelesen. Falls der Index _rowIdx < 0 ist, wurde zuvor keine passende Zeile gefunden und der mit notFound angegebene Variant wird an die Variable weiter gegeben.