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. Als u hulp nodig heeft bij het toepassen neem dan gerust contact op.

De bestanden openen automatisch met volledige toegang zodat u alle tabellen, velden, scripts, enzovoort kunt bestuderen, aanpassen en overnemen.

Actueel

Voorbeelden om van te leren: Foutafvanging

Geplaatst op: 25 april 2017 | Niveau: FileMaker Gevorderden Training

FileMaker programmeren

In de serie 'voorbeelden om van te leren' een nieuw voorbeeld: Foutafvanging. Omdat leren van andermans vergissingen leuker is dan van je eigen vergissingen, vooral omdat het tijd bespaart.

In te veel databases zien we dat er in scripts geen foutafvanging wordt gedaan. Zodra een database door meerdere personen gebruikt wordt en/of met beveiliging de toegangsrechten worden beperkt dan treden er gegarandeerd problemen op.

Als er niet op fouten wordt gecontroleerd dan gebeuren er rare dingen. Facturen die spontaan aan een ander bedrijf zijn gekoppeld omdat het maken van een nieuw record mislukte. Of een record dat plotseling is verdwenen. Een verkeerd export-bestand in een e-mail aan een klant. Mogelijk wordt het heel lang niet opgemerkt maar is er wel (financiële) schade.

Gebruik daarom in scripts de If-scriptstap met Get ( LaatsteFout ) = 0 om te bepalen of de vorige scriptstap goed is gegaan en de volgende scriptstappen veilig uitgevoerd kunnen worden.


Heeft u vragen? Plaats uw vraag op het FMTraining Forum of neem contact op.

Opletten bij loops met records

Geplaatst op: 18 april 2017 | Niveau: FileMaker Gevorderden Training

Voorbeeldscript met loop

Als een loop wordt gebruikt om in een script meerdere records te bewerken of een actie uit te voeren, dan moet de programmeur er rekening mee houden dat handelingen van andere gebruikers daar effect op hebben.

Door record-locking is het geen probleem als een gebruiker een record bewerkt dat niet tegelijk door het script wordt bewerkt. Voor het geval dat gebruiker en script hetzelfde record willen bewerken is het belangrijk dat de scriptstap 'Record openen' wordt gebruikt en bijvoorbeeld wacht totdat dat lukt.

Wanneer de loop door alle records van de tabel gaat, dan kan er een probleem ontstaan als andere gebruikers nieuwe records maken. Door voorafgaand aan de loop tweemaal de scriptstap 'Alleen weggelaten records tonen' te gebruiken voorkomt u dat.

Als een van de records tijdens het uitvoeren van het script wordt verwijderd is dat meestal geen probleem als de scriptstappen worden gebruikt die ervoor zijn: Loop, Ga naar record [ Volgende ; Afsluiten na laatste: Aan ] en End Loop. Met een eigen teller en tussendoor naar andere records gaan kan het mis gaan.
Het script moet er ook rekening mee houden dat het met minder records kan eindigen dan waarmee het begint.

Hoe meer gebruikers er in de database werken en hoe meer records de loop bewerkt, des te groter is het gevaar.

Zelf de zontijden berekenen

Geplaatst op: 15 februari 2017 | Niveau: FileMaker Expert Training

Als u in uw database wilt weten hoe laat de zon opkomt en ondergaat dan is deze berekening voor u nuttig. Daarmee kunt u bepalen of een activiteit voor zonsopgang begint, berekenen hoeveel uren daglicht er op een dag zijn, de interface aanpassen op licht en donker enzovoort.

Doel
De onderstaande berekening kan als Eigen Functie (met FileMaker Advanced) toegepast worden en eventueel als berekening(sveld) met resp. parameters en velden volgens deze functiebeschrijving:

Opmaak
SunTimes ( latitude ; longitude ; datum ; timezone ; sunrise ; sunset )

