Passa al contenuto principale

Esempio 5 - Parametri da tabella

Esempio 5 - Parametri da tabella​

Compito:​

In funzione di diverse informazioni di stato, come ad esempio un ID di geo-fence GEO_FENCE_ID, una designazione di linea nel trasporto pubblico locale LINE, il mese in corso o altri valori, devono essere letti da una tabella diversi parametri variabili, ad esempio un tempo di attesa, una direzione preferenziale o un comando di attivazione, per i calcoli successivi.

Soluzione:​

1. Creazione della tabella​

Se la tabella non è troppo estesa, può essere messa a disposizione direttamente come risorsa di testo nel modulo matematico. In alternativa, con i mezzi delle catene di decoder è possibile fornirla da file (compressi) o da sorgenti base64.

Si supponga che la seguente tabella sia creata con il tag di risorsa "Tabelle":

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. Implementazione nel testo della formula​

_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'});

Funzioni utilizzate​

Spiegazione:​

La tabella viene letta riga per riga. Le righe vuote o quelle che iniziano con 3 caratteri "linea" uguali (qui ad es. '---') vengono saltate. Le righe vengono suddivise in corrispondenza del separatore definito (vedere colSep), private degli spazi superflui all'inizio e alla fine e interpretate come Variant. La prima riga fornisce i nomi delle colonne (= campi). Tutte le righe successive contengono gli elementi di dati da confrontare o leggere.

Questa preparazione avviene una sola volta con una funzione selectRow() nel testo della formula; successivamente la tabella è disponibile con il nome indicato a tutte le altre funzioni. L'indicazione del separatore di colonna colSep: ';' è opzionale. Per impostazione predefinita vengono accettati, come espressione regolare, una singola virgola, un punto e virgola, una tabulazione o '|'. Anche l'indicazione di anyKey è opzionale e designa una voce della tabella (testo) che corrisponde a qualsiasi valore chiave fornito.

Con selectRow() viene ora cercata nella tabella una riga adatta e il suo indice viene restituito come valore di risultato. A tale scopo i valori chiave, qui ad es. GEO_FENCE_ID come <int> e LINE come <str>, vengono cercati nei campi GF_ID e LINE definiti tramite keys. Poiché in caso di variazione dei valori chiave la ricerca avviene riga per riga dall'alto verso il basso, le voci con anyKey devono sempre essere ordinate alla fine del rispettivo blocco di dati. Nell'esempio, la ricerca con "S8" e ID di geo-fence 14 trova la corrispondenza prima della voce con ID di geo-fence qualsiasi, e questa a sua volta ha la precedenza sulla voce con ID di geo-fence 100 e linea qualsiasi. Questa priorità può essere influenzata ordinando le righe in modo opportuno.

Con la funzione getField() vengono letti dalla stessa tabella i valori corrispondenti dalla colonna indicata (field). Se l'indice _rowIdx è < 0, in precedenza non è stata trovata alcuna riga adatta e il Variant indicato con notFound viene passato alla variabile.