Algoritmos
Operaciones que Flex compila a SQL para calcular valores en campos, informes y documentos dinámicos.
Un algoritmo es una operación que defines en Flex y que el sistema convierte en una consulta SQL optimizada. Lo usas para calcular un valor automáticamente: el total de una línea, la suma de una factura, el precio de un producto en catálogo o un dato del usuario que tiene la sesión abierta.
La sintaxis con la que escribes la lógica es DinaScript. Esta página explica los tipos de algoritmo, las partes que lo componen y cuándo usar cada cosa; la referencia del lenguaje (operadores, funciones, control de flujo) está en su propia sección.
Tipos de algoritmo
Cada tipo se diferencia por sobre qué datos opera: una sola fila, registros relacionados, otra sección o ningún contexto de fila. Elige el tipo según el alcance del cálculo.
| Tipo | Sobre qué opera | Devuelve | Ejemplo |
|---|---|---|---|
| Lineal | Una fila y sus relaciones directas | Un valor de esa fila | cantidad × precio de una línea |
| Cruzado | Registros relacionados, agregados | Un valor agregado | Sumar todas las líneas de una factura |
| Búsqueda | Otra sección, filtrada | El id de un registro | El producto de catálogo que coincide con un código |
| Datos | Todos los registros de una sección | Un valor agregado global | Total facturado del mes para un dashboard |
| Independiente | Sin contexto de fila | Un valor de sesión o cálculo | El usuario o la empresa de la sesión actual |
Matices de cada tipo
Lineal
Trabaja sobre una única fila y puede acceder a sus relaciones directas para traer datos de registros enlazados. No agrega: el resultado sale de los campos de ese mismo registro y de los que cuelgan de él por una relación.
Por ejemplo, en una línea de venta puedes calcular la comisión combinando un campo propio con un campo del empleado relacionado:
venta.total * venta.empleado.comision / 100Es el tipo que alimenta la mayoría de campos auto-calculados (⚙️), porque el cálculo vive y muere en la misma fila que se guarda.
→ Más sobre relaciones y campos auto-calculados en Campos.
Cruzado
Agrega registros relacionados con la fila actual y devuelve un único valor. Es el tipo que usas cuando un registro "padre" necesita un total que vive en sus "hijos": una factura que suma sus líneas, un proyecto que suma sus tareas.
Para agregar usa las funciones de agregación del espacio F de DinaScript (sumar, contar, máximo, etc.). El patrón conceptual es siempre el mismo: indicas qué registros relacionados recorrer y qué campo agregar.
La diferencia clave con el tipo Lineal es la dirección: Lineal baja a una relación para leer un dato concreto; Cruzado recoge muchos registros relacionados y los resume en un número.
Búsqueda
Recorre otra sección aplicando un filtro y devuelve el id del registro que coincide. No trae el dato final directamente: te da la referencia al registro encontrado, que luego usas para enlazar o para leer sus campos.
El caso típico es resolver una relación por una clave de negocio: dado un código de producto, encontrar el registro de catálogo correspondiente.
Datos
Agrega sobre todos los registros de una sección, sin limitarse a los relacionados con una fila. Es el motor de los dashboards y los widgets: total facturado del periodo, número de oportunidades abiertas, importe medio de pedido.
Usa también las funciones de agregación del espacio F, pero el conjunto de datos es toda la sección (con los filtros que definas), no el subconjunto relacionado con un registro concreto.
→ Estos cálculos suelen consumirse desde Informes y Documentos dinámicos.
Independiente
No tiene contexto de fila. No opera sobre un registro ni sobre una sección concreta: resuelve un valor del entorno de ejecución, como el usuario o la empresa de la sesión actual, o se apoya en otros algoritmos para componer su resultado.
Lo usas cuando el cálculo no depende de "dónde estás" sino de "quién eres" o de un dato global del sistema.
Las partes de un algoritmo
Un algoritmo no siempre es una sola fórmula. Los tipos que recorren varios registros (Cruzado, Búsqueda y Datos) se construyen por partes, cada una con un papel distinto en la consulta que Flex genera. Defines solo las que necesitas: en un cálculo simple basta con la fórmula principal; en un cruzado fino completas las demás para acotar exactamente qué registros entran.
| Parte | Qué hace | Cuándo la usas |
|---|---|---|
| Fórmula principal | El cálculo en sí: el valor que el algoritmo devuelve (la suma, el id encontrado, el importe). | Siempre. Es el corazón del algoritmo. |
| Prefiltrado | Un filtro general que descarta registros antes de cualquier otro paso. | Para recortar el universo de datos cuanto antes y que el resto trabaje sobre menos filas. |
| Filtrado izquierda (datos principales) | Filtra sobre los datos principales: el registro o sección desde el que parte el cálculo. | Cuando quieres limitar la fila o filas de origen (solo las activas, solo las del periodo). |
| Filtrado derecha (datos relacionados) | Filtra sobre los datos relacionados que el cruce trae al otro lado. | Cuando solo te interesan ciertos registros enlazados (solo las líneas confirmadas, solo cobros de un tipo). |
| Filtrado Having (post-agrupación) | Filtra después de agregar, sobre el resultado ya agrupado. | Cuando la condición depende del agregado, no de filas sueltas (grupos cuyo total supera un umbral). |
El orden conceptual sigue al de una consulta SQL: primero el prefiltrado poda lo evidente, luego los filtrados izquierda y derecha acotan cada lado del cruce, la fórmula principal agrega, y por último el Having descarta grupos enteros según el resultado.
Piénsalo como un embudo. Cada parte estrecha el conjunto de datos en un momento distinto: las de filtrado antes de sumar (sobre filas), el Having después de sumar (sobre el total). Filtrar pronto y por el lado correcto es lo que mantiene el algoritmo rápido aunque la sección sea enorme.
Cómo encaja en un cruzado
En un algoritmo Cruzado o de Búsqueda estás relacionando dos lados (el registro de origen y los registros enlazados) y cada filtrado actúa sobre un lado concreto:
- Izquierda = el origen del cruce (la factura, el proyecto, la sección de partida).
- Derecha = lo que cruzas contra él (sus líneas, sus tareas, los cobros relacionados).
- Having = la condición sobre el agregado final (solo facturas cuya suma de líneas pase de cierto importe).
Así puedes, por ejemplo, sumar solo las líneas confirmadas (filtrado derecha) de solo las facturas de este año (filtrado izquierda), descartando de entrada los registros anulados (prefiltrado), y quedarte únicamente con los grupos relevantes (Having).
Variables: convertir un algoritmo en parametrizable
Un algoritmo puede declarar variables (preguntas que se resuelven en tiempo de ejecución) y tratarlas como parámetros de entrada. Así el mismo algoritmo sirve para varios casos sin duplicarlo: en lugar de fijar un umbral en el código, lo recibes desde fuera.
Las variables locales se referencian con el prefijo v. (igual que en DinaScript). Por ejemplo, un algoritmo que cuenta registros por encima de una duración mínima recibe esa duración como variable:
v.DuracionMinimaQuien consume el algoritmo (un informe, un campo, un documento) aporta el valor de v.DuracionMinima, y el cálculo se ajusta sin tocar la lógica.
Las preguntas dinámicas de un informe encajan de forma natural aquí: el filtro que el usuario rellena al lanzar el informe se traduce en el parámetro que el algoritmo espera.
Dónde se usan
Un mismo algoritmo se puede reutilizar en varios sitios:
- Campos auto-calculados (⚙️): el valor del campo se recalcula al guardar el registro. Suelen ser algoritmos Lineales o Cruzados.
- Columnas de informes: columnas calculadas que no existen como campo de la sección. Aquí encajan los algoritmos Cruzados, de Búsqueda y de Datos.
- Documentos dinámicos: datos calculados que se insertan en una plantilla (factura, presupuesto, email).
Cómo se ejecutan
Los algoritmos se compilan a SQL nativo y se ejecutan directamente en PostgreSQL. No hay procesamiento en memoria intermedia, lo que aporta:
- Rendimiento: el cálculo ocurre en la base de datos, junto a los datos.
- Consistencia: siempre usan la versión más reciente de los datos.
- Escalabilidad: rinden bien aunque la sección tenga millones de registros.
Como el resultado es SQL, un algoritmo es tan rápido como permita el conjunto de datos que toca. Un tipo Datos que agrega una sección enorme sin filtros pesará más que un Lineal sobre una sola fila. Acota con las partes de filtrado cuando el volumen lo pida.
Preguntas frecuentes
→ DinaScript → Campos → Informes → Documentos dinámicos
Buenas prácticas de DinaScript
Convenciones de estilo, rendimiento y diseño de algoritmos para que tus scripts se entiendan a la primera y no penalicen al guardar.
Scripts y eventos
Asocia lógica a los eventos de tus secciones y campos para que Dinaup ejecute acciones cuando el usuario opera con los datos.