Innehåll
|
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.
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.
- Skapa en ny fil utan mall med namnet "Recept".
- Skapa en tabell med namnet "Recept" och en tabell med namnet "Ingredienser".
- 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.
- 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...".
- Stäng fönstret "Definiera databas" och välj i menyn Visa /
Layoutläge. Skapa layouten "Recept" som visar poster från tabellen
"Recept".
- 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.
- 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.
- 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.
- 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".
- 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:
- 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.
- 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.
- 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.
- Sidhuvud: Text överst på varje sida (t ex utskriftsdatum)
- Inledande totalsumma: Rubrik överst i rapporten (t ex "Försäljningsrapport")
- Delsumma (före): Rubrik över varje delgrupp (t ex "Stockholm")
- Huvuddel: En rad för varje post i delgrupp (t ex "1 000 kr")
- Delsumma (efter): Summa av varje delgrupp (t ex "1 000 000 kr")
- Avslutande delsumma: Totalsumma av poster i rapporten (t ex "10 000 000 kr")
- 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.
- Skapa en värdelista från nummerfältet och textfältet. Välj alternativet "Visa endast värden från det andra fältet".
- Lägg i layouten in nummerfältet och koppla värdelistan till det.
- 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.
- referens: det referensnummer som OCR-numret ska baseras på
- langd: referensnumrets längd
- 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".

|
|
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.

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.

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.

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.
|
|
|
|
|