15.07.2013 Views

1. Hensikten med kurset - Lars Marius Garshol

1. Hensikten med kurset - Lars Marius Garshol

1. Hensikten med kurset - Lars Marius Garshol

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>1.</strong> <strong>Hensikten</strong> <strong>med</strong> <strong>kurset</strong><br />

<strong>1.</strong>1 Hva er Microsoft Access?<br />

Innføring i databaser<br />

Som det står på manualer og disketter er Access en “relasjonsdatabase for Windows”. Det sier<br />

kanskje ikke de fleste så veldig mye, men det det egentlig betyr er at Access er en spesiell form<br />

for utviklingsverktøy. Access er altså ikke et program som kan brukes til noe nyttig direkte,<br />

slik som tekstbehandlere, regneark og annet. Det man gjør <strong>med</strong> Access er å lage nyttige<br />

programmer.<br />

<strong>1.</strong>2 Hva er et dataprogram?<br />

Ifølge Aschehoug og Gyldendals Store Norske Leksikon er det noe som “foreskriver i detalj de<br />

operasjoner som skal foretas av maskinen, og forutsettes utført i alt vesentlig uten menneskelig<br />

inngripen underveis”. Det er forsåvidt korrekt, men kanskje ikke så veldig opplysende.<br />

Poenget er at en datamaskin kan brukes til svært mye forskjellig, forutsatt at man har et<br />

program som forteller maskinen hvordan det skal gjøres. Uten programmer får man ikke gjort<br />

noe som helst på maskinen, fordi den ikke vet hva den skal gjøre. Alle programmer består av<br />

enkle instruksjoner som datamaskinen utfører en for en. Så uansett hva slags programmer du<br />

vil lage må de til syvende og sist oversettes til slike instruksjoner.<br />

<strong>1.</strong>3 Forskjellige typer dataprogrammer<br />

Her har jeg bare nevnt de viktigste og vanligste typene dataprogrammer. Det finnes utallige<br />

andre typer, men dette er de som er mest brukt i kontorsammenheng.<br />

• Tekstbehandlere<br />

Dette er programmer som lar deg skrive brev, rapporter, bøker, skjemaer og mye annet.<br />

Typiske eksempler: MS Word, AmiPro, WordStar, Emacs, WordPerfect.<br />

• Regneark<br />

Programmer som først og fremst er ment brukt til beregninger, for eksempel matematiske<br />

modeller, regnskap og lignende. De har etterhvert blitt mer avanserte, og man kan lage<br />

enkle databaser i dem. Eksempler: MS Excel, Quattro, Lotus 1-2-3, SuperCalc.<br />

• Tegneprogrammer/bildebehandlere<br />

Her er det mange varianter, men alle går ut på å lage bilder og diagrammer i forskjellige<br />

varianter. Eksempler: CorelDraw, Micrografx Designer, Adobe Illustrator, QuarkXpress og<br />

PhotoShop.<br />

• Databaseverktøy<br />

Dette er, som nevnt ovenfor, programmer du kan bruke til å utvikle andre programmer. De<br />

finnes i mange forskjellige typer, som vi gjennomgår senere. Felles for dem er at de bare kan<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 2


Innføring i databaser<br />

lage arkivsystemer: dvs programmer som lagrer store datamengder, og kan utføre søk i<br />

disse og trekke statistikk ut av dataene. Eksempler: MS Access, DataEase, dBase III,<br />

FoxPro, Clipper, SyBase, Ingres, Oracle, FileMaker Pro, PowerBuilder, Paradox og mange<br />

flere.<br />

• Spesialutviklede systemer<br />

Dette er programmer som er spesialutviklet for et bestemt, snevert formål. Ofte er de<br />

spesiallaget for en bestemt bedrift. Typiske eksempler er utlånsregister for bibliotek,<br />

AGR/Us soldatdatabase, lagersystemer. Siden programmene er beregnet for mer<br />

spesialiserte formål har de sjelden særlig stor utbredelse.<br />

Så er spørsmålet: hvilke av disse typene programmer kan vi lage <strong>med</strong> MS Access? Svaret er:<br />

bare den siste typen. Vi kan lage alle mulige former for arkivsystemer, men ikke så veldig mye<br />

annet.<br />

Grunnen til at bedrift (eller en enkeltperson) kan ønske å gjøre dette er enkel. Man vil ha<br />

datamaskinen til å hjelpe en <strong>med</strong> å utføre en (eller flere) oppgaver, men kan ikke finne et<br />

program som er passende. Løsningen er da enkel, man lager et selv.<br />

Det er dette dere skal lære på dette <strong>kurset</strong>: Hvordan utvikle enkle arkivsystemer ved hjelp av<br />

MS Access. Tanken er at dere også skal ha så god forståelse av relasjonsdatabaser generelt at<br />

dere lett kan lære dere andre slike systemer på egenhånd<br />

<strong>1.</strong>4 Hvordan bruke kursheftet<br />

<strong>Hensikten</strong> fra min side <strong>med</strong> dette kursheftet er at det skal kunne utfylle undervisningen i timene<br />

slik at dere kan gå tilbake og lese på ting dere ikke fikk <strong>med</strong> dere i timene. Det er også<br />

hensikten at dere skal ha noe dere kan ta <strong>med</strong> dere videre og bruke senere. Derfor kan det<br />

lønne seg å notere i heftet.<br />

I avsnitt 14.1 er det en ordliste som kan være grei å ha når du møter uttrykk i teksten som du<br />

ikke kjenner.<br />

Å lese før timene anbefales. Det er ikke nødvendig å forstå alt på forhånd, men det kan være<br />

lurt å ha sett over det.<br />

Når du jobber <strong>med</strong> oppgaver vil jeg anbefale at du bruker heftet til å slå opp i når det er ting du<br />

er usikker på. Tommelfingerreglene er ment å brukes til å hjelpe deg når du løser oppgaver.<br />

<strong>1.</strong>5 Konvensjoner<br />

Tastetrykk skrives i dette heftet som f.eks. Alt+F4, som betyr: hold nede Alt mens du trykker<br />

F4.<br />

Beskjeder som "velg Vis | Skjemadesign" betyr velg valget Skjemadesign i Vis-menyen.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 3


<strong>1.</strong>6 Kommentarer<br />

Innføring i databaser<br />

Dette kursheftet er på ingen måte perfekt, ei heller kursopplegget. Jeg tar derfor gjerne imot<br />

både kritikk og forslag om forbedringer og endringer.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 4


Innholdsfortegnelse<br />

Innføring i databaser<br />

<strong>1.</strong> HENSIKTEN MED KURSET..................................................................................................... 2<br />

<strong>1.</strong>1 HVA ER MICROSOFT ACCESS?........................................................................................................ 2<br />

<strong>1.</strong>2 HVA ER ET DATAPROGRAM?........................................................................................................... 2<br />

<strong>1.</strong>3 FORSKJELLIGE TYPER DATAPROGRAMMER ...................................................................................... 2<br />

<strong>1.</strong>4 HVORDAN BRUKE KURSHEFTET ...................................................................................................... 3<br />

<strong>1.</strong>5 KONVENSJONER............................................................................................................................ 3<br />

<strong>1.</strong>6 KOMMENTARER ............................................................................................................................ 4<br />

2. PROGRAMUTVIKLING............................................................................................................ 8<br />

2.1 ET PROGRAMS LIVSSYKLUS ............................................................................................................ 8<br />

2.2 ET PROGRAMS EGENSKAPER..........................................................................................................10<br />

2.3 PROGRAMUTVIKLINGSVERKTØY....................................................................................................10<br />

2.4 GODT DESIGN ..............................................................................................................................11<br />

3. OVERGANGEN FRA IDÉ TIL DATABASE............................................................................12<br />

3.1 HVA ER EN DATABASE? OM STRUKTURERING AV INFORMASJON ......................................................12<br />

3.2 DATAMODELLERING.....................................................................................................................12<br />

3.3 ET ENKELT SPESIFIKASJONSSPRÅK: ER-LIGHT................................................................................13<br />

3.4 FORHOLD.....................................................................................................................................14<br />

3.5 HVORDAN LAGE EN DATAMODELL.................................................................................................14<br />

3.6 TOMMELFINGERREGLER FOR DATAMODELLERING ..........................................................................16<br />

4. RELASJONSDATABASER .......................................................................................................18<br />

4.1 OPPBYGNINGEN AV EN RELASJONSDATABASE.................................................................................18<br />

4.2 FLERE TABELLER - RELASJONER....................................................................................................18<br />

4.3 NORMALISERING..........................................................................................................................19<br />

4.4 TOMMELFINGERREGLER FOR NORMALISERING ...............................................................................20<br />

4.5 SPØRRINGER, SKJEMAER OG RAPPORTER........................................................................................20<br />

4.6 OPPBYGNINGEN AV DATABASER....................................................................................................20<br />

4.7 REFERANSEINTEGRITET ................................................................................................................21<br />

4.8 SQL OG BASIC...........................................................................................................................21<br />

5. ACCESS’ OPPBYGNING OG VIRKEMÅTE ..........................................................................23<br />

5.1 ACCESS SETT I FORHOLD TIL ALTERNATIVENE................................................................................23<br />

5.2 GRENSESNITTET...........................................................................................................................23<br />

5.3 PROGRAMMENES GRENSESNITT.....................................................................................................24<br />

5.4 VEIVISERE ...................................................................................................................................24<br />

5.5 HVORDAN NAVIGERE I ACCESS......................................................................................................25<br />

5.6 STANDARDTABELLEN...................................................................................................................25<br />

6. TABELLER I ACCESS..............................................................................................................27<br />

6.1 HVORDAN OPPRETTE EN TABELL ...................................................................................................27<br />

6.2 FELTDEFINISJON...........................................................................................................................27<br />

6.3 DATATYPER OG FELTEGENSKAPER.................................................................................................28<br />

6.4 ENDRE FELT.................................................................................................................................30<br />

6.5 PRIMÆRNØKKEL...........................................................................................................................30<br />

6.6 FORHOLDENE...............................................................................................................................30<br />

6.7 ET EKSEMPEL...............................................................................................................................31<br />

6.8 SE PÅ OG SKRIVE INN DATA ...........................................................................................................32<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 5


Innføring i databaser<br />

7. SPØRRINGER I ACCESS .........................................................................................................33<br />

7.1 HVA ER EN SPØRRING?..................................................................................................................33<br />

7.2 SPØRRINGER FRA EN TABELL.........................................................................................................33<br />

7.2.1 Spørringer <strong>med</strong> alle poster ..................................................................................................33<br />

7.2.2 Spørringer <strong>med</strong> bare noen av postene..................................................................................35<br />

7.3 SPØRRINGER FRA FLERE TABELLER................................................................................................35<br />

7.4 KOBLINGSEGENSKAPER ................................................................................................................36<br />

7.5 BEREGNEDE FELT: AGGREGATFUNKSJONER OG UTTRYKK...............................................................37<br />

7.5.1 Uttrykk generelt...................................................................................................................37<br />

7.5.2 Uttrykk i de forskjellige typene............................................................................................37<br />

7.5.3 Aggregatfunksjoner .............................................................................................................38<br />

7.5.4 Gruppering..........................................................................................................................39<br />

7.6 DATAMANIPULASJON MED SPØRRINGER.........................................................................................41<br />

8. OPPBYGNING AV GRENSESNITT I WINDOWS..................................................................42<br />

8.1 SKJEMATYPER OG DERES REKKEFØLGE ..........................................................................................42<br />

8.<strong>1.</strong>1 Hovedmeny..........................................................................................................................42<br />

8.<strong>1.</strong>2 Velg post-skjemaet...............................................................................................................42<br />

8.<strong>1.</strong>3 Endre data-skjemaet............................................................................................................43<br />

8.2 HVORDAN LAGE ET GRENSESNITT..................................................................................................43<br />

8.3 TOMMELFINGERREGLER FOR SKJEMAER.........................................................................................43<br />

8.4 SMÅTIPS ......................................................................................................................................44<br />

9. SKJEMAER I ACCESS: BAKGRUNN.....................................................................................45<br />

9.1 HVA ER ET SKJEMA?......................................................................................................................45<br />

9.2 HVA BESTÅR ET SKJEMA AV?.........................................................................................................45<br />

9.3 SKJEMAETS DELER........................................................................................................................46<br />

9.4 SKJEMAVEIVISERNE......................................................................................................................46<br />

9.5 JOBBE MED KONTROLLER..............................................................................................................47<br />

9.5.1 Hvordan velge kontroller.....................................................................................................48<br />

9.5.2 Egenskaper..........................................................................................................................48<br />

10. SKJEMAER I ACCESS: DETALJENE...................................................................................49<br />

10.1 HVORDAN KONTROLLENE FUNGERER...........................................................................................49<br />

10.<strong>1.</strong>1 Hendelser..........................................................................................................................49<br />

10.<strong>1.</strong>2 Tekstbokser........................................................................................................................49<br />

10.<strong>1.</strong>3 Kombinasjons- og listebokser ............................................................................................49<br />

10.<strong>1.</strong>4 Knapper ............................................................................................................................49<br />

10.2 VIKTIGE EGENSKAPER VED KONTROLLER .....................................................................................50<br />

10.3 HVORDAN LAGE EN KOMBINASJONSBOKS.....................................................................................50<br />

10.4 HVORDAN BYGGE OPP ET SKJEMA................................................................................................51<br />

10.4.1 Endre data-skjema.............................................................................................................51<br />

10.4.2 Velg post-skjema................................................................................................................53<br />

10.4.3 Hovedmeny-skjemaet.........................................................................................................55<br />

10.4.4 Skjema <strong>med</strong> underskjema...................................................................................................56<br />

1<strong>1.</strong> RAPPORTER I ACCESS .........................................................................................................58<br />

1<strong>1.</strong>1 SKJEMAER/RAPPORTER - FORSKJELLER OG LIKHETER....................................................................58<br />

1<strong>1.</strong>2 HVORDAN LAGE RAPPORTER .......................................................................................................58<br />

1<strong>1.</strong>3 ET ENKELT EKSEMPEL.................................................................................................................59<br />

1<strong>1.</strong>4 HVORDAN BRUKE EN RAPPORT ....................................................................................................59<br />

1<strong>1.</strong>5 RAPPORTVEIVISERNE..................................................................................................................59<br />

1<strong>1.</strong>6 RAPPORTER MED GRUPPERING.....................................................................................................60<br />

1<strong>1.</strong>6.1 Hva er gruppering, og hvorfor bruke det? .........................................................................60<br />

1<strong>1.</strong>6.2 Grupperingsveiviseren.......................................................................................................61<br />

1<strong>1.</strong>6.3 Bruk av inndelingene.........................................................................................................61<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 6


Innføring i databaser<br />

1<strong>1.</strong>6.4 Sideinndeling.....................................................................................................................63<br />

1<strong>1.</strong>6.5 Gruppering- og sorteringsinnstillingene ............................................................................63<br />

1<strong>1.</strong>7 AGGREGATFUNKSJONER .............................................................................................................63<br />

12. FULLSTENDIGE APPLIKASJONER I ACCESS ..................................................................65<br />

12.1 SELVSTARTENDE DATABASER .....................................................................................................65<br />

12.2 FEILSJEKKING ............................................................................................................................65<br />

12.3 LAGE IKON FOR DATABASEN I PROGRAMBEHANDLING ..................................................................65<br />

12.4 SIKKERHET ................................................................................................................................66<br />

12.5 DATABASER I NETTVERK.............................................................................................................66<br />

12.6 DISTRIBUSJON AV DET FERDIGE PROGRAMMET .............................................................................66<br />

13. VEIEN VIDERE .......................................................................................................................67<br />

13.1 HVORDAN LÆRE MER..................................................................................................................67<br />

13.2 PROGRAMUTVIKLING PÅ EGENHÅND............................................................................................67<br />

14. TILLEGG..................................................................................................................................68<br />

14.1 ORDLISTE ..................................................................................................................................68<br />

14.2 VANLIGE KOMMANDOER.............................................................................................................70<br />

14.3 VANLIGE FEIL ............................................................................................................................71<br />

14.4 LITTERATUR ..............................................................................................................................71<br />

14.5 TAKK TIL ...................................................................................................................................71<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 7


2. Programutvikling<br />

2.1 Et programs livssyklus<br />

Innføring i databaser<br />

Å utvikle et programsystem er på ingen måte enkelt, og jo større programmet skal være jo<br />

vanskeligere blir det. Det forskes mye på hvordan dette bør gjøres, og det kan være lurt å<br />

bruke litt tid på dette før vi går videre. Egentlig kan det hele oppsummeres i en setning: Tenk<br />

deg om før du gjør noe! Dette kan kanskje høres ut som mas, men hvis du har tenkt å bruke<br />

Access (eller et annet utviklingsverktøy) til noe seriøst bør du følge nøye <strong>med</strong>.<br />

Som regel når du utvikler et program er det tre aktører involvert. Det er deg selv (utvikler),<br />

den som er oppdragsgiver og bestemmer hvordan programmet skal bli (oppdragsgiver) og de<br />

som skal bruke sluttresultatet (brukerne). Alle disse har hver sine ønsker og behov, og disse er<br />

ikke alltid forenlige <strong>med</strong> hverandre, og programutvikling kan fort bli en balansegang mellom<br />

disse behovene. Et annet problem er at det kan være vanskelig å forstå hva oppdragsgiver vil<br />

og det behøver ikke nødvendigvis være hva brukerne trenger osv. Derfor kan det fort bli en del<br />

omarbeiding av det man trodde var ferdig, og dette gjør at planlegging blir veldig viktig.<br />

Derfor har jeg tatt <strong>med</strong> en oversikt over hvordan programutvikling vanligvis forløper, og<br />

hvordan det er vanlig å dele prosessen inn i faser.<br />

• Behov<br />

Her starter det hele. Ofte finner bedriften ut at bestemte arbeidsoppgaver er svært<br />

tidkrevende og rutinepreget, og man ønsker seg et dataprogram som kan løse disse<br />

oppgavene. Men like ofte er visjonene bredere og mer uklare (typisk for mange<br />

bedriftsledere har vært at de ønsker å få hele bedriften inn på data, “information at your<br />

fingertips”), og det er særlig da neste stadium er viktig. Som regel vil det vise at noen av de<br />

planlagte delene er enklere å gjøre på andre måter, og litt sunn skepsis til at absolutt alt må<br />

gjøres på data kan også lønne seg.<br />

• Analyse<br />

Man finner ut at man trenger et program, og bestemmer seg for å lage det. Problemet er:<br />

oppdragsgiver er sjelden helt sikker på akkurat hva det er som trengs. Dette kan det ofte<br />

være svært vanskelig å finne ut av, og resultatet kan fort bli mye fram og tilbake uten at man<br />

får fastlåst en endelig versjon av programmet. Brukerne er sjelden de som lager det, og<br />

dette kan skape problemer fordi det kan være vanskelig å garantere at utvikleren lager det<br />

programmet brukeren vil ha.<br />

• Design<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 8


Innføring i databaser<br />

Når man har kommet så langt vet man hva som trengs, og begynner å planlegge hvordan<br />

dette skal løses på datamaskinen. Tar man de gale avgjørelsene her kan det koste svært mye<br />

tid og krefter senere.<br />

• Implementasjon<br />

Så er alt klart. Man vet hva man skal ha, og hvordan det skal lages. Da gjenstår bare å lage<br />

det. Denne delen betraktes ofte som 100% (eller 90%) av jobben; men det er feil!<br />

• Feilsjekking<br />

Så fort programmet komplett og har alt det skal tror man ofte at det er ferdig. Det er feil<br />

(igjen). Programmet vil nå inneholde feil. Alle programmer (unntatt de aller minste og<br />

enkleste) har feil. Det gjelder også både Windows og Access.<br />

• Bruk<br />

Etterhvert tas programmet i bruk, selv om det sannsynligvis gjenstår feil. Alle programmer<br />

som er store nok til å være nyttige inneholder feil. (Det er vanlig under utviklingen av store<br />

programsystemer å utgi programmet når antall feilrapporter pr uke har kommet ned i et<br />

passelig tall.)<br />

