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 fórmula guardada que calcula 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. En la Flex API es el tipo FlexObjectTypes.Algorithms.
Antes de empezar
- La pantalla: FlexHub → Algoritmos. Solo se guarda si el servidor de la empresa publica columnas editables para el tipo.
- El tipo y las secciones no se cambian después de crearlo: otro tipo u otra sección es otro algoritmo.
Flex_DeleteObjectAsyncyFlex_UndeleteObjectAsyncrechazan un algoritmo.
Los tipos
El tipo es la columna tipoalgoritmo, enum TipoAlgoritmoE. Decide sobre qué filas se calcula, si se aplica el filtro y qué 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 otra. | No admite. | Una ficha cada vez: no suma ni cuenta. |
| 2 | Dato | De dato | Muchas fichas de una sección, resumidas en un valor: un total, un recuento, una media. | Se aplica ficha a ficha. | Con varias fichas, todo dato va resumido (sumado, contado, máximo). Con una, no se resume. |
| 3 | Compuesto | Relacionado | Las fichas de otra sección que corresponden a cada una de las suyas. El único con unión. | Se aplica ficha a ficha. | Los datos de la otra sección se resumen siempre; los de la propia, nunca. |
| 4 | Calculo | Calculadora | Ninguna ficha: constantes, funciones y preguntas. | No admite. | Sin datos de ficha. |
| 5 | Compatibilidad | De búsqueda | La lista de fichas que cumplen una condición, para filtrar un informe. | Se aplica. | Ficha a ficha, sin sumar ni contar. FlexHub la crea con la fórmula C.ID. |
El valor 0 (Indefinido) es una fila sin tipo válido que no se puede ejecutar: FlexHub avisa con Este algoritmo no tiene tipo.
Elige el tipo más simple que cubra el cálculo: un Lineal no consulta otras fichas y cada cruce de un Relacionado encarece la consulta.
Crear un algoritmo
En FlexHub, con Nuevo en FlexHub → Algoritmos o en Contenido → Algoritmos de la sección. Los pasos: Crear un algoritmo. Pulsa Comprobar antes de Aceptar: valida la fórmula con el tipo, las secciones y las preguntas sin guardar nada.
Por la Flex API, Flex_CreateObjectAsync(FlexObjectTypes.Algorithms, sectionId, patch). sectionId es la sección principal y va vacío en una Calculadora.
| Clave del patch | Qué es |
|---|---|
tipoalgoritmo | El valor de TipoAlgoritmoE. Obligatorio. |
nombre | Obligatorio: mínimo 3 caracteres, sin * ni ~. |
algoritmo | La fórmula. 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 | Ver La unión y el tope de filas. |
Las preguntas se ponen después del alta, con Flex_SetQuestionsAsync.
Las partes de la consulta
Enum TipoAlgoritmo_TipoFormulaE. FlexHub y la Flex API editan las dos primeras; las demás se leen.
| Valor | Miembro | Rótulo | Qué hace |
|---|---|---|---|
| 1 | FormulaPrincipal | Formula principal | El cálculo. 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 el resultado ya resumido. |
Filtrar antes de resumir reduce las filas que procesa el cálculo.
La ficha
Columnas que publica Flex_GetEditablesAsync(FlexObjectTypes.Algorithms), además del criterio de unión:
| Columna | Rótulo en FlexHub | Qué hace |
|---|---|---|
nombre | Nombre | La palabra clave con la que lo llaman fórmulas y scripts: A. seguido del nombre. Mínimo 3 caracteres. |
descripcion, categoria, subcategoria | Descripción, Categoría, Subcategoría | Cómo se archiva dentro de su tipo. |
role | Rol tipo de dato | AlgoritmoRolE: Normal (0), Moneda (1), Porcentaje (2). Tiene que coincidir con el rol del campo que lo usa; mientras un campo se calcule con él, no se cambia (A-4073). |
espublico | Público, en la pestaña Avanzado | Activado, se usa en informes, paneles y otros algoritmos; desactivado, solo donde se añadió 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. |
condiciones | Filtro: sobre qué fichas calcula | Vacío, sobre todas. |
decimalescalc | Decimales que se ven | De 0 a 9. |
decimalesvis | Decimales con los que calcula | De 0 a 11. |
Se leen pero no se editan: el tipo (tipoalgoritmo), la Sección relacionada de un Relacionado (plantillarelacionid) y el subtipo (subtipo, AlgoritmoSubtipoE: Normal (1), Notificacion (2), Permisos (3), CamposAutoCalculadosODestinador (4), Dinamico (5)). El alta pone el subtipo en Normal.
La unión y el tope de filas
En un Relacionado, cómo se une con la otra sección; en los tipos que ordenan y acotan, qué fichas entran. FlexHub lo edita en la pestaña Unión de un Relacionado o Registros de uno De dato y uno De búsqueda.
| 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 empareja los dos. Solo campos directos. |
| Orden de la sección principal | campoorden1 a campoorden6, con campoorden1desc a campoorden6desc | Hasta seis niveles, cada uno ascendente o descendente. |
| 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 por el que un informe o un panel acotan el cálculo en el tiempo. 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. El servidor lo rechaza si no cumple:
- 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 valor y la fórmula no resume; 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, como en informes y documentos, y en la fórmula se leen con v. y el nombre interno. Se pasan por posición: mover una pregunta cambia lo que recibe quien llama.
Si el algoritmo ya calcula un campo, sus preguntas quedan congeladas (FlexQuestionsDTO.Frozen): no se añaden, quitan ni mueven, ni cambian de formato, sección o rango. Se cambian la etiqueta, la ayuda, el desplegable y, por la Flex API, el rol. Ver Preguntas de un informe.
Dónde se usa un algoritmo
| Uso | Cómo |
|---|---|
| Campo autocalculado | El subtipo CamposAutoCalculadosODestinador calcula el valor de un campo que rellena el motor. |
| Columna de un informe | Un dato calculado que no existe como campo. |
| Filtro de un informe | Un algoritmo De búsqueda en la columna algoritmodefiltrado decide qué filas entran. |
| Script | A. seguido del nombre devuelve su valor en un script. |
| Documento dinámico | Un valor calculado dentro de la plantilla. |
Un campo calculado se recalcula al guardar o borrar un registro de la sección origen, con un recálculo masivo, desde una tarea programada o cuando cambia un algoritmo del que depende. El servidor ordena la ejecución por dependencias y rechaza los ciclos.
Cambiar la fórmula de un algoritmo en uso cambia lo que calcula en cada campo, informe o script que lo use. Un algoritmo lento ligado a un campo calculado se ejecuta en cada guardado de la sección origen: si guardar se vuelve lento, acota con filtros.