Aller au contenu principal

Exemple 5 - Paramètres issus d'un tableau

Exemple 5 - Paramètres issus d'un tableau​

Tâche :​

En fonction de diverses informations d'état, comme par exemple un identifiant de geo-fence GEO_FENCE_ID, un repère de ligne dans les transports publics LINE, le mois en cours ou d'autres valeurs, plusieurs paramètres variables, par exemple un temps d'attente, un sens préférentiel ou une commande de mise en marche, doivent être lus dans un tableau pour les calculs suivants.

Solution :​

1. Création du tableau​

Si le tableau n'est pas trop volumineux, il peut être mis à disposition directement comme ressource texte dans le module mathématique. Il est également possible, avec les moyens des chaînes de décodeurs, de le fournir à partir de fichiers (compressés) ou de sources base64.

Le tableau suivant est supposé créé sous le tag de ressource « 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. Implémentation dans la formule​

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

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 au séparateur défini (voir colSep), 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.

Cette préparation n'a lieu qu'une seule fois, avec une fonction selectRow() dans la formule ; ensuite, le tableau est disponible sous le nom donné pour toutes les autres fonctions. L'indication du séparateur de colonnes colSep: ';' est facultative. Par défaut, une expression régulière accepte une virgule, un point-virgule, une tabulation ou '|' isolés. L'indication de anyKey est elle aussi facultative et désigne une entrée de tableau (texte) qui correspond à n'importe quelle valeur de clé proposée.

Avec selectRow(), une ligne correspondante est maintenant recherchée dans le tableau et son index est renvoyé comme valeur de résultat. Pour cela, les valeurs de clé, ici par exemple GEO_FENCE_ID en tant que <int> et LINE en tant que <str>, sont recherchées dans les champs GF_ID et LINE définis au moyen de keys. Comme la recherche s'effectue ligne par ligne, de haut en bas, lorsque les valeurs de clé changent, les entrées avec anyKey doivent toujours être classées à la fin du bloc de données correspondant. Dans l'exemple, la recherche avec "S8" et l'identifiant de geo-fence 14 donne le résultat avant l'identifiant de geo-fence quelconque, et cet identifiant de geo-fence quelconque a à son tour priorité sur l'entrée avec l'identifiant de geo-fence 100 et une ligne quelconque. Cette priorisation peut être influencée par un tri approprié des lignes.

Au moyen de la fonction getField(), les entrées correspondantes de la colonne désignée (field) sont lues 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 est transmis à la variable.