• Nye behov<br />

Men selv når programmet er tatt i bruk og alle feil fjernet er ikke programmererens oppgave<br />

over. Svært ofte finner man ut at ‘det hadde jo vært fint om programmet også kunne gjøre<br />

sånn og sånn’ eller ‘det var ikke slik det skulle være’ eller oppgavene programmet skal<br />

utføre endres. Da må man til <strong>med</strong> ny analyse, nytt design og så endre implementasjonen<br />

(systemet), sjekke feil osv nok en gang.<br />

I praksis vil man ikke kjøre gjennom hele denne sekvensen, ihvertfall ikke så grundig som det<br />

er beskrevet her, når man skal lage mindre/middels programmer. Ved større seriøse<br />

programmeringsprosjekter er det utenkelig å ikke kjøre gjennom et nøye planlagt program for<br />

utviklingen. Programutvikling (også kalt software engineering) er altfor vanskelig og dyrt til at<br />

man tør å gjøre noe annet. Det er alt for mange eksempler på utviklingsprosjekter som har<br />

trukket ut i det uendelige uten å komme noen vei. Her hjemmefra kan vi jo nevne<br />

Rikstrygdeverkets TRS’90-system (som et av mange), og også i resten av verden er problemet<br />

velkjent.<br />

Det lønner seg å hele tiden ha i tankene at programmet du lager kan komme til å leve lenge.<br />

Mange av programmene som brukes idag (særlig større administrasjonsprogrammer hos banker<br />

og i offentlig forvaltning) har vært ibruk siden slutten av 60-tallet. Det er ikke uvanlig at<br />

programmer overlever sin utvikler i en bedrift, slik at andre må jobbe videre <strong>med</strong> det du har<br />

utviklet. Det er da det er viktig at man hadde et godt gjennomtenkt design i begynnelsen.<br />

Dette kan kanskje høres ut som overdrevent mas om å “være grundig og nøyaktig blablabla”,<br />

og så lenge du bare lager programmer for deg selv er det det, men i det øyeblikk andre<br />

mennesker blir involvert som brukere/utviklere blir det svært viktig.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 9


2.2 Et programs egenskaper<br />

Innføring i databaser<br />

Når man skal vurdere om et program er godt eller dårlig er det mange egenskaper som spiller<br />

inn. Ofte er det slik at forbedring av en egenskap lett fører til forverring av en annen. Det<br />

perfekte program er der<strong>med</strong> temmelig uoppnåelig.<br />

• Hastighet - at programmet er raskt, brukeren slipper å vente<br />

• Enkelt å endre - at programmet lett kan tilpasses nye behov/rutiner<br />

• Ressursbruk - at programmet bruker lite minne, diskplass etc.<br />

• Utviklingstid - at programmet kan lages på kort tid (koster mindre da)<br />

• Dekker behovet til brukeren - mao: det gjør alt det brukeren ønsker<br />

• Brukervennlig - lett å lære, enkelt å bruke, ikke masse unødvendig tasting<br />

En svært viktig egenskap for utvikleren er at programmet er enkelt å endre. Det høres kanskje<br />

ikke så vanskelig ut, men krever svært mye av programmets oppbygning. Det krever at<br />

programmet er konsekvent og elegant laget. Dette å oppnå konsekvens og eleganse er svært<br />

vanskelig, og krever trening og disiplin. Å programmere er om ikke en kunst så er det i det<br />

minste solid håndtverk. ‘Software engineering’, som det kalles, er i dag et stort forskningsfelt<br />

av den enkle grunn at dårlig programmeringsstyring har kostet litt for mange milliarder.<br />

2.3 Programutviklingsverktøy<br />

En typisk del av analysen vil være å velge utviklingsverktøy, og her er Access kun ett av<br />

mange. Og databasesystemer er bare en av mange typer verktøy.<br />

• Assembler<br />

Assembler er (nesten) det samme som maskinkode. Her skriver man instruksjon for<br />

instruksjon den koden maskinen kommer til å utføre. Og siden de fleste maskiner i dag<br />

utfører millioner av instruksjoner pr sekund betyr dette at utviklingen blir ekstremt detaljert.<br />

Programmene blir lange, og generelt er det svært vanskelig å skrive selv enkle programmer.<br />

Det er også svært vanskelig å unngå feil.<br />

Fordelen er at man kan få til absolutt hva som helst maskinen kan gjøre, og at programmene<br />

blir svært raske.<br />

• Programmeringsspråk<br />

Programmeringsspråkene går et skritt videre. Man skriver programmet som tekst i et<br />

formelt språk spesiallaget for dette. Deretter oversetter et spesielt program (kalt<br />

kompilator) teksten til maskinkode. Dette gjør at koden blir kortere, man kan systematisere<br />

programmet mye mer og utviklingen går raskere og enklere. Man får også typisk færre feil<br />

enn om man skriver i assembler.<br />

Ulempene er at programmene blir langsommere enn om man skriver i assembler, og at en<br />

del ting ikke lar seg gjøre. Typisk er dette ting som bruk av fysisk utstyr som mus, tastatur,<br />

scanner, printer osv.<br />

Det finnes svært mange programmeringsspråk og de er inndelt i innbyrdes svært ulike<br />

familier. Blant de mer vanlige er: C/C++, Ada, Pascal, Java, BASIC, LISP, Smalltalk, ML,<br />

Perl og Prolog. Innen hvert enkelt språk igjen finnes en mengde dialekter. Særlig LISP og<br />

BASIC har en hærskare av dialekter.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 10


Innføring i databaser<br />

• ‘Visuelle’ programmeringsspråk<br />

Dette er videreutviklinger av vanlige programmeringsspråk, der man kan ‘tegne’ deler av<br />

programmet på skjermen (særlig brukergrensesnittet), og utviklingsverktøyet genererer så<br />

koden for en. Dette forenkler mye av rutinetastingen man ellers måtte gjøre, og sparer både<br />

tid og feil. Ulempen er at man ofte ikke lenger kan gjøre hva som helst, og at programmene<br />

kan bli langsommere.<br />

Eksempler på verktøy av denne typen er Borland Delphi (som bygger på Pascal) og<br />

Microsoft Visual Basic (som bygger på BASIC).<br />

• Fjerde-generasjons-verktøy<br />

Her finnes en mengde forskjellige varianter, og databasesystemer er bare en av dem. Disse<br />

er som regel basert på å utvikle systemer av en bestemt type, slik databasesystemer er ment<br />

til utvikling av arkivprogrammer. Her er man <strong>med</strong> andre ord enda mer begrenset enn om<br />

man bruker et programmeringsspråk, til gjengjeld blir det færre feil og utviklingen går<br />

raskere. Systemene kan ofte bli vel så raske som om man hadde brukt et vanlig<br />

programmeringspråk.<br />

2.4 Godt design<br />

Å lage et stort program <strong>med</strong> godt design er ikke enkelt, faktisk nærmest umulig. Å komme i<br />

nærheten av et godt design krever talent, disiplin, mye arbeid, erfaring og iblant også flaks.<br />

Merk at jeg sier stort. For mindre programmer er det langt enklere, og for de systemene vi går<br />

løs på i dette <strong>kurset</strong> er det ingen stor sak å få det til.<br />

En svært viktig del av et godt databasedesign er valget av tabeller og forhold. Gjør man et<br />

dårlig valg her får man svi for det senere. Et annet viktig poeng er navnene: alle tabeller, felter,<br />

spørringer osv må ha gode navn.<br />

Her er noen små tommelfingerregler:<br />

• Unngå dobbeltlagring! I en god database finnes ikke de samme dataene lagret to forskjellige<br />

steder (enten det er tabeller eller felter.)<br />

• Ikke legg for strenge begrensninger på bruken av systemet. Dersom det er noe du ikke har<br />

tenkt på vil du bare provosere brukerne.<br />

• Ikke gjør systemet for slapt, slik at det tillater ting som ikke burde vært tillatt. (Det er ikke<br />

lett å kombinere dette <strong>med</strong> regelen ovenfor.)<br />

• Et godt design mangler ingenting og har ingen overflødige deler. Dette er viktig: jo mindre<br />

systemet er, jo bedre. Det blir enklere å endre, forstå og bruke. Pass bare på at det ikke blir<br />

for lite...<br />

• Pass på å ha tenkt gjennom så mye som mulig før du begynner. Når deler av et program<br />

skrives om har det ekstra lett for å oppstå feil.<br />

• Navn er svært viktige! Vær konsekvent og grundig i navngivingen din.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 11


3. Overgangen fra idé til database<br />

3.1 Hva er en database? Om strukturering av informasjon<br />

Innføring i databaser<br />

Forskjellen på en database og et vanlig tekstdokument er at informasjonen i en database er<br />

strukturert på en måte som maskinen forstår, mens den ikke forstår tekstdokumentet.<br />

“Anne Tryti eier en Toyota MR2 som har registreringsnummer SP 83400. Hun bor i Dalveien<br />

19, 1800 Askim og privattelefon 69882344. Bil nummer BN 26131 er en Nissan Bluebird eid<br />

av Jarl Andresen, som bor i Nansensgt 69, 4601 Kristiansand og har telefon 38092483.”<br />

Dette er klar tale for et menneske, men for en datamaskin er dette komplett uforståelig. En<br />

database kan behandle informasjonen, organisere den og svare på spørsmål, mens et<br />

tekstbehandlingssystem ikke kan gjøre noen av delene <strong>med</strong> et dokument. Dataene må <strong>med</strong><br />

andre ord organiseres og struktureres før en datamaskin kan ‘forstå’ dem.<br />

Tabeller er løsningen man har brukt for å strukturere dataene i en relasjonsdatabase. Det finnes<br />

andre måter å gjøre det på, men da har man ikke lenger <strong>med</strong> en relasjonsdatabase å gjøre.<br />

Navn Gateadresse Sted/Postnummer Telefon Registreringsnr Merke<br />

Anne Tryti Dalveien 19 1800 ASKIM 69882344 SP 83400 Toyota MR2<br />

Jarl Andresen Nansensgt 69 4601 KRISTIANSAND 38092483 BN 26131 Nissan Bluebird<br />

Tabell 3.1<br />

Dette er den samme informasjonen, omorganisert til tabellform. Nå er det brått mulig å spørre<br />

datamaskinen om “Hva heter alle som bor i Askim?” eller “Hvem eier bil nummer BN 26131?”<br />

Den kan da i det første tilfellet gå gjennom alle radene i tabellen og for hver gang den finner<br />

Askim i Sted/Postnummer-kolonnen skrive ut det den finner i Navn-kolonnen. Spørsmålet må<br />

selvfølgelig stilles på en måte maskinen forstår, men det kommer vi tilbake til i kapittel 7.<br />

Nå kan du kanskje gjette hva en database er: et system som lagrer informasjon på en<br />

strukturert måte, og som kan la en bruker endre informasjonen og få ut informasjonen<br />

strukturert på en annen måte. Brukeren skal også kunne stille spørsmål til databasen.<br />

3.2 Datamodellering<br />

Når man lager en database er man egentlig ute etter å lage en modell i en datamaskin av en<br />

begrenset del av virkeligheten. I eksempelet ovenfor ville vi lage en modell av eierforholdene<br />

for noen norske biler. Disse eierforholdene er ikke tilfeldig organisert, men styrt av noe vi<br />

kaller ‘forretningsregler’. Disse sier slike ting som at ‘personer eier biler’, ‘en bil kan bare eies<br />

av en person til enhver tid’, ‘en person kan eie flere biler samtidig’ osv.<br />

Den største vanskeligheten <strong>med</strong> å utvikle databaser skulle nå være åpenbar: å finne ut<br />

av forretningsreglene, og gjøre dem om til et sett <strong>med</strong> tabeller. Det er et problem til: nemlig å<br />

finne forholdene mellom tabellene. (Hvis dette virker uklart kan du tyvlese litt i kapittel 4.) For<br />

enkle databaser er dette stort sett barnemat når man har litt trening, men for store databaser er<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 12


Innføring i databaser<br />

det langt i fra selvsagt. Særlig kan det være vanskelig å få ordentlig klarhet i hvordan brukerne<br />

av databasen egentlig vil ha dette.<br />

Det finnes en teknikk for å håndtere disse problemene, nemlig datamodellering. Den er faktisk<br />

svært nyttig i praksis, særlig ved utvikling av store og kompliserte databaser. Datamodellering<br />

gjøres som regel ved å tegne, og til å støtte seg har man forskjellige ‘spesifikasjonsspråk’, som<br />

er regler for hvordan forretningsreglene skal tegnes.<br />

Det finnes en rekke spesifikasjonsspråk, fra de mer avanserte som NIAM til de svært enkle,<br />

som ER. Vi skal ikke dekke noen av disse her, men jeg nevner dem så dere har hørt om dem.<br />

NIAM er faktisk såpass avansert at det finnes databasesystemer som lar deg tegne et NIAMdiagram,<br />

og så lager det tabellene og relasjonene for deg automatisk. Dette lar seg ikke<br />

egentlig gjøre fra et ER-diagram, ettersom ER er mer et skissespråk. I dette <strong>kurset</strong> skal vi bare<br />

bruke datamodellering til å tenke på papiret og kladde litt før vi lager ting, og trenger derfor<br />

bare en forenklet utgave av ER. Den har jeg kalt ER-light.<br />

3.3 Et enkelt spesifikasjonsspråk: ER-light<br />

Noen av forretningsreglene i bil-eksempelet kan beskrives slik: “En bil har bare en eier. En<br />

person kan eie flere biler. Biler har registreringsnummer og bilmerke. Personer har<br />

gateadresser, postnummer/bosted og telefon.”<br />

Datamodellering går ut på å finne typer av objekter (dette kan være gjenstander eller abstrakte<br />

begreper) som vi er interessert i og disses egenskaper. Objektgruppene/typene kalles entiteter,<br />

og deres egenskaper kalles attributter. I beskrivelsen ovenfor er modelleringen egentlig allerede<br />

gjort. Det ligger mellom linjene at vi har to entiteter: personer og biler. Forholdet mellom dem<br />

er gitt, og entitetenes attributter er klarlagt. (Entiteter og attributter er egentlig svært greie å<br />

forstå, ikke la deg skremme av at ordene høres vanskelige ut.)<br />

I ER-light tegnes dette slik:<br />

Merke<br />

Registreringsnummer<br />

Bil<br />

∞<br />

Bil<br />

1<br />

Person<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 13<br />

Eier<br />

Telefon


Innføring i databaser<br />

Med andre ord tegnes entiteter <strong>med</strong> ring rundt, mens attributter må klare seg uten. Mellom Bil<br />

og Person er det et forhold (representert ved en linje.) Ved linjen, inntil Bil står tegnet ∞, som<br />

står for uendelig, og betyr at hver Person kan ha uendelig mange biler. Inntil Person står 1,<br />

som betyr at hver Bil bare kan ha en Person. At Person’en er eier, og ikke tyv bryr vi oss ikke<br />

om. (Dette kalles Person’s rolle.)<br />

Å gjøre om fra datamodellen (dvs: tegningen) til tabeller og begrensningsregler er et tema for<br />

seg, som kalles normalisering. Siden våre databaser blir såpass enkle skal vi ikke gå noe særlig<br />

inn på dette her. (Mer om normalisering står i avsnitt 4.3.)<br />

3.4 Forhold<br />

Forholdene er kjernen i en relasjonsdatabase. De brukes til å organisere dataene og unngå<br />

dobbeltlagring. Mange databasesystemer er mer primitive enn relasjonsdatabasene, fordi de<br />

mangler forholdene. Som regel har de tabeller på samme måte som relasjonsdatabaser, men de<br />

kan altså ikke kobles sammen <strong>med</strong> forhold. Problemet <strong>med</strong> dette er at forholdene som gjør<br />

relasjonsdatabasene så kraftige.<br />

Det finnes enda mer avanserte databasetyper, men vi skal ikke gå inn på disse her. Dette blant<br />

annet fordi de aller fleste databasesystemer er relasjonsdatabaser (eller av den enklere typen jeg<br />

nevnte). Mer om dette i avsnitt 5.<strong>1.</strong><br />

Forhold kan være av tre typer:<br />

• En-til-en<br />

Her er det slik at det til hver post i den ene tabellen svarer nøyaktig en post i den andre. Da<br />

kan man som regel slå de to tabellene sammen, men ikke alltid, det kan være fornuftige<br />

grunner til å holde dem adskilt.<br />

• Mange-til-en (eller en-til-mange)<br />

Dette er den vanligste typen forhold, og er helt grei å forholde seg til.<br />

• Mange-til-mange<br />

Mange-til-mange-forhold skal ikke forekomme i en database. De trenger seg iblant på, men<br />

må da omgås ved at man lager en entitet mellom de to som har et innbyrdes mange-tilmange-forhold.<br />

Begge de opprinnelige entitetene har et en-til-mange-forhold til den nye.<br />

3.5 Hvordan lage en datamodell<br />

Navn<br />

Adresse<br />

Spørsmålet blir nå: når man skal lage en datamodell, hvordan finner man frem til entitene og<br />

deres attributter, og hvordan finner man forholdene mellom disse? Dette er egentlig et<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 14


Innføring i databaser<br />

spørsmål om kreativitet og intuisjon, og man kan ikke så lett lage tommelfingerregler for dette,<br />

men et eksempel kan kanskje klargjøre.<br />

Eksempel 3.1<br />

“Du har tenkt å lage en database over alle dine plater og musikkassetter. Du vil registrere tittel,<br />

artist, år, platetype (CD, LP etc.) og alle sanger på hver plate/kassett. For hver sang vil du<br />

registrere tittel, varighet og hvem som gjør hva (dvs: hvem spiller gitar, hvem har produsert,<br />

hvem har skrevet musikken osv.)”<br />

Her har vi tre åpenbare typer objekter som vi vil registrere data om: plater/kassetter, sanger og<br />

artister. Da kan vi begynne <strong>med</strong> å tegne disse som entiteter. Deretter kan vi sette på<br />

attributtene som ble nevnt ovenfor, unntatt de som er knyttet til andre entiteter.<br />

Da får vi denne modellen:<br />

Tittel<br />

År<br />

Det som da mangler er at vi ikke har sagt noe om forholdene mellom de forskjellige entitetene.<br />

Hvis vi tenker oss om er hver sang bare på en plate, mens en plate i teorien kan ha ubegrenset<br />

mange sanger. Her dukker det opp et lite problem: hva mener vi egentlig <strong>med</strong> sang? Du kan jo<br />

ha f.eks. både studioversjon og liveopptak av samme sang, og kanskje en coverlåt også? Er<br />

hver av disse forskjellige sanger, eller har vi samme sang flere steder? Dette er et typisk<br />

problem: hva mente den som ville ha databasen egentlig? Ofte vet de det ikke selv, eller, mer<br />

presist, de forstår ikke forskjellen.<br />

Den vanligste og greieste løsningen på problemer som akkurat dette er å si at hver versjon<br />

regnes som separate sanger. (Den motsatte varianten gir deg litt flere muligheter, men er mer<br />

tungvint.) Der<strong>med</strong> sier vi at hver versjon av en sang er også innspilt av en (og bare en) artist,<br />

mens hver artist kan ha spilt inn mange sanger.<br />

Tittel<br />

Spilt inn av Har spilt inn<br />

Plate<br />

∞<br />

1<br />

Artist<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 15<br />

År<br />

Type<br />

Type<br />

Plate Artist<br />

Sang<br />

Tittel Varighet<br />

Sang<br />

Navn<br />

Navn


Innføring i databaser<br />

En plate er utgitt av en artist, men en artist kan utgi mange plater. Eller? Dersom vi tar<br />

samleplater (som Absolute Music) <strong>med</strong> i betraktningen får vi et mange-til-mange-forhold, som<br />

egentlig er beskrevet av sangene på platen. Her må man gjøre et valg, og de aller fleste vil nok<br />

ende opp <strong>med</strong> å velge et en-til-mange-forhold mellom Plate og Artist. (Samleplater vil da være<br />

utgitt f.eks. av Diverse artister.)<br />