Parameters
latitude en longitude - Twee decimale getallen met de WGS84 kaartcoördinaten van de gewenste locatie, resp. breedtegraad en lengtegraad.
datum - De datum waarvan u de zontijden voor een locatie wilt weten.
timezone - Een getal waarmee de tijdzone in aantal uren verschil met GMT/UTC wordt aangegeven, zowel positief als negatief. In geval van zomertijd met één te verhogen.
sunrise en sunset - Twee logische waarden (True/False) waarmee u aangeeft of u de tijd van zonsopgang (sunrise) of zonsondergang (sunset) als resultaat wilt. Als beide parameters True zijn dan worden beide tijden gegeven in een waardenlijst.

Resulterend gegevenstype
tijd of tekst met twee tijden

Vereist
Eigen functie of berekeningsvelden met Atan2 (ook hieronder gegeven).

Voorbeeld
SunTimes ( 52,37307 ; 4,892647 ; Get ( HuidigeDatum ) ; 1 ; True ; False )
Geeft de tijd van zonsopgang voor de Dam in Amsterdam voor vandaag in tijdzone GMT+1 zonder zomertijd. Resultaat op 15 februari 2017: 07:55:44.

Bron
Dit is een voor gebruik in FileMaker aangepaste versie van een Excel-document met berekeningen die te vinden was op de website van US NOAA.

SunTimes ( latitude ; longitude ; datum ; timezone ; sunrise ; sunset ) =

Let ( [
  DatumGetal = GetAsNumber ( Datum ) - 693594 ;
  TijdGetal = GetAsNumber ( Time ( 12 ; 0 ; 0 ) ) / 86400 ;
  JulianDay = DatumGetal + 2415018,5 + TijdGetal - TimeZone / 24 ;
  JulianCentury = ( JulianDay - 2451545 ) / 36525 ;
  GeomMeanLongSun = Mod ( 280,46646 + JulianCentury * ( 36000,76983 + JulianCentury * ,0003032 ) ; 360 ) ;
  GeomMeanAnomSun = 357,52911 + JulianCentury * ( 35999,05029 - ,0001537 * JulianCentury ) ;
  EccentEarthOrbit = ,016708634 - JulianCentury * ( ,000042037 + ,0001537 * JulianCentury ) ;
  SunEqOfCtr = Sin ( Radians ( GeomMeanAnomSun ) ) * ( 1,914602 - JulianCentury * ( ,004817 + ,000014 * JulianCentury ) ) + Sin ( Radians ( 2 * GeomMeanAnomSun ) ) * ( ,019993 - ,000101 * JulianCentury ) + Sin ( Radians ( 3 * GeomMeanAnomSun ) ) * ,000289 ;
  SunTrueLongDeg = GeomMeanLongSun + SunEqOfCtr ;
  SunTrueAnomDeg = GeomMeanAnomSun + SunEqOfCtr ;
  SunRadVector = ( 1,000001018 * ( 1 - EccentEarthOrbit * EccentEarthOrbit ) ) / ( 1 + EccentEarthOrbit * Cos ( Radians ( SunTrueAnomDeg ) ) ) ;
  SunAppLongDeg = SunTrueLongDeg - ,00569 - ,00478 * Sin ( Radians ( 125,04 - 1934,136 * JulianCentury ) ) ;
  MeanObliqEclipticDeg = 23 + ( 26 + ( ( 21,448 - JulianCentury * ( 46,815 + JulianCentury * ( ,00059 - JulianCentury * ,001813 ) ) ) ) / 60 ) / 60 ;
  ObliqCorrDeg = MeanObliqEclipticDeg + ,00256 * Cos ( Radians ( 125,04 - 1934,136 * JulianCentury ) ) ;
  SunRtAscenDeg = Degrees ( Atan2 ( Cos ( Radians ( ObliqCorrDeg ) ) * Sin ( Radians ( SunAppLongDeg ) ) ; Cos ( Radians ( SunAppLongDeg ) ) ) ) ;
  SunRtAscenDeg = Degrees ( Atan2 ( Cos ( Radians ( SunAppLongDeg ) ) ; Cos ( Radians ( ObliqCorrDeg ) ) * Sin ( Radians ( SunAppLongDeg ) ) ) ) ;
  SunDeclinDeg = Degrees ( Asin ( Sin ( Radians ( ObliqCorrDeg ) ) * Sin ( Radians ( SunAppLongDeg ) ) ) ) ;
  VarY = Tan ( Radians ( ObliqCorrDeg / 2 ) ) * Tan ( Radians ( ObliqCorrDeg / 2 ) ) ;
  EqOfTimeMinutes = 4 * Degrees ( VarY *  Sin ( 2 * Radians ( GeomMeanLongSun ) )-2 * EccentEarthOrbit *  Sin ( Radians ( GeomMeanAnomSun ) )+4 * EccentEarthOrbit * VarY *  Sin ( Radians ( GeomMeanAnomSun ) ) *  Cos ( 2 * Radians ( GeomMeanLongSun ) )-,5 * VarY * VarY *  Sin ( 4 * Radians ( GeomMeanLongSun ) )-1,25 * EccentEarthOrbit * EccentEarthOrbit *  Sin ( 2 * Radians ( GeomMeanAnomSun ) ) ) ;
  HASunriseDeg = Degrees ( Acos ( Cos ( Radians ( 90,833 ) ) / ( Cos ( Radians ( Latitude ) ) * Cos ( Radians ( SunDeclinDeg ) ) ) - Tan ( Radians ( Latitude ) ) *  Tan ( Radians ( SunDeclinDeg ) ) ) ) ;
  SolarNoon = ( 720 - 4 * Longitude - EqOfTimeMinutes + TimeZone * 60 ) / 1440 ;
  SolarRise = Floor ( ( SolarNoon * 1440 - HASunriseDeg * 4 ) / 1440 * 86400 ) ;
  SolarSet = Floor ( ( SolarNoon * 1440 + HASunriseDeg * 4 ) / 1440 * 86400 ) ] ;

  Case (
    sunset and sunrise ; GetAsText ( GetAsTime ( SolarRise ) ) & "¶" & GetAsText ( GetAsTime ( SolarSet ) ) ;
    sunrise ; GetAsTime ( SolarRise ) ;
    sunset ; GetAsTime ( SolarSet ) ;
    ""
  )

)


