Tabla de decisión
La tabla de decisión es un paso de Zoan Flow que decide con reglas que tú escribes, como una matriz de decisión en una hoja de cálculo: cada fila dice «si los datos del caso son así, el resultado es este». Con ella ganas:
- El mismo resultado siempre. Dos casos con los mismos datos salen por la misma fila, hoy y dentro de un año.
- Sin costo por caso. No usa modelos de IA ni consume presupuesto de IA.
- Al instante. El paso se resuelve en cuanto el caso llega; no espera a un robot ni a una persona.
- Decisiones que se pueden explicar. En el monitor ves qué fila decidió y con qué valores, listo para una auditoría.
- Reglas que mantiene el negocio. Las filas se escriben como en Excel (y se pueden pegar desde Excel o importar en CSV): cambiar un tope o un rol no requiere tocar el robot.
Cuándo usarla
Sección titulada «Cuándo usarla»| Usa una tabla de decisión cuando… | Usa un paso de IA cuando… |
|---|---|
| La regla ya existe y se puede escribir (topes, rangos, listas de valores, fechas). | Hay que leer texto libre (la descripción de una solicitud, el texto que un robot sacó de un correo o un documento) y sacar de ahí los datos. |
| Necesitas el mismo resultado cada vez y poder mostrar por qué. | Hay que clasificar o redactar algo que no cabe en una lista cerrada de reglas. |
| El volumen es alto y quieres que cada caso cueste lo mismo: nada. | El valor está en entender el contenido, no en aplicar una política. |
Las dos se complementan: la IA deja los datos en variables del caso y la tabla decide con ellas.
Agregar el paso
Sección titulada «Agregar el paso»En la paleta del lienzo, grupo Decisiones, arrastra Tabla de decisión al diagrama. Al elegirla, el panel de propiedades muestra:
- Reglas: un resumen de la tabla y el botón Editar y probar la tabla, que abre el editor (en un flujo que solo puedes ver, el botón es Ver y probar la tabla).
- Enrutar por lo que decide (opcional): crea la compuerta que reparte los casos según una salida. Ver Combinarla con una compuerta.
El editor de la tabla
Sección titulada «El editor de la tabla»La tabla tiene cuatro partes: entradas, salidas, filas y la fila fija En cualquier otro caso.
Entradas
Sección titulada «Entradas»Las entradas son las variables del caso con las que se decide; cada una es una columna de condiciones. Con Agregar entrada eliges una variable del flujo. Cada entrada tiene un tipo: Número, Entero, Texto, Fecha, Fecha y hora, Sí/No o Lista. Si el dato está dentro de un objeto (por ejemplo, respuesta.fields.monto), elige Un campo dentro de un objeto…, escribe la ruta y declara su tipo, porque el objeto no lo dice.
Salidas
Sección titulada «Salidas»Las salidas son las variables que el paso escribe cuando decide; cada una es una columna de resultados. Con Agregar salida eliges una variable existente o Una variable nueva…, que se declara en el flujo. En cada fila, la salida puede llevar:
- un valor fijo (
Jefe de área,2,sí); - vacío, para dejar la variable sin valor;
- la copia de otra variable con
{{variable}}, por ejemplo{{correo_solicitante}}.
Cada fila es una regla: una condición por entrada y un valor por salida. Una fila se cumple cuando se cumplen todas sus condiciones.
- Agregar fila suma una al final. Cada fila tiene botones para subir, bajar, duplicar y eliminar.
- La columna Descripción es opcional: un nombre corto de la regla (por ejemplo,
Monto medio) que luego verás en el probador y en el monitor. - Pegar desde Excel. Copia un bloque de celdas en Excel y pégalo en una celda de la tabla: se llenan las filas y columnas que hagan falta, y si el bloque trae el encabezado, se salta solo.
- Debajo de la tabla ves cómo se entendió la celda activa, o su error, mientras escribes.
En cualquier otro caso
Sección titulada «En cualquier otro caso»La última fila, En cualquier otro caso, es fija y obligatoria: dice qué pasa cuando ninguna fila se cumple. Tienes dos opciones:
- Dar estos valores a las salidas, como una fila más que siempre se cumple; o
- Abrir un incidente para que una persona decida. Úsalo cuando un caso que no encaja en ninguna regla sea señal de un dato mal capturado.
Botones del editor
Sección titulada «Botones del editor»| Botón | Para qué |
|---|---|
| Probar | Abre el probador. Ver Probar la tabla. |
| CSV | Descarga la tabla en CSV, separado por ;, para revisarla o editarla en Excel. |
| Importar | Reemplaza las filas con las de un CSV. Ver Importar desde CSV. |
| Listo | Cierra el editor y vuelve al lienzo. |
Cómo se escriben las celdas
Sección titulada «Cómo se escriben las celdas»Las celdas se escriben como en una hoja de cálculo.
Condiciones (entradas)
Sección titulada «Condiciones (entradas)»| Escribes | Se cumple cuando el valor… |
|---|---|
- | es cualquiera (la entrada no importa en esta fila) |
5 o = 5 | es igual a 5 |
≠ 5 o != 5 | es distinto de 5 |
< 5, ≤ 5 (o <= 5) | es menor, o menor o igual |
> 5, ≥ 5 (o >= 5) | es mayor, o mayor o igual |
[5 .. 50] | está entre 5 y 50, incluidos los extremos |
(5 .. 50) | está entre 5 y 50, sin los extremos |
[5 .. 50) | está entre 5 y 50, incluido 5 y sin 50 (los corchetes y paréntesis se pueden mezclar) |
entre 5 y 50 | lo mismo que [5 .. 50] |
a; b; c | es uno de los valores de la lista (en textos, también separados por coma: a, b, c) |
contiene x | contiene el texto x |
vacío | no tiene valor |
con valor | tiene un valor |
Formatos:
- Números con punto de miles y coma decimal:
12.500.000o12500000;0,5. - Fechas como
AAAA-MM-DDoDD/MM/AAAA:2026-10-31o31/10/2026. - Texto literal entre comillas. Si necesitas comparar con un texto que coincide con la sintaxis, ponlo entre comillas:
"-"es el guion y no «cualquiera»,"vacío"es la palabra y no «sin valor».
Resultados (salidas)
Sección titulada «Resultados (salidas)»| Escribes | La salida queda con |
|---|---|
Jefe de área, 2, 2026-12-31 | ese valor |
sí / no | verdadero o falso |
vacío | sin valor |
{{variable}} | el valor de otra variable del caso |
Qué fila gana
Sección titulada «Qué fila gana»En el selector Si varias filas se cumplen eliges cómo se resuelve una tabla en la que más de una fila podría cumplirse:
- Gana la primera (el orden importa), la opción por defecto. Las filas se revisan de arriba abajo y gana la primera que se cumple. Pon arriba los casos particulares y abajo los generales.
- Solo puede cumplirse una (única). Al publicar, la revisión marca las filas que se solapan; si aun así en un caso se cumplen varias, el caso queda en incidente en lugar de elegir una al azar. Úsala cuando quieras la garantía de que las reglas no se pisan.
Revisión al publicar
Sección titulada «Revisión al publicar»La sección Revisión del editor lista los problemas de la tabla y, al hacer clic en uno, te lleva a la celda. La misma revisión corre al Validar o Publicar el flujo.
| Revisión | Ejemplo |
|---|---|
| Tipos incompatibles | > 5.000.000 en una entrada de tipo Texto. |
| Variables que no existen | Una entrada o un {{variable}} que no está declarado en el flujo. |
| Salidas sin valor | Una celda de salida en blanco (para dejarla sin valor, escribe vacío). |
| Rangos vacíos | [50 .. 5], que no contiene ningún valor. |
| Filas que nunca deciden | Con Gana la primera, una fila que las anteriores ya cubren por completo. |
| Filas que se solapan | Con Solo puede cumplirse una, dos filas que un mismo caso puede cumplir. |
| Huecos entre rangos | Cuando la tabla decide con una sola entrada numérica o de fecha, un valor que ninguna fila cubre; por ejemplo, filas < 5.000.000 y (5.000.000 .. 50.000.000] dejan sin cubrir 5.000.000. |
| Datos sensibles copiados | Una salida que copia con {{variable}} una variable marcada como sensible. |
Los errores impiden publicar; los avisos se pueden aceptar.
Probar la tabla
Sección titulada «Probar la tabla»- Probador. En el editor pulsa Probar y escribe valores para las entradas, o usa Probar con valores de ejemplo. Verás al momento la fila que decide, por ejemplo «Decide la fila 2 (Monto medio).», y lo que escribe en cada salida. Es la forma más rápida de revisar los bordes de cada rango.
- Simulación del flujo. Al Simular el flujo completo, la tabla se evalúa con los datos de ejemplo y el recorrido muestra en el paso decidió fila N y por dónde siguió el caso.
Importar desde CSV
Sección titulada «Importar desde CSV»Importar reemplaza todas las filas de la tabla con las de un archivo CSV separado por ;, como el que descarga CSV:
- La primera fila es el encabezado con los nombres de las columnas. La primera columna es Descripción; las salidas llevan
→delante del nombre (por ejemplo,→ rol_aprobador). - Cada fila siguiente es una regla, escrita con la misma sintaxis de las celdas.
- Una fila con la descripción En cualquier otro caso da los valores de esa fila fija. Si en una de sus salidas escribes
incidente, queda como Abrir un incidente para que una persona decida.
Descripción;monto;tipo_gasto;→ aprobacion_automatica;→ rol_aprobador;→ nivelMonto bajo;< 5.000.000;-;sí;vacío;0Monto medio;[5.000.000 .. 50.000.000];viajes, papelería;no;Jefe de área;1Monto medio, otros gastos;[5.000.000 .. 50.000.000];-;no;Director financiero;1En cualquier otro caso;;;no;Gerencia general;2Como el ; separa las columnas del archivo, en un CSV escrito a mano las listas de textos van separadas por coma.
Combinarla con una compuerta
Sección titulada «Combinarla con una compuerta»La tabla calcula; la compuerta exclusiva enruta. Después de la tabla, la compuerta compara una salida de la tabla, por ejemplo aprobacion_automatica es verdadera.
Para no armar las rutas a mano, usa la sección Enrutar por lo que decide del panel del paso: eliges la salida y pulsas Crear compuerta. El lienzo agrega una compuerta exclusiva con:
- una rama por cada valor fijo que esa salida toma en la tabla, con su condición ya escrita y terminando en un fin provisional que luego llevas al paso que corresponde;
- una rama En otro caso hacia el paso al que seguía la tabla.
Si rol_aprobador puede ser Jefe de área, Director financiero o Gerencia general, obtienes tres ramas más la de En otro caso. Si no era lo que querías, Ctrl+Z lo deshace.
En el monitor y el registro del caso
Sección titulada «En el monitor y el registro del caso»En el detalle del paso, el monitor muestra qué fila decidió y con qué valores:
Fila 2 · Monto medioMonto: 12.500.000 — entre 5.000.000 y 50.000.000→ Rol aprobador = Jefe de áreaEn el registro del caso queda una línea como Tabla «Nivel de aprobación»: decidió la fila 2 (…). Así cualquiera entiende por qué el caso tomó ese camino sin abrir la definición del flujo. Los valores de variables marcadas como sensibles se muestran enmascarados.
Incidentes
Sección titulada «Incidentes»| Incidente | Qué pasó |
|---|---|
| Ninguna fila de la tabla se cumple | El caso no encajó en ninguna fila y En cualquier otro caso está configurado para abrir un incidente. |
| Varias filas de la tabla se cumplen | Con Solo puede cumplirse una, el caso cumple más de una fila. |
| La tabla copia un dato que no tiene valor | Una salida usa {{variable}} y esa variable no tiene valor en este caso. |
Para resolverlo tienes dos caminos:
- Corregir y reintentar. Corrige las variables del caso que estaban mal y reintenta: la tabla se vuelve a evaluar con los datos corregidos.
- Saltar el paso dando las salidas. Si el caso es una excepción, salta el paso y escribe tú los valores de las salidas, para que los pasos siguientes tengan lo que necesitan.
Si el incidente viene de la tabla misma (dos filas que se solapan, un hueco entre rangos), corrígela, publica una versión nueva y atiende los casos detenidos.
Ejemplo: aprobación de solicitudes por monto
Sección titulada «Ejemplo: aprobación de solicitudes por monto»Una empresa ficticia aprueba las solicitudes de gasto según el monto y el tipo de gasto. Los datos del ejemplo son inventados.
Variables del flujo: monto (Número) y tipo_gasto (Texto) como entradas; aprobacion_automatica (Sí/No), rol_aprobador (Texto) y nivel (Entero) como salidas.
Tabla «Nivel de aprobación», con Gana la primera (el orden importa):
| # | Descripción | monto | tipo_gasto | aprobacion_automatica | rol_aprobador | nivel |
|---|---|---|---|---|---|---|
| 1 | Monto bajo | < 5.000.000 | - | sí | vacío | 0 |
| 2 | Monto medio | [5.000.000 .. 50.000.000] | viajes; papelería | no | Jefe de área | 1 |
| 3 | Monto medio, otros gastos | [5.000.000 .. 50.000.000] | - | no | Director financiero | 1 |
| En cualquier otro caso | no | Gerencia general | 2 |
La fila 2 va antes que la 3 porque es el caso particular: una solicitud de viajes por 12.500.000 cumple las dos, y gana la primera. Con 80.000.000, ninguna fila se cumple y decide En cualquier otro caso.
Después de la tabla, una compuerta exclusiva ¿Aprobación automática? separa los caminos: si aprobacion_automatica es verdadera, el caso sigue directo; si no, llega a una tarea de Persona asignada al rol {{rol_aprobador}}.
flowchart LR
A([Inicio]) --> T[Tabla de decisión<br/>Nivel de aprobación]
T --> G{¿Aprobación<br/>automática?}
G -- Sí --> R[Registrar la solicitud]
G -- No --> P[Persona<br/>rol: rol_aprobador]
P --> R
R --> F([Fin])
Así la regla vive en un solo lugar: si mañana el tope sube a 8.000.000 o los viajes pasan a otro rol, cambias una celda y publicas.
La definición en JSON
Sección titulada «La definición en JSON»Al descargar el flujo en JSON, la tabla se ve así:
{ "type": "decisionTable", "name": "Nivel de aprobación", "decision": { "hitPolicy": "first", "inputs": [ { "var": "monto" }, { "var": "tipo_gasto" } ], "outputs": [ { "var": "aprobacion_automatica" }, { "var": "rol_aprobador" }, { "var": "nivel" } ], "rules": [ { "id": "bajo", "when": { "monto": { "op": "lt", "value": 5000000 } }, "then": { "aprobacion_automatica": { "value": true }, "rol_aprobador": { "value": null }, "nivel": { "value": 0 } } }, { "id": "viajes", "when": { "monto": { "op": "between", "min": 5000000, "max": 50000000 }, "tipo_gasto": { "op": "in", "values": ["viajes", "papelería"] } }, "then": { "aprobacion_automatica": { "value": false }, "rol_aprobador": { "value": "Jefe de área" }, "nivel": { "value": 1 } } }, { "id": "medio", "when": { "monto": { "op": "between", "min": 5000000, "max": 50000000 } }, "then": { "aprobacion_automatica": { "value": false }, "rol_aprobador": { "value": "Director financiero" }, "nivel": { "value": 1 } } } ], "otherwise": { "then": { "aprobacion_automatica": { "value": false }, "rol_aprobador": { "value": "Gerencia general" }, "nivel": { "value": 2 } } } }}hitPolicy es first para Gana la primera (el orden importa) y unique para Solo puede cumplirse una (única). Para que un caso sin fila que se cumpla abra un incidente, otherwise es { "incident": true }.
Operadores de when:
op | Equivale a | Campos |
|---|---|---|
any | - | — |
eq, neq | =, ≠ | value |
lt, lte, gt, gte | <, ≤, >, ≥ | value |
between | [a .. b] | min, max; minExclusive y maxExclusive (true) para excluir un extremo |
in | a; b; c | values |
contains | contiene x | value |
empty, notEmpty | vacío, con valor | — |
| Elemento | Máximo por tabla |
|---|---|
| Filas | 500 |
| Entradas | 20 |
| Salidas | 20 |
Valores en una lista (a; b; c) | 200 |