Passa al contenuto principale

Esempio 6 - Tabella per intervalli di valori

Compito:​

Per una grandezza misurata deve essere trovato un testo descrittivo di una categoria. A tale scopo, ad esempio, la grandezza misurata TEMPERATURE viene confrontata con una tabella di valori limite e viene letto il testo corrispondente. Inoltre deve essere determinata la posizione del valore misurato rispetto ai limiti della categoria.

Soluzione:​

1. Creazione della tabella​

Come nell'Esempio 5, nell'area delle risorse del modulo matematico viene creata una tabella con le categorie. Si supponga che la seguente tabella sia creata con il tag di risorsa "Kategorien":

Name | T_Min | T_Max
===========================================
extrem kalt | * | -10.0
sehr kalt | -10.0 | 2.0
kalt | 2.0 | 8.0
kühl | 8.0 | 15.0
normal | 15.0 | 21.0
warm | 21.0 | 28.0
heiß | 28.0 | 34.0
sehr heiß | 34.0 | 46.0
extrem heiß | 46.0 | *

2. Implementazione nel testo della formula​

_rowIdx = selectRow(TEMPERATURE, TEMPERATURE, {
table: 'Kategorien'     // verpflichtend
, keys: ['>= T_Min', '< T_max']  // verpflichtend
});
KatName = getField(_rowidx, {table: 'Kategorien', field: 'Name'});
_TMin = getField(_rowidx, {table: 'Kategorien', field: 'T_Min'});
_TMax = getField(_rowidx, {table: 'Kategorien', field: 'T_Max'});
_width = max(0.01, _TMax - _TMin);
RelPos = (TEMPERATURE - _TMin) / _width;

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 dei separatori predefiniti (che comprendono anche il carattere |), 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 forniscono gli elementi di dati da confrontare o leggere.

Con selectRow() viene ora cercata nella tabella una riga adatta e il suo indice viene restituito come valore di risultato. A tale scopo il valore chiave, qui ad es. TEMPERATURE come <dbl>, viene passato due volte alla funzione, poiché deve essere confrontato con due colonne. Tramite keys vengono definiti i campi T_Min e T_Max, da cui devono essere prelevati i valori limite delle categorie. Ai nomi dei campi vengono aggiunti i corrispondenti operatori di confronto. Una riga soddisfa quindi la condizione solo se TEMPERATURE >= T_Min e TEMPERATURE < T_Max risultano entrambe vere. A ciò si aggiunge però anche la funzione per anyKey, che precede il confronto dei valori. Ne risulta la seguente condizione:

((T_Min == anyKey) || (TEMPERATURE >= T_Min))
&& ((T_Max == anyKey) || (TEMPERATURE < T_Max))

In questo modo è possibile una rappresentazione molto semplice delle zone marginali, senza indicare temperature finali concrete per gli estremi.

Con la funzione getField() viene letto dalla stessa tabella il Name della categoria. Se l'indice _rowIdx è < 0, in precedenza non è stata trovata alcuna riga adatta e il Variant indicato con notFound verrebbe passato alla variabile. Questa indicazione manca, per cui qui il risultato sarebbe semplicemente false.

Allo stesso modo vengono letti dalla tabella i valori limite _TMin e _TMax della categoria, utilizzati in precedenza per la ricerca, e viene calcolata la larghezza _width della categoria. Se non fosse stata trovata alcuna riga, le temperature limite sarebbero entrambe su false (== 0.0) e quindi anche la differenza risulterebbe pari a zero. Poiché in seguito si deve dividere per questo numero, con la funzione max() si garantisce che la larghezza _width non possa mai diventare zero.

La posizione relativa RelPos nella categoria viene determinata come quoziente tra la temperatura relativa al limite inferiore dell'intervallo e la larghezza determinata in precedenza.