Saltar al contenido principal

Ejemplo 5 - Parámetros desde una tabla

Ejemplo 5 - Parámetros desde una tabla​

Tarea:​

En función de distintas informaciones de estado, como, por ejemplo, un ID de geofence GEO_FENCE_ID, una identificación de línea en el transporte público local LINE, el mes en curso u otros valores, se deben leer de una tabla varios parámetros variables, por ejemplo un tiempo de espera, un sentido preferente o una orden de conexión, para los cálculos posteriores.

Solución:​

1. Creación de la tabla​

Si la tabla no es demasiado extensa, puede ponerse a disposición directamente como recurso de texto en el módulo matemático. Como alternativa, con los medios de las cadenas de decodificadores es posible suministrarla desde archivos (comprimidos) o desde fuentes base64.

Supongamos que la siguiente tabla está creada con la etiqueta de recurso "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. Implementación en el texto de fórmulas​

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

Funciones utilizadas​

Explicación:​

La tabla se lee línea por línea. Se omiten las líneas vacías y las que comienzan con 3 caracteres de "línea" iguales (aquí, p. ej., '---'). Las líneas se dividen en el carácter separador definido (véase colSep), se les eliminan los espacios sobrantes al principio y al final y se interpretan como Variant. La primera línea proporciona los nombres de las columnas (= campos). Todas las demás líneas proporcionan los elementos de datos para comparar o leer.

Esta preparación se realiza una sola vez con una función selectRow() en el texto de fórmulas; después, la tabla queda disponible con el nombre dado para todas las demás funciones. La indicación del separador de columnas colSep: ';' es opcional. Por defecto se aceptan como expresión regular una única coma, punto y coma, tabulador o '|'. La indicación de anyKey es igualmente opcional y designa una entrada de la tabla (texto) que coincide con cualquier valor de clave ofrecido.

Con selectRow() se busca ahora en la tabla una línea adecuada y se devuelve su índice como valor de resultado. Para ello se buscan valores de clave, aquí, p. ej., GEO_FENCE_ID como <int> y LINE como <str>, en los campos GF_ID y LINE definidos mediante keys. Como la búsqueda, cuando cambian los valores de clave, se realiza línea por línea de arriba abajo, las entradas con anyKey deben ordenarse siempre al final del bloque de datos correspondiente. En el ejemplo, la búsqueda con "S8" y el ID de geofence 14 encuentra su coincidencia antes que cualquier ID de geofence, y este ID de geofence cualquiera tiene a su vez prioridad sobre la entrada con ID de geofence 100 y línea cualquiera. Esta priorización puede influirse mediante una ordenación adecuada de las líneas.

Con la función getField() se leen de la misma tabla las entradas correspondientes de la columna indicada (field). Si el índice _rowIdx es < 0, antes no se encontró ninguna línea adecuada y el Variant indicado con notFound se transmite a la variable.