Det er ikke alltid slik at forretningsreglene alene gir deg de entitetene du trenger. Av og til må<br />

du “jukse” ved å se framover til hvordan databasen vil bli for å få den mest praktiske løsningen.<br />

Hvis du f.eks. vil at en av attributtene til en entitet bare skal kunne ha noen få forskjellige<br />

verdier, f.eks. platetype: CD, LP, kassett, video, lønner det seg å ha en egen tabell for typene<br />

og bruke et forhold til denne. Denne typetabellen vil da være en egen entitet i modellen.<br />

3.6 Tommelfingerregler for datamodellering<br />

1<br />

Inneholder<br />

∞<br />

Utgitt på<br />

• IKKE tenk på skjemaer og tabeller når du modellerer, det kommer senere. Tenk på hva som<br />

hører sammen <strong>med</strong> hva.<br />

• Begynn <strong>med</strong> å lage så mange entiteter som mulig. Lag en til hvert begrep som forekommer i<br />

databasebeskrivelsen.<br />

• Fortsett <strong>med</strong> de mest opplagte attributtene og plasser dem.<br />

• Så kan du begynne å plassere forhold og attributter, og opprette nye entiteter for å få dem<br />

til å passe inn.<br />

• Unngå å velge primærnøkler som kan endre seg.<br />

• Unngå lange primærnøkler.<br />

• Attributter som kan beregnes ut ifra de andre attributtene legges ikke inn i entitetene, men<br />

hører hjemme i spørringene.<br />

• Til slutt må du tenke over om noen entiteter skal fjernes. Kanskje førte du opp noen som<br />

ikke var interessante i vår database likevel.<br />

• En entitet skal være et begrep, noe som det finnes flere ‘instanser’ av i virkeligheten.<br />

Bilnummer er ikke et begrep, men bil er.<br />

• Før du plasserer forhold, tenk gjennom hvorfor du vil ha forholdet der. Det betyr at det skal<br />

registreres data som kobler sammen to instanser av hver entitet. Poenget er at du må vite<br />

hva disse dataene betyr. Eksempel: Har personen lånt bilen, kjøpt den, stjålet den, solgt den<br />

eller hva er det vi registrerer som lager et forhold mellom person og bil?<br />

• Vær nøye <strong>med</strong> navnene på både entiteter og attributter. Tenk gjennom dem.<br />

• Attributtene til en entitet skal gjelde ett emne, ikke flere.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 16


Innføring i databaser<br />

• Dersom flere entiteter har mange felter til felles bør du vurdere å slå dem sammen.<br />

• En entitet som ikke har attributter er kanskje overflødig.<br />

• Attributter som bare kan ha noen få verdier og som du vil gruppere/søke på bør gjøres til<br />

entiteter.<br />

• En attributt som viser til en annen entitet (som identifiserer en instans tilhørende en annen<br />

entitet (eller samme)) skal gjøres om til et forhold.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 17


4. Relasjonsdatabaser<br />

4.1 Oppbygningen av en relasjonsdatabase<br />

Innføring i databaser<br />

Hjertet i alle relasjonsdatabaser er tabellene, som er der alle data lagres. En tabell består av en<br />

rekke felter og poster, der postene er dataelementene, mens feltene er det postene består av.<br />

Sagt på en annen måte utgjør feltene definisjonen av tabellen, mens postene er innholdet.<br />

Registreringsnummer Merke Eier<br />

SP 83400 Toyota MR2 Anne Tryti<br />

BN 26131 Nissan Bluebird Jarl Andresen<br />

DE 66477 Opel Kadett Hans Hansen<br />

Tabell 4.1<br />

I dette eksempelet er ‘Registreringsnummer’, ‘Merke’ og ‘Eier’ feltene, mens ‘SP 83400’,<br />

‘Toyota MR2’ og ‘Anne Hansen’ er en post. For å si det på en annen måte er et felt en kolonne<br />

mens en post er en rad i tabellen. (De engelske begrepene er ‘field’ og ‘record’.) Du kan tenke<br />

deg en post som et arkivkort, men husk at det er en forenkling, for i relasjonsdatabaser kan vi<br />

koble flere poster sammen.<br />

Som regel ønsker vi å legge begrensninger på hva som kan stå i et felt. I feltet ‘Eier’ er vi for<br />

eksempel bare interessert i å ha navn, men det kan vi ikke fortelle maskinen på noen enkel<br />

måte. (Den kan ikke forstå at ingen heter ‘Rtwerwq Hasdjksk’.) Det vi kan fortelle den er at<br />

feltet skal inneholde tekst, og ikke mer enn 40 tegn.<br />

Det er også mulig å legge inn andre former for begrensning. For eksempel kan ikke flere biler<br />

ha samme registreringsnummer, der<strong>med</strong> sier vi at feltet skal bare ha unike verdier. Vi vil også<br />

typisk bruke registreringsnummer for å vise til/identifisere bestemte biler, og siden feltet er<br />

unikt vil dette alltid fungere. (Alle biler har et registreringsnummer og det finnes ikke to<br />

forskjellige biler <strong>med</strong> samme nummer.)<br />

Alle tabeller bør ha noe som kalles en primærnøkkel. Primærnøkkelen er ett (eller flere) felt<br />

som må fylles ut for alle poster og som har unike verdier (er det f.eks. to felter må ingen poster<br />

kunne ha like verdier i begge.) Primærnøkkelen brukes til å henvise til bestemte poster og er<br />

en svært viktig egenskap ved en tabell.<br />

I eksempelet overfor er det bare ‘Registreringsnummer’ som har unike verdier. (Felter som har<br />

unike verdier kalles ofte for kandidatnøkler, fordi de er kandidater til å være primærnøkler.)<br />

Siden ‘Registreringsnummer’ er eneste kandidatnøkkel er den også eneste mulige<br />

primærnøkkel.<br />

4.2 Flere tabeller - relasjoner<br />

Så lenge man kun har enkeltstående tabeller er det trivielt å lage databaser, men idet øyeblikk<br />

dataene i flere forskjellige tabeller skal forbindes <strong>med</strong> hverandre blir ting komplisert. For<br />

eksempel kan vi tenke oss at vi vil lagre data om eierne av bilene, for eksempel telefonnummer<br />

og adresse. Problemet blir da at hvis en person eier flere biler må vi lagre vedkommendes<br />

telefonnummer og adresse en gang for hver bil. Det er ikke særlig elegant og skaper også<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 18


Innføring i databaser<br />

problemer når personen flytter, fordi vi da må oppdatere de samme dataene flere ganger. (Det<br />

er som regel slik i programutvikling at det som ikke er elegant heller ikke er lurt.)<br />

Dette problemet lar seg løse om vi lager en tabell til for personer:<br />

Navn Gateadresse Postnummer Sted Telefon<br />

Anne Tryti Dalveien 19 1800 ASKIM 69882344<br />

Jarl Andresen Nansensgt 69 4601 KRISTIANSAND 38092483<br />

Hans Hansen Hanseveien 0316<br />

Tabell 4.2<br />

OSLO 22448482<br />

Problemet blir her at ‘Navn’ ikke er egnet som primærnøkkel siden vi godt kan tenke oss at det<br />

finnes flere ‘Hans Hansen’. For å få det hele til å gå opp må vi sette inn et nytt felt som kan<br />

brukes. Dette kan enten være en teller, som fungerer slik at første post blir 1, andre 2 osv, eller<br />

f.eks. personnummer, bare det er unikt for hver post.<br />

Det vi nå mangler er en måte å fortelle Access hvilke personer som eier hvilke biler. Og det er<br />

her relasjonene kommer inn. Vi bruker en relasjon mellom bil-tabellen og person-tabellen til å<br />

koble sammen riktige par av eier og bil. Det gjør vi ved å endre ‘Eier’-feltet i bil-tabellen til<br />

‘Eiers personnummer’. Så forteller vi database-systemet (Access) at ‘Eiers personnummer’<br />

viser til ‘Personnummer’ i person-tabellen. (Formelt sier vi at ‘Eiers personnummer’ er<br />

frem<strong>med</strong>nøkkel til person-tabellen.) Siden ‘Personnummer’ er primærnøkkel i person-tabellen<br />

vil dette fungere ypperlig.<br />

4.3 Normalisering<br />

Overgangen fra et ER-light-diagram til ferdig tabell- og relasjonsstruktur skulle være grei.<br />

Dette er fremgangsmåten:<br />

<strong>1.</strong> Lag en tabell for hver entitet.<br />

2. Hver attributt blir ett felt i tabellen. (Av og til deler man opp felter som man ikke gadd<br />

tegne som flere attributter, f.eks. slik jeg under deler opp adresse i gateadresse, postnummer<br />

og sted.)<br />

3. Dersom tabellene ikke har noen naturlig primærnøkkel må en lages. (Denne behøver ikke å<br />

finnes i virkeligheten, men kan være en teller.)<br />

4. Hvert forhold blir en frem<strong>med</strong>nøkkel (og der<strong>med</strong> også et felt) i tabellen. Frem<strong>med</strong>nøkkelen<br />

må svare til den andre tabellens primærnøkkel. Dersom vi har et en-til-mange forhold lager<br />

vi et felt i tabellen til den entiteten som har ∞-tegnet på sin side.<br />

5. Lag en relasjon for hvert forhold.<br />

Dersom vi følger disse reglene får vi:<br />

<strong>1.</strong> Tabellene Person og Bil.<br />

2. Person=(Navn, Gateadresse, Postnummer, Sted, Telefon) og Bil=(Registreringsnummer,<br />

Merke). Her er adresse splittet i flere felter.<br />

3. Person=(ID_Person, Navn, Gateadresse, Postnummer, Sted, Telefon) og<br />

Bil=(Registreringsnummer, Merke). ID_Person er en teller som er satt inn.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 19


Innføring i databaser<br />

4. Person=(ID_Person, Navn, Gateadresse, Postnummer, Sted, Telefon) og<br />

Bil=(Registreringsnummer, Merke, Eier). Her er Eier en frem<strong>med</strong>nøkkel til Person-tabellen.<br />

5. Person=(ID_Person, Navn, Gateadresse, Postnummer, Sted, Telefon) og<br />

Bil=(Registreringsnummer, Merke, Eier). Relasjoner: (Person,ID_Person,1)-(Bil,Eier,∞).<br />

Merk her at relasjonen går mellom feltene ID_Person og Eier. En relasjon må alltid være<br />

mellom to felter.<br />

Her har vi det vi i dette <strong>kurset</strong> vil trenge for å begynne å lage en database. I større systemer<br />

ville man ofte vært interessert i flere regler og begrensninger, men for våre formål holder dette.<br />

4.4 Tommelfingerregler for normalisering<br />

• Primærnøkkelen bør være kort, av hensyn til hastigheten.<br />

• Verdien til primærnøkkelen må være kjent for alle poster.<br />

• Frem<strong>med</strong>nøkkelen som representerer et forhold skal inn i den tabellen som har ∞-tegnet<br />

nærmest seg.<br />

• Bruk bare tall hvis du vil regne <strong>med</strong> verdiene i feltet, eller hvis du er helt sikker på at<br />

verdiene i feltet bare er tall.<br />

• Bruk boolean til felter som bare kan ha to verdier. (Det finnes unntak her, men de er få.<br />

Dersom det f.eks. bare kan være to typer av noe er det et unntak.)<br />

• Bruk dato/tid til alt som har <strong>med</strong> datoer og klokkeslett å gjøre.<br />

• Dersom du har forhold mellom to felter må disse ha samme type. Tellere må kobles <strong>med</strong><br />

Tall (Langt heltall).<br />

4.5 Spørringer, skjemaer og rapporter<br />

Etter å ha laget en relasjon mellom bil- og person-tabellene går det svært greit å lage oversikter<br />

der dataene fra disse to tabellene kombineres. Til dette bruker man noe som kalles spørringer<br />

(eng. queries). I en spørring kan man angi hvilke felter man vil ha <strong>med</strong>, lage nye felter<br />

sammensatt av de gamle, sortere, velge ut bare noen av postene og stort sett gjøre hva man vil.<br />

Spørringene brukes som grunnlag for skjemaene, som er skjermbildene, og rapportene, som er<br />

utskriftene. Skjemaene vises på skjermen som vinduer, mens rapportene ser ut som<br />

dokumenter, og kan forhåndsvises og skrives ut. Skjemaene kan også skrives ut, men det er<br />

ikke hovedhensikten <strong>med</strong> dem. Dersom du vil vite mer om skjemaer og rapporter kan du tyvtitte<br />

på kapitlene 9 og 1<strong>1.</strong>)<br />

4.6 Oppbygningen av databaser<br />

Dette er en formell ISO-standard som beskriver inndelingen av databasene som utvikles i tre<br />

lag, eller skjemaer. (Ikke å forveksle <strong>med</strong> skjemaene nevnt ovenfor, som vi skal lage i Access.)<br />

Denne kalles 3-skjema-arkitekturen, men er såpass formell at vi dropper den og tar vår egen<br />

variant istedet. Dersom dette avsnittet er uforståelig så ikke fortvil: dette er ikke ment som<br />

noen viktig del av <strong>kurset</strong>, bare som en sammenheng å sette det vi lærer senere inn i.<br />

De tre lagene eller skjemaene er<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 20


Innføring i databaser<br />

• SQL-tolken<br />

Denne delen er allerede laget av Microsoft, nemlig databasemotoren Jet, som er Access’<br />

hjerte. Den er en adskilt del av programmet, som oppbevarer alle data, håndhever alle<br />

begrensninger på dataene og mottar og svarer på alle spørringer. For å si det på en annen<br />

måte er det programdelene som tolker/utfører de to andre delene. Forskjellen på databaseverktøy<br />

og vanlige programmeringsspråk er at i de siste har du ikke denne delen, og må lage<br />

de tilsvarende funksjonene selv.<br />

• Datastruktur<br />

Dette er beskrivelsen av databasen, som lages av deg. Beskrivelsene av alle tabeller,<br />

begrensninger på dataene i tabellene, relasjoner hører hjemme her. Spørringer hører forsåvidt<br />

også hjemme her.<br />

• Brukergrensesnitt<br />

Dette er beskrivelsen av hvordan data skal skrives inn av og presenteres for brukeren. Her<br />

er alle skjemaer og rapporter.<br />

Denne tredelingen av databasene forklarer for en stor del hvorfor ting fungerer som de gjør i<br />

Access og gir en grei sammenheng å sette nye begreper inn i. Det kan <strong>med</strong> andre ord være<br />

greit å ha den i tankene når du leser videre. Et viktig poeng her er at de to siste delene lages av<br />

utvikler, men at ingen av dem inneholder dataene. Alt som beskrives her er hvordan dataene<br />

skal håndteres.<br />

4.7 Referanseintegritet<br />

Når data endres, slettes og flyttes på kan det fort gå slik at frem<strong>med</strong>nøkler i en tabell viser til<br />

poster som ikke finnes i den tabellen forholdet går til. Da har man et brudd på<br />

referanseintegriteten, og det kan føre til en god del besvær. Mange databaser har spesielle<br />

rutiner som håndterer dette.<br />

Den varianten Access brukes kalles kaskadesletting (i den norske programteksten:<br />

massesletting). Det vil si at når du sletter en post vil alle poster som har referanser til denne<br />

også bli slettet. Det kan være en farlig strategi i enkelte tilfeller, men fungerer stort sett bra.<br />

Access protesterer av og til når man prøver å lagre en post ved å si at referanseintegriteten<br />

krever en relatert post i tabell T_EttEllerAnnet. Det som da har skjedd er at posten enten har<br />

en referanse til en post som ikke eksisterer, eller at den ikke har noen referanse i det hele tatt<br />

der den skulle hatt det. I så fall må man enten legge inn/rette referansen eller slette posten.<br />

4.8 SQL og BASIC<br />

Selv om Access for en stor del er basert på at utviklingen skal skje via vinduer, veivisere og<br />

klikking gir ikke dette adgang til alle muligheter. Tradisjonelt har relasjonsdatabaser vært<br />

basert på et spesielt programmeringsspråk kalt SQL. SQL står for Structured Query Language,<br />

som er litt misvisende, ettersom SQL brukes både til spørringer, datamanipulasjon og<br />

oppretting/sletting av tabeller.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 21


Innføring i databaser<br />

Access bygger også på SQL, men det er mulig å lage fullt brukbare databaser uten å skrive så<br />

mye som en linje <strong>med</strong> SQL-kode. Likevel kan dette være nødvendig dersom man vil få til mer<br />

kompliserte ting. Dette <strong>kurset</strong> dekker ikke SQL.<br />

Som nevnt i avsnitt 2.3 er det ting som ikke lar seg gjøre <strong>med</strong> Access og SQL. Access har<br />

derfor også et vanlig (<strong>med</strong> det mener jeg imperativt, for de som kan litt om programmering)<br />

programmeringsspråk innebygget, nemlig BASIC. Dette er et gammelt (fra 1965)<br />

programmeringsspråk, som opprinnelig ble laget til bruk i undervisning. Det var svært<br />

primitivt, men har gjennomgått store endringer, blant annet takket være Microsoft, men er og<br />

blir primitivt. BASIC kan brukes til programmering av ting som ikke lar seg uttrykke i SQL,<br />

men kommer fortsatt til kort overfor skikkelige programmeringsspråk.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 22


5. Access’ oppbygning og virkemåte<br />

5.1 Access sett i forhold til alternativene<br />

Innføring i databaser<br />

Det finnes mange typer databasesystemer, og den enkleste typen bygger på såkalte "flate filer".<br />

Dette kan betraktes som databaser <strong>med</strong> bare en tabell, men <strong>med</strong> litt flere muligheter innen en<br />

enkelt tabell enn det f.eks. Access har. Eksempler på denne typen databasesystemer er<br />

Filemaker Pro og til en viss grad DataEase.<br />

Hakket over disse systemene finner vi de ekte relasjonsdatabasene som Access, Paradox,<br />

dBASE og andre. Disse systemene er laget for PCer, hvilket vil si at de er beregnet på å brukes<br />

på en enkelt maskin, selv om de fleste også kan deles i nettverk. Disse er litt mindre systemer,<br />

som ofte har en rekke svakheter ved utvikling av større systemer. (Dette gjelder også Access.)<br />

Det finnes også større databasesystemer (også de relasjonsdatabaser) som er beregnet på bruk i<br />

større systemer, som f.eks. Oracle, Sybase, Ingres og andre. Disse har gjerne en utvidet SQL<br />

som gjør SQL til et nesten fullverdig programmeringsspråk (kalles ofte for T-SQL) og har<br />

også i større grad støtte for utvikling av større systemer. Enkelte har også modelleringsprogrammer<br />

og mulighet for automatisk normalisering av datamodellene.<br />

Det finnes også mer avanserte typer databaser enn relasjonsdatabasene, nemlig den eldste av<br />

dem alle: nettverksdatabasene og de mer moderne objekt-orienterte databasene. Nettverksdatabasene<br />

brukes lite ettersom de er litt for kompliserte, og relasjonsdatabaser kan håndtere det<br />

meste i alle fall. De objekt-orienterte databasene tilbyr vesentlige forbedringer overfor<br />

relasjonsdatabasene, men har ikke slått gjennom ennå, blant annet fordi utviklerne er så<br />

konservative.<br />

Kongen på haugen i dette hierarkiet er selvfølgelig de rene programmeringsspråkene, som<br />

databasesystemene selv er laget i.<br />

5.2 Grensesnittet<br />

Access er et vindusbasert system, slik at programmene som utvikles i Access blir også<br />

vindusbaserte Windows-programmer. Databasen lagres i en enkelt fil <strong>med</strong> etternavnet .MDB.<br />

Det er bare mulig å ha en database åpen av gangen, men man kan jobbe <strong>med</strong> flere forskjellige<br />

deler av databasen samtidig.<br />

Fil-menyens Lagre og Lukk-valg gjelder kun det åpne vinduet, ikke hele databasen.<br />

(Databasevinduet er et unntak, siden det inneholder hele databasen, lukker du det vil du derfor<br />

også lukke databasen.)<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 23


