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 2019

Postcode online opvragen met JSON

28 augustus 2019 | 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 Publieke Dienstverlening Op de Kaart (PDOK) biedt een interessante dienst om on-line gegevens op basis van postcode en huisnummer op te vragen. PDOK is een platform voor het ontsluiten van geodatasets van Nederlandse overheden en de dienst isgratis.
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 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 [ $url; Waarde:"https://geodata.nationaalgeoregister.nl/locatieserver/v3/free?q=postcode:" & Postcode &" and huisnummer:" & Huisnummer " ]

Invoegen vanuit URL [ Selecteren; Geen dialoogvenster ; $result; $url; Opties voor cURL: $urlopties ]

If [ Get ( LaatsteFout ) = 0 and JSONGetElement ( $result ; "response.numFound" ) > 0 ]
  Variabele instellen [ $adresdata; Waarde:JSONGetElement ( $result ; "response.docs[0]" ) ]
  Veld instellen [ PostcodeData::Straat; JSONGetElement ( $adresdata ; "woonplaatsnaam" ) ]
  Veld instellen [ PostcodeData::Plaats; JSONGetElement ( $adresdata ; "gemeentenaam" ) ]
  Veld instellen [ PostcodeData::Provincie; JSONGetElement ( $adresdata ; "provincienaam" ) ]
End If

In april 2018 publiceerden we een voorbeeld voor gebruik met de website Postcode.nl. Deze website beëindigde de gratis accounts per 1 augustus 2019. Als alternatief kan de PDOK website gebruikt worden waarvoor deze Tip & Truc een voorbeeld geeft.

Opgemaakte mailing

10 juli 2019 | Niveau: FileMaker Kenniswerkers Training

In ons bericht over FileMaker 18 werd al aangegeven dat die versie ook HTML-code als opgemaakte e-mail berichten kan versturen. Wellicht interessant om zelf eens naar te kijken?

Voorheen werd onze FMTraining nieuwsbrief verzonden met AppleScript op de Mac. Een berekende tekst met daarin AppleScript-code maar ook de HTML code werd uitgevoerd door de normale Mail-software.

Onze nieuwsbrief van mei was de eerste die we met die FileMaker 18 techniek hebben verstuurd, rechtstreeks via de SMTP-server. Niet de scriptstap 'Mail verzenden' moet daarvoor gebruikt worden, maar 'Invoegen vanuit URL'.

Bij de 'Invoegen vanuit URL' scriptstap moet de mailtekst, inclusief geadressseerde, en de cURL opties opgegeven worden. Denk daarbij wel aan utf-8 encoding van de mailtekst.
Om een idee te geven zijn de vereenvoudigde berekeningen voor de mailtekst en cURL-opties hieronder weergegeven.


$mail =
"From: " & Afzender & "¶" &
"To: \"" & Persoon & "\" <" & Email & ">¶" &
"Subject: " & Tekst Titel & "¶" &
"Content-Type: text/html; charset=\"utf8\"¶¶" &
Bericht HTML

$curl =
"--ssl-reqd" &
" --mail-from " & Mail From Email &
" --mail-rcpt " & Email &
" --upload-file $mail" &
" --user " & Mail Gebruikersnaam & ":" & Mail Wachtwoord


Invoegen vanuit URL [ Selecteren ; Met dialoogvenster: Uit ; Doel: $result ; "smtp://" & Mail Server Adres & ":" & Mail Server Poort ) ; Opties coor cURL:  $curl ]

Getalopmaak met de nieuwe While-functie

23 mei 2019 | Niveau: FileMaker Expert Training

Voorbeeld getallen en de resultaten van de Round-functie en deze While-berekening

FileMaker 18 is verschenen en introduceert de functie While waarmee het herhalen van berekeningen eenvoudiger is geworden. In deze Tip & Truc geven we daar een voorbeeld van.

De While-functie is eigenlijk een uitbreiding op de Let-functie. De Let-functie maakt het mogelijk om meerdere variabelen met deelberekeningen uit te voeren en deze komen samen in één eindberekening. De While-functie geeft de mogelijkheid om variabelen met deelberekeningen te herhalen.
Daarmee kan redelijk eenvoudig bijvoorbeeld een reeks tekens gemaakt worden van elk gewenst aantal. Zoals willekeurige tekens voor een wachtwoord met 8, 10, 12 of meer tekens.

