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:
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:
let country := 'Country filter';
select People where Country = countryNastępnie powierz ograniczenie drugiemu polu formuły, Effective members, które odczytuje Members w rekordzie i w jego rekordzie nadrzędnym:
if Parent then
let parentMembers := Parent.Members;
Members[contains(parentMembers, this)]
else
Members
endEffective 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
Memberspodgrupy 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:
MembersodczytująceParent.'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.