5.3 Programmenes grensesnitt<br />

Innføring i databaser<br />

Access er et Windows-program og det vil også programmene du lager <strong>med</strong> Access være. Det<br />

betyr at deres grensesnitt vil følge Windows-standarden <strong>med</strong> knapper, vinduer osv. I<br />

programmene du lager vil hvert skjema være et dokumentvindu, og oppføre seg som vanlige<br />

Windows-vinduer.<br />

En stor fordel <strong>med</strong> å bruke Windows som operativsystem er at alle programmer ser mer eller<br />

mindre like ut fordi de har grensesnitt som er bygget opp av de samme elementene. Dersom du<br />

vil lage brukervennlige programmer bør du ha dette i tankene, og prøve å få ditt program til å<br />

ligne mest mulig på andre Windows-programmer. Det vil gjøre at brukerne har lettere for å<br />

lære seg programmet, siden det ligner på andre de allerede kjenner.<br />

5.4 Veivisere<br />

Access har en rekke såkalte “veivisere” (engelsk: wizards), som er små hjelpeprogrammer som<br />

guider deg gjennom oppsettet av en del standardiserte løsninger. Dette kan være spesielle typer<br />

skjemer, knapper, rapporter eller annet. De er ofte tidsbesparende og enkle å bruke, men gir<br />

ikke tilgang til alle muligheter. Imidlertid kan det veiviserne lager senere endres av deg, slik at<br />

du kan lage noe som ligner på det du vil ha, og så endre det etterpå.<br />

Vi skal ikke ta for oss veiviserne spesielt grundig i dette <strong>kurset</strong>, og skal heller ikke se på alle.<br />

Det kan imidlertid lønne seg å utforske disse litt på egenhånd slik at du husker hva du kan<br />

gjøre enklere hvor. Det bør også legges til at de ikke alltid er like tidsbesparende heller.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 24


5.5 Hvordan navigere i Access<br />

Kort<br />

Figur 5.1<br />

Innføring i databaser<br />

Hjertet i Access’ grensesnitt er vinduet i Figur 5.1, herfra har du adgang til alle delene av<br />

databasen din. Vinduet består av en rekke kort (som du ser på venstresiden) og hvert kort har<br />

sin egen liste som vises i vinduet og sin egen knapperad. På bildet vises listen til kortet<br />

‘Tabell’, altså alle tabellene. (Som du ser er det ingen tabeller ennå.)<br />

5.6 Standardtabellen<br />

Dette er et element i Access-grensesnittet som går igjen i en god del forskjellige sammenhenger<br />

og som jeg derfor vil gjøre unna her. Den dukker f.eks. opp når du skal lage tabeller og spørringer,<br />

når du viser tabeller og spørringer og en rekke andre steder, blant annet når du lager og<br />

bruker skjemaer.<br />

Figur 5.1<br />

Knapper<br />

Vindu<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 25


Innføring i databaser<br />

• Hvordan bevege seg rundt i tabellen<br />

Dette gjøres enkelt og greit ved å bruke piltastene og tab/shift+tab, eventuelt musa.<br />

• Justering av kolonnebredde og radhøyde<br />

Dette gjøres ved å ta tak <strong>med</strong> musen mellom to kolonner og dra dem til den bredden man vil<br />

ha. Et dobbeltklikk her vil gi en kolonnebredde som akkurat passer til den bredeste verdien i<br />

kolonnen. Radhøyde justeres på samme måte, men dobbeltklikket fungerer ikke.<br />

• Velge kolonne/rad eller hele tabellen<br />

En kolonne eller rad velges i sin helhet ved å trykke i det grå feltet til venstre/over<br />

raden/kolonnen. Et klikk <strong>med</strong> høyre mustast vil da få opp en hurtigmeny som gir adgang til<br />

å sette inn nye rader/kolonner, slette rader/kolonner og endel annet.<br />

Du kan velge hele tabellen ved å trykke på det grå feltet helt oppe i venstre hjørne.<br />

• Flytte kolonne/rad<br />

En eller flere kolonner/rader flyttes ved at de først merkes ved å dra <strong>med</strong> musen over dem.<br />

Deretter slipper du mustasten og drar dem på nytt dit du vil ha dem.<br />

• Postvelgerne<br />

Mange av disse standardtabellene (og endel vanlige skjemaer) har navigasjonsknapper nederst<br />

til venstre. Der kan du bla mellom postene <strong>med</strong> knappene, som er i rekkefølge fra venstre:<br />

første post, en post tilbake, en post frem, siste post. Blar du forbi siste post lager du en ny<br />

post.<br />

• Hvordan lage ny post<br />

En ny post lages ved å gå inn på nederste rad (som alltid er tom) og skrive inn posten her.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 26


6. Tabeller i Access<br />

6.1 Hvordan opprette en tabell<br />

Innføring i databaser<br />

Dersom vi skal lage en tabell i Access velger vi kortet ‘Table’ i hovedvinduet og trykker<br />

‘New’-knappen. Vi blir da spurt om vi vil bruke tabell-veiviseren eller lage tabellen selv.<br />

Tabell-veiviseren har en rekke ferdiglagede tabeller klare, men selv om disse kan modifiseres<br />

av brukeren satser vi i dette <strong>kurset</strong> på å lage tabellene selv. Når vi velger å lage tabellene selv<br />

kommer vinduet i Figur 6.1 opp. Der vises en tabell over feltene i tabellen, <strong>med</strong> feltnavn,<br />

datatype og en beskrivelse. Feltnavnet er det navnet som brukes på feltet i hele databasen og er<br />

derfor svært viktig.<br />

6.2 Feltdefinisjon<br />

Figur 6.1<br />

Etter at feltet har fått et navn må det få en type. Typen avgjør hva slags data som kan lagres i<br />

feltet og hva vi kan gjøre <strong>med</strong> dem. Access tilbyr typene ‘Tekst’, ‘Notat’, ‘Tall’, ‘Dato/Tid’,<br />

‘Valuta’, ‘Teller’ og ‘OLE-objekt’. Feltene får en type av to grunner: for det første fordi den<br />

begrenser verdiene som kan legges i feltet, og for det andre fordi det forteller Access hvordan<br />

vi kan behandle verdiene i feltet. Dersom Pris f.eks. lagres som Tall vet Access at ‘Bxcx’ ikke<br />

er en gyldig pris. Den vil også forstå hva du mener <strong>med</strong> gjennomsnittlig Pris, og vil protestere<br />

hvis du prøver å ta gjennomsnittet av en rekke datoer.<br />

Under 'Beskrivelse' kan du legge inn en beskrivelse av feltet som er synlig både for bruker og<br />

deg selv. Dersom andre enn deg skal være involvert i databasen bør du legge inn beskrivelser<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 27


Innføring i databaser<br />

her. De kan være gode å ha når du noen måneder senere sitter og klør deg i hodet og lurer på<br />

hva de forskjellige feltene egentlig var ment brukt til.<br />

6.3 Datatyper og feltegenskaper<br />

Alle felt har egenskaper som avgjør hvordan de oppfører seg. Disse varierer fra type til type, så<br />

vi behandler dem under omtalen av typene. Ikke alle egenskapene er like viktige, så vi<br />

gjennomgår bare de aller viktigste her.<br />

En egenskap som er felles for alle felt (og svært viktig) heter 'Indeksert' og har tre muligheter:<br />

Ja (<strong>med</strong> duplikater), Nei, og Ja (uten duplikater.) Dersom du indekserer et felt bruker du en del<br />

minne og diskplass, men søk og oppslag går langt raskere. Primærnøkler må være indeksert og<br />

blir det automatisk. Dersom du velger 'uten duplikater' vil ikke to forskjellige poster kunne ha<br />

samme verdi i dette feltet.<br />

• Tekst<br />

Her kan du lagre vanlig tekst, maksimalt 255 tegn.<br />

• Feltstørrelse<br />

Dette avgjør den maksimale lengden på feltet. Lengden avgjør hvor stor plass feltet vil ta<br />

på disk og i minnet, men det er likevel som regel ingen vits i å finregne på størrelsen her.<br />

Sørg for at du har nok, men ikke overdriv.<br />

• Standardverdi<br />

Denne verdien settes inn i feltet idet en ny post opprettes, men kan endres av brukeren.<br />

• Valideringsregel<br />

Dette er et boolsk uttrykk (se ordlisten eller avsnitt 7.5.2.3) og når feltverdien ikke<br />

tilfredsstiller dette vil verdien ikke bli godkjent. Som feilmelding vises teksten i<br />

Valideringstekst.<br />

• Valideringstekst (se over)<br />

• Obligatorisk<br />

Dersom du vil at brukeren skal være nødt til å fylle ut dette feltet svarer du ja her.<br />

Primærnøkkelen må være obligatorisk (settes automatisk), men ellers bør du være<br />

forsiktig <strong>med</strong> denne egenskapen. Den kan fort bli mer til irritasjon enn nytte.<br />

• Notat<br />

Også her kan du lagre tekst, men nå er lengden maksimalt 64000 tegn. Denne typen brukes<br />

mest til å lagre fritekst som kommentarer, beskrivelser og lignende. Man er som regel ikke<br />

interessert i å søke på Notat-felt.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 28


Denne typen har akkurat de samme egenskapene som Tekst.<br />

Innføring i databaser<br />

• Tall<br />

Kanskje ikke så overraskende: her kan du lagre tall, og ingenting annet. Hva slags tall det er<br />

snakk om avgjør egenskapene.<br />

• Feltstørrelse<br />

Denne egenskapen avgjør hvor mange byte som skal brukes til å lagre tallet, og hvordan<br />

disse skal tolkes. Byte, heltall og langt heltall er alle heltall (dvs: tall uten komma) og kan<br />

lagre stadig større tall. Langt heltall går til +/- 2 milliarder. Vil du lagre noe større enn<br />

dette må du bruke Flyttall eller Langt flyttall. Begge disse er kommatall, og langt flyttall<br />

har 15 desimaler og går til 10 308 . Plassforskjellen er liten her, så det lønner seg å velge en<br />

variant som man vet gir plass til det man er interessert i.<br />

Navn Bytes Kan lagre<br />

Byte 1 0 til 255.<br />

Heltall 2 -32768 til 32767.<br />

Langt heltall 4 -2147483648 til 2147483647.<br />

Flyttall 4 ±3.402E38 og ned til <strong>1.</strong>401E-45.<br />

Langt flyttall 8 ±<strong>1.</strong>797E308 og ned til 4.94E-324.<br />

Tabell 6.1<br />

• Antall desimaler<br />

Her velger du hvor mange sifre feltet maks skal kunne ha. Hvis du ikke vet hvor mange<br />

det er (som i f.eks. en varepris) bør denne egenskapen settes til Auto.<br />

• Ellers er feltene som for Tekst og Notat.<br />

• Dato/Tid<br />

Denne typen brukes til å lagre dato og/eller klokkeslett. Egenskapen Format brukes til å<br />

avgjøre om det er dato, klokkeslett eller begge deler, og hvordan de skal skrives. Ellers er<br />

egenskapene som for Tekst.<br />

• Valuta<br />

Denne typen brukes til å lagre pengebeløp. Den eneste grunnen til å velge den framfor Tall<br />

(langt heltall) er at Valuta har en rekke ferdigdefinerte formater som kan være greie å ha.<br />

• Teller<br />

Denne typen er spesiell. Den er egentlig den samme som Langt heltall, men har den<br />

egenskapen at første post i tabellen får verdien 1, mens siden telles feltetverdien opp <strong>med</strong> 1<br />

for hver ny post. Dette sikrer at alle postene har forskjellige verdier. Så hvis en tabell ikke<br />

har noen naturlig primærnøkkel er det vanlig å slenge på et teller-felt og la det være primærnøkkelen.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 29


6.4 Endre felt<br />

Innføring i databaser<br />

Å gå tilbake og endre definisjonen av et felt er stort sett greit i Access. Dataene konverteres<br />

automatisk til en eventuell ny type (så langt råd er) og alle andre endringer gjøres problemfritt.<br />

Det er imidlertid ett unntak: feltnavnet. Dersom du endrer dette vil du få feil overalt i<br />

databasen der du har brukt det gamle navnet, og du vil bli nødt til å gå over hele databasen for<br />

å finne alle forekomster av det gamle navnet. Dette er en stor svakhet ved Access, men lite å<br />

gjøre ved.<br />

Det gjelder også å være klar over at endringer som har <strong>med</strong> primærnøkler og frem<strong>med</strong>nøkler å<br />

gjøre kan skape problemer dersom data forsvinner eller typene ikke lenger stemmer overens.<br />

Et generelt problem er når man ønsker å konvertere et felt fra en type til en annen. F.eks. når<br />

man går fra tekst til tall. Tekst som “123” går greit, mens ting som “Hansen, Erik” går dårlig<br />

ettersom dette ikke kan skrives som tall. Da må man enten droppe konverteringen, eller finne<br />

seg i at data forsvinner.<br />

6.5 Primærnøkkel<br />

Å definere primærnøkkel i Access er svært enkelt: merk radene til de feltene som skal være<br />

<strong>med</strong> i nøkkelen. (Du kan ha <strong>med</strong> flere felter, men jo kortere nøkkel, jo raskere database.) Klikk<br />

<strong>med</strong> høyre mustast, og velg Sett primærnøkkel i hurtigmenyen som kommer opp. De merkede<br />

feltene blir da sammen ny primærnøkkel.<br />

6.6 Forholdene<br />

Så var det å definere forholdene mellom de forskjellige tabellene man har laget. Det gjøres ved<br />

å velge Redigere|Relasjoner i menyen når du har tabell-kortet oppe. Da kommer først en<br />

dialogboks der du avgjør hvilke tabeller som skal være <strong>med</strong> i relasjons-oversikten (se Figur<br />

6.2).<br />

Figur 6.2<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 30


Innføring i databaser<br />

I relasjonsoversikten kan du flytte rundt på tabellene som du vil for å få trukket forholdslinjene<br />

slik at de går minst mulig i kryss. Et forhold mellom to tabeller settes opp ved at du<br />

trekker feltet fra den ene tabellen der 1-tallet skal stå til det tilsvarende feltet i den andre<br />

tabellen. Når du har gjort dette kommer dialogboksen i Figur 6.3 opp. Der setter du et kryss i<br />

feltet Referanseintegritet, og velger om du skal ha en-til-en eller en-til-mange. Dersom du<br />

setter kryss i de to merkefeltene til høyre vil referanseintegriteten automatisk overholdes, ved<br />

at alle poster som viser til ikke-eksisterende poster i andre tabeller vil slettes. Dette valget<br />

anbefales!<br />

6.7 Et eksempel<br />

Figur 6.3<br />

I Access (og andre steder) er det vanlig å angi feltnavn slik: Tabellnavn.Feltnavn, slik at det er<br />

tydelig hvilken tabell feltet tilhører. Det går an å sløyfe tabellnavnet hvis dette er åpenbart<br />

(feltet finnes bare i en tabell).<br />

I bilregister-eksempelet (se avsnitt 3.3) ville jeg laget to tabeller: T_Bil og T_Person. Disse<br />

ville jeg laget slik:<br />

Feltnavn Type Merk<br />

ID_Person Teller Spesialopprettet for å være primærnøkkelen.<br />

Navn Tekst Personens navn.<br />

Gateadresse Tekst Personenes gateadresse.<br />

Postnr Tall Postnummeret til personens bosted. Heltall, 4 siffer.<br />

Sted Tekst Personens bosted.<br />

Telefon Tall Personens telefonnummer. Heltall, 8 siffer.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 31


Tabell 6.2: T_Person<br />

Innføring i databaser<br />

Feltnavn Type Merk<br />

Registreringsnr. Tekst Primærnøkkel. Bilens registreringsnummer. Lengde: 9.<br />

Merke Tekst Bilens merke.<br />

Eier Tall Frem<strong>med</strong>nøkkel til T_Person.ID_Person. Langt heltall.<br />

Tabell 6.3: T_Bil<br />

Forholdet mellom T_Person.ID_Person og T_Bil.Registreringsnummer er en-til-mange,<br />

akkurat som i datamodellen.<br />

6.8 Se på og skrive inn data<br />

Du kan skrive inn og endre data i tabellene ved å åpne tabellene <strong>med</strong> ‘Åpne’-knappen på<br />

databasevinduet. Du vil da få opp en standardtabell som viser alle postene i tabellen. Der kan<br />

du både skrive inn og endre data.<br />

Det er også mulig å endre data og skrive inn data når du åpner en spørring i dataark-visning.<br />

Det er enkelte typer spørringer som ikke lar deg gjøre dette, men stort sett går det greit.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 32


7. Spørringer i Access<br />

7.1 Hva er en spørring?<br />

Innføring i databaser<br />

Spørringer er egentlig to ting, utvalgsspørringer og datamanipulasjonsspørringer. Den første<br />

typen er overlegent den vanligste, og er den vi først og fremst skal beskjeftige oss <strong>med</strong>. Det er<br />

imidlertid viktig å vite om manipuleringsspørringene også siden det er eneste måten å behandle<br />

data automatisk på i en relasjonsdatabase. (Uten å bruke Access Basic, som vi ikke skal lære<br />

her.)<br />

Utvalgsspørringer trekker ut data fra tabeller og organiserer dem på nye måter. Vi kan f.eks.<br />

liste ut alle personer bosatt i Kristiansand, finne bilen som har registreringsnummer ‘DE 66477’<br />

eller skrive ut hvor mange biler hver enkelt person eier osv. Vi skal begynne forsiktig og bygge<br />

dette opp etterhvert.<br />

Ingen av de spørringene vi lager i dette kapittelet er særlig pene eller spesielt egnet til å skrives<br />

ut eller vises på skjerm. Det er heller ikke meningen. Meningen <strong>med</strong> spørringer er å få fram de<br />

rette dataene, og så kan disse enten vises på skjerm i et skjema eller skrives ut i en rapport.<br />

Layouten ligger da i skjemaet/rapporten, mens dataene leveres av spørringen.<br />

7.2 Spørringer fra en tabell<br />

7.2.1 Spørringer <strong>med</strong> alle poster<br />

Den enkleste typen spørring plukker data fra en tabell, men velger bare ut noen av feltene. Du<br />

lager en spørring ved å velge ‘Spørring’-kortet i databasen og så trykke ‘Ny’. Du vil da bli<br />

spurt om du vil bruke en veiviser eller om du vil starte <strong>med</strong> en blank spørring. Vi satser på å<br />

lage spørrringene selv. Dersom vi vil lage en adresseliste over alle personene i vår eksempeldatabase<br />

gjør vi som beskrevet over. Deretter må vi velge hvilke tabeller og spørringer vi vil gå<br />

ut i fra. Vi velger der tabellen ‘T_Person’, siden det er der informasjonen finnes. Vi får da opp<br />

følgende vindu:<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 33


Figur 7.1<br />

Innføring i databaser<br />

Her ser vi i øverste halvdel av vinduet tabellene og spørringene vi har valgt ut (og forholdene<br />

mellom dem). Det er ikke nødvendig å ha tabellene og spørringene oppe her for å kunne bruke<br />

dem i spørringen, men det er greit å ha som huskelapper og snarveier til enkelte kommandoer.<br />

Nederste halvdel av vinduet er der vi lager spørringen. Den består av en tabell der hver kolonne<br />

lager en kolonne i den ferdige spørringen, mens radene beskriver hva som skal gjøres <strong>med</strong><br />

kolonnene. Vi skal lage en spørring som lister ut alle personene i databasen, og data om dem.<br />

Da skriver vi bare inn feltene vi vil ha <strong>med</strong> i øverste rad i hver kolonne, eller velger dem. Feltraden<br />

er en rad <strong>med</strong> kombinasjonsbokser, så du kan trykke pilen i feltet og velge det feltet du<br />

vil ha. Du kan også dobbeltklikke på feltet i huskelisten (øverst i vinduet) eller dra fra huskelisten<br />

til spørringen. Når du er ferdig kan du velge Vis | Dataark i menyen for å se resultatet.<br />

Figur 7.2<br />

