Campos fórmula: la referencia circular
Una fórmula de campo puede leer los campos de un registro vinculado, incluso cuando ese registro pertenece a la misma tabla. En cambio, no puede leer su propio campo en ese registro: el editor de fórmulas la rechaza con el mensaje «Circular reference».
El caso
Una tabla Groups tiene una referencia a sí misma, Parent: así es como un subgrupo indica su grupo. El campo fórmula Members elige a las personas de un país (Country filter), y un subgrupo debe tomar las suyas entre los miembros de su grupo:
let country := 'Country filter';
let candidates := if Parent then Parent.Members else select People end;
candidates[Country = country]El editor de fórmulas rechaza este código: «Circular reference: Members».
Por qué
Ninox razona por campo, no por registro. Para compilar la fórmula de Members, necesita conocer el tipo de Parent.Members y, por tanto, compilar la fórmula de Members… justo la que está compilando. No importa que el registro padre nunca sea el propio registro: la dependencia se rechaza ya al compilar.
Atención
La misma expresión no provoca ningún error cuando se evalúa mediante la interfaz de programación (/query), ni cuando se coloca en la fórmula de otro campo. Solo el editor de fórmulas del campo que lee la rechaza: una prueba que funciona en otro lugar no garantiza, por tanto, que vaya a ser aceptada.
La solución: un segundo campo
Deje que Members calcule su lista sin leer el grupo padre:
let country := 'Country filter';
select People where Country = countryDespués confíe la restricción a un segundo campo fórmula, Effective members, que lee Members en el registro y en su padre:
if Parent then
let parentMembers := Parent.Members;
Members[contains(parentMembers, this)]
else
Members
endEffective members lee Members, pero Members no lee Effective members: ya no hay ciclo. Dentro de los corchetes, this designa a la persona examinada; por eso los miembros del padre se leen antes, en una variable.
A tener en cuenta
- El campo
Membersde un subgrupo contiene ahora personas que no son miembros del grupo: todo lo que muestra o utiliza los miembros (vistas, botones, funciones globales) debe leerEffective members. - Un ciclo también puede pasar por dos campos:
Membersque leyeraParent.'Effective members'formaría el bucleMembers→Effective members→Members. No hemos comprobado cómo trata Ninox este caso: evítelo de la misma manera.