Atan2 ( y ; x ) =

Let ( [
  a = If ( x > 0 ; Atan ( y / x ) ;
          If ( x < 0 ; PI - Atan ( -y / x ) ;
          PI / 2 * Sign ( y ) ) );
  result = Mod ( a ; 2 * PI ) ];

  result
)

De berekening is opgesteld met FileMaker 12 die een nul voor de komma van een getal eiste maar deze niet opsloeg zodat bij aanpassing overal weer een nul moest worden getypt... Dat werd opgelost door de berekening in een tekstdocument te bewaren.

Inspiratie vanachter de schermen?

Geplaatst op: 22 juni 2016 | Niveau: FileMaker Kenniswerkers Training

Script-code voor export naar SQL-server

De administratie van FMTraining wordt uiteraard gedaan met een zelf ontwikkelde FileMaker database. Daarin worden de trainingen gepland en de inschrijvingen verwerkt. Mogelijk dat u er inspiratie voor uw database uit kan halen?

Vanwege capaciteit en veiligheid van server en verbinding hebben we ervoor gekozen om de noodzakelijke gegevens te publiceren op een extern gehoste Apache webserver onder Debian. Daarvoor worden de gegevens vanuit de FM database over een ODBC verbinding naar een SQL-tabel overgebracht en met PHP op de website getoond.

