Over
Archief
Tips en trucs over FileMaker met code, afbeeldingen of te downloaden bestanden. Als u zelf in FileMaker programmeert dan kunnen deze u wellicht helpen. Volg ons om nieuwe tips & trucs te ontvangen.
De bestanden openen automatisch met volledige toegang zodat u alle tabellen, velden, scripts, enzovoort kunt bestuderen, aanpassen en overnemen.
Jaar 2018
Plakken zonder stijl
8 november 2018 | Niveau: FileMaker Expert Training
Plakken van teksten is in FileMaker niet altijd prettig. De opmaak wordt meegenomen zodat tekstkleur en tekststijl in de velden terecht komt. Terwijl de programmeur de database heeft gemaakt met een eigen tekstopmaak in gedachte.
Plakken wordt eigenlijk in twee stappen uitgevoerd: eerst de niet opgemaakte (platte) tekst en daarna wordt de opmaak toegepast. Door eenmaal 'Ongedaan maken' in het Bewerken menu te kiezen wordt de opmaak ongedaan gemaakt en blijft er een platte tekst over.
Er is ook een menu-onderdeel 'Alleen tekst plakken' maar dat heeft een heel andere toetscombinatie dan men gewend is.
Beide mogelijkheden vereisen dat de gebruiker een ongebruikelijke handeling verricht. Wat kan de programmeur doen om het de gebruiker makkelijk te maken?
Bij elk tekst-veld zou er een invoerberekening gemaakt kunnen worden met TextFormatRemove ( Self ) maar dat is heel veel werk. En het kan lastig te combineren zijn met andere berekeningen.
Door middel van Eigen Menu's kan het gedrag van de menu's aangepast worden. Achter het menu-onderdeel 'Plakken' zou de FileMaker-opdracht 'Alleen tekst plakken' ingesteld kunnen worden maar om onbekende reden werkt dat niet.
Wat beter werkt is om voor het menu-onderdeel 'Plakken' de scriptstap 'Plakken' als actie in te stellen (zie afbeelding). Bij die scriptstap kan de optie 'Plakken zonder stijl' gekozen worden zodat de gebruiker gewoon voor 'Plakken' kan kiezen en er geen opmaak mee komt.
Helaas kan een scriptstap niet uitgevoerd worden in een dialoogvenster van FileMaker zoals 'Database Beheren' of 'Open URL'. Een script dat kan testen of er een gewoon veld actief is werkt dan ook niet en voor elke scriptstap naar de 'Standaard FileMaker-menus' omschakelen is nogal omslachtig. Het zou mooi zijn als bij dialoogvensters automatisch de 'Standaard FileMaker-menus' wordt gebruikt...
Gewoon, berekenen van voorloopnullen
7 mei 2018 | Niveau: FileMaker Gevorderden Training
Een kleine tip om in berekeningen voorloopnullen aan een getal toe te voegen en ook aan een datum. Soms zien we heel lange berekeningen die voor elk getal onder de 10 een enkele nul toevoegt. En wat als het om getallen van meer dan twee cijfers gaat? Dat kan handiger...
Het principe is om een getal om te zetten naar tekst en ervoor een maximum aantal nullen te plaatsen. Vervolgens wordt daarvan de rechter tekens genomen. Een getal dat altijd drie cijfers moet zijn, kan als volgt berekend worden:
Right ( "000" & GetAsText ( getal ) ; 3 )
Door als getal de dag en maand te gebruiken kan een datum met voorloopnullen berekend worden, zoals 07-05-2017.
Dat is handig voor het berekenen van een tekst, e-mail, export en dergelijke waar getal- en datumnotatie niet beschikbaar zijn. Helemaal handig als het als Eigen Functie wordt toegepast.
If ( IsEmpty ( datum ) ;
"ongedateerd" ;
Right ( "00" & GetAsText ( Day ( datum ) ) ; 2 ) & "-" &
Right ( "00" & GetAsText ( Month ( datum ) ) ; 2 ) & "-" &
GetAsText ( Year ( datum ) )
)
Postcode online opvragen met JSON
4 april 2018 | Niveau: FileMaker Kenniswerkers Training
Al jaren wil iedereen een postcode-tabel in zijn database maar het was altijd duur, omslachtig en niet-actueel. Tegenwoordig zijn er on-line diensten en de JSON-functies van FileMaker 16 passen daar prima bij.
De website Postcode API biedt een interessante dienst om on-line gegevens op basis van postcode en huisnummer op te vragen. Na registratie krijgt u de benodigde API key en tot 100 aanroepen per dag is de dienst gratis.
De informatie is afkomstig van de Basisregistraties Adressen en Gebouwen (BAG) van de overheid. Het wordt continu geactualiseerd om de foutmarge te minimaliseren en nieuwe postcodes up-to-date te houden.
De webdienst wordt met een URL aangeroepen waarin postcode en huisnummer zijn opgenomen en het resultaat wordt in JSON-opmaak geretourneerd. Met de JSON-functies van FileMaker 16 is de data eenvoudig uit het resultaat te halen en in velden te plaatsen. Of andere toepassingen die u zelf bedenkt.
De straat, plaats en provincie kunnen zo snel en eenvoudig in het record van bijvoorbeeld een nieuwe klant geplaatst worden. Maar ook gemeente, soort pand, gebruik, woonoppervlakte, bouwjaar en kaartcoördinaten zijn beschikbaar.
De code hieronder heeft een eenvoudige versie van een mogelijk script. Het voorbeeldbestand toont ook de uitgebreidere mogelijkheden.
Variabele instellen [ $apikey; Waarde: "-Uw eigen API-key hier-" ]
Variabele instellen [ $url; Waarde:"https://api.postcodeapi.nu/v2/addresses/" & "?postcode=" & Postcode & "&number=" & Huisnummer ]
Variabele instellen [ $urlopties; Waarde:"--header \"X-Api-Key: " & $apikey & "\" --dump-header $result_header --show-error" ]
Invoegen vanuit URL [ Selecteren; Geen dialoogvenster ; $result; $url; Opties voor cURL: $urlopties ]
If [ Get ( LaatsteFout ) = 0 and GetAsNumber ( MiddleWords ( $result_header ; 3 ; 1 ) ) = 200 ]
Variabele instellen [ $adresdata; Waarde:JSONGetElement ( $result ; "_embedded.addresses[0]" ) ]
Veld instellen [ PostcodeData::Straat; JSONGetElement ( $adresdata ; "street" ) ]
Veld instellen [ PostcodeData::Plaats; JSONGetElement ( $adresdata ; "city.label" ) ]
Veld instellen [ PostcodeData::Provincie; JSONGetElement ( $adresdata ; "province.label" ) ]
End If
Scriptstap ging goed en tóch een foutmelding
19 maart 2018 | Niveau: FileMaker Gevorderden Training
Als een scriptstap precies doet wat u ingesteld heeft dan verwacht u geen foutmelding. Toch is dat wat de scriptstap 'Ga naar gerelateerde record' soms doet. Dat leggen we graag uit.
Met de optie 'Alleen gerelateerde records' wordt niet alleen van het parent record naar een gerelateerde (child) record gegaan, ook de gevonden reeks in de gerelateerde (child) tabel wordt beperkt tot een specifiek aantal records.
Die gevonden reeks zijn alle gerelateerde records van het huidige parent record als de optie 'Alleen overeenkomst met huidige record' is ingesteld. Bijvoorbeeld alleen de vijf personen die bij één bedrijf horen.
De optie 'Overeenkomst met alle records in huidige gevonden reeks' zorgt dat de huidige reeks alle child records bevat van alle parent records. Met hetzelfde voorbeeld: 385 personen van 124 bedrijven.
Met de optie 'Alleen overeenkomst met huidige record' kunnen er twee foutnummers volgen: geen fout (0) en record ontbreekt (101).
Als de optie 'Overeenkomst met alle records in huidige gevonden reeks' is ingesteld dan kan ook de fout 'Geen records die overeenkomen aan de zoekopdracht' (401) optreden. Dat gebeurd als geen enkel parent record een child record heeft.
Wat minder logisch is, is als toevallig het huidige parent record geen gerelateerde records heeft toch ook fout 101 optreedt en wordt teruggegeven. Omdat de gevraagde actie keurig is uitgevoerd zou je dit een bug kunnen noemen. Hoe dan ook, bij foutafvanging moet daar rekening mee worden gehouden (zie voorbeeld script en bestand hieronder).
En bedenk dat als de scriptstap 'Ga naar gerelateerde record' geen gerelateerde records vindt, het ook niet naar de opgegeven lay-out gaat. En dat heeft tot gevolg dat de volgende scriptstappen op de verkeerde tabel worden uitgevoerd.
Als er een scriptstap is waar u met de Ophaal-functie Get ( LaatsteFout) moet controleren of het goed is uitgevoerd, dan is het wel 'Ga naar gerelateerde record'. En nu weet u wat u kunt verwachten.
Ga naar gerelateerde record [ Alleen gerelateerde records ; Overeenkomst met gevonden reeks ; Van tabel: "Personen" ; Met lay-out: "Personen" (Personen) ]
If [ Get ( LaatsteFout) = 0 or Get ( LaatsteFout ) = 101 ]
# andere script stappen als de gerelateerde records zijn gevonden
End If
Bellen met een QR barcode
7 maart 2018 | Niveau: FileMaker Basis Training
U heeft een telefoonnummer op een FileMaker lay-out staan en de persoon naast u wil dat bellen? Of een webadres openen met een mobiele telefoon waar geen FileMaker Go op is geïnstalleerd?
Een hele leuke en eenvoudige manier is om een QR barcode met een webdienst op een scherm lay-out te plaatsen. Een QR barcode kan met de meeste mobiele telefoons via de camera 'gescand' worden.
Het e-mail adres kan dan gebruikt worden voor een nieuwe e-mail, het webadres geopend worden, een WiFi netwerk ingesteld worden, enzovoort.
Maar een QR barcode kost veel ruimte en meer dan één kan de oorzaak zijn dat de verkeerde gelezen wordt. Een mooie oplossing is om een pop-overknop te plaatsen met daarin een webviewer. Afdrukken kan natuurlijk ook en dan is de webviewer voldoende.
Een webviewer wordt meestal gebruikt om een webpagina te tonen maar een enkele afbeelding is ook mogelijk. Met de scriptstap 'Invoegen vanuit URL' kan de afbeelding ook in een containerveld opgeslagen worden als dat gewenst is.
Een webdienst die een plaatje van een QR barcode genereert is bijvoorbeeld de QR Code Generator van goQR. Het voorbeeldbestand dat bij deze tip hoort gebruikt deze webdienst en bevat een Eigen Functie om het webadres te berekenen. In elke webviewer wordt de data samengesteld die in de barcode moet komen.
Voorbeelden die getoond worden zijn telefoonnummer, e-mail, website en WiFi-netwerk. Daarnaast zijn SMS, vcard, geolocatie en events mogelijk. Voor hulp met implementeren kunt u contact met ons opnemen. Deelnemers aan onze trainingen kunnen gratis vragen stellen, per e-mail of op ons forum.
Werkt een database-kopie ook goed?
14 februari 2018 | Niveau: FileMaker Gevorderden Training
We zijn bijna allemaal met een lege database begonnen en tijdens het gebruik zijn gegevens ingevoerd en aanpassingen gemaakt. Maar werkt uw database ook goed als u een kopie opent en waarom is dat belangrijk?
Zorg in de eerste plaats dat de bestandspaden voor de Externe Gegevensbronnen niet absoluut maar relatief zijn. Een relatief pad begint met "file:" met de bestandsnaam* en soms mapnamen als de database lokaal gebruikt wordt.
In een absoluut pad zit een IP-adres of hostnaam zodat bij het openen van een kopie wordt geprobeerd de bestanden op een FM Server te openen terwijl ze gewoon lokaal in dezelfde map staan. Dit kan het best getest worden op een computer zonder netwerkverbinding.
Bij het openen van een backup-kopie wilt u niet dat automatisch herinneringsberichten worden verzonden voor facturen die nog niet betaald zouden zijn, om een voorbeeld te geven.
Ook wilt u niet dat automatisch oude data via een ODBC-verbinding in de SQL-tabel op de website terecht komt! Zorg dat er een veiligheidsklep is ingebouwd bijvoorbeeld door te controleren met de ophaalfunctie Get ( StatusSamengebruik ) of de gebruiker om toestemming te vragen.
En werkt de database goed als u een lege kopie (kloon) opent of een lege tabel hebt? Verschijnen er dan foutmeldingen of proberen scripts dan onbedoelde dingen te doen?
Wellicht moet u uw scripts eens op deze zaken controleren? En doe dan ook een test met een backup-kopie. Als het echt een keer nodig is, wilt u niet verrast worden en nog verder in de problemen komen...
FileMaker Webviewer Demo
31 januari 2018 | Niveau: FileMaker Gevorderden Training
Sinds FileMaker 8.5 kan met de Web Viewer webpagina's in een lay-out getoond worden. De berekeningen van de webadressen in ons voorbeeldbestand zijn geactualiseerd.
De gevorderde programmeur kan de webadressen in de Web Viewer zelf laten berekenen en daarin de inhoud van velden gebruiken.
Het Webviewer Demo bestand laat enkele berekeningen van webadressen voor Nederlandse gebruikers zien: Klok, Google Maps luchtfoto, De Telefoongids, Kamer van Koophandel Handelsregister e.v.a.
De berekende webadressen kunnen door wijzigingen in de aangeroepen website hun werking verliezen.
Denk aan de Nederlandse kalender
16 januari 2018 | Niveau: FileMaker Gevorderden Training
Rekenen met een datum is in FileMaker erg eenvoudig. Maar denkt u er wel aan dat de datumfuncties van FileMaker de Amerikaanse kalender hanteren?
De Amerikanen laten week 1 altijd op 1 januari beginnen zodat een week niet altijd uit zeven dagen bestaat. Terwijl wij de ISO-standaard gebruiken waarbij de week 52 of 53 wordt afgemaakt als de meeste dagen in die week vallen. In het andere geval betekent het dat 31 december in week 1 van het volgende jaar valt. Dat heeft natuurlijk ook gevolgen voor het jaartal. Immers, 1 januari 2017 viel in week 52 van 2016.
In Nederland wijken we wel van de ISO-standaard af omdat wij niet de zondag als de eerste weekdag beschouwen maar de maandag.
Hieronder volgt een berekening voor het volgens de ISO-standaard berekenen van het weeknummer, jaar en weekdag voor een gegeven datum. Deze berekeningen zijn te implementeren als Berekeningsvelden of (in FileMaker Advanced) Eigen Functie's.
WeekISO = WeekofYearFiscal ( datum ; 2 ) // 2 = maandag
YearISO =
Year ( datum )
- ( WeekISO ( datum ) > 51 and Month ( datum ) = 1 ) // correctie week van vorig jaar, 1 jaar lager als boolean test waar is
+ ( WeekISO ( datum ) = 1 and Month ( datum ) = 12 ) // correctie week van volgend jaar, 1 jaar hoger als boolean test waar is
DayofWeekNL = DayofWeek ( datum - 1 ) // correctie weekdag door weekdag van een dag eerder te nemen, 1 = maandag enz.
Script afsluiten overbodig
3 januari 2018 | Niveau: FileMaker Gevorderden Training
We zien soms databases waar in vrijwel elk script de scriptstap 'Script afsluiten' meerdere keren wordt gebruikt. Wist u dat die scriptstap vrijwel nooit nodig is en dat uw scripts beter te onderhouden zijn zonder die scriptstap?
De scriptstap 'Script afsluiten' kan handig zijn tijdens het testen van een script. Maar het is eigenlijk alleen nodig als het script een resultaat moet teruggeven aan het script dat het uitvoerde *. Een script sluit immers automatisch af als de laatste scriptstap is uitgevoerd en hoeft niet met deze scriptstap afgesloten te worden.
In vrijwel alle situaties is een net gebruik van de scriptstappen If, Else, Else If en End If voldoende om ervoor te zorgen dat bepaalde scriptstappen onder voorwaarden wel of niet worden uitgevoerd.
Bovendien blijft het script dan beter leesbaar zodat onderhoud eenvoudiger is. Bij het later toevoegen van scriptstappen hoeft u niet het hele script na te lopen om te controleren of de nieuwe scriptstappen wel uitgevoerd worden.
Met de code hieronder proberen we het verschil te laten zien. Een klein verschil maar hopelijk heeft u er wat aan.
#
# liever niet zo:
#
Aangepast dialoogvenster tonen [ ... ]
If ( Get ( KeuzeLaatsteBericht ) ≠ 1 ) // ONgelijk aan 1 !
Script afsluiten []
End If
# andere scriptstappen
#
# de flow is beter te volgen en voorkomt vergissingen met deze opzet:
#
Aangepast dialoogvenster tonen [ ... ]
If ( Get ( KeuzeLaatsteBericht ) = 1 ) // gelijk aan 1 !
# andere scriptstappen
End If