Ejemplo 6 - Tabla para rangos de valores
Tarea:
Para una magnitud de medición se debe encontrar un texto descriptivo de una categoría. Para ello se compara, por ejemplo, la magnitud de medición TEMPERATURE con una tabla de valores límite y se lee el texto correspondiente. Además, se debe determinar la posición del valor medido respecto a los límites de la categoría.
Solución:
1. Creación de la tabla
Como ya en el Ejemplo 5, se crea una tabla con las categorías en el área de recursos del módulo matemático. Supongamos que la siguiente tabla está creada con la etiqueta de recurso "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. Implementación en el texto de fórmulas
_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;
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 los caracteres separadores predeterminados (que incluyen también el carácter |), 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.
Con selectRow() se busca ahora en la tabla una línea adecuada y se devuelve su índice como valor de resultado. Para ello, el valor de clave, aquí, p. ej., TEMPERATURE como <dbl>, se pasa dos veces a la función, ya que debe compararse con dos columnas. Mediante keys se definen los campos T_Min y T_Max, de los que deben tomarse los valores límite de las categorías. Los nombres de los campos se completan con los operadores de comparación correspondientes. Una línea cumple, por tanto, la condición solo si se cumple TEMPERATURE >= T_Min y TEMPERATURE < T_Max. A ello se añade además la función de anyKey, que precede a la comparación de valores. De este modo resulta la siguiente condición:
((T_Min == anyKey) || (TEMPERATURE >= T_Min))
&& ((T_Max == anyKey) || (TEMPERATURE < T_Max))
Así es posible representar de forma muy sencilla las zonas extremas, sin indicar temperaturas finales concretas para los extremos.
Con la función getField() se lee de la misma tabla el Name de la categoría. Si el índice _rowIdx es < 0, antes no se encontró ninguna línea adecuada y el Variant indicado con notFound se transmitiría a la variable. Esta indicación falta, por lo que aquí el resultado sería simplemente false.
De forma análoga se leen de la tabla los valores límite _TMin y _TMax de la categoría, utilizados antes para la búsqueda, y se calcula la anchura _width de la categoría. Si no se hubiera encontrado ninguna línea, ambas temperaturas límite valdrían false (== 0.0) y, por tanto, la diferencia también sería cero. Como más adelante se va a dividir por este número, con la función max() se garantiza que la anchura _width nunca pueda ser cero.
La posición relativa RelPos en la categoría se determina como cociente entre la temperatura relativa al límite inferior del rango y la anchura determinada previamente.