trell.org

Meny for IT-fag

Access-tips

Finne ut om tall er delelig på 10 | Velge parameter ved hjelp av skjema | Skrive ut faktura fra skjema | Opptelling | I stedet for Teller/Autonummer | Summere data fra et underskjema | Nummerere linjer | Beregne plassering i en resultatliste | Oppdatere en lagerbeholdning | Beregne forfallsdato utfra frist i antall dager

Finne ut om tall er delelig på 10

Bruk følgende uttrykk som betingelse:

[Mitt_tall]/10 = Int([Mitt_tall]/10)

Den venstre delen av uttrykket gir som resultat et heltall hvis Mitt_tall er delelig på 10. Den høyre delen av uttrykket gir alltid et heltall som resultat. Uttrykket blir dermed SANT hvis Mitt_tall er delelig med 10, usant hvis ikke. Ønsker man å teste om et tall er delelig med noe annet enn 10, kan man bare bytte ut tallet 10 i betingelsen.

Et slikt uttrykk kan da brukes i f.eks. en IIf-setning.

Et eksempel:

Et felt kan hete Bonuspoeng, og i Kontrollkilde kan det da stå følgende uttrykk:

=IIf([Antall kjøp]/5=Int([Antall kjøp]/5);15;0)

Her får kunden 15 bonuspoeng for hvert 5te kjøp.


Velge parameter ved hjelp av skjema

Parameterspørringer er ofte lite brukervennlige: Brukeren må vanligvis oppgi en kode (f.eks. Kundenr), og da må han slå opp dette først. Skal brukeren i parameterspørringen oppgi f.eks. et navn, så er risikoen der for stavefeil.

For å slippe begge disse ulempene kan man lage et skjema for valg av parameter.

Dette skjemaet skal bare inneholde en kombinasjonsboks, for den parameteren man skal velge, og et par knapper, en for å utføre parameterspørringen (eller den rapporten som skal kjøres på grunnlag av slik spørring), og evt en for å gå ut av skjemaet uten noen handling. Den første knappen kan hete OK eller i dette eksempelet, Vis kunden. Den andre knappen kan hete Avbryt. Her er et eksempel på hvordan et slikt skjema kan se ut:

Velg_kunde skjemaet

La oss anta at dette hjelpeskjemaet heter Velg_kunde og kontrollen som er en kombinasjonsboks for oppslag av kundenavnet heter Kunde_id. Da kan man referere til feltnavnet i parameterspørringen slik:

[Skjemaer]![Velg_kunde]![Kunde_id]

der man ellers ville ha skrevet f.eks. [Oppgi kundenummer:]. (Obs: Pass på at det står [Skjemaer] og ikke [Skjema].)

I hendelsesprosedyren (eller makroen) som ligger i knappen som utfører spørringen (her knappen Vis kunden) må man bare passe på at dette skjemaet er åpent når spørringen kjøres. Det kan så lukkes automatisk etterpå. Hendelsesprosedyren skal dermed ha to linjer: I første linje velges Åpne spørring. Pass her på å velge riktig navn på spørring. I andre linje velges Lukk, Objekttype: Skjema og Objektnavn: Velg_kunde.

Hvis du vil vise informasjonen i en rapport, ikke i en spørring, er fremgangsmåten slik:

I egenskapsarket for rapporten oppgir du under Data og Filter på tilsvarende måte:

[Kundenr]=[Skjemaer]![Velg_kunde]![Kunde_id]

og

Filtrering på: Ja

Hendelsesprosedyren som ligger i Vis kunden-knappen i skjemaet Velg_kunde skal nå ha Åpne rapport i første linje. La gjerne Visning være Forhåndsvisning, så ikke rapporten kommer direkte ut på skriveren.


Skrive ut faktura fra skjema

Det er mange situasjoner hvor det er nyttig å kunne hente verdien fra et felt i et skjema. Det kan alltid gjøres på tilsvarende måte som i forrige tips. Et eksempel er ved utskrift av faktura. Vi har gjerne et hoved/del-skjema for en faktura (med fakturalinjene i delskjemaet). Da er det fint å kunne legge inn en kommandoknapp i hovedskjemaet som skriver ut fakturaen.