Een ander voorbeeld is de opmaak van een getal als een bedrag met duizendtal-tekens en extra nullen achter de komma. Voor de opmaak van velden op een lay-out is dit in FileMaker voorzien maar niet als je het bedrag in een berekende tekst voor bijvoorbeeld een e-mail wilt opnemen. Voorheen was je tot een maximum aantal cijfers beperkt. Of je moest een Eigen Functie maken die zichzelf aanroept (recursief) maar daarvoor had je FileMaker Advanced nodig.

De tekstopmaak van een getal was een mooie aanleiding om de nieuwe While-functie uit te proberen. Het werd een berekening met zelfs tweemaal de While-functie: eenmaal om de duizendtalpunten links van de komma te plaatsen en een tweede om eventueel het deel rechts van de komma aan te vullen met nullen. Beide zijn binnen de Let-functie geplaatst zodat de eenmalige deelberekeningen voor beide While-functies geldig zijn.

Eerst nog even de algemene en functionele opbouw van de Let en While functies:
Let ( variabelen ; berekening )
Let ( [ var1 = exp1 ; var2 = exp2... ] ; berekening )
waarbij de variabelen berekend worden en gebruikt in de berekening als eindresultaat.

While ( start variabelen ; test ; herberekende variabelen ; berekening )
While ( [ var1 = exp1 ; var2 = exp2... ] ; test ; [ var3 = exp3 ; var4 = exp4... ] ; berekening )
waarbij de start variabelen berekend worden en gebruikt in de herberekende variabelen zolang de test waar is waarna alle variabelen in de berekening gebruikt kunnen worden.

Dit voorbeeld is voor gebruik in een berekening(sveld) maar kan eenvoudig in een Eigen Functie geplaatst worden. Zie de berekening voor toelichtingen in de commentaren.
De berekening verwacht een getal zoals 12345603,6 en het gewenste aantal decimalen zoals 3 waarna de uitkomst 12.345.603,600 is. Een negatief aantal decimalen werkt ook om voor de komma af te ronden.


Let (
  [
    getal = Tabel::Veld ; // getal waarop tekstformaat met opmaak toegepast moet worden
    decimaal_aantal = 2 ; // gewenst aantal decimalen achter decimaal teken (positief) of afronding voor decimaal teken (negatief)
    decimaal_teken = "," ; // teken te gebruiken als decimaal teken
    duizendtal_teken = "." ; // teken te gebruiken als scheiding duizendtallen

    getal = Round ( getal ; decimaal_aantal ) ; // afronden m.n. vanwege afronden voor het decimale teken met bv. -2

    getal_teken = If ( Sign ( getal ) = -1 ; "-" ; "" ) ; // bepaal het negatief teken voor het getal
    getal_geheel = Int ( Abs ( getal ) ) ; // het gehele deel links van het decimale teken
    getal_decimaal = Mod ( Abs ( getal ) ; 1 ) ; // het gehele deel rechts van het decimale teken
    getal_lengte = Length ( getal_geheel ) // aantal tekens links van het decimale teken
  ] ;


  While (
    [
      getal_tekst = "" ; // start met een lege tekst
      i = getal_lengte // start met cijfer rechts in het getal
    ] ;

    i > 0 ; // herhaal totdat alle cijfers in het getal zijn toegevoegd

    [
      // voeg cijfer vooraan de tekst toe
      getal_tekst = Middle ( GetAsText ( getal_geheel ) ; i ; 1 ) & getal_tekst ;

      // voeg na elk derde cijfer een duizendtal teken vooraan de tekst toe
      getal_tekst = If ( Mod ( getal_lengte - i + 1; 3 ) = 0 and i > 1 ; duizendtal_teken ; "" ) & getal_tekst ;

      i = i - 1 // ga naar een cijfer links in het gehele getal
    ] ;

    getal_teken & getal_tekst
  )

  &

  While (
    decimaal_tekst = Middle ( GetAsText ( ( getal_decimaal ) ) ; 2 ; 10^8 ) ; // start met decimaal deel als geheel getal

    Length ( decimaal_tekst ) < decimaal_aantal ; // herhaal totdat de lengte gelijk is aan gewenst aantal decimale cijfers

    decimaal_tekst = decimaal_tekst & "0" ; // voeg een nul achteraan toe

    If ( IsEmpty ( decimaal_tekst ) ; "" ; decimaal_teken & decimaal_tekst )
  )

)

Let op, de While-functie werkt niet als de database met FileMaker (Server) 17 of eerder wordt gebruikt.

Een portaal sorteren op een gerelateerd veld

27 maart 2019 | Niveau: FileMaker Gevorderden Training

Sorteervolgorde van een portaal met velden uit meerdere tabellen.

