Ir al contenido

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.
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.

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.

La tabla tiene cuatro partes: entradas, salidas, filas y la fila fija En cualquier otro caso.

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.

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.

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.
BotónPara qué
ProbarAbre el probador. Ver Probar la tabla.
CSVDescarga la tabla en CSV, separado por ;, para revisarla o editarla en Excel.
ImportarReemplaza las filas con las de un CSV. Ver Importar desde CSV.
ListoCierra el editor y vuelve al lienzo.

Las celdas se escriben como en una hoja de cálculo.

EscribesSe cumple cuando el valor…
-es cualquiera (la entrada no importa en esta fila)
5 o = 5es igual a 5
≠ 5 o != 5es 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 50lo mismo que [5 .. 50]
a; b; ces uno de los valores de la lista (en textos, también separados por coma: a, b, c)
contiene xcontiene el texto x
vacíono tiene valor
con valortiene un valor

Formatos:

  • Números con punto de miles y coma decimal: 12.500.000 o 12500000; 0,5.
  • Fechas como AAAA-MM-DD o DD/MM/AAAA: 2026-10-31 o 31/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».
EscribesLa salida queda con
Jefe de área, 2, 2026-12-31ese valor
sí / noverdadero o falso
vacíosin valor
{{variable}}el valor de otra variable del caso

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.

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ónEjemplo
Tipos incompatibles> 5.000.000 en una entrada de tipo Texto.
Variables que no existenUna entrada o un {{variable}} que no está declarado en el flujo.
Salidas sin valorUna 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 decidenCon Gana la primera, una fila que las anteriores ya cubren por completo.
Filas que se solapanCon Solo puede cumplirse una, dos filas que un mismo caso puede cumplir.
Huecos entre rangosCuando 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 copiadosUna salida que copia con {{variable}} una variable marcada como sensible.

Los errores impiden publicar; los avisos se pueden aceptar.

  • 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 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;→ nivel
Monto bajo;< 5.000.000;-;sí;vacío;0
Monto medio;[5.000.000 .. 50.000.000];viajes, papelería;no;Jefe de área;1
Monto medio, otros gastos;[5.000.000 .. 50.000.000];-;no;Director financiero;1
En cualquier otro caso;;;no;Gerencia general;2

Como el ; separa las columnas del archivo, en un CSV escrito a mano las listas de textos van separadas por coma.

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 detalle del paso, el monitor muestra qué fila decidió y con qué valores:

Fila 2 · Monto medio
Monto: 12.500.000 — entre 5.000.000 y 50.000.000
→ Rol aprobador = Jefe de área

En 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.

IncidenteQué pasó
Ninguna fila de la tabla se cumpleEl caso no encajó en ninguna fila y En cualquier otro caso está configurado para abrir un incidente.
Varias filas de la tabla se cumplenCon Solo puede cumplirse una, el caso cumple más de una fila.
La tabla copia un dato que no tiene valorUna 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ónmontotipo_gastoaprobacion_automaticarol_aprobadornivel
1Monto bajo< 5.000.000-sívacío0
2Monto medio[5.000.000 .. 50.000.000]viajes; papeleríanoJefe de área1
3Monto medio, otros gastos[5.000.000 .. 50.000.000]-noDirector financiero1
En cualquier otro casonoGerencia general2

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.

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:

opEquivale aCampos
any-—
eq, neq=, ≠value
lt, lte, gt, gte<, ≤, >, ≥value
between[a .. b]min, max; minExclusive y maxExclusive (true) para excluir un extremo
ina; b; cvalues
containscontiene xvalue
empty, notEmptyvacío, con valor—
ElementoMáximo por tabla
Filas500
Entradas20
Salidas20
Valores en una lista (a; b; c)200