En slik kommandoknapp kan ganske enkelt åpne en rapport (i forhåndsvisning) som f.eks. heter Faktura_RP.

I egenskapsarket for rapporten oppgir du under Data og Filter på tilsvarende måte:

[Fakturanr]=[Skjemaer]![Faktura]![Fakturanr]

og

Filtrering på: Ja

I enkelte tilfeller er det behov for å få frem fakturaen utfra et fakturanr eller salgsnr som står i et delskjema. Da må knappen som åpner faktura-rapporten stå i delskjemaet. Delskjemaet må altså lages slik at det blir en tabell-visning, ikke en kolonnevisning. Tabell-visning er nødvendig for å få lagt inn en kommando-knapp i delskjemaet. Koden som står under Filter i egenskapsarket for faktura-rapporten må endres noe for at Access skal finne et felt som befinner seg i et delskjema. Hvis delskjemaet heter f.eks. Salg delskjema, blir uttrykket ovenfor slik:

[Fakturanr]=[Skjemaer]![Salg].[Salg delskjema]![Fakturanr]

Husk fortsatt å bruke "Filtrering på"!


Opptelling

Det er ofte behov for å telle opp forekomster. Det kan f.eks. være antall ganger en kunde har handlet.

Dette går lettest hvis koblingsfeltene har ulikt navn. (Det er tilstrekkelig at feltnavnet i skjemaet er ulikt, tabell-feltet under kan hete det samme).

La oss anta at man i et Faktura-skjema vil ha et felt som viser antall ganger en kunde har handlet hos oss. Det kan da ordnes med en områdemengdefunksjon:

=DCount("[Fakturanr]" ; "Faktura" ; "[Kundenr]=[Kunde_nr]")

Det er viktig å legge merke til at parametrene i områdefunksjonene bruker anførselstegn; alle parametrene skal gis som tegnstrenger. Her er det tre parametre, i "ulogisk" rekkefølge.

  1. Første parameter er den variablen som skal telles opp (det er naturlig å telle opp identifikatoren i en tabell). Her: "[Fakturanr]"
  2. Andre parameter er navnet på det området som skal undersøkes, vanligvis en tabell (eller en spørring). Her: "Faktura"
  3. Tredje parameter er en betingelse. Her er betingelsen: "[Kundenr]=[Kunde_nr]"

Betingelsen i tredje parameter er følsom for feil. Det går best hvis man i en slik betingelse har ulike feltnavn på hver side av likhet/ulikhet. Venstre side refererer til det området (tabell) som står i andre parameter. Høyre side kan referere seg f.eks. til aktuelt skjermbilde (skjema).

For å aktivere en slik oppslagsfunksjon, må skjermbildet oppdateres. Dette kan gjøres ved at brukeren trykker F9, eller ved at det legges inn en makro i VedEndring i et egnet felt. Denne makroen er en enkel sak på én linje, og ser slik ut:

Instruksjon: OppdaterObjekt
Objekttype: Skjema
Objektnavn: xxx

hvor Objektnavn er navnet på det skjemaet som skal oppdateres.


I stedet for Teller/Autonummer

Det er noen ulemper ved å bruke datatypen Teller/Autonummer, eksempelvis i felt av typen Kundenr. Det kan jo hende at man ikke ønsker å starte opptellingen med tallet 1, men med et annet tall, f.eks. 1001. Det kan også hende at man vil slette siste post(er) og fortsette opptellingen fra det som nå er høyeste verdi.

Begge disse behovene kan dekkes ved å velge datatypen Heltall (evt. Byte eller Langt heltall) i stedet for Teller/Autonummer, og legge inn et passende uttrykk for Standardverdi under Feltegenskaper for det tilsvarende feltet i aktuelt registreringsskjema.

