Campi formula: il riferimento circolare

Una formula di campo può leggere i campi di un record collegato, anche quando quel record appartiene alla stessa tabella. Non può invece leggere il proprio campo su quel record: l'editor delle formule la rifiuta con il messaggio "Circular reference".

Il caso

Una tabella Groups ha un riferimento a sé stessa, Parent: è così che un sottogruppo indica il proprio gruppo. Il campo formula Members sceglie le persone di un paese (Country filter), e un sottogruppo deve prendere le sue tra i membri del proprio gruppo:

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

L'editor delle formule rifiuta questo codice: "Circular reference: Members".

Perché

Ninox ragiona per campo, non per record. Per compilare la formula di Members deve conoscere il tipo di Parent.Members, e quindi compilare la formula di Members… proprio quella che sta compilando. Non importa che il record padre non sia mai il record stesso: la dipendenza viene rifiutata già in fase di compilazione.

Attenzione

La stessa espressione non provoca alcun errore quando viene valutata tramite l'interfaccia di programmazione (/query), né quando viene inserita nella formula di un altro campo. Solo l'editor delle formule del campo che legge la rifiuta: un test riuscito altrove non garantisce quindi che verrà accettata.

La soluzione: un secondo campo

Lasciate che Members calcoli il suo elenco senza leggere il gruppo padre:

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

Poi affidate la restrizione a un secondo campo formula, Effective members, che legge Members sul record e sul suo padre:

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

Effective members legge Members, ma Members non legge Effective members: non c'è più alcun ciclo. Tra le parentesi quadre, this indica la persona esaminata; per questo i membri del padre vengono letti prima, in una variabile.

Da sapere

  • Il campo Members di un sottogruppo ora contiene persone che non sono membri del gruppo: tutto ciò che mostra o usa i membri (viste, pulsanti, funzioni globali) deve leggere Effective members.
  • Un ciclo può passare anche per due campi: Members che leggesse Parent.'Effective members' formerebbe il ciclo Members → Effective members → Members. Non abbiamo verificato come Ninox tratta questo caso: evitatelo allo stesso modo.