De records in een portaal willen sorteren op een (lager) gerelateerd veld? Dat kan normaal niet maar er is toch een mogelijkheid waarmee een extra veld voorkomen wordt en het is net zo snel.

Ga daarvoor naar de Portaal-instellingen (bv. dubbelklikken op de portaal) en normaal gaat u dan naar de optie 'Portaal sorteren' om de sorteervolgorde op te geven.

Maar voordat u dat doet, kies dan bij 'Records tonen uit' voor de lagere tabelvermelding. Ga dan naar 'Portaal sorteren' en voeg het gewenste veld aan de sorteervolgorde toe. Daarna kiest u bij 'Records tonen uit' weer de originele tabelvermelding.

Een voorbeeld: er is een portaal voor 'Artikelen' die een leverancier kan leveren en bij de artikelen wordt met een sleutelveld Categorie ID verwezen naar een lagere tabel van 'Artikelcategorieen'.
Omdat u de artikelen ook wilt sorteren op de naam van een categorie kunt u het veld met de categorie-naam in de sorteervolgorde opnemen zoals hierboven is beschreven.

Sneller openen van database

27 februari 2019 | Niveau: FileMaker Basis Training

Bestandsopties met opgeven lay-out

Mogelijk kan het openen van uw database aanzienlijk versneld worden door één instelling te wijzigen.

Een database opent in eerste instantie met de oudste lay-out. Als daarop portalen met veel gerelateerde records, niet-opgeslagen berekeningen en Resume-velden worden gebruikt dan kan dit veel tijd kosten. Zonder dat de gebruiker het ziet en zonder dat het nut heeft. Vooral met een trage verbinding kan dit vervelend merkbaar zijn.

In het Startscript naar een andere lay-out gaan met de scriptstap Ga naar Lay-out[] heeft daar geen effect op. In plaats daarvan moet u bij de bestandsopties de gewenste lay-out opgeven. Bijvoorbeeld een lay-out met minder zware objecten, wellicht alleen het bedrijfslogo?

De optie vindt u via het Bestand menu, onderdeel Bestandsopties. In het tabblad Openen ziet u de keuze 'Naar lay-out gaan'. Geeft u daar een eenvoudige lay-out op en wellicht dat het openen van de database dan voor alle gebruikers merkbaar sneller gaat?

Rekenen met de feestdagen

18 februari 2019 | Niveau: FileMaker Gevorderden Training

Hoe kan FileMaker bepalen of het een nationale feestdag is? Bijvoorbeeld voor een planning of een kalender met openingsdagen? Nu ook voor carnaval...

De vaste feestdagen zijn heel eenvoudig maar een aantal wordt hieronder toch even genoemd. Dodenherdenking en Bevrijdingsdag zijn op dezelfde manier te berekenen.
Een aantal nationale feestdagen zijn gebaseerd op christelijke feestdagen en die hangen af van de maankalender. Pasen is daarbij leidend en als we de datum daarvan weten, dan zijn Goede Vrijdag, Hemelvaart en Pinksteren eenvoudig af te leiden. De eenvoudigste berekening voor Pasen is alleen geldig voor de periode 1900-2099 maar meestal voldoende.

Hieronder volgen alle berekeningen waarbij 'jaar' het getal met het gewenste jaar is. Het uitkomsttype is in alle gevallen Datum.


DatumFeestdagKerst = Date ( 12 ; 25 ; jaar )
DatumFeestdagOudjaar = Date ( 12 ; 31 ; jaar )
DatumFeestdagNieuwjaar = Date ( 1 ; 1 ; jaar )

DatumFeestdagPasen = 
Let ( [
  temp1 = Mod ( ( 225 - ( 11 * Mod ( jaar; 19 ) ) ) - 21 ; 30 ) ;
  temp2 = ( temp1 + 21 - ( temp1 + 21 > 48 ) ) ;
  paasdagen = temp2 + 7 - ( Mod ( jaar + Int ( jaar / 4 ) + temp2 + 1 ; 7 ) ) ] ;

  If ( jaar >= 1900 and jaar <= 2099 ;
    Date ( 3 ; paasdagen; jaar );
    GetAsDate ( "" ) // GetAsDate() hoeft tegenwoordig niet meer
  )
)

DatumFeestdagCarnaval = DatumFeestdagPasen - 49
DatumFeestdagGoedeVrijdag = DatumFeestdagPasen - 2
DatumFeestdagHemelvaart = DatumFeestdagPasen + 39
DatumFeestdagPinksteren = DatumFeestdagPasen + 49