Oppgaven blir nå å konstruere et uttrykk som finner hvor stor den største eksisterende verdien er for et felt i en tabell/spørring. Deretter skal dette tilpasses bruk i skjemaet. Et slikt uttrykk kan konstrueres ut i fra områdemengdefunksjonen DMax(). Anvendt på tabellen Kunde med primærnøkkelen Kunde#, kan funksjonen bli slik:

=DMax("[Kunde#]";"Kunde")

Dette gir den største verdien av feltet Kunde# som finnes i tabellen Kunde. Siden alle postene skal gjennomsøkes, bruker vi ikke her noen betingelse. Som standardverdi for skjemafeltet Kundenr kan man da øke denne verdien med 1:

=DMax("[Kunde#]";"Kunde") + 1.

Dette virker greit, bortsett i fra det tilfellet hvor man ønsker å angi en bestemt verdi som startverdi og sikre at denne kommer frem hvis det ikke er registrert noen poster. Da kan man teste på antall registrerte poster først ved å telle opp forekomster som vist under avsnittet Opptelling. Hvis det ikke er noen poster i tabellen vil DCount returnere 0. (I versjoner av Access før Access 2000 kan det hende du må teste mot Null-verdien, ikke tallet 0.) Opptellingen kan gjøres slik:

=DCount("[Kunde#]";"Kunde").

Dette plasseres inne i en betingelse som returnerer en bestemt verdi, f.eks. 1001 hvis opptellingen gir 0. Dette kan da gjøres slik:

=IIf(DCount("[Kunde#]";"Kunde") = 0 ; 1001; DMax("[Kunde#]";"Kunde")+1)


Summere data fra et underskjema

Underskjema har et summeringsfelt som er skjult i kolonnevisning, f.eks. Sum_pris

=Summer([Pris])

Dette feltet kan refereres fra hovedskjemaet slik:

=[Mitt_lille_skjema].[Skjema]![Sum_pris]

Dette blir da alltid oppdatert! (Legg merke til syntaksen, rekkefølgen av skjemanavnet og Skjema, og bruken av punktum i stedet for utropstegn.)


Nummerering/opptelling av poster i en rapport

Ofte har man behov for å nummerere eller fortløpende telle poster i en rapport. Dette kan lett gjøres ved å sette inn et nytt, beregnet felt i detalj-linjen i rapporten. Feltet kan f.eks. hete "Teller". I egenskapsarket skal dette feltet ha følgende innstillinger:

Kontrollkilde: =1

og

Løpende total: Over alle

Dermed får man en enkel opptelling av postene i rapporten. Hvis rapporten er sortert, kan dette bl.a. benyttes til å lage en ordnet liste, f.eks. en resultatliste.


Resultatliste

Som resultatliste er det foregående ikke alltid helt tilfredsstillende, dette skyldes jo at man ønsker at to (eller flere) personer med samme resultat skal ha samme plassering, mens den neste skal ha en plassering som om disse også var nummerert. Slik:

Plassering Startnr Navn Lengde
1 12 Inger 4,05
2 9 Inga 3,80
2 5 Ingrid 3,80
4 11 Ingunn 3,68

Logikken her er at enhver deltakers plassering er lik antallet av de med bedre resultat + 1.

Dette kan enkelt implementeres i en rapport, med f.eks. følgende formel i Kontrollkilde for et nytt, beregnet (avledet) felt som kan kalles Plassering:

=DCount("[Startnr]" ; "Resultat" ; "[Res]<[Resultat]") + 1

Her er det forutsatt at det feltet som inneholder resultatet heter Resultat i tabellen med samme navn, og at feltet som viser Kontrollkilden Resultat i rapporten heter Res (det er lettest å få et greit resultat her hvis disse to feltene har ulike navn). I dette tilfellet er det beste resultatet det som har den høyeste verdien. Rapporten må derfor også sorteres avtagendeResultat. (Se også kommentar om områdefunksjoner under Opptelling ovenfor.)

