FileMaker Tip 318

GetNthRecord: nog een fraaie toepassing

 

In tip 316 maakten we kennis met de functie GethNthRecord. Hier volgt nog een andere toepassing van deze functie, vandaag op verzoek van een vraagsteller die het voorbeeldscript van FileMaker gedownload heeft, maar het niet helemaal begrijpt*. Hij vraagt dus dat script in detail uit te leggen.

We moeten wel even waarschuwen: de lezer moet reeds bekend zijn met de functies Let en Evaluate (zie tip 312).

Eerst even uitleggen wat het voorbeeldbestand is en wat er in dit voorbeeld mee gedaan wordt. In feite is het een heel eenvoudig werknemersbestand waarbij het natuurlijk kan voorkomen dat meerdere werknemers voor hetzelfde bedrijf werken. Het bestand is van het type single table (de vroegere flat file dus), en de bedrijfsgegevens staan dus op dezelfde record als de werknemersgegevens: eerst hebben we Naam en ID, daarna Companynaam, Straat, Stad, enzovoort. Wanneer we zo'n record ingevuld hebben, en we gaan naar New Record om een volgende in te vullen, dan kan het gebeuren dat de bedrijfsgegevens identiek zijn aan die van de vorige record: de volgende werknemer werkt voor hetzelfde bedrijf als de vorige. Vroeger moesten we alle gegevens een voor een kopiëren en plakken, of we moesten werken via tijdelijk opslaan in een aantal globalen, maar met de nieuwe GetNthRecord, gecombineerd met de Let-functie kunnen we het helemaal anders doen. En daarbij speelt het aantal in te vullen velden niet eens een rol!

Hoe werkt het in de praktijk?

We maken een nieuwe record aan, vullen de naamgegevens in en klikken daarna op een button die een loop-script activeert om alle bedrijfsgegevens over te nemen uit de vorige record. Het script gaat naar het eerstvolgende veld, vult dat in met de gegevens van de vorige record, gaat dan naar het volgende veld, vult ook dat in met de gegevens van de vorige record, en zo gaat het verder tot aan het veld met de naam die niet meer ingevuld moet worden. Om telkens naar het volgende veld te gaan, gebruikt het script een loop.

Hier volgt het originele script, met voor elke stap, de nodige uitleg:

Allow User Abort[On]
(We laten toe dat de gebruiker het script onderbreekt met de Esc-toets)

SetErrorCapture[On]

(We onderdrukken eventuele foutmeldingen van FileMaker)

If[Get(RecordNumber) - 1 <> 0]

(Dit doet zich voor als er minstens één vorige record is: het script mag immers alleen lopen als er een vorige record is)

Go to Field[Companies::Company]

(We gaan in deze tabel Companies naar het veld Company en laten daar dus de cursor staan; dit is het eerste veld dat ingevuld moet worden met de Companynaam van de vorige record)

Loop

(De loop wordt gestart; de cursor staat nog steeds in het veld Company)

Set Field[
Let ([
Field = Get(ActiveFieldName);
Record_Number = Get(RecordNumber) - 1];
GetNthRecord ( Evaluate ( Field ); Record_Number) )]

(we definiëren eerst twee variabelen:

Field = de naam van het actieve veld, namelijk dat waarin de cursor staat);

Record_Number = het actuele record nummer min één, dus het record nummer van de vorige record;

daarna vullen we het veld met de inhoud die we met de Evaluate-functie gevonden hebben in datzelfde veld in de vorige record)

Go to Next Field

(De cursor gaat naar het volgende veld)

Exit Loop If [Get(Active FieldName) = "Naam"]

(De loop moet stoppen wanneer de cursor in het veld Naam terechtkomt, maar dat is pas het geval als alle tussenliggende velden gevuld zijn)

End Loop

(De loop wordt opnieuw doorlopen vanaf het begin)

End If

(De afsluiter van het If-statement).

 

Zo, dat was het. Er zijn nog een paar aspirientjes over van tip 152.

 


* Het FileMaker voorbeeldbestand staat hier.

 

Terug naar het selectiemenu voor de tips.