Resultatet blir da som i Figur 7.2. Problemet er bare at hvis vi får mange personer vil denne<br />

adresselisten bli vanskelig å finne frem i fordi den ikke er sortert. Det kan vi lett gjøre: Sorterraden<br />

i Figur 7.1 styrer sorteringen av postene. Dersom vi velger ‘Stigende’ i ‘Navn’-kolonnen<br />

vil postene bli sortert på navn i rekkefølgen A-Å. Der<strong>med</strong> er vår adresseliste klar. Da er det<br />

bare å lukke vinduet og gi spørringen et navn. (F.eks: ‘Q_Adresseliste’.)<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 34


Innføring i databaser<br />

7.2.2 Spørringer <strong>med</strong> bare noen av postene<br />

Av og til er vi interessert i å vise bare noen av postene i databasen. Dette kan også enkelt<br />

gjøres <strong>med</strong> en spørring. Sett at vi er interessert i en spørring som viser alle personene som bor<br />

på ett bestemt sted. Dette kan gjøres ved at spørringen får en ‘parameter’ som oppgis av<br />

brukeren. Vi kan gå fram på eksakt samme måte som sist, og lage nøyaktig den samme<br />

spørringen. (Vi kan også kopiere den gamle ved hjelp av klipp og lim i databasevinduet.) Det<br />

som da gjenstår er parameteren og å bruke denne. Denne kan legges i en ny kolonne bortenfor<br />

‘Sted’. Der kan du skrive ‘[Angi sted]’ i felt-raden. ‘Angi sted’ er da teksten som vises til<br />

brukeren når han blir bedt om å skrive inn stedet.<br />

Deretter skriver vi et boolsk uttrykk i ‘Vilkår’-raden. I dette tilfellet er det enkelt: ‘=[Sted]’.<br />

Da vises alle poster der [Angi sted] er lik innholdet i feltet Sted. (Du må skrive hakeparenteser<br />

rundt Sted for at Access skal forstå at det er et feltnavn.) Hvis du nå velger Vis|Dataark vil du<br />

bli bedt om å ‘Angi sted’, skriver du da ‘Kristiansand’ vil posten ‘Jarl Andresen’ vises. Der vil<br />

du se at siste kolonne heter ‘Uttr1’ og er lik Sted. Dette er [Angi sted]-kolonnen, og vi er<br />

egentlig ikke interessert i å ha <strong>med</strong> denne. Den kan tas vekk fra visningen ved at krysset i Visboksen<br />

fjernes.<br />

Boolske uttrykk står forklart i avsnitt 7.5.2.<br />

7.3 Spørringer fra flere tabeller<br />

Som regel ønsker man å kombinere data fra flere tabeller for å få fram informasjon. Dette kan<br />

også enkelt gjøres av en spørring. La oss si at vi vil ha en liste over hva slags biler hver enkelt<br />

person eier. Da lager vi en ny spørring der både T_Bil og T_Person brukes. Siden vi har lagt<br />

inn forholdet mellom disse to tabellene i Redigere|Relasjoner kommer dette opp i spørringsvinduet.<br />

Ferdig laget ser spørringen ut som i Figur 7.3.)<br />

Figur 7.3<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 35


Innføring i databaser<br />

Dersom du vil forestille deg hvordan dette fungerer kan du tenke deg at datamaskinen først<br />

setter opp alle mulige kombinasjoner av 1 post fra T_Person og 1 fra T_Bil. Deretter plukker<br />

den ut de der T_Person.ID er lik T_Bil.Eier, før den sorterer de som er igjen på<br />

T_Person.Navn og viser det hele.<br />

Figur 7.4<br />

Resultatet vises i Figur 7.4. Som du ser dukker samme person opp flere ganger dersom<br />

han/hun har flere biler. Det er selvsagt ikke særlig pent, men kan lett ordnes i et skjema eller en<br />

rapport. (Spørringen lagres som Q_Biler på eier.)<br />

7.4 Koblingsegenskaper<br />

Når du kobler to tabeller vises bare de radene der de kombinerte feltene i begge tabellene er<br />

like. Dersom en bil for eksempel skulle stå oppført uten eier vil den ikke bli vist. Dette kan du<br />

endre ved å velge koblingen, klikke <strong>med</strong> høyre mustast og velge koblingsegenskaper.<br />

Der har du tre muligheter:<br />

• standardløsningen: bare ta <strong>med</strong> rader der begge feltene har samme verdi.<br />

• ta <strong>med</strong> alle poster fra den ene tabellen, men bare de <strong>med</strong> en verdi i koblingsfeltet fra den<br />

andre<br />

• den omvendte muligheten.<br />

Der<strong>med</strong> kunne vi valgt å ta <strong>med</strong> alle poster fra T_Bil, men bare de fra T_Person der<br />

koblingsfeltene er like. Da ville vi fått opp også biler uten eiere, som ville hatt Navn-kolonnen<br />

tom.<br />

Stort sett vil referanseintegriteten sørge for at dette skjer automatisk, men iblant får du ikke<br />

opp en eneste rad i en koblingsspørring selv om det er data i tabellene. Da kan<br />

koblingsegenskapene være løsningen.<br />

Hvis du endrer koblingsegenskapene slik at resultatet av spørringen vil avhenge av rekkefølgen<br />

postene leses ut av tabellene i vil du få en feilmelding: «Query contains ambiguous outer join.»<br />

Da er det bare å finne på noe annet.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 36


7.5 Beregnede felt: Aggregatfunksjoner og uttrykk<br />

Innføring i databaser<br />

Av og til er vi interessert i å vise frem felt som kan beregnes ut ifra dataene som allerede ligger<br />

i tabellen. Dette gjøres i spørringer og kan aldri gjøres i selve tabellen. Det lønner seg ikke å<br />

lagre slik informasjon i tabellene, fordi du da får dobbeltlagring.<br />

7.5.1 Uttrykk generelt<br />

Generelt kan vi si at et beregnet felt skrives slik: Feltnavn: Uttrykk. Feltnavn er her navnet<br />

feltet vil få i spørringen, mens Uttrykk er et uttrykk som beskriver hvordan det skal beregnes.<br />

Dersom du regner <strong>med</strong> tall kan uttrykket skrives som et vanlig matematisk uttrykk, men hvis<br />

du jobber <strong>med</strong> f.eks. tekst blir ting litt annerledes.<br />

7.5.2 Uttrykk i de forskjellige typene<br />

7.5.2.1 Tall<br />

Dersom du har en tabell <strong>med</strong> ansatte som har feltene ‘Timelønn’, ‘Timer jobbet denne mnd’ og<br />

‘Skatteprosent’ kan du beregne to nye felter: ‘Fradrag’ og ‘Utbetalt lønn’. Disse skrives da<br />

slik: (skatteprosent er mellom 0 og 100)<br />

Fradrag: Timelønn*[Timer jobbet denne mnd]*(Skatteprosent/100)<br />

Utbetalt lønn: Timelønn*[Timer jobbet denne mnd]*((100-Skatteprosent)/100)<br />

I tall-beregninger fungerer parenteser og annet akkurat som vi er vant til fra vanlig<br />

matematikk. Prioritetene er også som vanlig. (Dvs: rekkefølgen de beregnes i, f.eks. beregnes<br />

gange før pluss osv.) Operatorene er (i prioritert rekkefølge):<br />

Prioritet Operator Betydning Operator Betydning<br />

1 ^ Opphøyd i<br />

2 * Gange / Dele<br />

3 + Pluss - Minus<br />

Tabell 7.1<br />

7.5.2.2 Tekst<br />

Dersom du jobber <strong>med</strong> tekst kan du skrive inn tekst-konstanter i gåseøyne: "Dette er en tekstkonstant".<br />

De kan settes sammen <strong>med</strong> + slik at "Dette er"+" "+"en test" blir "Dette er en test".<br />

I adresselisten kunne vi for eksempel vært interessert i å ha Sted og Postnr samlet til ett felt,<br />

slik at vi slapp å justere avstanden mellom dem så nøyaktig i rapporter. Dette kunne da gjøres<br />

slik:<br />

Bosted: [Postnr]+" "+[Sted]<br />

Legg merke til at vi setter inn et mellomrom mellom disse. Det er for å unngå resultater som<br />

1800ASKIM.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 37


Innføring i databaser<br />

7.5.2.3 Boolske uttrykk<br />

Du lager boolske verdier fra Ja/Nei-felter eller ved å sammenligne to felter av samme verdi.<br />

Det gjøres <strong>med</strong> en sammenligningsoperator som<br />

Operator Betydning<br />

= er lik<br />

< mindre enn<br />

> større enn<br />

= større enn eller lik<br />

ulik<br />

Tabell 7.2<br />

Uttrykk som A=B, Pris


Figur 7.5<br />

Innføring i databaser<br />

Hvordan dette ser ut i dataark-visning kan du vel tenke deg. Hvis ikke kan du jo prøve det<br />

selv.<br />

De viktigste aggregatfunksjonene er:<br />

Navn Betydning<br />

Summer Summen av feltverdiene<br />

Maks Den største feltverdien<br />

Min Den minste feltverdien<br />

Antall Antall poster som har en verdi i feltet<br />

Gjennomsnitt Gjennomsnittet av feltverdiene<br />

Tabell 7.4<br />

7.5.4 Gruppering<br />

Jeg sa i avsnittet over at aggregatfunksjoner ‘tar data fra ett felt over flere poster og trekker<br />

noe ut av dem’. Det som er viktig her er hvilke poster det er funksjonene opererer over. Dette<br />

avgjøres av grupperingen. Dersom vi ikke grupperer i det hele tatt vil funksjonene operere på<br />

alle postene (snittet av alle poster, antall poster, summen av alle poster etc.) Dersom vi grupperer<br />

på f.eks. Person_ID vil f.eks. sum-funksjonen summere for hver person.<br />

Dersom vi tenker oss en spørring som i eksempeldatabasen gir følgende resultat:<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 39


Registreringsnummer Merke Eier<br />

SP 83400 Toyota MR2 Anne Tryti<br />

DE 72719 TransAM Anne Tryti<br />

DE 39291 Dodge Van Anne Tryti<br />

AJ 27381 Alfa Romeo GTV Tore Borregaard<br />

AJ 23992 Alfa Romeo Giulia Tore Borregaard<br />

UC 39921 VW Golf GTI Bertha Skottland<br />

BN 26131 Nissan Bluebird Jarl Andresen<br />

DE 66477 Opel Kadett Hans Hansen<br />

Tabell 7.5<br />

Innføring i databaser<br />

Dersom vi ut ifra den samme tabellen (eller flere tabeller, det spiller ingen rolle) lager en spørring<br />

<strong>med</strong> ett eneste felt: Antall(Registreringsnummer) vil resultatet bli en eneste rad der det står<br />

8. Da har Access gått gjennom tabellene og funnet 8 poster <strong>med</strong> en verdi i feltet Registreringsnummer.<br />

Dersom vi i spørringen nå legger inn ett felt til, nemlig Eier, vil ting bli annerledes. Da vil<br />

følgende bli resultatet:<br />

Eier Antall(Registreringsnummer)<br />

Anne Tryti 3<br />

Tore Borregaard 2<br />

Bertha Skottland 1<br />

Jarl Andresen 1<br />

Hans Hansen 1<br />

Tabell 7.6<br />

Det som nå har skjedd er at Access teller antall poster som har lik verdi i Eier-feltet. Vi sier at<br />

vi har gruppert på Eier, og da teller vi hvor mange biler hver eier har. Det er ikke mulig å vise<br />

et felt i Access uten å gruppere på det.<br />

Det betyr at dersom vi setter inn feltet registreringsnummer også så vil vi gruppere på Eier og<br />

Registreringsnummer, og der<strong>med</strong> teller vi antall poster som har lik verdi i Eier og Registreringsnummer-feltene.<br />

Resultatet blir en linje for hver linje i Tabell 7.5, og hver av dem vil ha<br />

antallet <strong>1.</strong><br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 40


7.6 Datamanipulasjon <strong>med</strong> spørringer<br />

Innføring i databaser<br />

Så langt har vi bare snakket om utvalgsspørringer, men det finnes også datamanipuleringsspørringer.<br />

Disse kan brukes til å systematisk bearbeide data, og er svært praktiske siden de<br />

kan utløses fra trykk på knapper i skjemaer og andre hendelser. Det fine <strong>med</strong> dette er at du via<br />

et knappetrykk kan oppdatere 1000 poster på to sekunder.<br />

De viktigste typene er:<br />

Navn Funksjon<br />

Oppdaterings- Endrer dataene i enkelte felter i de utvalgte postene<br />

Føy til- Legger inn nye poster i en tabell<br />

Slette- Sletter de utvalgte postene fra en tabell<br />

Tabell 7.7<br />

Du velger den spørringstypen du vil ha i Spørring-menyen.<br />

Slettespørringer er de enkleste å bruke. De fungerer akkurat som en utvalgsspørring, bortsett<br />

fra at de sletter de postene utvalgsspørringen ville vist frem. (Dataark-visning viser deg postene<br />

som ville blitt slettet om du hadde kjørt spørringen, eller valgt Spørring|Kjør i menyen.)<br />

Oppdateringsspørringer har en ekstra rad i design-vinduet. Der skriver du et uttrykk som<br />

beskriver hva feltet som står øverst skal endres til.<br />

Dersom du velger en Føy til-spørring må du først velge hvilken tabell de nye postene skal føyes<br />

til. Deretter dukker det opp en ekstra rad i design-vinduet som heter 'Føy til'. Der velger du<br />

hvilket felt spørringsfeltet skal settes inn i.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 41


8. Oppbygning av grensesnitt i Windows<br />

8.1 Skjematyper og deres rekkefølge<br />

Innføring i databaser<br />

De fleste databaser har store likheter, og det gjør at det finnes en del greie klisjeer for oppbygningen<br />

av grensesnittene. Særlig er det noen typer skjemaer som er vanligere enn andre, og<br />

de gjennomgår jeg her. Du er ikke nødt til å lage dine egne databaser akkurat slik, men det kan<br />

være greie tips å ha <strong>med</strong> seg.<br />

Utformingen av brukergrensesnitt er noe det forskes mye på i disse dager. Vi skal ikke gå så<br />

veldig dypt i dette, men husk: databasen din bør være enkel å bruke (brukerne bør spares for<br />

unødvendig venting og tasting), enkel å forstå (brukerne bør kunne forstå hva de gjør) og den<br />

bør være behagelig å se på.<br />

8.<strong>1.</strong>1 Hovedmeny<br />

Brukerne dine bør være beskyttet mot å måtte sitte og navigere rundt i databasen ved hjelp av<br />

databasevinduet. Istedet bør du lage et eget skjema som fungerer som hovedmeny. Derfra skal<br />

alle funksjoner som brukeren skal kunne utføre være tilgjengelige. Det er best å ikke ha data i<br />

hovedmenyen, men istedet bare mulighetene til å velge mellom forskjellige skjemaer. Dersom<br />

databasen er stor kan disse igjen være hovedmenyer for sine deler av databasen.<br />

Hovedmenyen bør ha: overskrift som forklarer hvilken database dette er, en knapp for hvert<br />

skjema brukeren kan gå til og kanskje et bilde til pynt og illustrasjon.<br />

Et litt mer avansert, men ikke nødvendigvis bedre alternativ er å definere sin egen menylinje<br />

istedetfor en hovedmeny. Du kan ha de samme valgene, men du gjør dem tilgjengelige på en<br />

annen måte.<br />

8.<strong>1.</strong>2 Velg post-skjemaet<br />

Du har sannsynligvis mange poster i databasen din, og mange data om hver enkelt post. Det er<br />

derfor greit å dele endringen av data opp i to skjemaer: et til å velge posten som skal endres,<br />

og et til å gjøre endringene.<br />

Det første skjemaet bør ikke vise mer data om hver enkelt post enn det som trengs til å<br />

identifisere posten for brukeren. Dette kan gjøres enten ved å bruke detalj-delen av skjemaet<br />

(se avsnitt 9.3), eller ved å bruke en listeboks (se avsnitt 9.2). Postene bør være sortert, ellers<br />

blir det vanskelig å finne fram.<br />

Skjemaet bør også ha en overskrift og noen knapper. Følgende knapper bør være <strong>med</strong>: lukk<br />

skjema, opprett ny post, slett denne posten og endre denne posten. Det siste kan det være flere<br />

knapper for, spesielt hvis vi fra denne posten er interessert i å gå inn i flere andre tabeller.<br />

Dette skjemaet kan fungere som endre data-skjema også hvis tabellen har så få felter at du kan<br />

se alle samtidig.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 42


Innføring i databaser<br />

8.<strong>1.</strong>3 Endre data-skjemaet<br />

Dette skjemaet viser frem de interessante dataene om posten. (Av og til er det så mange data at<br />

det lønner seg å splitte dem på flere skjemaer.) Skjemaet bør ha en overskrift, og for hvert felt<br />

bør det være en etikett (<strong>med</strong> feltets navn) og en kontroll. Enten en tekstboks, listeboks,<br />

kombinasjonsboks, merkefelt eller annet. Disse skjemaene blir ofte rotete, så det lønner seg å<br />

legge kontrollene mest mulig på linje <strong>med</strong> hverandre og systematisere det hele så mye som<br />

mulig.<br />

8.2 Hvordan lage et grensesnitt<br />

For noen går dette automatisk (særlig de som har endel trening og erfaring), mens andre sliter<br />

<strong>med</strong> å finne ut hvordan de skal bygge opp grensesnittene til programmene sine. Dette vil sannsynligvis<br />

komme seg etterhvert som du får mer erfaring, men før du får det lønner det seg å<br />

være metodisk og grundig.<br />

Begynn <strong>med</strong> å lage en liste over enkelthandlinger bruker sannsynligvis er interessert i å utføre.<br />

Dette bør være ting som (for å holde oss til eksempelet vårt): slette bil, slette person, endre<br />

data om person etc.<br />

Deretter bør du begynne å planlegge skjemaene dine ved å tegne dem på papiret, og sette opp<br />

på et eget ark forbindelsene dem imellom. Mens du gjør dette bør du forsøke å holde tommelfingerreglene<br />

klart for deg og prøve å tenke på hvordan du helt konkret skal få dette til i<br />

Access. Prøv også å bygge systemet opp etter det skjemasystemet jeg foreslo i avsnitt 8.<strong>1.</strong><br />

8.3 Tommelfingerregler for skjemaer<br />

Å lage et godt brukergrensesnitt er svært vanskelig, og selv store datafimaer har tabbet seg ut<br />

på dette. Det krever også trening og forståelse for hvordan brukeren jobber, samt kunnskap<br />

om hvordan mennesker oppfatter hva de ser. Den ideelle brukergrensesnittdesigner er selv<br />

bruker og programutvikler, samt psykolog og tankeleser. (Mao: han/hun finnes ikke.)<br />

Her er imidlertid noen tommelfingerregler som kan være greie å ha:<br />

• Sørg for gode navn på alle felter, knapper og skjemaer. Gode navn er korte, men likevel<br />

forståelige for brukeren. Det viktigste er at de er konsekvente! Samme ting må hete det<br />

samme overalt.<br />

• Tabulatorrekkefølgen må være naturlig.<br />

• Bruk så få farger og skriftsnitt (fonter) som mulig. Alt annet blir bare forvirrende for<br />

brukeren.<br />

• Sørg for at kontrollene ligger på linjer.<br />

• Det lønner seg å samle feltene i en gruppe, og ha knappene for seg. Ting som hører sammen<br />

bør stå sammen.<br />

• Ikke ha for mange elementer i ett skjema. Synes du det blir for mye så del det på flere<br />

skjemaer.<br />

• Skjemaene bør ligne på hverandre. Prøv å gjøre tingene på samme måte overalt i samme<br />

database. Du kan f.eks. ha en fast farge på overskriftene dine og en fast farge på Lukkknappen.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 43


8.4 Småtips<br />

Innføring i databaser<br />

Dersom du har veldig mange poster kan det være lurt å utvide velg post-skjemaet <strong>med</strong> et par<br />

