Pola formuły: odwołanie cykliczne

Formuła pola może odczytywać pola powiązanego rekordu, nawet gdy ten rekord należy do tej samej tabeli. Nie może natomiast odczytać własnego pola w tym rekordzie: edytor formuł odrzuca ją z komunikatem „Circular reference”.

Przypadek

Tabela Groups ma odwołanie do samej siebie, Parent: w ten sposób podgrupa wskazuje swoją grupę. Pole formuły Members wybiera osoby z danego kraju (Country filter), a podgrupa ma wybierać swoje spośród członków swojej grupy:

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

Edytor formuł odrzuca ten kod: „Circular reference: Members”.

Dlaczego

Ninox myśli polami, a nie rekordami. Aby skompilować formułę Members, musi znać typ Parent.Members, a więc skompilować formułę Members… tę samą, którą właśnie kompiluje. Nie ma znaczenia, że rekord nadrzędny nigdy nie jest tym samym rekordem: zależność zostaje odrzucona już podczas kompilacji.

Uwaga

To samo wyrażenie nie powoduje żadnego błędu, gdy jest obliczane przez interfejs programistyczny (/query) ani gdy zostanie umieszczone w formule innego pola. Odrzuca je tylko edytor formuł pola, które ono odczytuje: udany test w innym miejscu nie gwarantuje więc, że zostanie przyjęte.

Rozwiązanie: drugie pole

Niech Members oblicza swoją listę bez odczytywania grupy nadrzędnej:

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

Następnie powierz ograniczenie drugiemu polu formuły, Effective members, które odczytuje Members w rekordzie i w jego rekordzie nadrzędnym:

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

Effective members odczytuje Members, ale Members nie odczytuje Effective members: cyklu już nie ma. W nawiasach kwadratowych this oznacza sprawdzaną osobę; dlatego członkowie rekordu nadrzędnego są odczytywani wcześniej, do zmiennej.

Warto wiedzieć

  • Pole Members podgrupy zawiera teraz osoby, które nie są członkami grupy: wszystko, co wyświetla lub wykorzystuje członków (widoki, przyciski, funkcje globalne), musi odczytywać Effective members.
  • Cykl może też przebiegać przez dwa pola: Members odczytujące Parent.'Effective members' utworzyłoby pętlę Members → Effective members → Members. Nie sprawdziliśmy, jak Ninox traktuje ten przypadek: unikaj go w ten sam sposób.