2016

Okt

25

Av

FileMaker är känt för dess snabba och flexibla sökning. Det är inte många databasprogram som söker i alla ord i alla fält med ett en knapptryckning (snabbsök)! Sökning bland miljontals poster går på ett kick. Men ibland vill man visa sökresultatet i en portal och då är det inte lika enkelt, men inte heller så svårt :) .

I exemplet har jag en tabell med bilmärken som jag vill söka bland. Resultatet, som kan vara en eller flera bilmärken, vill jag visa i en portal som visas i en layout baserad på en annan tabell.

Portalsok_layout

När jag skriver en bokstav i sökfältet ovanför portalen vill jag att portalen omedelbart ska visa aktuellt resultat. I bilden har jag skrivit “ma” och portalen visar alla bilmärken som börjar med dessa bokstäver. Jag använder en manus-trigger som kör ett manus varje gång fältet ändras. Högerklicka på fältet i layoutläget och välj Ange scripttrigger i menyn. Jag har gjort ett manus som gör sökningen, i brist på fantasi har jag kallat det för Sök, som ska köras varje gång fältet ändras (VidObjektÄndra).

Portalsok_trigger

Jag har tidigare skrivit om hur du kan söka medan du skriver med fördröjning så att du hinner skriva några bokstäver innan FileMaker behöver göra en sökning, allt för att göra det “snabbare” för användaren och låta FileMaker slippa göra så mycket jobb. Denna gång görs sökningen direkt.

Sökningen gör jag med manuset Sök som faktiskt bara består av en enda rad. Det finns flera olika sätt att göra sökningen på, t.ex. att gå till en annan layout och söka med “FileMaker-sökning” och därefter gå tillbaka till ursprunglig layout, men denna gång använder jag en enkel SQL-fråga. Alla bilmärken finns i tabellen Bilmärken med fälten id_bilmärke (ett unikt id-nummer för varje post), Bilmärke och i vissa fall även Land. Från tabellen “Portalsök” vill jag söka början på alla bilmärken.

Jag använder en SQL-fråga som ser ut så här:

SELECT id_bilmärke FROM Bilmärken WHERE LOWER(Bilmärke) LIKE ?

Sökning görs på fältet Bilmärke i tabellen Bilmärken. För att kunna söka på både små och stora bokstäver omvandlar jag först innehållet till små bokstäver med SQL-funktionen LOWER. Som resultat returnerar jag id-numret för alla bilmärken som hittas. FileMaker har en funktion för att köra SQL-frågor, funktionen ser ut så här:

ExecuteSQL ("SELECT \"id_bilmärke\" FROM \"Bilmärken\" 
WHERE LOWER(\"Bilmärke\") LIKE ?";"";"¶";Lower(Portalsök::gSök) & "%")

Alla fält som innehåller “konstiga” bokstäver (ofta åäö) måste finnas inom citat-tecken för att FileMaker ska kunna förstå dem, därav \” före och efter varje fält- och databasnamn i SQL-frågan.

Den andra parametern till funktionen är skiljetecknet mellan de fält som frågan ger som resultat. Eftersom frågan endast returnerar ett fält (id_bilmärke) så anger jag en tom sträng.

Den tredje parametern är skiljetecknet mellan olika poster. Jag anger en radmatning för jag vill att varje id-nummer ska hamna på en egen rad i resultatet.

Den fjärde parametern är det jag vill söka efter, den ersätter frågetecknet i SQL-frågan. Jag har kallat fältet för Portalsök::gSök och lägger till ett procenttecken som talar om för SQL att söka på början av fältet. Även sökfältet omvandlar jag till små bokstäver med FileMaker-funktionen Lower.

Resultatet, som är ett eller flera id-nummer på lika många rader, tilldelar jag ett annat variabel-fält av typen Text i tabellen Portalsök. Portalen som ska visa resultatet är relaterad med tabellen Bilmärken, variabel-fältet och id_bilmärke är nyckel.

Portalsok_relation

SQL-frågan körs varje gång du skriver ett tecken i sök-fältet, variabel-fältet i Portalsök tilldelas med de hittade id-numren och portalen uppdateras med de bilmärken som hittas. Enkelt, eller hur?

Du kan ladda ner exempel-databas här: Portalsok.fmp12

Skriv en kommentar

  • (will not be published)
  • 7 × four =

Läs också: