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:

Ninox
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:

Ninox
let country := 'Country filter';
select People where Country = country

Después confíe la restricción a un segundo campo fórmula, Effective members, que lee Members en el registro y en su padre:

Ninox
if Parent then
    let parentMembers := Parent.Members;
    Members[contains(parentMembers, this)]
else
    Members
end

Effective 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 Members de un subgrupo contiene ahora personas que no son miembros del grupo: todo lo que muestra o utiliza los miembros (vistas, botones, funciones globales) debe leer Effective members.
  • Un ciclo también puede pasar por dos campos: Members que leyera Parent.'Effective members' formaría el bucle Members → Effective members → Members. No hemos comprobado cómo trata Ninox este caso: evítelo de la misma manera.