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:
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:
let country := 'Country filter';
select People where Country = countryDesprés confieu la restricció a un segon camp fórmula, Effective members, que llegeix Members al registre i al seu pare:
if Parent then
let parentMembers := Parent.Members;
Members[contains(parentMembers, this)]
else
Members
endEffective 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
Membersd'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 llegirEffective members. - Un cicle també pot passar per dos camps:
Membersque llegísParent.'Effective members'formaria el bucleMembers→Effective members→Members. No hem comprovat com tracta Ninox aquest cas: eviteu-lo de la mateixa manera.
