Skip to main content

Visión general

Las Constantes (Constants) y las Tablas de búsqueda (Lookup Tables) son la forma en que separas los parámetros de un modelo de su lógica. En lugar de codificar valores dentro de las expresiones, los nombras, los almacenas en un solo lugar y los referencias desde cualquier parte. Cambia el valor nombrado una vez, y cada expresión que lo referencia se actualiza automáticamente. Esto importa por tres razones:
  1. Ajuste: modifica los parámetros del modelo sin cazar a través de expresiones. Cambia BASE_PROCESSING_TIME de 60 a 75 y cada componente relevante lo sigue.
  2. Legibilidad: SHIFT_EFFICIENCY_FACTOR es más fácil de entender que 0.87 esparcido por las expresiones.
  3. Acceso no técnico: los operadores y analistas que no deberían modificar expresiones aún pueden afinar el modelo cambiando los valores de las constantes.
Tanto las Constantes como las Tablas de búsqueda están limitadas a la fábrica (factory): viven a nivel de fábrica y pueden reutilizarse entre modelos. Pero cada modelo tiene que optar por participar (opt in) en las que usa. Una constante que existe en la fábrica pero no ha sido añadida al modelo es invisible para ese modelo.
Referenciar una constante o tabla que no está añadida al modelo falla la validación. El verificador de expresiones resuelve los nombres contra las propias constantes y tablas de búsqueda del modelo, así que un LOOKUP contra una tabla que la fábrica tiene pero el modelo no ha añadido produce un error “Lookup table ’…’ is not defined” (una constante faltante aparece como “Unknown identifier”): ese es el síntoma que realmente verás cuando se omitió el paso de opt-in.

Constantes

Una Constante es un valor nombrado con un tipo específico: number, text o boolean. Cada constante tiene:
  • Name: cómo la referencian las expresiones. Los nombres usan SCREAMING_SNAKE_CASE (por ejemplo, BASE_CYCLE_TIME)
  • Description: qué representa y en qué unidades
  • Type: number, text o boolean
  • Value: los datos reales
El tipo se llama Text, no string. El menú desplegable Type (Tipo) ofrece Number (Número), Text (Texto) y Boolean (Booleano).
Los nombres se convierten automáticamente a mayúsculas mientras escribes. El campo de nombre convierte lo que escribes a SCREAMING_SNAKE_CASE: escribir base rate se guarda como BASE_RATE. Las letras se convierten a mayúsculas y los espacios se vuelven guiones bajos. Referencia el nombre tal como queda después de la conversión.
Las expresiones referencian el nombre. El nombre debe, por lo tanto, ser un identificador válido del DSL: letras mayúsculas, dígitos y guiones bajos, comenzando con una letra. No puede ser una palabra reservada del DSL (como SIM_TIME o el nombre de una función), y las constantes y las tablas de búsqueda no pueden compartir un nombre entre sí. Cualquiera de los dos conflictos falla la validación (por ejemplo, “Constant ‘SIM_TIME’ collides with reserved identifier.”). Las variables de estado tampoco pueden reutilizar el nombre de una constante o tabla de búsqueda. Referencia una constante por su nombre en cualquier expresión:

Constantes vs. variables de estado

Las Constantes son estáticas durante la duración de una ejecución (Run): no pueden ser reasignadas. Para mutar un valor durante la simulación, usa una Variable de estado en su lugar. Las variables de estado exponen una acción assign en tiempo de ejecución que las constantes no tienen. El alcance también difiere: las constantes están limitadas a la fábrica y se comparten entre todos los modelos que optan por participar, mientras que las variables de estado están limitadas al modelo. Una constante es la herramienta correcta para un parámetro que afinas entre ejecuciones o compartes entre modelos. Una variable de estado es la herramienta correcta para un valor que la simulación misma cambia: turno actual, contador móvil de WIP, señal de demanda.