In diverse pagina's wordt de trainingsdata getoond zoals in de Agenda maar ook als keuzelijsten in de formulieren voor Inschrijvingen en Evaluatie.
Bijzonder is dat een PHP-pagina de trainingsdata presenteert als een on-line kalenderbestand waarin status, locatie, docent en aantal deelnemers is opgenomen. De locatiebeheerder en andere medewerkers hebben zich hierop geabonneerd en zien volautomatisch de wijzigingen in hun agenda verschijnen.
Met een kleine kans op miscommunicatie ontvangen alle betrokkenen zo de benodigde informatie. Bovendien kan via een speciale link in de agenda de FileMaker database geopend worden en het record over die training ingezien worden.

Inschrijvingen en evaluaties worden via een PHP pagina ingevoerd op de website en in een SQL-tabel bewaard. Vervolgens worden ze in de FileMaker database geïmporteerd en onmiddellijk uit de SQL-tabel verwijdert. De gemiddelde beoordelingscijfers per training gaan overigens ook weer naar de webserver...
Daarnaast gaan berichten met Nieuws en Tips & Trucs via een RSS bestand automatisch naar LinkedIn, FaceBook en Twitter.

Tot zover de koppeling van onze FileMaker database en de webserver. De database stuurt ook e-mails en, zonder plug-in, HTML-opgemaakte mailings.
En natuurlijk kan de database op een iPad geopend worden en kunnen de cursisten hun handtekening in de digitale presentielijst plaatsen.


De hierboven genoemde technieken worden grotendeels uitgelegd in onze Kenniswerkers Training.

FileMaker 15 en Beacons

Geplaatst op: 8 juni 2016 | Niveau: FileMaker Kenniswerkers Training

Beacons

Met FileMaker Go 15 is het mogelijk om beacons in de omgeving te detecteren. Maar een beacon zendt geen naam, beschrijving en bedragen uit maar alleen codes. Wat kunt u er dan mee?

Een beacon is een apparaat dat via Bluetooth Low Energy codes uitzendt die door andere apparaten ontvangen kunnen worden. Deze codes kunnen door FileMaker ontvangen worden op een iOS apparaat, een iPhone of iPad.
Vaak is een beacon een speciaal klein zendertje met een batterij, maar een smartphone kan dat ook zijn. Zo kan met de app 'Locate Beacon' een iPhone of iPad een beacon worden.

Een beacon kan statisch maar ook mobiel geplaatst worden. Denk aan beacons in een magazijn waaruit een apparaat kan afleiden in welk magazijn en waar in het magazijn het is. Maar een beacon kan ook in de cabine van een vrachtwagen zitten. Het kan ook gebruikt worden om te bepalen of een ander iOS apparaat in de buurt is. Of een armband en dus een mens.

Wat de vorm ook is, een beacon zend een UUID-code van 36 tekens uit en tevens twee getallen primair en secundair. Deze code en getallen kunnen meestal gewijzigd worden met bijgeleverde software.
Als beacons van een bedrijf dezelfde UUID-code hebben dan kunnen de getallen primair en secundair gebruikt worden om elk beacon apart te identificeren naar magazijnstelling, vrachtwagen enzovoort.

Sinds FileMaker Go 15 is de functie RangeBeacons beschikbaar om de beacons in de omgeving te bepalen. Daarbij kan één UUID van de gezochte beacons opgegeven worden maar omdat elke aanroep meerdere seconden duurt is het praktisch niet haalbaar om verschillende UUIDs op te vragen. RangeBeacons kan alleen binnen een script gebruikt worden maar scriptactivering is niet van toepassing.
De functie geeft een lijst van alle beacons met de gezochte UUID in de omgeving, hun primaire en secundaire getallen en de relatieve afstand. Op basis hiervan kan in een zelf samengestelde tabel gezocht worden bij welke magazijnstelling, vrachtwagen enzovoort de dichtstbijzijnde beacon hoort en op basis daarvan acties uit te voeren.

