1. Hensikten med kurset - Lars Marius Garshol
1. Hensikten med kurset - Lars Marius Garshol
1. Hensikten med kurset - Lars Marius Garshol
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