kontroller som du kan bruke til å begrense postene som vises. Når du søker på person kan du<br />

f.eks. ha et felt der du kan skrive inn en del av navnet, og en knapp som da viser bare personer<br />

<strong>med</strong> navn som inneholder denne teksten.<br />

Det kan også være en ide å begrense antall skjemaer brukeren må igjennom for å komme dit<br />

han/hun vil. Alle disse skjemaene må jo lukkes igjen, og det kan bli en plage.<br />

Det kan også være lurt å lage et spesielt skjema <strong>med</strong> informasjon om programmet. Der bør det<br />

stå hva programmet heter, hvem som har laget det, og kanskje en del annen informasjon, som<br />

når det er laget osv. Det lønner seg også å ha <strong>med</strong> et versjonsnummer på programmet, slik at<br />

du enkelt kan se om en utgave av det er den siste eller ikke. Dersom programmet skal kopieres<br />

til flere maskiner er dette ganske viktig. Et slikt skjema kan også fungere som reklame for deg<br />

selv som programutvikler.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 44


9. Skjemaer i Access: Bakgrunn<br />

9.1 Hva er et skjema?<br />

Innføring i databaser<br />

Et skjema i Access er et dokumentvindu. Det kan inneholde hva som helst som vanlige vinduer<br />

kan inneholde, og fungerer som vinduer i andre programmer. Det vinduer brukes til er å vise,<br />

endre og skrive inn data, samt å velge mellom forskjellige handlinger programmet tilbyr.<br />

Eksempler på det siste kan være å lukke skjemaer, åpne nye skjemaer, utløse<br />

handlingsspørringer eller vise rapporter.<br />

Du kan selvfølgelig lage en database basert kun på tabeller og spørringer, men da er det<br />

tvilsomt om noen andre enn du kan bruke den, og særlig pen blir den ikke. For å gjøre<br />

databasen mer brukervennlig kan du lage et brukergrensesnitt mellom selve databasen og<br />

brukeren. Dette er det du gjør <strong>med</strong> skjemaene du lager.<br />

9.2 Hva består et skjema av?<br />

Et skjema er som sagt et vindu, og består av de samme kontrollene som vanlige Windowsvinduer.<br />

De kan deles i to grupper: de standardiserte som sitter på vinduskantene, som<br />

rullefelter, postvelger, kontrollmeny-boks osv og de som du selv plasserer i vinduet.<br />

Etikett<br />

Tekstfelt<br />

Kombinasjonsboks<br />

Listeboks<br />

Figur 9.1<br />

Kontrollboks<br />

Postvelgere<br />

Rullefelt<br />

Størrelse-knapper<br />

Navigasjonsknapper<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 45


Innføring i databaser<br />

De forskjellige kontrollene fungerer på forskjellige måter og har forskjellige funksjoner. Vi kan<br />

dele dem i to typer: handlingskontroller og datakontroller. Handlingskontrollene utløser en<br />

handling, men forandrer ikke data direkte, slik datakontrollene gjør.<br />

Jeg regner <strong>med</strong> at dere allerede kjenner til hvordan man bruker disse kontrollene, og nøyer <strong>med</strong><br />

meg å ha satt navn på dem her.<br />

9.3 Skjemaets deler<br />

Når du designer et skjema i Access kan det bestå det av opptil fem deler. Disse er i rekkefølge:<br />

• topptekst i skjema<br />

• topptekst på side<br />

• detalj<br />

• bunntekst på side<br />

• bunntekst i skjema<br />

Topp- og bunntekstene på side brukes bare ved utskrift på printer, og er derfor ikke interessante<br />

for oss. Topp- og bunnteksten hentes fram ved å velge Vis | Topptekst/bunntekst i<br />

skjemaet.<br />

Dersom du baserer et skjema på en spørring vil topp- og bunnteksten vises en gang hver,<br />

henholdsvis øverst og nederst på skjemaet. Imellom dem gjentas detaljen en gang for hver rad i<br />

spørringen. Der<strong>med</strong> brukes topp- og bunntekst til overskrifter, generelle kontroller og<br />

lignende, mens detaljen brukes til å vise data fra radene i spørringen.<br />

9.4 Skjemaveiviserne<br />

Dersom du vil lage et skjema tar du opp Skjema-kortet i databasevinduet og trykker Ny. Du vil<br />

da bli spurt om du vil lage skjemaet selv eller om du vil ha hjelp av en veiviser. Veiviserne kan<br />

være svært greie og spare deg for mye kjedelig tegnearbeid. Når veiviserne har laget et skjema<br />

for deg er det et vanlig skjema som alle andre og kan redigeres og justeres manuelt. Veiviserne<br />

har imidlertid sine helt klare begrensninger, så du vil ofte være nødt til å lage dine egne<br />

skjemaer fra bunnen av.<br />

De forskjellige veiviserne er<br />

• AutoSkjema<br />

Denne veiviseren lager et nytt skjema direkte. Skjemaet er basert på den valgte<br />

tabellen/spørringen og viser alle feltene i kun en post i vinduet samtidig. Du må bruke<br />

postvelgerne til å bla mellom postene. Denne typen skjemaer anbefales ikke alene siden de<br />

gir så liten oversikt. De kan imidlertid brukes som vis/endre data-skjema.<br />

• Enkolonneskjema<br />

Denne varianten ligner svært på AutoSkjema, men lar deg velge mellom flere designvarianter<br />

og feltene i skjemaet.<br />

• Tabellskjema<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 46


Innføring i databaser<br />

Denne veiviseren lager skjemaet på samme måte som enkolonne-veiviseren, men legger alle<br />

feltene i en rad istedet, slik at du får plass til flere poster i vinduet samtidig. Denne varianten<br />

blir ikke særlig pen, men den blir langt mer oversiktlig enn enkolonne-varianten, og kan<br />

brukes som både velg post-skjema og endre data-skjema, hvis det ikke er for mange felter.<br />

• Diagram<br />

Denne veiviseren lar deg lage skjemaer som viser grafer av dataene i en spørring/tabell. Den<br />

er svært hendig for å lage skjemaer som ellers hadde vært vanskelige å lage, og som tar seg<br />

svært bra ut grafisk. Selve diagrammet er ett enkelt objekt fra MS Graph, som egentlig ikke<br />

er en del av Access i det hele tatt, men som følger <strong>med</strong> Office-pakken.<br />

• Hovedskjema <strong>med</strong> delskjema<br />

Denne veiviseren lar deg lage skjemaer som inneholder et nytt skjema inne i seg. De egner<br />

seg godt til å vise en post i en tabell, og en rekke tilknyttede poster i en annen tabell.<br />

9.5 Jobbe <strong>med</strong> kontroller<br />

I et skjema oppretter du enklest en ny kontroll fra verktøylinjen du får opp ved å velge<br />

Vis|Verktøylinjer i skjema-design-visning. Det gir deg verktøylinjen under.<br />

Peker<br />

Etikett<br />

Alternativgruppe<br />

Alternativknapp<br />

Kombinasjonsboks<br />

Diagram<br />

Linje<br />

Sideskift<br />

Veivisere av/på<br />

Tekstboks<br />

Veksleknapp<br />

Avkrysningsboks<br />

Listeboks<br />

Delskjema<br />

Rektangel<br />

Kommandoknapp<br />

Verktøylås<br />

Figur 9.2<br />

Bortsett fra de to nederste knappene, som er av/på-knapper, og den øverste, som brukes til å<br />

velge kontroller er alle knappene tegneverktøy. Du velger det verktøyet du ønsker, trekker det<br />

opp på skjemaet, og vips så er det opprettet. Dersom veiviser-knappen er nede og kontrollen<br />

har en veiviser, vil en dukke opp for å hjelpe deg <strong>med</strong> designet.<br />

Siden kan du velge en hvilken som helst kontroll. En rekke svarte rektangler vil da komme opp<br />

rundt kontrollen. Disse kan du dra i for å endre størrelsen på kontrollen, eller du kan flytte<br />

kontrollen ved å dra midt på den. Kontrollen plasserer seg på et rutenett i skjemaet så lenge<br />

Format | Fest til rutenett er valgt. Dette kan du unngå ved å holde inne Ctrl mens du drar.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 47


Innføring i databaser<br />

Dersom du har paletten oppe (Vis|Palett), kan du velge kontrollen og så endre farge på den<br />

ved å trykke på paletten. Kontrollens egenskaper kan også redigeres ved å velge kontrollen og<br />

trykke høyre mustast.<br />

9.5.1 Hvordan velge kontroller<br />

Kontroller kan velges på flere måter. Du kan velge dem en for en ved å klikke direkte på dem,<br />

eller du kan holde shift inne mens du klikker på dem. Hvis du holder shift inne idet du trykker<br />

på et element som ikke er valgt velges det i tillegg til allerede valgte elementer, men hvis det<br />

var valgt slutter det <strong>med</strong> å være det.<br />

Du kan også dra et rektangel over de elementene du vil velge. Alle elementene som er inne i<br />

dette rektangelet vil bli valgt. Og dersom du klikker på linjalene (enten den vertikale eller den<br />

horisontale) vil alle elementer som ligger på akkurat den høyden/bredden velges. Du kan også<br />

klikke og dra på linjalene, slik at alle som ligger i det intervallet du drar over velges.<br />

9.5.2 Egenskaper<br />

Alle deler av en Access-database har egenskaper. For et skjema vil dette si slike ting som navn,<br />

overskrift, hvilken spørring det er basert på osv. Egenskapene til et objekt vil altså avgjøre<br />

hvordan det oppfører seg.<br />

Egenskapene til et objekt kan endres ved at du klikker på objektet <strong>med</strong> høyre mustast, og<br />

velger Egenskaper i hurtigmenyen som da kommer frem.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 48


10. Skjemaer i Access: Detaljene<br />

10.1 Hvordan kontrollene fungerer<br />

Innføring i databaser<br />

De fleste kontrollene er enkle å bruke, men det er en del ting som bør nevnes i forhold til<br />

hvordan de skal lages.<br />

10.<strong>1.</strong>1 Hendelser<br />

Hver gang du klikker i et vindu eller trykker på en tast skjer en ‘hendelse’. Hver gang en<br />

hendelse inntreffer i et vindu eller en kontroll utløses en ‘hendelseshåndterer’ (event handler),<br />

som avgjør hva som skal skje. Denne er tilgjengelig som en egenskap ved vinduet/kontrollen,<br />

og kan være enten et uttrykk, en makro eller en prosedyre i Access Basic.<br />

10.<strong>1.</strong>2 Tekstbokser<br />

Tekstbokser er som regel tilordnet et felt i spørringen som skjemaet er basert på. Da vises<br />

feltverdien til gjeldende post i boksen, og dersom bruker endrer denne verdien vil feltverdien<br />

også endres idet gjeldende post skifter eller vinduet lukkes. Mao: tabellen oppdateres når du<br />

velger en ny post eller vinduet lukkes. Tekstboksene oppdateres fra tabellene stadig vekk, slik<br />

at hvis verdien skulle endres et annet sted vil du kunne se det straks.<br />

Du kan også lage en tekstboks som ikke er tilknyttet noe felt, denne vil da fungere som de<br />

andre tekstboksene, men vil ikke oppdatere noe felt. Verdien er likevel tilgjengelig i spørringer,<br />

makroer og prosedyrer som [forms]![Skjemanavn]! [Kontrollnavn]. Dette krever imidlertid at<br />

skjemaet er åpent, ellers vil du få en feilmelding.<br />

10.<strong>1.</strong>3 Kombinasjons- og listebokser<br />

Kombinasjonsbokser og listebokser viser data i ‘tabellform’, så de kan ikke vise enkle felter<br />

slik en tekstboks kan. Det de viser er spørringer eller tabeller, <strong>med</strong> utvalgte felter fra utvalgte<br />

poster, og du velger en av postene. Det som lagres i kontrollen er verdien i ett av feltene (det<br />

bundne feltet) i den valgte posten. Hvilket felt dette er velger du når du lager boksen.<br />

Hvis boksen skal oppdatere ett felt i en tabell må det bundne feltet inneholde den verdien som<br />

skal lagres i det feltet som skal oppdateres. For frem<strong>med</strong>nøkler vil dette være primærnøkkelen.<br />

Kombinasjons- og listebokser oppdateres ikke automatisk, siden dette vil kreve for mye datakraft.<br />

Istedet kan du oppdatere dem <strong>med</strong> Access Basic-kommandoen «DoCmd Requery<br />

[Boksens navn]». Denne kommandoen kan du sette inn i de hendelsesprosedyrene du måtte ha<br />

behov for den i.<br />

10.<strong>1.</strong>4 Knapper<br />

Når en knapp trykkes ned utføres hendelseshåndtereren til knappen. Denne vil utføre det som<br />

skal skje når knappen trykkes ned. Hendelseshåndtereren skrives av veiviseren hvis denne er<br />

istand til det, hvis ikke må du skrive den selv. Du kan også endre kode skrevet av veiviseren.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 49


Innføring i databaser<br />

Dersom du lærer deg Access Basic kan du gjøre svært mye mer enn det du er istand til å få til<br />

uten. Vi kan imidlertid ikke gå inn på det i dette <strong>kurset</strong>, ettersom det ville kreve altfor mye tid.<br />

10.2 Viktige egenskaper ved kontroller<br />

De fleste kontroller har en del egenskaper felles. En av dem er ‘Navn’, som er det den høres ut<br />

som. Dette er navnet du bruker til å henvise til kontrollen i et uttrykk eller andre steder.<br />

‘Kontrollkilde’ er det feltet i den underliggende tabellen/spørringen som kontrollen henter sine<br />

data fra og oppdaterer.<br />

‘Tittel’ er teksten som står på kontrollen for å beskrive den overfor brukeren.<br />

‘Tekstjustering’ angir om teksten skal være inntil venstre eller høyre kant, eller eventuelt være<br />

midtstilt.<br />

‘Spesialeffekter’ kan brukes til å gjøre det visuelle mer spennende, ved å få f.eks. en boks<br />

(tekst-, liste- eller kombinasjons-) til å være opphøyd eller senket. Her går det an å prøve seg<br />

frem for å se hva som gir best resultat.<br />

10.3 Hvordan lage en kombinasjonsboks<br />

Kombinasjonsbokser er greie å ha når vi har en frem<strong>med</strong>nøkkel som er koblet til en annen<br />

tabell og i et skjema trenger å velge en tilhørende post i den tilkoblede tabellen. Den kan også<br />

brukes til å velge når du har en liste <strong>med</strong> forskjellige verdier et felt kan ha.<br />

Skrittene i kombinasjonsboks-veiviseren er:<br />

<strong>1.</strong> Først må du velge om du vil at veiviseren skal slå opp verdiene i en spørring/tabell eller om<br />

du skal skrive inn verdiene den kan ta. Dersom du velger det siste er neste skritt å velge<br />

antall kolonner, samt å skrive inn verdiene. Hvis boksen er koblet til en frem<strong>med</strong>nøkkel skal<br />

vi slå opp verdiene i den tilkoblede tabellen (evt via en spørring.)<br />

2. Neste skritt er å velge hvilken tabell/spørring kombinasjonsboksen skal hente sine verdier.<br />

3. Så må du velge hvilke felter du vil skal vises i kombinasjonsboksen. Hvis boksen er koblet<br />

til en frem<strong>med</strong>nøkkel må primærnøkkelen være <strong>med</strong> her. (Sett den opp først av alle.) Ta<br />

også <strong>med</strong> akkurat mange nok felter til at brukerne kan se hvilke poster de har å velge<br />

mellom.<br />

4. Så skal du sette kolonnebredden til de forskjellige kolonnene. Har du tatt <strong>med</strong> en<br />

primærnøkkel som ikke er av interesse for brukeren setter du kolonnebredden dens til 0.<br />

5. Deretter spør Access hvilken av kolonnene den verdien vi skal lagre befinner seg i. Er<br />

boksen koblet til en frem<strong>med</strong>nøkkel er svaret primærnøkkelen.<br />

6. Så må du velge om boksen skal være koblet til et felt i den underliggende tabellen (og i<br />

tilfelle hvilket), eller om den skal være frittstående.<br />

7. Tilslutt gjenstår det bare å sette navnet, og kombinasjonsboksen din er ferdig.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 50


10.4 Hvordan bygge opp et skjema<br />

Innføring i databaser<br />

10.4.1 Endre data-skjema<br />

Først lager vi et endre data-skjema for tabellen T_Bil i eksempel-databasen. Det gjøres enklest<br />

ved å opprette en spørring kalt ‘Q_Billiste’, som ganske enkelt viser alle feltene i T_Bil,<br />

unntatt Eier. Der henter du istedet inn Navn fra T_Person. Deretter lager du et enkolonneskjema<br />

basert på alle feltene i denne spørringen. Det skjemaet ser slik ut:<br />

Figur 10.3<br />

Siden dette er ment å være et vanlig endre data-skjema tar vi vekk postvelgerne og<br />

navigasjonsknappene. Det gjøres ved å gå til design-visning <strong>med</strong> Vis|Skjemadesign og klikke<br />

<strong>med</strong> høyre mustast i det hvite feltet oppe til høyre. Da får du opp et vindu <strong>med</strong> såkalte<br />

egenskaper. Der setter du postvelgere, navigasjonsknapper og rullefelter til Nei.<br />

Så kan vi flytte litt rundt på kontrollene, og strekke dem litt for at de skal passe bedre <strong>med</strong><br />

feltstørrelsene.<br />

Fargene ligger nå i en egen tabell, slik at istedet for å taste inn fargene for hånd, og håpe på at<br />

vi staver dem riktig hver gang, bruker vi en kombinasjonsboks til å velge dem <strong>med</strong>. (Det<br />

samme gjelder eier, men der er det så mange poster at vi velger å la det stå. I en skikkelig<br />

database ville vi gjort noe <strong>med</strong> den.)<br />

Vi lager da en Q_Fargeliste som inneholder FargeNr og Navn og sorterer på Navn. Så kan du<br />

slette tekstboksen Farge og dens etikett, og opprette en kombinasjonsboks der istedet.<br />

Veiviseren vil da la deg plukke ut begge feltene i Q_Fargeliste, og justere kolonnebredden til<br />

hvert av dem. Der setter du kolonnebredden til FargeNr til 0, slik at den ikke synes selv om<br />

den er der. FargeNr er nemlig den kolonnen som har verdiene vi trenger. T_Bil har en Farge,<br />

som er frem<strong>med</strong>nøkkel til T_Farge, og der lagres jo fargenummeret. Verdien skal altså lagres i<br />

feltet Farge. Etiketten er grei: den skal hete Farge. Så må du bare gå inn og sette listeboksens<br />

egenskap ‘Tekstjustering’ til Venstre, og alt er iorden.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 51


Innføring i databaser<br />

Det eneste som mangler da er en knapp til å lukke skjemaet <strong>med</strong>. Den er ikke absolutt<br />

nødvendig, siden det går an å gjøre det via kontrollboksen, men vi tar det <strong>med</strong> for å illustrere<br />

hvordan man lager en knapp.<br />

Knappen lages via knappeverktøyet på verktøylinjen. Først må du imidlertid utvide Bunntekst i<br />

skjema, ved å dra i den nedre kanten. Deretter kan du tegne på knappen. Som kommando<br />

velger du Skjemaoperasjoner|Lukk skjema. Resten av veiviseren er mest et spørsmål om<br />

personlig smak, så der kan du gjøre som du vil.<br />

Skjemaet ser nå slik ut:<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 52


Figur 10.4<br />

Innføring i databaser<br />

10.4.2 Velg post-skjema<br />

Etter å ha laget endre data-skjemaet kan vi lage velg post-skjemaet. Der velger du hvilken post<br />

som skal vises i endre data-skjemaet. Også dette kan lages <strong>med</strong> utgangspunkt i Q_Billiste, bare<br />

vi endrer den til å sortere på Registreringsnummer. Her kan vi velge om vi vil lage et<br />

tabellskjema <strong>med</strong> en veiviser, eller om vi vil lage skjemaet selv fra bunnen av og basere<br />