Een actie kan zijn om te zoeken naar informatie over artikelen in die magazijnstelling, het onderhoudsrapport van de vrachtwagen enzovoort en deze informatie, foto of film te tonen aan de gebruiker. Of bij het invoeren van nieuwe records voor onderhoud automatisch de dichtstbijzijnde vrachtwagen in te voeren.

Kortom, beacons geven FileMaker voor het eerst informatie over de omgeving en dat biedt heel veel nieuwe mogelijkheden!

Voorbeeldbestand synchroniseren

Geplaatst op: 13 januari 2016 | Niveau: FileMaker Kenniswerkers Training

Records importeren met bijwerken bestaande gegevens

Samen een gedeelde database gebruiken is ideaal maar soms is er geen verbinding. Dan moeten laptops, iPhone en dergelijke off-line gebruikt kunnen worden en gesynchroniseerd worden.

Data synchroniseren (gelijk maken) is geen eenvoudige kwestie en bij verkeerd gebruik kunnen gegevens onbedoeld overschreven worden.
Bij voorkeur wordt twee-weg synchronisatie vermeden en vaak is dat ook niet nodig. Meestal kan dat opgelost worden met twee maal een één-weg synchronisatie. Maar ook één-weg synchronisatie heeft vele variaties.

Om FileMaker ontwikkelaars te helpen hebben we een voorbeeldbestand 'Synchroniseren' gemaakt dat een basis geeft voor het toepassen van één-weg synchronisatie. Daarbij is gekozen voor gebruik van de scriptstap Records Importeren met de optie 'bijwerken' hetgeen een kort en snel script oplevert. Bovendien is het eenvoudig aan te passen als er velden bij komen.
Een relatie tussen de tabellen is niet nodig en voorkomt overbodige verbindingen (concurrent connections) maar er moet voor elke FileMaker- of ODBC-tabel wel een tabelvermelding zijn maar dat kan in twee verschillende bestanden zijn.

Kennis op het niveau van de Gevorderden Training is vereist om de techniek in uw eigen database te implementeren. In onze nieuwe Kenniswerkers Training wordt de techniek behandeld.

Scriptstappen verplaatsen met toetsen

Geplaatst op: 15 oktober 2015 | Niveau: FileMaker Gevorderden Training

Even een kleine tip die ik zelf al heel lang gebruik; een handige toetscombinatie voor als u scripts bewerkt.

In ScriptMaker of, vanaf FileMaker 14, de Scriptwerkruimte kunt u een of meer scriptstappen selecteren en met toetsen verplaatsen.

Selecteren doet u door de eerste scriptstap met de muis te klikken en met shift of control ingedrukt een volgende scriptstap te klikken om resp. een groep of meerdere losse scriptstappen te selecteren.

Als u vervolgens de control-toets ingedrukt houdt en de pijl-omhoog of pijl-omlaag toets indrukt, dan worden de geselecteerde scriptstappen één regel omhoog of omlaag verplaatst.
Handig om even snel scriptstappen van plek te laten wisselen. Werkt sinds FileMaker 11.

Opsomming van gerelateerde velden met een uitzondering

Geplaatst op: 21 augustus 2015 | Niveau: FileMaker Expert Training

Stel, u wilt een naam o.i.d. van meerdere gerelateerde records als een opsomming in een tekst opnemen, bijvoorbeeld om in een e-mail te gebruiken. Zoals de contactpersonen van een organisatie, de data van trainingen of accessoires van een artikel enz.

Die moeten van elkaar gescheiden zijn met een komma maar tussen de laatste twee is een uitzondering en moet het woord 'en' of 'of' staan. Eigenlijk zoals in de laatste zin van de vorige paragraaf: mogelijkheid 1, mogelijkheid 2 of mogelijkheid 3.
Hoe kan dat handig gedaan worden? Afgelopen week heb ik het weer eens toegepast dus een mooie aanleiding om hier te delen.

