Innehåll

Filemaker

2009-01-25

Om Filemaker

Filemaker är ett lättanvänt databasprogram som jag kom i kontakt med i början av 2000-talet. Mitt bokföringsprogram hade vuxit ur Excel och eftersom jag inom alla områden föredrar att tillverka saker själv om jag kan så vände jag mig till Filemaker. Det som tilltalade mig med Filemaker var möjligheten att kunna arbeta med databaser, rapporter och layouter i ett och samma program. Visserligen var "lättanvänt" en sanning med modifikation då även Filemaker har en startsträcka innan man förstår logiken och vet hur man ska börja. Tack vare boken "Special Edition Using Filemaker" kom jag dock i gång och inom kort hade jag utvecklat det fungerande bokföringsprogrammet Niconomy som täckte alla mina behov. Sedan dess har jag vidareutvecklat Niconomy och hjälpt företag som Gooh! och organisationer som Ornäs båtklubb med Filemaker.

Filemakers fördel är dess enkelhet. Med Filemaker arbetar du med databaser som består av en enda fil. Tabellerna skapar du i ett intuitivt gränssnitt och relationerna genom att dra och släppa de fält som ska kopplas. Layouterna skapar du sedan i en miljö som ser ut som vilket ritprogram som helst, där du lägger in fält, knappar och annan grafik. Funktioner skapar du också i ett intuitivt gränssnitt och du behöver inte behärska programmering. Rapporter slutligen bygger du genom en enkel guide som skapar detalj- och summadelar automatiskt.

Filemakers begränsningar uppenbarar sig dock när du försöker göra mer avancerade saker. Data är inte separerad från tabellstruktur så du måste göra alla strukturförändringar antingen direkt i databasen eller i en tom kopia till vilken du sedan importerar all data. Eftersom datahantering ofta kräver så kallade beräknings- och statistikfält så kräver nya rapporter och liknande ofta en ny tabellstruktur. Jag saknar ibland möjligheten att skriva kod för sökningar och procedurer i stället för att gå omvägen via tabellstrukturen. Filemakers webbgränssnitt lämnar också mycket övrigt att önska.

Dessa begränsningar till trots så är Filemaker ett utmärkt program för enklare databaser. Jag känner inte till några andra program där du på ett par timmar kan skapa enkla program som hanterar och presenterar data på ett tilltalande sätt.


Tips och tricks

Filemaker erbjuder många fiffiga lösningar. Här är några tips och tricks som jag har haft särskild nytta av i mitt arbete.

1. Första databasen

Här är ett exempel på en mycket enkel receptdatabas som illustrerar de första stegen i en ny databas från grunden. Titta också på de många mallar som kommer med Filemaker.

  1. Skapa en ny fil utan mall med namnet "Recept".
  2. Skapa en tabell med namnet "Recept" och en tabell med namnet "Ingredienser".
  3. Skapa i tabellen "Recept" fälten "Nr" (typ Numeriskt) och "Namn" (typ Text). Skapa i tabellen "Ingredienser" fälten "Nr" (typ Numeriskt), "Receptnr" (typ Numeriskt), "Namn" (typ Text), "Antal" (typ Numeriskt) och "Enhet" (typ Text). Ange för fälten "Nr" tillvalet "Löpnummer" så att varje post automatiskt får ett unikt nummer.
  4. Skapa en relation mellan fälten Recept::Nr och Ingredienser::Receptnr genom att i fliken "Relationer" dra och släppa det ena fältet på det andra. Dubbelklicka på relationen och kryssa under tabellen "Ingredienser" för alternativen "Tillåt att poster skapas..." och "Radera relaterade poster...".
  5. Stäng fönstret "Definiera databas" och välj i menyn Visa / Layoutläge. Skapa layouten "Recept" som visar poster från tabellen "Recept".
  6. Sätt in i layouten "Recept" en portal som visar poster enligt relationen "Ingredienser" (som du skapade i punkt 3). Arbeta lite med utseendet (t ex rubriker, fältkanter). Observera att "Nr" och "Receptnr" kommer att skapas automatiskt. Varje post visar nu ett recept med relaterade ingredienser.
  7. Välj menyn Manus / Scriptmaker och skapa ett manus med namnet "Ny" med manussteget "Ny post". Gå till layoutläget, välj menyn Sätt in / Knapp och välj funktion "Utför manus" för knappen. Knappen skapar nu nya recept.
  8. Välj menyn Arkiv / Definiera / Värdelistor och skapa en ny värdelista med namnet "Enhet" och alternativet "Använd värden i listan". Ange värdena "g", "hg" och "kg". Gå tillbaka till layoutläget, dubbelklicka på fältet "Enhet" och ändra "Visa som" till "Nedrullningsbar lista" som visar värden från "Enhet". Enheter kan nu väljas i en lista.
  9. Välj menyn Layouter / Ny layout. Välj visa poster från "Ingredienser" och layouttyp "Rapport". Fortsätt i guiden med att flytta fälten "Namn", "Antal" och "Enhet" från tabellen "Ingredienser" samt fältet "Namn" från tabellen "Recept".
  10. Avsluta rapportguiden och arbeta med utseendet. Lägg t ex in en del "Inledande totalsumma" och dra Recept::Namn dit så att varje recept visas med en receptrubrik och en ingredienslista.