velgingen på en listeboks istedet. Det siste er penest og enklest for bruker, men det første er<br />

raskest.<br />

Siden det første er så enkelt og gir liten læregevinst kan vi velge det andre, og heller bare gi et<br />

kortfattet referat av prosessen. Vi starter <strong>med</strong> å opprette et tomt skjema som ikke er basert på<br />

noen spørring. (Få opp verktøykassen, paletten og skjema-design-verktøylinjen dersom de ikke<br />

kommer opp av seg selv.)<br />

Så er det bare å velge detalj-delen og sette bakgrunnsfargen til vanlig Windows-grå. Deretter<br />

setter vi inn overskriften “Velg bil” og midtstiller den. Mens den er valgt kan skrifttype, -<br />

størrelse og justering endres <strong>med</strong> skjema-design-verktøylinjen. Bakgrunnsfargen må også<br />

endres <strong>med</strong> paletten.<br />

Før vi lager listeboksen midt i vinduet må vi lage en spørring som henter<br />

Så er det bare å trekke opp en listeboks midt i vinduet. Den skal vise verdier fra spørringen<br />

‘Q_Billiste’, nærmere bestemt feltene ‘Registreringsnummer’, ‘Merke’ og ‘Eier’. Så må<br />

kolonnebreddene justeres, og feltet ‘Registreringsnummer’ velges som det interessante feltet i<br />

boksen. Boksen kan f.eks. døpes ‘Valgt bil’. Så oppretter veiviseren boksen for deg, og du kan<br />

nøye deg <strong>med</strong> å plassere den på nytt, siden veiviseren endrer bredden på den. For å gjøre<br />

skjemaet litt penere kan vi endre egenskapen ‘Spesialeffekt’ til ‘Senket’.<br />

Det eneste som gjenstår da er kommandoknappene. I koden til disse knappene brukes av og til<br />

skjemanavnet, og før du har lagret er det ‘Skjema1’, så du må lagre skjemaet først.<br />

Vi trenger knappene ‘lukk’, ‘ny’, ‘vis’ og ‘slett’. Lukk lages på samme måte som før. ‘Vis’<br />

lages ved å velge kommandoen ‘Åpne skjema’ i veiviseren, og skjemaet ‘F_Bil’, som vi lagde i<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 53


Innføring i databaser<br />

forrige avsnitt. Vi ønsker å vise bestemte data i skjemaet F_Bil, og velger å koble feltene<br />

‘Valgt bil’ (som jo inneholder registreringsnummer, det valgte vi ovenfor) <strong>med</strong><br />

‘Registreringsnummer’. Da vil bilen <strong>med</strong> samme registreringsnummeret den som ble valgt i<br />

listeboksen bli vist, og siden registreringsnummer er primærnøkkel må dette være samme bilen.<br />

‘Ny’-knappen er litt småvanskelig. Kommandoen er ‘Ny post’, men vil ikke fungere alene.<br />

Hadde vi laget en tabell-rapport ville det gått greit, men som det er vet ikke Access hvilken<br />

tabell den skal lage en ny post i, og den vet ikke hvilket skjema den skal vises i. Alt dette<br />

ordnes ved å klikke ‘Bygg hendelse’ i hurtigmenyen til knappen, og sette inn linjen DoCmd<br />

OpenForm “F_Bil” over linjen <strong>med</strong> DoCmd GotoRecord ... Dette er en<br />

instruksjon i Access Basic som åpner skjemaet F_Bil. Deretter viser den andre instruksjonen en<br />

ny post i skjemaet. Når F_Bil lukkes vil ikke dataene i listeboksen oppdateres av seg selv. Det<br />

kan ordnes ved å legge inn en linje etter DoCmd Close på lukk-knappen i F_Bil der det står<br />

DoCmd forms![F_Velg bil]![Valgt bil].Requery. Dersom F_Velg bilskjemaet<br />

ikke er åpnet vil dette ikke fungere, og du vil få en feilmelding. Det får heller være...<br />

‘Slett’-knappen er også litt tung. Hadde skjemaet vært et tabell-skjema ville det ikke vært noe<br />

problem, men som det er blir det tungvint. Da kunne veiviseren gjort jobben dersom du valgte<br />

kommandoen ‘Slette post’. Som det er kan vi lage en slettespørring og utløse den fra knappen.<br />

Lag en slettespørring som sletter en post <strong>med</strong> registreringsnummer lik [forms]![F_Velg<br />

bil]![Valgt bil]. Dette uttrykket betyr innholdet i kontrollen [Valgt bil] i skjemaet [F_Velg bil]<br />

([forms] betyr skjemaer.) Denne spørringen kan du kalle ‘Q_Slett bil’.<br />

Så kan du skru av veiviserene og tegne knappen (og sette på veiviserene igjen.) Du kan endre<br />

teksten på knappen ved å dobbeltklikke på den. Deretter kan du lete opp egenskapen ‘Ved<br />

klikk’ og trykke på ‘...’ på høyrekanten i vinduet, velg så ‘Kodebygger’ og skriv:<br />

DoCmd OpenQuery “Q_Slettbil”<br />

DoCmd Requery “Valgt bil”<br />

Dette skal stå mellom de to linjene som allerede er i vinduet. Den første linjen åpner<br />

slettespørringen som sletter den bilen som er valgt <strong>med</strong> listeboksen, mens den andre oppdaterer<br />

postene i listeboksen.<br />

Vinduet kan da f.eks. se slik ut:<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 54


Figur 10.5<br />

Innføring i databaser<br />

10.4.3 Hovedmeny-skjemaet<br />

Så kan vi lage hovedmenyen. Der lager vi en overskrift, en avslutt-knapp og knapper for de<br />

forskjellige delene av programmet. Vi kan f.eks. lage en for kundelisten og en for en enkel<br />

fargeliste. Det eneste som er nytt her er avslutt-knappen, der kommandoen ligger under<br />

‘Applikasjon’ og heter ‘Avslutt program’.<br />

For øvelsens skyld kan vi også legge inn et lite ClipArt-bilde. Du må da velge verktøyet for<br />

OLE-objekter, og så velge Microsoft Clip Art. Så er det bare å velge bildet du vil ha, i vårt<br />

tilfelle velger vi en bil.<br />

Hovedmenyen ser da slik ut når vi er ferdige:<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 55


Figur 10.6<br />

Innføring i databaser<br />

10.4.4 Skjema <strong>med</strong> underskjema<br />

Tilslutt kommer rosinen i pølsa: et skjema <strong>med</strong> underskjema. Vi bør ha et skjema der vi legger<br />

inn eiere, og der kan godt bilene de eier vises i et underskjema. For å få til dette trenger vi et<br />

velg post-skjema for eiere og baserer det på en spørring vi kaller Q_Eierliste. Så må vi lage en<br />

spørring til underskjemaet, den må inneholde de interessante dataene fra T_Bil slik at vi kan<br />

vise dem i underskjemaet, og Eier, slik at vi kan vise bare de bilene personen eier. Vi kan kalle<br />

den Q_Eide biler.<br />

Selve skjemaet lages <strong>med</strong> Skjema <strong>med</strong> underskjema-veiviseren, og baseres på Q_Eiereliste,<br />

mens underskjemaet som sagt baseres på Q_Eide biler. På hovedskjemaet skal alle feltene<br />

unntatt ID, som jo ikke er interessant for noen, vises, mens på underskjemaet tar vi <strong>med</strong><br />

Registreringsnummer og Merke. (Eier behøver ikke vises, den må bare være i spørringen.)<br />

Mens veiviseren lager skjemaet spør den om navnet på underskjemaet, det er som det skal<br />

være. Den klarer heller ikke å lage en kobling mellom skjemaene selv, men det kan vi ordne for<br />

den. Etter å ha tatt vekk postvelgere, navigasjonsknapper og rullefelter kan du gå inn på<br />

egenskapene til underskjemaet. Der må KobleOverordnetFelt og KobleUnderordnetFelt settes<br />

til henholdsvis ID (som er i hovedskjemaet) og Eier (som er i underskjemaet).<br />

Da er skjemaet klart, og ser slik ut:<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 56


Figur 10.7<br />

Innføring i databaser<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 57


1<strong>1.</strong> Rapporter i Access<br />

1<strong>1.</strong>1 Skjemaer/rapporter - forskjeller og likheter<br />

Innføring i databaser<br />

Skjemaer og rapporter er svært like, forskjellen er stort sett at rapporter er helt passive og<br />

beregnet på å skrives ut. Det betyr at innholdet i tekstboksene ikke kan endres og at knapper,<br />

listebokser, kombinasjonsbokser og andre kontroller ikke finnes.<br />

I tillegg kommer det inn en del nye ting, som sideinndeling, topp- og bunntekster og slikt. Det<br />

er også lagt en del bedre til rette for aggregatfunksjoner og gruppering i rapporter enn i<br />

skjemaer.<br />

I en jobbsituasjon der noen har bestilt databasen blir det ofte mange rapporter, og mye pirk<br />

over hvordan de skal se ut. Brukerne har som regel enten meget bestemte, men svært uklare<br />

krav til hvordan rapportene skal se ut, eller svært klare og helt ufravikelige meninger.<br />

1<strong>1.</strong>2 Hvordan lage rapporter<br />

Rapporter lages på samme måte som skjemaer. Elementene redigeres og endres på samme<br />

måte, og inndelingssystemet er det samme. Veiviserene er også stort sett de samme som for<br />

skjemaer. (Se avsnitt 1<strong>1.</strong>5.)<br />

Inndelingene følger det samme systemet som i skjemaene, men er litt mer avanserte. Følgende<br />

inndelinger finnes:<br />

• Topp-/bunntekst i rapport<br />

Dette er en del som kommer aller øverst i rapporten og aller nederst.<br />

• Topp-/bunntekst på side<br />

Denne delen gjentas øverst og nederst på hver side, uavhengig av alt annet.<br />

• Topp-/bunntekst til gruppering på felt<br />

Det som står her gjentas en gang for hver verdi i feltet du har gruppert på. Det er fullt mulig<br />

å ha flere slike og der<strong>med</strong> få grupper inne i grupper. Detaljene følger den innerste<br />

grupperingen. Eksempelvis kunne man gruppere soldatene først på kompani, og deretter på<br />

tropp, og la detaljen være enkeltsoldater.<br />

Det er da mulig å gjøre separate beregninger for kompani og soldat, og også mulig å<br />

kombinere disse. Mer om dette i avsnitt 1<strong>1.</strong>6.<br />

• Detalj<br />

Detaljen er eksakt den samme som i skjemaer.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 58


1<strong>1.</strong>3 Et enkelt eksempel<br />

Innføring i databaser<br />

Vi lager en enkel rapport, bare for å illustrere hvordan det gjøres. Har du fått til skjemaer<br />

skulle du ikke ha store problemer <strong>med</strong> dette. Jeg velger å lage en liste over alle bileierene i<br />

databasen. Den baseres på en dertil egnet spørring (Q_Personer), og lages fra bunnen av.<br />

I ‘topptekst side’ setter vi inn et tekstfelt <strong>med</strong> teksten ‘Bileieroversikt’ som midtstilles og<br />

gjøres stor. Deretter settes kolonneoversikter inn under, og en linje trekkes under disse. (Siden<br />

må utvides til 16 på den horisontale linjalen for å få plass til alt.)<br />

Under detalj settes feltene inn. Det lønner seg å bruke Ctrl til å gjøre detaljen så liten som<br />

mulig, slik at listen ikke tar mer plass enn nødvendig.<br />

Tilslutt kan vi sette inn en liten festlig sak på bunntekst side. Trekk opp feltet, og gå inn på<br />

egenskapen kontroll-kilde <strong>med</strong> de tre prikkene (...) til høyre. I uttrykks-byggeren kan du velge<br />

‘Vanlige uttrykk’ og ‘Sidetall’. Nå vil sidetallet vises der du trakk opp feltet. (Pass på å at det<br />

står = aller først i feltet.)<br />

Prøv dette selv for å få se resultatet.<br />

1<strong>1.</strong>4 Hvordan bruke en rapport<br />

Når en rapport åpnes kjøres spørringen den er basert på, og vi får noe som ser ut som et Worddokument.<br />

Det kan enten forhåndsvises på samme måte, eller skrives ut på samme måte, men<br />

den kan ikke endres direkte.<br />

Også fra knapper i skjemaer kan en av to kommandoer utløses: forhåndsvis rapport eller skriv<br />

ut rapport. Begge ligger under rapport-operasjoner i knapp-veiviseren.<br />

Utskrift gjøres <strong>med</strong> Ctrl+P, og derfra fungerer alt som ellers i Windows. Nederst på skjermen<br />

er det navigasjonsknapper som kan brukes til å bla mellom sidene, mens musa kan brukes til å<br />

zoome inn og ut. (Et klikk er inn, deretter er neste ut, og så inn igjen... Det zoomes inn på<br />

stedet der du klikket.)<br />

1<strong>1.</strong>5 Rapportveiviserne<br />

Akkurat som for skjemaer finnes det en rekke rapportveivisere som hjelper deg <strong>med</strong> å lage<br />

rapporter. De er nyttigere enn skjemaveiviserene, i og <strong>med</strong> at resultatet ikke blir så stygt som<br />

for skjemaene. De sparer deg som regel også for masse småjustering og fikling, selv om det<br />

alltid er litt igjen.<br />

Veiviserene er:<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 59


Innføring i databaser<br />

Navn Beskrivelse<br />

Enkolonne Som enkolonne for skjemaer, nesten ubrukelig.<br />

Grupper/totaler Se avsnitt 1<strong>1.</strong>6.2.<br />

Etiketter Brukes til adresseetiketter og andre typer etiketter.<br />

Summering Som grupper/totaler, men <strong>med</strong> litt ekstra for summeringer.<br />

Tabell Som tabell for skjemaer.<br />

AutoRapport Som AutoSkjema.<br />

1<strong>1.</strong>6 Rapporter <strong>med</strong> gruppering<br />

Tabell 1<strong>1.</strong>1<br />

1<strong>1.</strong>6.1 Hva er gruppering, og hvorfor bruke det?<br />

Gruppering for rapporter er akkurat det samme som for spørringer, men man kan gjøre litt<br />

andre ting <strong>med</strong> det. (Gruppering i spørringer står forklart i avsnitt 7.5.4.) Dersom du for<br />

eksempel vil vise alle kurs og for hvert kurs alle påmeldte soldater vil du dersom du ikke<br />

grupperer få noe a la Tabell 1<strong>1.</strong>2.<br />

Kursnavn Soldat<br />

Innføring i databaser Stein Arne Slåtten<br />

Innføring i databaser Ingvald Strømme<br />

Innføring i databaser Tommy Wilson<br />

Strikkekurs Kjetil Ravnås<br />

Strikkekurs Arvid Gundersen<br />

Tabell 1<strong>1.</strong>2<br />

Dette er resultatet fra spørringen. Hvis vi nå lager en rapport der detaljen inneholder Kursnavn<br />

og Soldat, og så har en topp- og bunntekst i rapporten vil rapporten se ut omtrent som<br />

spørringen. Problemet <strong>med</strong> det er åpenbart: kursnavnet gjentas for hver eneste soldat. Da er en<br />

løsning av følgende type langt mer interessant:<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 60


Innføring i databaser<br />

Stein Arne Slåtten<br />

Ingvald Strømme<br />

Tommy Wilson<br />

Strikkekurs<br />

Kjetil Ravnås<br />

Arvid Gundersen<br />

Påmeldinger<br />

Innføring i databaser<br />

Dette kan du få til ved å gruppere på kurs og ha en egen topp- og bunntekst for hvert kurs.<br />

1<strong>1.</strong>6.2 Grupperingsveiviseren<br />

Grupperingsveiviseren guider deg gjennom det å lage en rapport <strong>med</strong> gruppering. Som regel er<br />

dette den greieste måten å gjøre det på. Som eksempel skal vi lage en oversikt over bilene til<br />

hver enkelt bileier, basert på spørringen i Figur 7.4.<br />

Ny rapport opprettes ved å velge rapportkortet i databasevinduet og trykke Ny-knappen.<br />

Deretter velger du spørringen den skal baseres på og Grupper/totaler-veiviseren.<br />

Deretter går veiviseren gjennom følgende skritt:<br />

<strong>1.</strong> Velg ut feltene som skal være <strong>med</strong> i rapporten. Dette er kjent kost fra skjemaene.<br />

2. Velg feltene du vil gruppere på i rekkefølge. Dette fungerer på samme måte som skritt <strong>1.</strong><br />

3. Her velger du hvordan du skal gruppere på hvert enkelt felt. Dette kan du bare hoppe over i<br />

99% av tilfellene.<br />

4. Så må du avgjøre hvordan du vil sortere postene. (Merk: dette er innen hver enkelt gruppe.)<br />

5. Her velger du stil og om du vil ha stående eller liggende utskrift.<br />

6. Siste skritt er å velge tittel.<br />

1<strong>1.</strong>6.3 Bruk av inndelingene<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 61


Figur 1<strong>1.</strong>1<br />

Innføring i databaser<br />

Figur 1<strong>1.</strong>1 viser resultatet av å kjøre veiviseren Grupper/totaler. Når du viser denne rapporten<br />

legges først toppteksten i rapporten (Report header) inn, deretter topptekst side (som siden<br />

gjentas for hver side) og så topptekst Navn hvorpå en detalj for hver post <strong>med</strong> samme navn<br />

legges på.<br />

Det som står under topptekst side (Page header) er etiketter, så de er de samme på hver side.<br />

Det som står under detalj og topptekst Navn, derimot, er tekstbokser, så de fylles inn <strong>med</strong><br />

verdier fra spørringen. Feltene i toppteksten får verdiene til den første posten i den inndelingen,<br />

og dersom feltverdiene (som f.eks. for Navn) er de samme for alle postene er det OK. (Hvis<br />

ikke vil rapporten bli misvisende, men Access vil ikke protestere.)<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 62


Innføring i databaser<br />

1<strong>1.</strong>6.4 Sideinndeling<br />

Ofte er man interessert i å ha utskriftene slik at hver ny gruppe begynner øverst på et nytt ark.<br />

Dette kan gjøres ved å endre egenskapen TvingSideSkift hos inndelingene. Som regel endrer<br />

du den hos topptekst til gruppen, men alle inndelingene har denne egenskapen.<br />

TvingSideskift kan ha verdiene: Ingen, Før inndeling, Etter inndeling og Før og etter. Hvis du<br />

velger Ingen vil nye grupper komme på samme side som de forrige så lenge det er plass.<br />

Velger du Før inndeling settes sideskiftet inn foran hver ny gruppe. Velger du Etter inndeling<br />

settes sideskiftet inn etter inndelingen. Hvis dette er Topptekst for gruppen vil sideskiftet<br />

komme mellom toppteksten og detaljene. Velger du Før og etter blir sideskiftene satt inn både<br />

før og etter, slik at hver slik inndeling kommer på en side for seg.<br />

1<strong>1.</strong>6.5 Gruppering- og sorteringsinnstillingene<br />

Dersom du vil lage rapporten selv fra bunnen av, eller vil endre gruppering/sortering så kan du<br />

gjøre det ved å klikke <strong>med</strong> høyre mustast i det hvite feltet øverst til venstre i skjema-designvinduet.<br />

I hurtigmenyen kan du så velge Gruppering og sortering. Da kommer vinduet under<br />

opp (Figur 1<strong>1.</strong>2).<br />

Figur 1<strong>1.</strong>2<br />

Hver rad i tabellen er et felt det skal grupperes på, og rekkefølgen her er svært viktig. Skal du<br />

se kurs for hver soldat, eller deltagere for hvert kurs? Slike spørsmål er det som avgjøres av<br />

rekkefølgen. I kolonnen sorteringsrekkefølge stilles hvordan det skal sorteres på feltet.<br />

I et eget vindu under vises egenskapene til hver enkelt gruppering. ToppTekstforGruppe<br />

avgjør om grupperingen skal ha en egen topptekst eller ikke. (Tilsvarende for BunnTekstfor-<br />

Gruppe.) GrupperEtter skal i 99% av tilfellene være Hver verdi, mens GrupperingsIntervall<br />

