Aller au contenu principal

Exemple 6 - Tableau pour plages de valeurs

Tâche :​

Pour une grandeur mesurée, un texte descriptif d'une catégorie doit être trouvé. Pour cela, la grandeur mesurée TEMPERATURE est par exemple comparée à des valeurs limites dans un tableau et un texte correspondant est lu. En outre, la position de la valeur mesurée par rapport aux limites de la catégorie doit être déterminée.

Solution :​

1. Création du tableau​

Comme dans l'exemple 5, un tableau contenant les catégories est établi dans la zone de ressources du module mathématique. Le tableau suivant est supposé créé sous le tag de ressource « 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. Implémentation dans la formule​

_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;

Fonctions utilisées​

Explication :​

Le tableau est lu ligne par ligne. Les lignes vides ou celles qui commencent par 3 caractères de « ligne » identiques (ici par exemple '===') sont ignorées. Les lignes sont découpées aux séparateurs par défaut (ceux-ci comprennent aussi le caractère |), débarrassées des espaces superflus au début et à la fin, et interprétées comme Variant. La première ligne fournit les désignations des colonnes (= champs). Toutes les autres lignes fournissent les éléments de données à comparer ou à lire.

Avec selectRow(), une ligne correspondante est maintenant recherchée dans le tableau et son index est renvoyé comme valeur de résultat. Pour cela, la valeur de clé, ici par exemple TEMPERATURE en tant que <dbl>, est transmise deux fois à la fonction, car elle doit être comparée à deux colonnes. Au moyen de keys, les champs T_Min et T_Max sont définis ; c'est d'eux que doivent être tirées les valeurs limites des catégories. Les noms des champs sont complétés par les opérateurs de comparaison correspondants. Une ligne ne satisfait donc la condition que si TEMPERATURE >= T_Min et TEMPERATURE < T_Max sont vrais. À cela s'ajoute toutefois la fonction de anyKey, qui précède la comparaison des valeurs. On obtient ainsi la condition suivante :

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

Cela permet une représentation très simple des zones extrêmes, sans indiquer de températures finales concrètes pour les extrêmes.

Au moyen de la fonction getField(), le Name de la catégorie est lu dans le même tableau. Si l'index _rowIdx est < 0, aucune ligne correspondante n'a été trouvée auparavant et le Variant indiqué avec notFound serait transmis à la variable. Cette indication est absente, de sorte que le résultat serait ici simplement false.

De même, les valeurs limites _TMin et _TMax de la catégorie, utilisées auparavant pour la recherche, sont lues dans le tableau et la largeur _width de la catégorie est calculée. Si aucune ligne n'a été trouvée, les températures limites seraient toutes deux à false (== 0.0) et la différence serait donc également nulle. Comme il faudra diviser ensuite par ce nombre, la fonction max() garantit que la largeur _width ne peut jamais devenir nulle.

La position relative RelPos dans la catégorie est déterminée comme le quotient de la température relative par rapport à la limite inférieure de la plage et de la largeur déterminée précédemment.