Algoritmos
Los cinco tipos de algoritmo de Flex, cómo se crean, qué propiedades se editan, la unión con otra sección y sus preguntas.
Un algoritmo es una consulta guardada que el motor ejecuta para calcular un valor sobre una sección: la deuda de un cliente, el stock de un artículo, el total de una factura. La fórmula se escribe en DinaScript y el servidor la compila a SQL. En la Flex API es el tipo FlexObjectTypes.Algorithms.
Antes de empezar
- Un algoritmo se crea y se edita en FlexHub → Algoritmos si el servidor de la empresa publica columnas editables para el tipo. Con la lista vacía, se lee y se comprueba, pero no se guarda.
- El tipo y las secciones se eligen al crear y no se cambian: un algoritmo de otro tipo o sobre otra sección es otro algoritmo.
- No se borra ni se restaura por la Flex API:
Flex_DeleteObjectAsyncyFlex_UndeleteObjectAsynclo rechazan.
Los tipos
El tipo es la columna tipoalgoritmo, enum TipoAlgoritmoE. Determina sobre qué filas se calcula, si el filtro se ejecuta y qué gramática admite la fórmula.
| Valor | TipoAlgoritmoE | Rótulo | Sobre qué calcula | El filtro | La fórmula |
|---|---|---|---|---|---|
| 1 | Lineal | Lineal | Los datos de la propia ficha, sin consultar ninguna otra. | No se ejecuta. El servidor rechaza escribir uno; el que venga puesto se puede vaciar. | Una ficha cada vez: no se puede sumar ni contar. |
| 2 | Dato | Dato | Muchas fichas de una sección, resumidas en un solo valor: un total, un recuento, una media. | Se ejecuta, ficha a ficha, sin resumir. | Procesando varias fichas, todo dato va resumido (sumado, contado, máximo). Procesando una sola, no se puede resumir. |
| 3 | Compuesto | Relacionado | Las fichas de otra sección que le corresponden a cada una de las suyas. Es el único con criterio de unión. | Se ejecuta, ficha a ficha. | Los datos de la otra sección se resumen siempre; los de la propia, nunca. |
| 4 | Calculo | Calculadora | Ninguna ficha: combina constantes, funciones y preguntas. | No hay filas que filtrar. El servidor rechaza escribir uno; el que venga puesto se puede vaciar. | Sin datos de ficha. |
| 5 | Compatibilidad | Búsqueda | Devuelve la lista de fichas que cumplen una condición, para filtrar un informe. | Se ejecuta. En FlexHub se llama Filtrado de compatibilidad: qué fichas deja pasar. | Ficha a ficha, sin sumar ni contar. En FlexHub se crea con la fórmula C.ID. |
El valor 0 (Indefinido, No Detectado) es una fila sin tipo válido: el motor no puede ejecutarla y FlexHub lo avisa con Este algoritmo no tiene tipo.
Pulsa Comprobar antes de Aceptar: comprueba la fórmula con las dos secciones, el tipo y las preguntas del algoritmo, sin escribir nada.
Crear un algoritmo
Pulsa Nuevo
En FlexHub → Algoritmos, o en Contenido → Algoritmos dentro de la ventana de una sección, pulsa Nuevo. Si el servidor de la empresa no admite crear algoritmos, FlexHub avisa No se pueden crear algoritmos y no abre nada.
Elige el tipo
La ventana Nuevo algoritmo ofrece Lineal, De dato, Relacionado, Calculadora y De búsqueda, cada uno con lo que necesita: una sección, dos o ninguna.
Elige las secciones
Desde FlexHub → Algoritmos, la ventana siguiente pide la sección sobre la que calcula; desde una sección, ya viene dada. Un Relacionado pide además la sección con la que se une. Una Calculadora no pide ninguna. Cerrar cualquiera de estas ventanas cancela el alta.
Nombre y fórmula
Se abre la ventana del algoritmo. Escribe el Nombre (mínimo 3 caracteres) y la fórmula en la pestaña Fórmula. Pulsa Aceptar: el servidor crea el algoritmo en unos 11 segundos, y la ventana sigue abierta con la pestaña Preguntas.
Por la Flex API, Flex_CreateObjectAsync(FlexObjectTypes.Algorithms, sectionId, patch). sectionId es la sección principal y va vacío en una Calculadora. Claves del patch:
| Clave | Qué es |
|---|---|
tipoalgoritmo | El valor de TipoAlgoritmoE. Obligatorio. |
nombre | Obligatorio: mínimo 3 caracteres, sin * ni ~. |
algoritmo | La fórmula, legible. Obligatoria. |
plantillarelacionid | La sección con la que se une. Obligatoria en un Relacionado y rechazada en los demás. |
condiciones | El filtro. |
descripcion, categoria, subcategoria | Cómo se archiva. |
role, espublico | Ver La ficha. |
decimalescalc, decimalesvis | Sin ellos, 2 y 2. |
| El criterio de unión | Las columnas de La unión y el tope de filas. |
Las preguntas se ponen después del alta, con Flex_SetQuestionsAsync.
Las partes de la consulta
El motor distingue cinco partes de un algoritmo, enum TipoAlgoritmo_TipoFormulaE:
| Valor | Miembro | Rótulo | Qué hace |
|---|---|---|---|
| 1 | FormulaPrincipal | Formula principal | El cálculo. La única parte que siempre existe. Columna algoritmo. |
| 3 | Prefiltrado | Filtrado | Descarta filas antes de cualquier otro paso. Columna condiciones. |
| 4 | FiltradoDeDatosPrincipales | Prefiltrado izquierda | Filtra la sección de partida en un Relacionado. |
| 5 | FiltradoDeDatosRelacionados | Prefiltrado derecha | Filtra las fichas de la otra sección en un Relacionado. |
| 6 | FiltradoHaving | Filtro post agrupación | Filtra después de resumir, sobre el total. |
FlexHub y la Flex API editan la fórmula (algoritmo) y el filtro (condiciones); en FlexHub, los dos en la pestaña Fórmula. Las otras tres partes no se editan.
La ficha
Las columnas que publica Flex_GetEditablesAsync(FlexObjectTypes.Algorithms), aparte del criterio de unión:
| Columna | Rótulo en FlexHub | Qué hace |
|---|---|---|
nombre | Nombre | La palabra clave con la que las fórmulas y los scripts lo invocan: A. seguido del nombre. Obligatorio, mínimo 3 caracteres. Va encima de las pestañas. |
descripcion, categoria, subcategoria | Descripción, Categoría, Subcategoría | Cómo se archiva dentro de su tipo. Card Datos del algoritmo de la pestaña General. |
role | Rol tipo de dato | AlgoritmoRolE: Normal (0), Moneda (1), Porcentaje (2). Cómo se presenta el resultado. Tiene que coincidir con el rol del campo que use el algoritmo: mientras un campo se calcule con él, el servidor no deja cambiarlo (A-4073). Card Datos del algoritmo. |
espublico | El interruptor Público de la pestaña Avanzado | Activado, el algoritmo se usa en informes, paneles y otros algoritmos; desactivado, solo donde se haya añadido a mano. Uno que calcula un campo no puede ser público (A-4186) y uno sugerido para notificaciones tiene que serlo (E-6706). |
algoritmo | La fórmula | El cálculo, en DinaScript. Obligatorio. Pestaña Fórmula. |
condiciones | Filtro: sobre qué fichas calcula | Sobre qué filas se aplica. Vacío, sobre todas. Pestaña Fórmula. |
decimalescalc | Decimales que se ven | De 0 a 9. Pestaña Avanzado. |
decimalesvis | Decimales con los que calcula | De 0 a 11. Pestaña Avanzado. |
iconobase64 | El icono. FlexHub no lo cambia. |
Si el servidor no publica esas dos columnas como editables, FlexHub muestra el dato en solo lectura: Cómo se presenta para role y Dónde se puede usar para espublico.
Lo que se lee pero no se edita:
| Dato | Columna | Valores |
|---|---|---|
| Tipo | tipoalgoritmo | TipoAlgoritmoE. FlexHub lo muestra en el subtítulo de la card Sobre qué calcula. |
| Sección relacionada | plantillarelacionid | La sección con la que se une un Relacionado. Sale en Sobre qué calcula, al lado de la Sección principal. |
| Subtipo | subtipo | AlgoritmoSubtipoE: Normal (1), Notificacion (2), Permisos (3), CamposAutoCalculadosODestinador (4), Dinamico (5). El alta lo pone en Normal. |
La unión y el tope de filas
En un Relacionado la fila guarda cómo se une con la otra sección, y en los tipos que ordenan y acotan, qué fichas entran en el cálculo. FlexHub lo edita en la pestaña Unión de un Relacionado o Fichas de un Dato y una Búsqueda. Un Lineal y una Calculadora no tienen esa pestaña.
| Dato | Columnas | Qué es |
|---|---|---|
| Parejas de unión | camporelacioninterno1 a camporelacioninterno10 con camporelacionexterno1 a camporelacionexterno10 | El campo de la sección principal y el de la relacionada que tienen que valer lo mismo. El número de la columna empareja los dos campos. Añadir pareja ocupa el primer número libre. Solo campos directos. |
| Orden de la sección principal | campoorden1 a campoorden6, con campoorden1desc a campoorden6desc | Hasta seis niveles, cada uno ascendente o descendente. Se añaden con Añadir orden. |
| Orden de la sección relacionada | relacioncampoorden1 a relacioncampoorden6, con su desc | Lo mismo, del lado de la relacionada. Solo en un Relacionado. |
| Se saltan las primeras | datosignorar, y relacioncantidadignorar en la relacionada | Cuántas fichas se saltan. |
| Y de ahí entran | datosaprocesar, y relacioncantidaprocesar en la relacionada | Cuántas fichas entran en el cálculo. |
| Fecha de referencia | camporeftemporal, y camporeftemporalrel en la relacionada | El campo de fecha, o de fecha y hora, por el que un informe o un panel acotan el cálculo en el tiempo. En FlexHub se rotula Fecha de referencia en y el nombre de la sección. Solo campos directos. Con las dos puestas, del mismo formato. |
El criterio viaja en bloque: si cambia una de sus 50 columnas, se envían todas, y el servidor lo valida entero antes de escribir. Lo rechaza si no cumple estas reglas:
- Un Relacionado necesita al menos una pareja completa y no admite parejas incompletas.
- Orden y tope van juntos: acotar sin ordenar (B-645, B-662) y ordenar sin acotar (B-646, B-663) se rechazan.
- Un Lineal no ordena ni acota, y una Calculadora no admite nada de esta tabla (B-625, B-626).
Con datosaprocesar = 1 el algoritmo devuelve un solo valor y la fórmula no puede resumir; con 0 o más de 1 devuelve un conjunto y la fórmula tiene que resumir.
Preguntas
Un algoritmo puede pedir valores antes de calcular: un porcentaje, una fecha, un registro. Son FlexQuestionDTO, los mismos que en un informe o un documento, y en la fórmula se leen como v. seguido del nombre interno de la pregunta (Keyword). Se pasan por posición, no por nombre: mover una pregunta cambia lo que recibe quien llama. En FlexHub están en la pestaña Preguntas, que sale con el algoritmo ya creado.
Un algoritmo que ya calcula un campo está en uso y su estructura de preguntas queda congelada (FlexQuestionsDTO.Frozen): no se añade, quita ni mueve ninguna, ni se cambia su formato, su sección o su rango de fechas. Se cambian la etiqueta, la ayuda, el desplegable y, por la Flex API, el rol; FlexHub no ofrece el rol. Ver Las preguntas.
Dónde se usa un algoritmo
| Uso | Cómo |
|---|---|
| Campo auto-calculado | El subtipo CamposAutoCalculadosODestinador calcula el valor de un campo que rellena el motor. |
| Columna de un informe | Una columna calculada que no existe como campo. Ver Informes. |
| Filtro de un informe | Un algoritmo de Búsqueda en la columna algoritmodefiltrado determina qué filas entran; un desplegable ofrece solo lo que encaja. |
| Script | A. seguido del nombre del algoritmo devuelve su valor dentro de un script. |
| Documento dinámico | Un valor calculado que se inserta en la plantilla. Ver Documentos dinámicos. |
Cambiar la fórmula de un algoritmo en uso cambia lo que calcula en todo el ERP: en cada campo, informe o script que lo use. Tras Aceptar, pulsa Releer para ver la fórmula tal como la guardó el servidor.
Siguiente: Scripts.