nesten alltid er <strong>1.</strong> HoldSamlet avgjør om alle postene som tilhører samme gruppe skal vises på<br />

en side eller om de kan spres utover flere.<br />

1<strong>1.</strong>7 Aggregatfunksjoner<br />

Du kan sette inn tekstbokser <strong>med</strong> uttrykk som bruker aggregatfunksjoner i inndelingene i en<br />

rapport. Disse aggregatfunksjonene vil da gjelde over alle postene som hører til denne<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 63


Innføring i databaser<br />

inndelingen. F.eks. kan du i Topptekst kursnavn sette inn en boks <strong>med</strong> teksten<br />

‘=Antall(ID_Soldat)’, og denne vil da telle antall soldater som hører inn under hvert kurs. (De<br />

andre aggregatfunksjonene ville ha reagert på tilsvarende måter.)<br />

Setter du inn en slik aggregatfunksjon i topp- eller bunntekst i en rapport vil den gjelde alle<br />

postene i rapporten. Denne metoden er mye enklere enn å bruke aggregatfunksjonene i<br />

spørringene, og anbefales brukt istedet.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 64


12. Fullstendige applikasjoner i Access<br />

12.1 Selvstartende databaser<br />

Innføring i databaser<br />

Det er mye enklere for bruker om han slipper å starte opp hovedmeny-skjemaet selv. Det gir<br />

dessuten et helt annet inntrykk av programmet om bruker aldri ser databasevinduet, men<br />

istedet presenteres for en hovedmeny direkte. Dette gjøres svært enkelt: dersom en database<br />

inneholder en makro som heter AutoExec startes denne automatisk. Det er der<strong>med</strong> bare å lage<br />

en makro som åpner hovedmenyen og heter AutoExec.<br />

Denne lager du ved å velge makro-kortet i databasevinduet, og trykke på Ny-knappen. Som<br />

første instruksjon setter du opp ‘UtførMenykommando’, og under argumenter (nederst på<br />

siden) setter du opp Menylinje=Database, Menynavn=Vindu og Kommando=Skjul. Denne<br />

instruksjonen skjuler databasevinduet for brukeren. Det kan hentes frem igjen <strong>med</strong> kommandoen<br />

Vindu | Ta frem.<br />

Neste instruksjon skal åpne hovedmenyskjemaet automatisk, og til det brukes ÅpneSkjema.<br />

Deretter er det bare å sette argumentet Skjemanavn til det riktige navnet, og makroen er klar.<br />

Dersom du lukker vinduet blir du bedt om et navn, og der skriver du AutoExec.<br />

12.2 Feilsjekking<br />

Skal andre enn deg bruke databasen bør du sjekke den grundig for feil, ellers vil du nesten<br />

garantert få noen sure overraskelser. Brukerne som regel frustrert over å finne feil, hvilket er<br />

enda en grunn til å bruke tid på dette. Under testingen gjelder det å være hard mot seg selv og<br />

prøve bevisst på å kræsje systemet. Skal du finne feil må du prøve å gjøre ting du selv ikke har<br />

tenkt på at noen kunne finne på å gjøre, så etter å ha grovtestet selv bør du sette en av de<br />

fremtidige brukerne til å teste resten.<br />

Access er forferdelig dårlig på feilmeldinger. Som regel får du ikke beskjed om hva som er<br />

galt, og det er direkte elendig av Microsoft. Dette gjør det enda vanskeligere å finne ut hva<br />

som er feil. Feilfjerning er under normale forhold vanskelig, og krever både intuisjon, erfaring<br />

og stahet, og i Access er det enda verre. Likevel er det bare å holde ut, det går lettere<br />

etterhvert som du lærer å kjenne igjen de vanligste feilene du gjør.<br />

12.3 Lage ikon for databasen i Programbehandling<br />

Dette gjøres svært enkelt: gå inn i Programbehandling. Velg Fil | Ny | Programobjekt. Skriv inn<br />

navnet på databasen (eks:’Bilutleieregister’) under Beskrivelse. På Kommandolinje skriver du<br />

path til Access fulgt av \MSACCESS.EXE, mellomrom og databasens filnavn (<strong>med</strong> path.) Så<br />

trykker du OK og flytter ikonet til riktig gruppe.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 65


12.4 Sikkerhet<br />

Innføring i databaser<br />

Access har ganske dårlig sikkerhet i forhold til slettede poster, slik at jevnlig backup er å<br />

anbefale. Alt som da trengs er å ta kopi av .MDB-filen, som inneholder hele databasen. Access<br />

lager også en .LDB-fil, men den trengs ikke.<br />

Dersom du komprimerer databasen <strong>med</strong> komprimeringsprogrammer som f.eks. PkZip eller<br />

ARJ kan du regne <strong>med</strong> ganske god komprimering, ettersom databaser ikke bruker særlig<br />

plassbesparende lagringsformater.<br />

12.5 Databaser i nettverk<br />

Det er fullt mulig å lage en Access-database som kan brukes av flere brukere samtidig, og deles<br />

over et nettverk. Selve databasen behøver ikke å lages annerledes av den grunn, men oppsettet<br />

må gjøres litt annerledes. Dette er egentlig et temmelig stort område, så vi skal ikke gå i<br />

dybden på dette her.<br />

Den enkleste (og mest primitive!) måten å dele en database på er å gå inn på Vis|Alternativer i<br />

menyen, og velge Flerbruker/ODBC. Der stiller du Standard postlåsing til ‘Endret post’ og<br />

Standard åpenmodus for databaser til ‘Delt’.<br />

Nå vil brukere kunne dele databasen uten at de overskriver hverandres endringer dersom de<br />

prøver å endre en post samtidig. Istedet vil de få beskjed om at posten er låst, slik at de ikke<br />

kan endre den. Dette kan gjøres mer avansert, blant annet gjennom bruk av Access Basic, men<br />

det går vi ikke inn på her.<br />

12.6 Distribusjon av det ferdige programmet<br />

Det er fullt mulig å lage kommersielle programmer <strong>med</strong> Access. Det vil si: at du enten lager<br />

programmer på bestilling mot betaling eller at du lager mer generelle programmer og utgir<br />

disse. I begge tilfeller vil du ønske å gi din .MDB-fil til brukerne. Problemet er da at brukerne<br />

må ha Access for å kunne kjøre programmet ditt. Dette kan omgås hvis du anskaffer deg<br />

Access Developer’s Toolkit som koster ca 3500,- Der finnes en fil som heter<br />

MSARN200.EXE som du kan gi bort til hvem som helst, og som bare kan brukes til å kjøre<br />

.MDB-filer, ikke lage dem.<br />

Dersom programmet utgis og brukes av andre enn deg selv vil brukerne garantert forlange<br />

endringer etterhvert. De vil også forlange å få beholde sine gamle data. Du står da overfor et<br />

problem, ettersom skjemaer og rapporter (som er det som mest sannsynlig må endres) ligger i<br />

samme fil som dataene. Der<strong>med</strong>: gir du dem en ny tom .MDB-fil må de enten bytte den ut <strong>med</strong><br />

den gamle (og miste dataene) eller importere alt de trenger. (Det siste er ikke en jobb for<br />

uerfarne brukere.)<br />

Løsningen på problemet består i å lage en database som bare inneholder tabellene. Så lager du<br />

en database som inneholder alt det andre, og tilknytter tabellene til denne. Du kan da<br />

distribuere grensesnitt-databasen så ofte du vil, uten at dataene slettes, fordi de ligger i en<br />

annen fil.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 66


13. Veien videre<br />

13.1 Hvordan lære mer<br />

Innføring i databaser<br />

Som jeg gjentar til kjedsommelighet: programutvikling læres ved å gjøre det. Accessmanualene<br />

inneholder helt greie leksjoner i Access og kan brukes sammen <strong>med</strong> kursheftet som<br />

veiledning. Den beste måten å lære på er der<strong>med</strong> å lage flere databaser, og bruke manualene og<br />

dette heftet som støttemateriale.<br />

Det er bare å prøve seg fram <strong>med</strong> både modellering og utvikling. Den beste måten å lære dette<br />

på er ved å ta seg vann over hodet og begi seg ut på noe som egentlig er for vanskelig for en.<br />

Derfor: lag databaser! Dersom ingen gir deg oppdrag, så er det bare å lage bokdatabaser og<br />

platesamlingarkiver. Du bør også lese manualene og lære deg Access Basic hvis du vil komme<br />

noen vei.<br />

13.2 Programutvikling på egenhånd<br />

Dersom du har tenkt å utvikle programmer på egenhånd er det noen tips du bør ha <strong>med</strong> deg.<br />

Det lønner seg å begynne <strong>med</strong> de enkleste delene, og få de til å fungere først. Deretter kan du<br />

gå videre og bygge på til du har fått <strong>med</strong> alt du vil ha <strong>med</strong>. Dersom du synes noe er vanskelig<br />

så vent <strong>med</strong> det.<br />

Skal du begynne på noe du vet er vanskelig så bruk ekstra god tid på planleggingen. Ofte kan<br />

det lønne seg å tenke gjennom skjemaer også på forhånd. Hold på helt til du føler du har<br />

oversikten.<br />

Iblant vil du garantert føle at du har kjørt deg fast i gjørma og mistet oversikten over det du<br />

gjør fullstendig. Eller du kan oppdage at slik du har lagt opp databasen blir det nesten umulig å<br />

få inn neste del. Da er det som regel enklere å begynne på nytt enn å sitte og flikke på det du<br />

allerede har.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 67


14. Tillegg<br />

14.1 Ordliste<br />

Innføring i databaser<br />

• Aggregatfunksjon<br />

En funksjon som brukes i spørringer, slår sammen data innen ett felt fra flere poster til en<br />

verdi. Typiske eksempler: Summere, Gjennomsnitt etc.<br />

• Attributt<br />

Begrep som brukes i datamodellering. Data eller faktum vi ønsker å lagre om en entitet.<br />

• Boolsk uttrykk<br />

Et uttrykk som, når det er ferdig utregnet, gir en boolsk verdi, dvs: sant eller usant. Brukes<br />

som betingelser og krav, f.eks. ved utvalg av poster.<br />

• Enititet<br />

En type gjenstand (gjerne abstrakt begrep) som vi ønsker å registrere data om. Dette kan<br />

typisk være utlån/leie-forhold, personer, biler eller annet. Generelt er det en klasse/mengde<br />

objekter som det finnes flere av, som f.eks. sykler eller bestillinger.<br />

• ER<br />

Entity Relationship, en enkel teknikk for datamodellering. I dette heftet brukes en<br />

forenkling jeg har laget selv.<br />

• Felt<br />

Dette er kolonnene i tabellene. Hver post (dataelement/rad) har en utgave av hvert felt.<br />

• Forretningsregler<br />

Dette er reglene som bestemmer hvordan dataene vi skal lagre i databasen oppfører seg i<br />

den virkelige verden. Dvs: utenfor datamaskinen. Databasen må følge forretningsreglene<br />

etter beste evne.<br />

• Frem<strong>med</strong>nøkkel<br />

Dette er et felt i en tabell som inneholder frem<strong>med</strong>nøkkelen til en post i en annen tabell.<br />

Typisk vil feltet ‘Eier’ i tabellen ‘Bil’ være en frem<strong>med</strong>nøkkel til tabellen ‘Person’, og<br />

verdien i feltet ‘Eier’ vil vise til den personen som eier bilen.<br />

• Hendelse<br />

Hver gang noe skjer i Windows (museklikk, et vindu åpnes eller lukkes, et tastetrykk etc) er<br />

det en hendelse. Til hver hendelse er det knyttet bestemte prosedyrer/makroer som utføres.<br />

Enkelte av disse kan endres av den som lager en database.<br />

• Hurtigmeny<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 68


Innføring i databaser<br />

Dette er en meny som ikke kommer ned fra menylinjen, men som du får opp ved å trykke<br />

<strong>med</strong> høyre mustast på ett eller annet objekt i Access. Denne menyen fungerer som en vanlig<br />

meny, men åpnes altså på en litt annen måte.<br />

• Inndeling<br />

I rapporter og skjemaer er dette forskjellige seksjoner i skjemaet/rapporten som vises på<br />

forskjellige steder og gjentas et forskjellig antall ganger. Topptekst i side vises f.eks. øverst<br />

på hver side, mens Detalj vises en gang for hver post i rapporten/skjemaet.<br />

• Instans<br />

En instans av entiteten Bil er en bestemt bil, f.eks. kaptein Lorentzens Opel Kadett.<br />

• Kandidatnøkkel<br />

Et felt som der alle poster skal ha forskjellige (unike) verdier. Kandidat til å være<br />

primærnøkkel, men behøver ikke være det.<br />

• Kontroll<br />

Et element i et vindu, som knapp, tekstboks, listeboks etc.<br />

• NIAM<br />

Nijssen Information Analysis Method, avansert datamodelleringsspråk. Vesentlig bedre og<br />

mer avansert enn ER, kan anbefales.<br />

• Parameter<br />

En verdi som oppgis til en funksjon eller en spørring, og som brukes av disse for å lage<br />

output’en. (Omtrent det samme som x i f(x) i skole-matematikken.)<br />

• Post<br />

En rad i en tabell, et sett <strong>med</strong> data om en entitet, dvs det vi har data om i tabellen. F.eks. er<br />

en post i tabellen ’Person’ et fullstendig sett <strong>med</strong> data om en bestemt person.<br />

• Primærnøkkel<br />

Et felt i en tabell som brukes for å identifisere postene i tabellen. For personer ville dette<br />

typisk vært personnummer, for biler registreringsnummer.<br />

• Prosedyre<br />

En makro, et uttrykk eller en samling instruksjoner i Access Basic som beskriver hvordan<br />

noe skal utføres. Med andre ord: en liten bit av et Access-program som er samlet til en<br />

enhet og gitt et navn.<br />

• Query<br />

Engelsk for spørring.<br />

• Rapport<br />

En rapport er en liste <strong>med</strong> data fra databasen som er beregnet på å skrives ut på papir. Dette<br />

kan typisk være oversiktslister, statistikk/opptelling mm.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 69


Innføring i databaser<br />

• Relasjon<br />

En sammenkobling av to tabeller. Relasjoner representeres ved frem<strong>med</strong>nøkler. Uttrykker et<br />

forhold mellom postene i to forskjellige tabeller.<br />

• Skjema<br />

Et skjema er et skjermbilde, som kan brukes til å endre data, vise informasjon eller som<br />

meny.<br />

• Spesifikasjonsspråk<br />

Et sett <strong>med</strong> regler for hvordan en datamodell skal tegnes. Eksempler er ER og NIAM.<br />

• Spørring<br />

Spørringer trekker ut og kombinerer data fra forskjellige tabeller for å lage lister. De kan<br />

også brukes til å endre, slette og opprette nye data.<br />

• SQL<br />

Programmeringsspråk som er spesiallaget for bruk i relasjonsdatabaser. Brukes til å lage<br />

spørringer, men også til å definere tabeller og oppdatere data. Finnes i Access, som også har<br />

alternativer til SQL.<br />

• Tabell<br />

Tabellene er der alle data i en database lagres. Tabellene beskriver hva slags data som skal<br />

ligge i en database, men ikke noe mer.<br />

14.2 Vanlige kommandoer<br />

• Endre relasjon<br />

For å endre relasjonene i en database: få opp databasevinduet og velg Redigere | Relasjoner<br />

i menyen. Relasjoner endres ved å klikke på dem <strong>med</strong> musa. Høyre mustast gir adgang til<br />

egenskaper etc, mens du etter å ha valgt relasjonen kan slette den <strong>med</strong> Del.<br />

• Endre kobling mellom tekstboks og felt<br />

Dette styres av egenskapen Kontrollkilde i tekstboksen.<br />

• Endre gruppering/sortering i rapport<br />

Klikk <strong>med</strong> høyre mustast på det hvite feltet øverst til høyre i redigeringsvinduet. Velg<br />

Gruppering/sortering.<br />

• Endre hvilken spørring skjema/rapport er basert på<br />

Dette er en egenskap ved hele skjemaet/rapporten: Postkilde.<br />

• Fjerne postvelgere, navigasjonsknapper og rullefelt i skjema<br />

Dette styres av skjemaets egenskaper: Postvelgere, Navigasjonsknapper og Rullefelt.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 70


Innføring i databaser<br />

• Endre farger i et skjema<br />

Dette gjøres enklest dersom du får opp palett-verktøy-linjen. (Vis | Palett i menyen.)<br />

14.3 Vanlige feil<br />

• Jeg endret en tabell/spørring, men kan ikke se noe resultat av det i spørringen/<br />

skjemaet/rapporten der jeg bruker tabellen/spørringen<br />

Du kan ha glemt å lagre endringen, men mer sannsynlig har du glemt å lukke<br />

spørringen/skjemaet/rapporten der du skal bruke resultatet og åpne den igjen, slik at den får<br />

<strong>med</strong> seg endringen.<br />

• Prøvde å lage en relasjon, men fikk feilmeldingen: “Feil type i relasjon”<br />

De to feltene du prøver å koble sammen har forskjellige typer. To felter <strong>med</strong> en relasjon<br />

imellom seg må alltid ha samme type.<br />

• Endret typen på et felt i en tabell, men fikk feilmelding om konverteringsfeil<br />

Det finnes data i tabellen som ikke lar seg oversette fra den gamle typen til den nye. Her er<br />

det ikke så mye annet å gjøre en å gå inn i tabellen og se om dette betyr at konverteringen<br />

må droppes, eller om dataene er gale.<br />

• Når jeg åpner spørringen/skjemaet/rapporten får jeg en dialogboks der jeg må skrive inn<br />

en verdi til et av feltene<br />

Du har sannsynligvis feilstavet feltnavnet slik at Access tror det dreier seg om en parameter.<br />

• Når jeg viser skjemaet mitt kommer det opp en dialogboks der jeg må skrive inn tekst, og<br />

denne teksten kommer der jeg lagde en etikett i skjemaet<br />

Du har laget en tekstboks istedetfor en etikett.<br />

14.4 Litteratur<br />

• MS Access-manualene<br />

• Innføring i database, Kjetil Nyhus (kursheftet til dette <strong>kurset</strong> kontingenten 0196)<br />

• Kompendium for IN 113 - Dataorientert systemutvikling, Ragnar Normann og Jan Erik<br />

Ressem, Institutt for Informatikk, Universitetet i Oslo<br />

• MS Access 2.0 grunnkurs og videregående, DataPower<br />

• Data i fokus, Gerhard Skagestein, Universitetsforlaget<br />

• PCWorld Norge 03/96<br />

14.5 Takk til<br />

• Knut <strong>Garshol</strong><br />

Min far leste gjennom dette kursheftet og viste seg å være svært flink til å avdekke svake<br />

punkter i teksten, og gav meg flere verdifulle råd og tips om formulering og innhold.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 71


Innføring i databaser<br />

• Kjetil Ravnås<br />

Kjetil leste korrektur på heftet da det var nesten ferdig, og luket ut en rekke småfeil.<br />

• Kjetil Nyhus<br />

Nyhus holdt dette <strong>kurset</strong> i kontingentene 1095 og 0196. Da han dimitterte lot han meg få<br />

kursheftet han hadde laget. Jeg har stjålet noen av hans ideer og poenger, og er takknemlig<br />

for å ha fått sjansen til det.<br />

• Rolf-Anders Moldeklev<br />

Rolf-Anders kom <strong>med</strong> en rekke gode forslag etter å ha brukt heftet til selvstudium. Ikke alle<br />

ble fulgt, og noen snek seg inn i undervisningsopplegget istedet.<br />

• Meg selv<br />

Jeg holdt i 0496 kontingenten et kurs i Innføring i EDB der MS Word ble gjennomgått. Å<br />

lage dette <strong>kurset</strong> gav meg en god forståelse av Word, som var til stor hjelp når jeg skulle<br />

lage dette kursheftet.<br />

1096 - <strong>Lars</strong> <strong>Marius</strong> <strong>Garshol</strong> 72

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!