2. Gå till relaterade poster

En relationsdatabas hanterar relaterade poster - det säger sig självt. En av mina favoriter bland manusstegen är därför gå till relaterade poster. Om du har genomtänkta relationer mellan databaserna kan du använda manussteget på många sätt, t ex:

  1. Navigera till relaterade poster, t ex till ingredienser som tillhör ett visst recept eller tvärtom till recept som använder sig av en viss ingrediens.
  2. Förenkla standardsökningar, t ex genom att bygga en relation med det beräknade värdet 0 för att enkelt hitta ingredienser som kostar 0 kr.
  3. Duplicera post med relaterade poster, t ex genom att exportera ett recepts ingredienser till en temporär tabell, skapa ett nytt recept och till det importera ingredienserna. Alternativt kan du gå till de relaterade posterna, duplicera dem och tilldela dem nästa receptlöpnummer med funktionen GetNextSerialValue enligt nedan. If-satsen kontrollerar att det verkligen finns relaterade poster medan sorteringen gör att en duplicerad post lägger sig under originalposten. (Om posterna är osorterade lägger sig den duplicerade posten sist.)

Ange variabel [$Recept; Värde:GetNextSerialValue("Recept";"Recept::Recept nr")]
If [Ingredienser::Recept nr]
Gå till relaterad post [Visa endast relaterade poster; Från tabell: "Ingredienser"; Med layout: "Ingredienser" (Ingredienser)]
Sortera poster [Spara; Ingen dialogruta]
Loop
Gå till post/sökpost/sida [Första]
Duplicera post/sökpost
Tilldela fält [Ingredienser::Recept nr; $Recept]
Gå till post/sökpost/sida Första]
Uteslut
Uteslut
Exit Loop If [Get(HittadePoster)=0]
End Loop
Gå till layout [ursprunglig layout]
End If
Duplicera post/sökpost


3. Kontrollberäkningar för låsning av poster

Ibland behöver poster låsas för förändringar. Det kan du enkelt åstadkomma genom ett fält som anger huruvida posten är låst eller inte låst, t ex "Låst". Övriga fält kan sedan definieras med en kontrollberäkning under fliken Kontroll, t ex Låst="Nej". I detta fall så kommer förändringar av data endast att accepteras så länge Låst="Nej".

Denna kontrollberäkning kan användas på många andra sätt, t ex för att kontrollera att en behörig användare är inloggad.


4. Loopar för hantering av flera poster

För att hantera flera poster på en gång kan du använda loopar. Nedanstående exempel kombinerar punkt 2 och 3 ovan för att låsa en posts underposter.

Gå till relaterade poster [Visa endast relaterade poster; Från tabell: Underposter; Med layout: Aktuell Underposter]
Gå till post [Första];
Tilldela fält [Låst; "Ja"]
Gå till post [Nästa; Avbryt efter sista]
End loop

