FileMaker: Exporteer naar Excel met aangepaste kolomnamen
Hoe vaak kwam een klant of je manager bij je langs met deze vraag: “Ik wil een Excel export vanuit FileMaker, maar ik wil geen technische namen bedoeld voor nerds als kolomkop, maar leesbare kolomnamen!”
Zolang deze vraag niet te vaak opduikt en van niet al te groot belang is, draai je als FileMaker developer je hoofd om en hoop je dat de tijd op een magische manier deze vraag doet wegebben. Maar als de vraag vaker opduikt of plots heel erg belangrijk wordt, dan kom je best met iets beters!
Ja hoor, we hebben een probleem!
Het punt hier is dat FileMaker veldnamen als kolomkop gebruikt, en dat je geen eenvoudige manier hebt om in te stellen dat je andere namen wil. Als FileMaker ontwikkelaar kies je niet altijd veldnamen die leesbaar zijn voor gebruikers. Bij export van velden uit gerelateerde tabellen toont Excel de zogenaamde “fully qualified field names” in de stijl “TO1_TO2::Veld2”, wat de meeste gebruikers de gordijnen injaagt (meestal figuurlijk weliswaar).
Om hieraan tegemoet te komen, bestaan sinds lang allerlei truukjes (bv. http://fmforums.com/forum/topic/84008-adding-first-row-with-field-names-…). Deze houden in dat je bijvoorbeeld exporteert naar een tekstformaat als .csv of .tab en dan een eerste rij met veldnamen toevoegt. Andere oplossing gebruiker XML en XSLT, maar dat wordt dan plots heel technisch, en dat is dan ook weer je ding niet. We willen ook een Excel-eigen .xls of .xlsx formaat, en niet Excel doen denken dat een gewoon tekstbestand wel goed genoeg is.
Goed nieuws voor je!
Het goede nieuws is, dat als je tenminste een beetje tijd wil investeren in een FileMaker-eigen oplossing, dat je dat kan. Meer zelfs, de oplossing is eenvoudig én dynamisch!
Kan je een beetje meer specifiek zijn?
OK dan! De oplossing is gebaseerd op onderstaande:
- Een extra tabel (ExportTable) met relaties naar de brontabellen van waaruit je data wil exporteren (Customers en Invoices)
- Veldcommentaar in de velden verwijst naar de velden in de brontabellen. Je kan gerust gerelateerde velden van TO’s die je aan de brontabellen koppelt gebruiken
- Indirectie om dynamisch waarden uit de brontabellen op te halen met de GetField() functie
Om extra specifiek te zijn…
Ik verwijs naar het demobestand waarvoor je een download link vindt onderaan dit artikel. Het voorbeeldbestand heeft een Customers (CUS) en een Invoices (INV) tabel. Het is mogelijk om data van Customers of Invoices te exporteren, door gewoon in de aparte ExportTable (EXT) tabel id’s (primary keys) van de bron in te vullen.
Zo werkt het:
- De tabel ExportTable (EXT) heeft een veld ‘__id’ waarin je de primary keys (pk’s) zal stoppen van records uit de brontabellen (Customers of Invoices)
- Voeg relaties toe waarbij je EXT::__id koppelt aan de pk’s uit de brontabellen
- Alle andere velden in ExportTable zijn berekende velden. Het is belangrijk dat je de optie ‘unstored’ (resultaat niet opslaan) aanvinkt zodat FileMaker de resultaten berekent telkens ze nodig zijn
- In de veldcommentaar van de berekende velden verwijs je naar de velden in de brontabellen die je wil exporteren. Dit is het enige hard gecodeerd stuk van de oplossing. Dat wil zeggen dat als je bv. een veldnaam in een brontabel wijzigt, dat je ook de veldcommentaar hier moet bijwerken
- De expressies in de berekende velen zijn alle dezelfde. Ze halen op een dynamische manier de waarden op uit velden van de brontabellen. Je hoeft zelf de werking van de berekening niet te kennen. Het dupliceren van een bestaand veld is voldoende om extra kolommen toe te voegen.
- De berekeningen verwijzen via de Self() functie naar het actuele veldobject, gebruiken de FieldComments() functie om de veldcommentaar op te halen, gebruiken de GetFieldName() functie om op een dynamische manier de veldnaam als een string op te halen, en uiteindelijk de GetField() functie om de veldwaarden op te halen.
- Exporteer de nodige records door precies die kolommen die je nodig hebt te selecteren. Het demobestand heeft 2 scripts om gegevens van Customers en Invoices te exporteren.
Hoe je de id waarden in ExportTable precies opvult laat ik aan jou over. Je kan bijvoorbeeld de Import() scriptstap gebruiken, of via een loop de nodige id’s ophalen uit de brontabellen en vervolgens via een andere loop wegschrijven in Exporttable. Een andere mogelijkheid is om de Virtual List techniek toe te passen en de id’s in ExportTable zelf dynamisch te laten verschijnen op basis van een globale variabele met een lijst van id’s, waarbij EXT::__id zelf een berekening is die waarden uit die lijst ophaalt
Credits
Ik bedacht deze techniek niet zelf. Credits gaan naar Joris Aarts en Jan Stieperaere hier bij ClickWorks, zij kwamen met het originele idee en bijkomende tips.
Eerlijk gezegd is deze techniek op dit moment nog experimenteel. We gebruiken dit nog niet in productie, maar dat zal binnenkort wel gebeuren. Als de techniek je bevalt, opmerkingen of aanvullingen hebt, laat me dit gerust weten via commentaar op onze website.