2024

Jun

27

Av Rolf

Många av de beräkningsfunktioner som finns i Excel finns också i FileMaker. Saknas en av dina favoritfunktioner i FileMaker går det att göra en egen funktion. En funktion jag använder ganska ofta och som saknas i FileMaker är motsvarigheten till Antal.Om (CountIf på engelska) i Excel. Funktionen räknar antalet förekomster av ett värde i en lista.

I maj 2004 publicerade jag funktionen DCount på Brian Dunnings samlingssida för egna FileMaker-funktioner. DCount använder rekursion för att räkna antal förekomster. Sedan FileMaker 18 går det också att göra med While-funktionen. Resultatet blir detsamma så det är mest en fråga om tycke och smak.

Funktionen Antal.Om har i det här exemplet två argument, först en lista med värden och sedan ett villkor som värdet i listan ska uppfylla för att det ska räknas. Villkoret skulle kunna vara t.ex. ">0" eller "=Grönsak" för att räkna alla värden som är större än 0 respektive räkna alla värden som är lika med "Grönsak", men jag nöjer mig för enkelhetens skull med att räkna alla värden som är exakt lika med villkoret (precis som i funktionen DCount). (Vill du se hur "den mer avancerade" funktionen ser ut kan du ladda ner exempeldatabasen nedan, den finns där som Antal.Om.Villkor.)

Du gör en egen funktion med menyvalet Hantera->Anpassade funktioner i menyn Arkiv. Min version av Antal.Om (lista, värde) med While ser ut så här:

While ( 
    [ 
      i = 0; 
      resultat = 0
    ]; 
      i < ValueCount(lista); 
    [ 
      i = i + 1;
      resultat = resultat + 
          (not IsEmpty(GetValue(lista;i)) and GetValue(lista;i) = värde)
    ]; 
    resultat 
)

Med funktionen While går funktionen genom alla värden i listan, ett i taget, och kontrollerar om det inte är tomt och uppfyller villkoret. I så fall ökas resultatet med 1 (ett sant uttryck ger värdet 1, ett falskt ger 0).

Om du t.ex. har en lista med bilmärken och tillverkningsland kan du med en formel få antal bilmärken som kommer från ett visst land, t.ex.

Antal.Om (bilmärken; "USA") = 46

Exempel

Vad kan du använda detta till? Jag har gjort ett exempel med just bilmärken och länder (om du läst FileMakerBloggen tidigare så är det ett återkommande exempel) som visas i en portal.

Till höger om portalen vill jag visa en lista med alla länder som har ett bilmärke, samt hur många bilmärken som tillverkas i landet. Jag vet inte i förväg vilka länder som finns. Se bilden nedan.

Exemplet använder inget script, ingen extra tabell och inga extra fält. Jag använder istället en av mina absoluta favoriter: layoutberäkningar. Layoutberäkningen görs i ett textobjekt i layoutläget och ser i exemplet ut så här:

<<ƒ:Let([
  länder = UniqueValues ( List(Bilmärken::Land) );
  bilmärken = List ( Bilmärken::Land )
];
  While (
    [
      i = 0;
      s = ""
    ];
      i < ValueCount(länder);
    [
      i = i + 1;
      s = List(s; GetValue (länder;i) & Char(9) & 
            Antal.Om ( bilmärken; GetValue (länder;i)) )
    ];
      SortValues ( s; -2 )
  )
)>>

Först tar jag reda på vilka möjliga länder det finns och tar bort alla dubbletter med funktionen UniqueValues. I nästa steg får jag en lista med alla bilmärken. Med hjälp av While-funktionen går funktionen genom alla länder, ett i taget, och använder funktionen Antal.Om för att räkna antal bilmärken för just det landet. Jag sätter samman resultatet i variabeln "s", där varje rad är landets namn följt av ett tab-tecken och sedan antalet.

Till sist sorterar jag resultatet i numerisk, fallande ordning (funktionen SortValues med argumentet -2). FileMaker är då så smart att endast sortera antalet på varje rad och ignorerar texten. Resultatet blir en lista med alla länder, sorterad i fallande ordning efter antalet bilmärken.

Textfältet utformar jag med ett tab-läge på lämpligt avstånd, i exemplet har jag även lagt till punktutföring till antalssiffran.

En finess är att om ett nytt land läggs till för något av bilmärkena, eller ett befintligt land ändras, kommer listan omedelbart att uppdateras. Antalet ändras automatiskt och antalet länder i listan kan både bli färre eller fler.

Ladda ner exempeldatabas här: AntalOm.fmp12

Skriv en kommentar

Din epost-adress stannar hos oss.