In de community zie ik af en toe vragen voorbijkomen van mensen die keuzelijsten van meerdere tabellen in één willen hebben en vragen van mensen die Magic-Valuelists niet werkend krijgen.
Het interessante is dat je de Magic-Valuelists-techniek kan combineren met Virtuele Lijsten en ExecuteSQL() om Virtual Magic Valuelists te maken. Die combinatie heeft me geïnspireerd om dit voorbeeld in elkaar te zetten.
Bronnen
Het download-bestand demonstreert de Magic Value Lists, waarvan Andries Heylen enkele jaren geleden eens een mooie demo voor heeft gemaakt. Gecombineerd met Virtuele Lijsten en ExecuteSQL().
Het blog van Kevin Frank bevat een artikel over de Magic Value Lists, met de demo van Andries op: https://filemakerhacks.com/2012/07/25/magic-value-lists/. Er bestaan heel veel artikelen over virtuele lijsten, je kan ze vinden via deze links: https://www.1-more-thing.com/client-side-virtual-list/ en https://filemakerhacks.com/tag/virtual-list/.
Over ExecuteSQL zou de informatie die FMI zelf geeft iets beter kunnen, maar gelukkig hebben een hoop mensen er het nodige over op internet gepubliceerd: https://filemakerhacks.com/2012/10/19/the-missing-fm-12-executesql-reference/ en https://www.soliantconsulting.com/blog/executesql-filemaker-performance.
Structuur
Er zitten 4 tabellen in het voorbeeld-bestand:
1) Arbeid (Labour)
2) Materiaal (Material)
3) Doorbelasting (Charges) en
4) VirtualValueLists (Een virtuele lijst die wordt gevuld met zoekresultaten)
Zoeken met SQL
De waardelijsten worden in dit voorbeeld dus gevuld met ExecuteSQL(). Het mooie daarvan is, dat die techniek context-onafhankelijk is en je dus geen enkele relatie nodig hebt om je gegevens te verzamelen. De resultaten kan je gewoon aan elkaar knopen met bijvoorbeeld de List() functie.
Je moet niet de “UNION” van SQL gebruiken, want die sorteert je resultaat. Op zich niet erg, maar in deze demo wil ik “parallelle” lijsten gebruiken: ID plus een Waarde. Het sorteren mag pas bij het laden van de keuzelijst worden gedaan, anders worden de onjuiste ID’s aan de waarden gekoppeld.
Voor de SQL gebruik ik wat CF’s, maar die zijn alleen om “robuust” te coderen m.a.w. je kan veld- en tabel-namen wijzigen en het blijft werken, zonder je code aan te moeten passen. Als je dat niet wil gebruiken is prima, want nodig is het niet, maar ik vind het zelf gewoon handig. Verder valt er niet zoveel over te zeggen. Kijk gerust in het script “Setup Valuelists” om te zien hoe dat met E-sql in elkaar zit.
Resultaat van variabelen naar velden
De E-sql’s vullen de global-variables $$IdList[n] en $$IdValue[n] (n staat voor de “herhaling” van de variabele). Die variabelen worden op hun beurt weer gebruikt in VirtualValueLists in “niet opgeslagen” berekeningen ….. je moet dit in de velddefinitie expliciet aanzetten, want anders werkt deze techniek niet.
Onmogelijke relatie
Na dit zo te hebben gemaakt leg je een relatie vanuit de tabel waar je de keuzelijst in wilt gebruiken naar de “VirtualValueLists”-tabel Deze relatie moet je leggen NAAR een on-geïndexeerd veld in VirtualValueLists.
Die relatie zal dus nooit iets kunnen tonen in lay-outs, maar in deze VMVL-techniek is dit de enige manier waarop het zal werken.
Keuzelijst definiëren
Tenslotte kan je nu de ValueList maken: Wijs in de dialoog aan dat je velden uit een andere tabel wilt gebruiken. Kies dan in de eerste kolom een ID en als tweede de value. Geef verder aan dat je alleen de waarden van de tweede kolom wilt tonen. Tenslotte geef je aan dat je dit wilt doen met alleen gerelateerde waarden vanuit de context van de tabel charges. (in dit voorbeeld)
FileMaker zal aangeven dat de keuzelijst niet kan werken omdat de velden en de relatie die je gebruikt, on-geïndexeerd zijn. Het is inderdaad allemaal on-geïndexeerd, maar de keuzelijst werkt wél en daar gaat het om.
Download
Het voorbeeldbestand kan je hier downloaden: Virtual Magic Valuelists