De truc zit hem in het achterstevoren gebruiken van de functie Positon ( tekst ; zoekreeks ; begin ; item ) om de laatste scheiding te vinden.
Meestal gebruikt men in deze functie de parameters begin = 1 en item = 1 maar hier willen we vanaf het laatste teken kijken. Dan moet de begin-parameter de lengte van de tekst of groter zijn (bv. 21) en het item negatief (bv. -1) zodat van rechts naar links in de tekst gezocht wordt.

De berekening zou er dan zo uit kunnen zien:

Let (
  [
// Let-functie om snel en eenvoudig éénmaal de lijst met veldinhoud op te vragen
// en de vaste teksten éénmaal op te geven zodat bij een wijziging niet de hele berekening
// moet worden nagelopen.
  vScheiding = ", " ; // definieer de nieuwe tekst tussen de waarden
  vScheidingLaatste = " of " ; // definieer de nieuwe laatste tekst tussen de waarden

  vList = List ( Tabelvermelding::Veld ) ; // bepaal de lijst met veldinhoud 
  vList = Substitute ( vList ; "¶" ; vScheiding ) ; // vervang scheidingsteken ¶ door komma en spatie

  vPosLaatste = Position ( vList ; vScheiding ; Length ( vList ) ; -1 )
  // bepaal de positie van het eerste teken van de laatste scheiding in de lijst, zie uitleg hierboven
  ] ;

  If ( vPosLaatste = 0 ; // indien de scheiding niet voorkomt in de lijst...

    vList ; // ...dan zit er maar één waarde in en is dat de uitkomst 

    Replace ( // vervang...
      vList ; // ...in de lijst van waarden...
      vPosLaatste ; // ...vanaf de positie van de laatste scheiding punt-spatie...
      Length ( vScheiding ) ; // ...het aantal tekens van de scheiding punt-spatie...
      vScheidingLaatste // ...met het woord 'of' en spaties.
    )
  )

)

Wilt u de opsomming in een specifieke volgorde hebben? Dan zult u voor de relatie een sorteervolgorde moeten instellen (niet voor een portaal).

Waarom GetAsNumber gebruiken?

Geplaatst op: 5 januari 2015 | Niveau: FileMaker Gevorderden Training

FileMaker geeft geen enkele foutmelding als in berekeningen 3 * "abc1" of "Kosten: " & 123,4 operaties met teksten en getallen worden uitgevoerd waarbij natuurlijk ook velden gebruikt kunnen worden.

En toch gebruik ik vaak functies zoals GetAsNumber() en GetAsText() om FileMaker expliciet duidelijk te maken dat het een tekst naar een getal om moet zetten of andersom. Vooral toen FileMaker 7 zich anders gedroeg en mijn database onterecht dacht dat de FileMaker versie te oud was om de database mee te gebruiken. Door de functies te gebruiken hoop ik veiliger en defensiever te programmeren om op de lange termijn geen problemen te ondervinden met nieuwe FileMaker versies.

Maar bij scriptparameters is het niet vrijblijvend en moet u GetAsNumber(), GetAsDate() e.d. gebruiken. Scriptparameters worden door FileMaker altijd als tekst doorgegeven aan het aangeroepen script. Als het aangeroepen script een getal verwacht in Get ( ScriptParameter ) dan komt u voor een verrassing te staan bij bijvoorbeeld vergelijkingen. Zie bijvoorbeeld dit script dat aangeroepen wordt met het getal 14:

Variabele instellen [ $mijnwaarde ; GetAsNumber ( Get ( ScriptParameter ) ) ]

If ( $mijnwaarde < 5 )
  // zonder GetAsNumber() worden scriptstappen hier uitgevoerd omdat "14" < 5 = 1 (Waar)
Else
  // met GetAsNumber() worden scriptstappen hier uitgevoerd omdat 14 < 5 = 0 (Niet waar)
End If

Wilt u meer weten over Scriptparameters en Logische Waarden (boolean)? Neem dan deel aan een FileMaker Expert Training.