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.

2017

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.