(Hvis det beste resultatet har den laveste verdien, skal rapporten sorteres stigendeResultat. Ulikheten i tredje parameter i kontrollkilden ovenfor må også snus: "[Res]>[Resultat]".)

Denne metoden for å beregne plassering kan også godt benyttes i et skjema, på helt tilsvarende vis. Da vil man i det beregnede feltet få opp den foreløpige plasseringen for hver deltaker etterhvert som resultatene registreres.


Oppdatere lagerbeholdning

Det er ofte behov for å oppdatere i en annen tabell fra et skjema. Et vanlig eksempel på dette er når man har et kombinert ordre/ordrelinjeskjema. Man vil da gjerne at lagerbeholdningen skal endres når ordren effektueres. En enkel måte å implementere dette på er ved hjelp av en oppdateringsspørring som kalles fra en knapp i ordreskjemaet. Forutsetningen her er at det i ordrelinjetabellen finnes et Ja/Nei-felt som heter Oppdatert og som har som standardverdi Nei. Dette endres da til Ja ved oppdatering.

En aktuell oppdateringsspørring kan se slik ut:

Felt: Antall på lager Oppdatert Varenr
Tabell: Vare Ordrelinje Ordrelinje
Oppdater til: [Antall på lager]-[Ordrelinje]![Antall] Ja
Vilkår: Nei [Vare]![Varenr]

Oppdateringsspørringen virker slik:

Vilkårene settes for tabellen Ordrelinje. For det første skal bare de postene som har Nei i feltet Oppdatert oppdateres. I tillegg skal bare de postene som har riktig Varenr oppdateres, nemlig de som har samme Varenr som i angjeldende orderlinje. Dermed må Varenr i Ordrelinje være lik Varenr i Vare, og denne refereres slik: [Vare]![Varenr].

Med disse to vilkårene utføres da oppdateringene. For det første skal antall varer på lager reduseres. Det gjøres med uttrykket: [Antall på lager]-[Ordrelinje]![Antall]. Dernest skal også posten i Ordrelinje registreres med det at den har blitt oppdatert. Derfor Ja under feltet Oppdatert ved Oppdater til.


Beregne forfallsdato utfra frist i antall dager

Ofte har man bruk for å angi en forfallsfrist med en dato. Dette kan gjelde for betaling av en faktura, for innlevering av en bok el.l. Vanligvis er det i slike tilfeller en fast frist som kan beregnes utfra dagens dato. Eksempelvis betalingsfrist for en faktura på 30 dager. Fristen kan da angis i et felt ved å sette Standardverdi til =Date() + 30. Feltet kan enten lagres eller bare være et visningsfelt i et skjema / en rapport.

Hvis vi har tenkt å operere med ulike frister, blir det hele litt mer komplisert. Da har vi et eget felt, Frist hvor fristen angis i antall dager. Det beregnede forfallet skal automatisk komme i et annet felt, Forfall. Det som da må skje er at idet man legger inn en verdi i feltet Frist så skal verdien for Forfall beregnes. En enkel måte å få til dette på er å legge inn en makro i feltet Frist. Gå inn på egenskapsarket for feltet og velg Hendelse. Ved hendelsen Etter oppdatering klikk på de tre prikkene ... og velg Makroverktøy. Gi makroen et navn (f.eks. Beregn_forfall). Under Handling skal det stå AngiVerdi. Element skal være [Forfall] (dette er det feltet som skal gis verdi) og Uttrykk skal være [Frist]+Date().

Eventuelt kan feltet Frist lages som en kombinasjonsboks slik at brukeren kan velge 1 uke, 2 uker, 1 mnd osv, men verdien som angis må i alle tilfelle være et heltall.



Toppen av siden | Finne ut om tall er delelig på 10 | Velge parameter ved hjelp av skjema | Skrive ut faktura fra skjema | Opptelling | I stedet for Teller/Autonummer | Summere data fra et underskjema | Nummerere linjer | Beregne plassering i en resultatliste | Oppdatere en lagerbeholdning | Beregne forfallsdato utfra frist i antall dager

Meny for IT-fag

kontakt: