Intelligente portals die in een SelfJoin niet het eigen record tonen
FileMaker Tip 226
![]()
![]()
Eerst nog eens even herhalen wat een SelfJoin is. Dat is een relatie tussen een table (een tabel, vroeger een databank) en zichzelf. Stel dat we een databank contactpersonen hebben, elk met een Contactcode en natuurlijk ook de Bedrijfscode van het bedrijf waartoe ze behoren. Een SelfJoin portal op basis van de bedrijfscode toont dan alle collega's van een bepaald bedrijf, namelijk alle contactpersonen die dezelfde bedrijfscode hebben. Stel dat er acht contactpersonen voor hetzelfde bedrijf werken, dan toont de portal 8 namen.
Iemand die daar al lang gebruik van maakt, vindt het wat dom dat op de record van bijvoorbeeld Jan Peeters die Jan Peeters ook voorkomt in de portal. Hij zou willen dat de portal enkel de overige 7 contactpersonen toont.
Vanaf FileMaker 7 (en uiteraard ook in FileMaker 8) konden we reeds relaties definiëren op basis van de vergelijking tussen meer dan één veld. Dat kunnen we hier handig gebruiken: de portal is gebaseerd op twee relaties:
Bedrijfscode = Bedrijfscodeen
Contactcode <> ContactcodeVoor gebruikers van FileMaker 6 en lager is er dus een probleem. Die moeten hun toevlucht nemen tot een work around. Daarbij maken ze gebruik van een tweede relatie die werkt met een multiline key (een key field dat uit meerdere regels bestaat) langs de linkerkant.
Even uitleggen hoe we tewerk gaan.
Eerst moeten we aan die multiline key zien te geraken: we hebben de lijst nodig van alle gerelateerde records die we in de portal willen laten zien, dus de lijst van alle gerelateerde records min het eigen record (een SelfJoin kijkt immers ook naar zichzelf). Daartoe kunnen we gebruik maken van de omweg via een value list. Creëer dus een relationele value list op basis van de relatie die we al gebruikten voor de portal (die waarin één lijn te veel stond). Laat deze value list de Record ID tonen. Deze value list noemen we bijvoorbeeld IDList.
Creëer daarna een calculatieveld Beperkte ID list met deze formule:
Substitute (ValueListItems(Status(CurrentFileName);"IDList"); "Record ID";"")Deze substitute-functie vervangt dus de actuele Record ID door niets en geeft dus een lijstje van alle overige gerelateerde Record ID's. Zorg er wel voor dat dit calculatieveld unstored is.
Daarna maken we een nieuwe portal aan op basis van de gelijkheid tussen het veld Beperkte ID list links en het veld Record ID rechts. Op die manier toont onze portal alle overige records en wordt het actuele record niet getoond.
Oef, en op naar FileMaker 8: dan wordt alles veel eenvoudiger!
Terug naar het selectiemenu voor de tips.