Cuándo usar una constante

  • Cualquier valor que aparezca en múltiples lugares. Si te encuentras escribiendo 0.87 en varias expresiones, extráelo a una constante.
  • Cualquier valor que podrías querer cambiar entre ejecuciones. Edita la constante, ejecuta de nuevo y compara las ejecuciones.
  • Cualquier valor que un interesado no técnico pueda necesitar ajustar. Los analistas pueden afinar una constante sin conocer el lenguaje de expresiones.
Las constantes tienen alcance de fábrica. Cambiar una la cambia para cada modelo que la usa, incluidas las copias de un modelo. Para comparar valores, ejecuta con un valor, cámbialo, ejecuta de nuevo y compara las dos ejecuciones.

Gestión de constantes

Las constantes aparecen en la sección Constantes (Constants) del panel izquierdo del Modelador, en la vista Vista general (Overview). Cada fila muestra una constante que usa el modelo y su valor.
  • + Agregar Constante al final de la sección añade una constante existente de la fábrica a este modelo, o elige Crear nuevo… para definir una y añadirla en un solo paso.
  • El × de una fila quita la constante de este modelo sin eliminarla. Está deshabilitado mientras el modelo siga referenciando la constante (“En uso: quita sus referencias primero”).
  • El icono de lápiz de la sección (Ver y gestionar todo) abre el diálogo Búsquedas (Lookups) en su pestaña Constantes, que lista cada constante de la fábrica. Añade, edita o elimina constantes ahí, y usa la casilla En Modelo para añadir o quitar una del modelo actual. El mismo diálogo también tiene las pestañas Tablas de Búsqueda, Variables de Estado y Temas.
Editar el valor de una constante lo cambia para cada modelo de la fábrica que la use.

Tablas de búsqueda

Una Tabla de búsqueda (Lookup Table) es una tabla nombrada con claves tipadas, consultable en expresiones. Cada tabla tiene un tipo de valor (number, text o boolean) y una o más claves (llamadas “Attributes” en la UI: estas son las columnas clave de la tabla, sin relación con los atributos de entidad). Las claves mismas están tipadas (cada una puede ser boolean, text o number), por lo que una búsqueda multidimensional puede mezclar tipos de clave. Consulta una tabla con LOOKUP:

Proporcionar un valor de respaldo

LOOKUP acepta un argumento de palabra clave opcional default:= que retorna el valor proporcionado cuando ninguna fila coincide:
Esta es la forma canónica de darle un valor de respaldo a una búsqueda. Siempre prefiere default:= sobre envolver en IF(): es una sola expresión sin doble evaluación de la misma búsqueda.
Sin default:=, las filas faltantes retornan el cero específico de tipo: 0 para una tabla numérica, "" (cadena vacía) para una tabla de texto, FALSE para una tabla booleana. Ese cero es silencioso y fácilmente confundido con un resultado real. Usa default:= siempre que la diferencia entre “ninguna fila coincidió” y “el valor es exactamente cero” importe.
La sintaxis de argumento de palabra clave usa :=, no = (que significa igualdad en el DSL). A pesar del parecido visual con el operador morsa de Python, := aquí es simplemente un marcador de argumento nombrado, no una asignación. El mismo := marca los argumentos de palabra clave filter:= y type:= en las funciones de agregación y ndigits:= en ROUND.

Búsquedas multidimensionales

Una Tabla de búsqueda puede configurarse con más de una columna clave, por lo que una sola tabla puede capturar datos que varían a través de dos o más ejes a la vez, como “tiempo de procesamiento por (tipo de producto, estación)” o “tasa de rendimiento por (turno, clase de material)”. Consúltala con un argumento posicional por columna clave, en el orden en que la tabla las define:
Cada columna clave tiene su propio tipo y una lista obligatoria de valores posibles: el conjunto enumerado de valores que esa columna acepta. Esa lista es estructural, no decorativa: cada entrada de la tabla se valida contra ella, y el diálogo genera las entradas de la tabla a partir de ella. Diseña una tabla de búsqueda enumerando de antemano el dominio de cada clave. Las llamadas a LOOKUP con múltiples claves coinciden con las filas donde todas las columnas clave igualan los valores que pasas. Un argumento por columna clave. No hay sintaxis comodín ni de coincidencia parcial: siempre pasa exactamente tantas claves como define la tabla. Claves compuestas mediante CONCAT. Cuando una clave natural es una cadena compuesta, constrúyela en la expresión en lugar de añadir una columna por fragmento:

Gestión de tablas de búsqueda

Las tablas de búsqueda aparecen en la sección Tablas de búsqueda (Lookup tables) de la vista Vista general, justo debajo de Constantes, y funcionan de la misma manera: + Agregar Tabla de Búsqueda añade una tabla existente de la fábrica a este modelo (Crear nuevo… abre el diálogo para definir una), el × de una fila la quita de este modelo, y el icono de lápiz abre el diálogo Búsquedas en su pestaña Tablas de Búsqueda. En el diálogo, cada tabla tiene:
  • Un Name (Nombre) (SCREAMING_SNAKE_CASE, convertido mientras escribes, igual que los nombres de constantes)
  • Un Value Type (Tipo de Valor): Number, Text o Boolean
  • Uno o más Attributes (Atributos): las columnas clave tipadas, cada una con un nombre, un tipo y sus valores posibles
  • Entries (Entradas): una fila por cada combinación de valores de clave, cada una con su valor
Las entradas se validan al guardar: una fila con el número incorrecto de claves, una clave fuera de los valores posibles de su columna, o un valor que no coincide con el tipo de la tabla, se rechaza con un Error de Validación: no descubrirás una fila malformada hasta el momento de la simulación.

Cuándo usar una tabla de búsqueda

  • Valores que varían según un atributo categórico. Tiempo de procesamiento por tipo de producto, tasa de rendimiento por material, peso de prioridad por nivel de cliente: todas búsquedas naturales.
  • Enrutamiento y divisiones proporcionales. Diferentes entidades se enrutan de manera diferente; almacena las reglas de enrutamiento en una tabla en lugar de expresiones IF profundamente anidadas.
  • Configuración basada en datos. Cuando la “configuración” de un modelo es en realidad un conjunto de números ligados a categorías, una tabla de búsqueda es más clara que codificar la misma información a través de muchos campos.

Constantes vs. tablas de búsqueda: ¿cuál usar?

  • Valor único usado en muchos lugares → Constante
  • Valor que depende de un atributo categórico → Tabla de búsqueda
  • Necesita variar entre ejecuciones de comparación → Constante (un valor por ejecución)
  • Conjunto de datos de referencia grande → Tabla de búsqueda
Es común usar ambos: una constante para un factor global, una búsqueda para tasas por tipo, combinadas en una expresión.

Patrones

Tiempo de procesamiento por producto:
Costo o recargo condicional con respaldo seguro:
Dinámicas de turno ajustables:

Consejos

  • La aritmética del DSL es estricta en tipos. Los números se suman a números; el texto no se convierte silenciosamente. Detecta los desajustes de tipo en la validación en lugar de depender de conversiones silenciosas.
  • El tipo de valor debe coincidir con el contexto que lo lee. Una constante boolean en una expresión numérica, o un valor de búsqueda text alimentando una ranura numérica, falla la validación con un error de tipo: un punto de tropiezo común después de refactorizar una tabla de números a valores de texto.
  • Usa default:= defensivamente. Si una fila de búsqueda faltante debería ser cualquier cosa diferente del cero del tipo, default:= es más corto y claro que un envoltorio IF() alrededor de dos llamadas a LOOKUP.
  • Cada modelo opta por participar. Crear una constante o tabla de búsqueda a nivel de fábrica es el primer paso. Añadirla al modelo (desde la sección Vista general o la casilla En Modelo del diálogo) decide si ese modelo la ve.