Glöm inte bort tillägget "Avbryt efter sista" när du går till nästa post - annars fortsätter loopen för evigt.


5. Lathund för rapporter

Rapporter innehåller många delar och specialfält och det är lätt att gå vilse så fort man lämnar guiden. Här är en lathund att ha i åtanke när du ändrar rapporter eller skapar nya utan guide. Lathunden exemplifieras med en försäljningsdatabas grupperad efter geografi.

  1. Sidhuvud: Text överst på varje sida (t ex utskriftsdatum)
  2. Inledande totalsumma: Rubrik överst i rapporten (t ex "Försäljningsrapport")
  3. Delsumma (före): Rubrik över varje delgrupp (t ex "Stockholm")
  4. Huvuddel: En rad för varje post i delgrupp (t ex "1 000 kr")
  5. Delsumma (efter): Summa av varje delgrupp (t ex "1 000 000 kr")
  6. Avslutande delsumma: Totalsumma av poster i rapporten (t ex "10 000 000 kr")
  7. Sidfot: Text nederst på varje sida

Rapportdata hämtas från den tabell som layouten är baserad på. Ytterligare information, t ex rubriker, kan dock hämtas genom relaterade fält. Genom att sortera posterna i flera steg kan du lägga in flera delgrupper. Till exempel kan du sortera försäljning efter regioner, länder och städer. Du kan då lägga in delsummor som visar delsumma för Stockholm, delsumma för Sverige och delsumma för Europa.

Glöm inte att ett fälts kanter måste ha marginal till delens kanter samt att posterna måste vara sorterade på samma sätt som delgrupperna för att rapporten ska fungera.

Obs! Om poster syns i granskningsläge men ändå inte skrivs ut kan det bero på skrivarinställningar. I PC-versionen kan man ställla in att endast aktuell post, framsökta poster eller samtliga poster ska skrivas ut. I Mac-versionen kan man inte välja utan det är framsökta poster som skrivs ut. Jag fick detta problem med en fil som ursprungligen var en PC-mall inställd på att skriva ut endast aktuell post. Det var först när jag på en PC ändrade filens inställningar till framsökta poster som jag kunde skriva ut på min Mac.


6. Mergefält i rapporter

Ett vanligt problem i layouter i allmänhet och rapporter i synnerhet är att veta vilken storlek fält och delar behöver för att innehållet ska passa. Mergefält löser många av dessa problem.

Mergefält skapar du genom menyn Sätt in / Mergefält eller genom ett vanligt textfält där text blandas med fältinnehåll enligt formatet <<tabellnamn::fältnamn>>. Ett exempel på användning av mergefält är sidnummer som också visar rapportens totala antal sidor. Gör ett manus, gå till sista posten och tilldela sidnumret till en variabel. Kombinera sedan i ett mergefält sidnummer med variabeln.

Mergefält kan också vara nyttiga för enskilda fält. Antag att du har ett fält med en löptext av okänd längd. Om den visas i ett vanligt fält måste storleken på både fältet och delen specificeras, med risk för att inte hela löptexten syns eller att rapporten får onödig luft. Om löptexten däremot visas i ett mergefält så kan du göra så att delen anpassas efter innehållet. Detta åstadkommer du genom att göra delen och mergefältet så stora att all tänkbara data ryms samt välja alternativet "Dela upp en del på flera sidor" när du definierar delen. Receptdatabasen nedan innehåller en sådan rapport. Anvisningarna för receptet (som ju kan vara olika långa) finns i ett mergefält i en delsummedel och ingredienserna i receptet följer i en huvuddel.


7. Get Summary för att ta bort nollposter i rapporter

Statistikfält används för statistik om en tabells värde, t ex summa, men tyvärr kan de bara användas för att skriva ut statistiken i rapporter. Du kan dock hämta statistik till beräkningar med funktionen GetSummary. GetSummary har två parametrar: statistikfält och sorteringsfält. Nedanstående exempel visar hur du i en rapport utesluter poster som summerar till noll med hjälp av statistikfält för summa och antal.

Gå till post [Första]
Loop
If [GetSummary(rapport::summastatistik;rapport::sorteringsfält)=0]
Uteslut flera poster [GetSummary(rapport::antalantalstatistik;rapport::sorteringsfält)
Else
Gå till post [Get(Postnummer)+GetSummary(rapport::antalstatistik;rapport::sorteringsfält)]
End if
Exit Loop If [Get(Postnummer)=Get(HittadePoster)=0]
End Loop


8. Värdelistor som visar text men lagrar nummer

Varje post i en databas bör ha ett unikt nummer som identifierar posten. Användaren vill dock hellre se klartext så hur hanterar du den intressekonflikten i en värdelista? Lösningen ligger i att lägga in två fält i layouten, ett för identifikationsnumret och ett för den beskrivande texten.

  1. Skapa en värdelista från nummerfältet och textfältet. Välj alternativet "Visa endast värden från det andra fältet".
  2. Lägg i layouten in nummerfältet och koppla värdelistan till det.
  3. Lägg i layouten in textfältet ovanpå nummerfältet och ange funktionssätt "Tillåt inmatning i fältet" endast i sökläge.

Användaren kommer nu i bearbetningsläge att välja ett textvärde i värdelistan men Filemaker lagrar ett nummervärde. I sökläge kommer användaren att kunna söka på textvärdet.


9. Navigering i webbgränssnitt

Webbgränssnitt har som sagt många begränsningar och en sådan är att listor max visar 25 poster och tabeller max 50 poster. Boken Special Edition Using Filemaker ger dock ett utmärkt exempel på hur man kan göra navigeringen mer webblik. Nedanstående manuset kan användas för navigeringsknappar med manusparametrarna "Next" respektive "Prev". Manuset navigerar 25 poster framåt eller bakåt om användaren om användaren är i listläge och 50 poster om användaren är i tabelläge.

Let ( [
curRec = Get (Postnummer) ;
jumpSize =
Case (
Get ( Layoutvisningsläge ) = 1; 25;
Get ( Layoutvisningsläge ) = 2; 50;
1 ) ;
direction =
Case (
Get (Manusparameter) = "Next"; 1;
Get (Manusparameter) = "Prev"; -1 ) ;
newRec = curRec + (jumpSize * direction) ] ;
Case ( newRec > Get ( HittadePoster ) ; curRec ; newRec)
)


10. Egendefinierade funktioner för beräkning av OCR-nummer

Med Filemaker Advanced kan du definiera egna funktioner som kan användas till mycket. Ett exempel är beräkning av OCR-nummer. Ett OCR-nummer består av ett id-nummer, eventuellt ett längdnummer (sista siffran i antal tecken i id-numret, t ex "3" för ett 13-siffrigt id-nummer) samt en kontrollsiffra. Funktionen "check" nedan beräknar ett OCR-nummers sista kontrollsiffra utifrån tre parametrar.

  1. referens: det referensnummer som OCR-numret ska baseras på
  2. langd: referensnumrets längd
  3. vikt: det tal som siffrorna i referensnumret ska viktas med

If(
Middle(referens;langd;1)*vikt > 9; Middle(referens;langd;1)*vikt - 9; Middle(referens;langd;1)*vikt
)
+
Case(
langd>1 and vikt=1;check(referens;langd-1;2);
langd>1 and vikt=2;check(referens;langd-1;1);
0)

Nedanstående beräkning avänder funktionen check för att lägga till ett OCR-nummer till fältet "referens".

referens &
Right(
Truncate( check ( referens ; Length(referens) ; 2) ; -1) + 10 -
check ( referens ; Length(referens) ; 2)
;1)

För att skapa ett referensfält där en längdsiffra läggs till ett id-fält kan följande beräkning användas.

id & Right(10+Length(id);1)

Se bifogad fil som exempel. Funktionen check skapas med menyvalet Arkiv / Definiera / Egna funktioner och funktionsparametrarna "referens", "langd" och "vikt". Beräkningsfältet "referens" lägger till en längdsiffra till fältet "id". Beräkningsfältet "ocr" lägger sedan till en kontrollsiffra till fältet "referens".



Receptdatabas

Filemakers möjligheter kan illustreras med den här lilla receptdatabasen. Den är baserad på en av Filemakers mallar och vidareutvecklad för att hantera beräkning av tid, pris och kalorier för recept. Jag utvecklade den på ett par dagar när jag ville börja organisera mina recept. Använd den gärna som inspiration till egna databaser eller som den är för egna recept. Receptdatabasen kräver Filemaker 12.


Bokföringsprogram

En mer avancerad databas är det här bokföringsprogrammet som jag byggde för att lära mig mer om utmaningarna med ett affärssystem. Den innehåller funktioner som huvudbok, reskontra, inventarier, lager, tidredovisning och rapportering och är tänkt för småföretag. Jag använder det själv för mina egna kunders bokföring. Bokföringsprogrammet kräver Filemaker 12 eller senare.


Medlemsdatabas

Den här medlemsdatabasen började jag bygga på i samband med en offert till en motorklubb. Klubben valde visserligen att gå vidare med en molntjänst, något som jag också rekommenderade då Filemaker är bättre som skrivbordsdatabas än som databas åtkomlig över Internet, men jag byggde klart den ändå. Med funktioner som medlemsregister, avgifts- och betalningshantering, e-postutskick och medlemsinloggning via webben ger den kontroll över många medlemsfrågor. Programmet kan också importera betalfiler från banker för automatisk matchning mot fakturor. Medlemsdatabasen kräver Filemaker 12 eller senare.


Buggar och felmeddelanden

Trots alla förtjänster är Filemaker inte perfekt. Buggar och felmeddelanden finns här också och det är tyvärr inte alltid så lätt att hitta hjälp i manualen. Google och forum såsom Filemaker Today är en bra källa till hjälp men ibland räcker inte ens det. Här har jag därför samlat buggar och felmeddelanden där lösningen varit svårhittad. Förhoppningsvis hjälper det andra att hitta en snabb lösning.

1. Kolumnbredd i värdelistor

Värdelistor hjälper användaren att välja värden vid inmatning i fält. De kan konfigureras till ett visa både en och två kolumner och Filemaker anpassar automatiskt värdelistans kolumnbredd efter innehållet.

Så långt allt väl men om du vill visa fler kolumner än så måste du anpassa de underliggande fälten, till exempel skapa beräkningsfält som visar innehållet från flera andra fält. Då tror du kanske att Filemaker automatiskt anpassar värdelistans kolumnbredd efter dessa anpassade fält?

Nej tyvärr, i vissa fall så förblir kolumnbredden för liten så att man inte ser hela fältet och det går heller inte att manuellt anpassa kolumnbredden. Denna bugg är känd men tyvärr finns det inte någon lösing så vitt jag vet.


2. Nätverksstacken kunde inte initialiseras

Funktionen fjärranslutning gör att du kan ansluta till andra Filemakerdatabaser över Internet (förutsatt att de är delade). Det är en utmärkt funktion men i PC-versionen har jag ibland fått det kryptiska felmeddelandet "FileMaker kan inte dela eller vara en filklient eftersom nätverksstacken inte kunde initialiseras".

Vad detta betyder är att det är något fel på filen server.pem. Sök upp filen i din installation (den finns normalt i mappen Program Files / Filemaker) och ersätt den. För Filemaker 8 kan den här filen användas. Sedan borde du kunna fjärransluta utan att få det här felmeddelandet.




Hemsidan har fått 205356 besök. Skriv gärna en rad innan du går. Välkommen åter!

Namn:

E-post:




2016-05-16

Hej
Hittade din sida här.
Jag håller på lite med Filemaker 6 där vi har ett bokning system.
Nu har jag även FileMaker8.
Men har problem med att vi inte kan fjärröppna och dela databaserna.
Har du någon lösning på detta?


2014-12-14

Hej!

Jag tycker att det är enklast med manussteget "Gå till relaterade poster" för att gå till en tabell där alla portalposter syns och sedan ta bort dem därifrån.

Var dock mycket försiktig med manus och radera så att du inte raderar för mycket.

Vänliga hälsningar
Nicholas Hjelmberg


2014-12-13

hur kan man ta bort poster från portal med manus filemaker 13


2014-09-04

Hej Michael!

Medlemsdatabasen tar jag inte betalt för. Om du vill ha hjälp att anpassa den brukar jag ta 800 kr/timme för företag och halva priset för ideella föreningar.

Vänliga hälsningar
Nicholas Hjelmberg


2014-09-03

Hej!
Vad skulle ditt medlemsdatabas kosta?


2014-02-22

Hej Sten!

Jag la upp en ozippad fil istället. Se om det går bättre med den, annars skickar jag den gärna direkt till dig om du vill.

Vänliga hälsningar
Nicholas Hjelmberg


2014-02-22

Jag har testat att ta hem din Receptdatabas. Men zip filen fungerar ej.


2014-01-19

Hej Fredrik!

Roligt att du fick nytta av tipset. Man kan kan bygga komplicerade lösningar i FileMaker men jag föredrar enkelhet.

Vänliga hälsningar
Nicholas Hjelmberg


2014-01-19

Hej Niklas,
jag har jobbat mycket med FileMaker och ser att du löst post-låsning-problemet snyggt och enkelt.

Tack!
/Fredrik


2013-02-26

Hej Lisbeth!

Tack för påpekandet. Jag lade upp en ny länk till en zippad version istället så nu borde det fungera bättre.

Återkom gärna med kommentarer.

Vänliga hälsningar
Nicholas Hjelmberg


2013-02-26

Ville ladda ner receptdatabasen med kom till en 404-sida...


2012-09-03

Hej Vio!

Filemaker har mallar som går att använda som de är eller anpassa. Det går också att ladda ned demoversioner för att se om de passar för ens behov.

Vänliga hälsningar
Nicholas Hjelmberg


2012-09-03

Hej... Vi är ett mycket gammalt ordenssällskap som söker ett enkelt sätt att hantera våra medlemsavgifter. Typ reskontra. Har du nåt tips att bidra med.
MVH
Vio


2011-12-21

Tack för tipset om filen server.pen
Höll på att bli galen varför det helt plötsligt inte gick att fjärröppna databaser.
PS: filen funkade även för FM9


2011-02-17

Hej !Intressant sida du gjort. Jag jobbar med ekonomi och data på ett medelstort tillverkande företag norr om Skellefteå.
Har hållit på med FileMaker till och från i några år. Just nu är det "till" och då blir att att söka lösningar lite här och där.
TACK !
/matz


2010-01-01

Hej Nicholas

Utmärkta och snygga layouter

Jobbar du även med grafik över nätet? Är det svårt att koppla charts från Google och kunna göra snygga grafer?
är du öppen för affärsidér eller har du mer jobb än du kan ta hand om...

Vänligen

Magnus


2009-04-29

Hej! Roligt att du tycker om min hemsida. Get(Sidnummer) hämtar sidnumret för den post som för tillfället är markerad. För att få en lista bör du därför loopa igenom varje post och hämta sidnummer:



Bearbeta[]

Gå till layout(layout)

 Loop

 Gå till post/sökpost/sida[Sista]

 Ange variabel[$sida;  Värde:Get(Sidnummer)]

 Bearbeta[]

 Gå till post/sökpost/sida [Sista]

 Tilldela fält [fält; $sida]

 Uteslut

 Exit Loop If [Get(HittadePoster)=0]

End loop

Visa alla



Återkom gärna om jag har missförstått ditt problem.

Vänliga hälsningar
Nicholas Hjelmberg


2009-04-29

Hej
En jätte bra sida med många tips som är användbara.
Jag vet inte om du tar emot frågor... men jag har ett litet problem. Det gäller när jag använder "Get(Sidnummer)"-funktionen. Jag får inte den att fungera i ett manus.
Jag skulle vija få en lista på villken sida som posterna stod på när jag granskat eller skrivit ut.
Har du något tips eller vad jag kan finna svart vore jag tacksam.
mvh
Åke



www.000webhost.com