2021

aug

26

Av

Det finns många beräkningsfunktioner i FileMaker. Några har jag antagligen aldrig använt. Men några använder jag väldigt ofta. Vissa dyker bara upp på FileMakers certifieringstester. Resten använder jag väldigt sällan, eller aldrig. Vilka beräkningsfunktioner behöver du?

Jag har helt ovetenskapligt gjort en lista på de beräkningsfunktioner som jag använder mest när jag utvecklar olika slags lösningar med FileMaker Pro. Med dessa kommer du långt, både för att göra beräkningar och manus.

If
Funktionen If är den funktion jag använder i särklass mest. Funktionen kontrollerar ett värde och returnerar olika resultat om värdet är sant eller falskt. Värdet som kontrolleras är oftast en jämförelse.

Flera jämförelser på en gång kräver Case, men det blir inte ofta för min del.

En vanlig jämförelse är om ett fält är tomt, det finns en beräkningsfunktion för det: IsEmpty

Exempel

If (not IsEmpty(fältnamn); "Fältet innehållet ett värde."; "Fältet är tomt.")

Let
En tumregel är att om du använder en beräkning fler än en gång i samma formel ska du använda Let. Med Let sparar du beräkningen i en variabel, den utförs bara en gång, och variabeln kan användas flera gånger i samma formel. Funktionen är egentligen bara en hjälp för att slippa utföra beräkningar flera gånger och ger en mer lättläst formel, men behövs inte för resultatet.

Egentligen en onödig funktion, men på samma gång helt oumbärlig! Let kan också användas för att skapa globala variabler.

Exempel som returnerar år och månad i formen 202108.

Let([
  dagens_datum = Get(AktuelltDatum)
];
  Year(dagens_datum)*100 + Month(dagens_datum)
)

Get (HittadePoster), Get (AktuelltDatum) och Get (AktuellTidsstämpel)
Med Get-funktioner hämtas värden, som t.ex. dagens datum och aktuell tid, och dessa används i princip uteslutande i manus. Om du använder en Get-funktion i ett beräkningsfält i en tabell måste du välja alternativet Lagra inte beräkningsresultat för fältet för att få aktuella värden. Annars beräknas fältet endast en gång istället för när det används, och tro mig, det blir inte bra.

Exempel

Manussteget ”If (Get (HittadePoster) > 0” kontrollerar om poster hittats efter en sökning.

List
List-funktionen är magisk! Funktionen sätter ihop flera värden, antingen i samma post eller i relaterade poster, till ett fält med radmatningstecken mellan värdena. Tomma värden/rader ignoreras. En enda List-beräkning ersätter ibland många komplicerade If-funktioner och hela, långa manus.

Exempel som returnerar en adress. Om t.ex. fältet Adress2 är tomt hoppas det över.

List(
  Namn;
  Adress1;
  Adress2;
  Postadress
)

Substitute
Byter ut tecken i en text mot andra tecken. Används med fördel i kombination med List för att t.ex. skapa komma-separerade listor för presentation, men har oändliga användningsområden.

Exempel som returnerar ett fält i alla relaterade poster med ”, ” mellan, t.ex. ”Peppar, Salt, Koriander”:

Substitute(List(Recept_Kryddor::Krydda); "¶";", ")

Position
Söker efter tecken i en text och ger som resultat positionen för tecknen. Används också för att ta reda på om tecken finns i en text (resultatet blir då större än 0), något som även PatternCount kan. Men Position kan söka både framifrån och bakifrån, och resultatet kan direkt användas i andra funktioner. Ska du lära dig någon av dem, lär dig Position.

Exempel om en text innehåller en följd av tecken:

If (Position(text;"a";1;1) > 0; 
  "Fältet innehåller ett a";
  "Fältet innehåller inget a")

Följande exempel är en fortsättning på exempel för Substitute ovan. Komma-tecknet mellan den sista och näst sista kryddan ersätts med ” och ”, dvs. ”Peppar, Salt och Koriander”.

Let([ 
  text = Substitute ( List (Recept_Kryddor::Krydda); "¶"; ", ");
  längd = Length (text); 
  pos = Position (text; ", "; längd; -1)
]; 
  Left (text; pos-1) & " och " & Right (text;längd - pos - 1)
 )

GetValue och ValueCount
Väldigt ofta får jag en lista med värden som åtskiljs med retur. Jag brukar jämföra det med en ”array” i vilket annat programspråk som helst, som Javascript eller C. Ofta är det resultatet av en List-funktion. Beräkningsfunktionerna GetValue och ValueCount använder jag nästan uteslutande i manus tillsammans med Exit Loop If för att avbryta loopar. Men i stort sett alla manus jag gör innehåller en eller flera loopar så de används ofta.

Exempel på ett manus kan vara:

Ange variabel [$i ; 0]
Loop
  Ange variabel [$i; $i + 1]
  Exit Loop If [$i > ValueCount ($lista)]
  # Något som görs i loopen
End Loop

Exempel på en beräkning som returnerar vilken rad tecknet ”d” finns på i en lista:

Let([ 
  lista = List(Recept_Kryddor::Krydda) 
]; 
  ValueCount(Left(lista; position(lista;"d";1;1))) 
)

Left, Middle och Right
Tänk om alla programspråk hade ett lika enkelt sätt att göra beräkningar med texter som FileMaker! Vanliga textfunktioner är Left (returnerar tecken i början av en text), Middle (returnerar tecken i mitten av en text) eller Right (returnerar tecken i slutet av text). Jag har använt både Left och Right i exemplen ovan.

Json-funktioner
Dessa används mer och mer, speciellt för integration med andra system, tillämpningar och API:er. Men också bra tillsammans med List och GetValue för att lagra information temporärt i manus. JSONGetElement, JSONSetElement och JSONListValues är de som jag använder mest.

Skriv en kommentar

  • (will not be published)

Läs också: