Camps fórmula: la referència circular

Una fórmula de camp pot llegir els camps d'un registre vinculat, fins i tot quan aquest registre pertany a la mateixa taula. En canvi, no pot llegir el seu propi camp en aquest registre: l'editor de fórmules la rebutja amb el missatge «Circular reference».

El cas

Una taula Groups té una referència a si mateixa, Parent: és així com un subgrup indica el seu grup. El camp fórmula Members tria les persones d'un país (Country filter), i un subgrup ha de prendre les seves entre els membres del seu grup:

Ninox
let country := 'Country filter';
let candidates := if Parent then Parent.Members else select People end;
candidates[Country = country]

L'editor de fórmules rebutja aquest codi: «Circular reference: Members».

Per què

Ninox raona per camp, no per registre. Per compilar la fórmula de Members, ha de conèixer el tipus de Parent.Members i, per tant, compilar la fórmula de Members… just la que està compilant. Tant se val que el registre pare no sigui mai el mateix registre: la dependència es rebutja ja en compilar.

Atenció

La mateixa expressió no provoca cap error quan s'avalua mitjançant la interfície de programació (/query), ni quan es col·loca a la fórmula d'un altre camp. Només l'editor de fórmules del camp que llegeix la rebutja: una prova que funciona en un altre lloc no garanteix, doncs, que serà acceptada.

La solució: un segon camp

Deixeu que Members calculi la seva llista sense llegir el grup pare:

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

Després confieu la restricció a un segon camp fórmula, Effective members, que llegeix Members al registre i al seu pare:

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

Effective members llegeix Members, però Members no llegeix Effective members: ja no hi ha cap cicle. Dins dels claudàtors, this designa la persona examinada; per això els membres del pare es llegeixen abans, en una variable.

Cal saber

  • El camp Members d'un subgrup conté ara persones que no són membres del grup: tot el que mostra o fa servir els membres (vistes, botons, funcions globals) ha de llegir Effective members.
  • Un cicle també pot passar per dos camps: Members que llegís Parent.'Effective members' formaria el bucle Members → Effective members → Members. No hem comprovat com tracta Ninox aquest cas: eviteu-lo de la mateixa manera.