IBE151: Løsningsforslag, eksamen 2017

Submitted by lroedal on Thu, 12/21/2017 - 00:47

Fikk tilsendt en tekstutgave av eksamen for 2017, og har ut fra dette snekret sammen et løsningsforslag. Jeg har ikke testet dette i Access, så tar forbehold om at jeg kan ha kodet noe feil, evt. at det kan være feil i oppgaveteksten jeg gikk ut i fra. Koden kan dere se under.

Oppgave 1.1 Antall bøker solgt

Vi har et skjema der det er en komboboks der en velger bok. Beskriv SQL setningen for å velge ut titler fra tabellen Salg. Skjemaet har en knapp med tekst Antall, som teller opp det totale antall bøker solgt. Vis koden som hører til ”on-click eventet” for denne knappen. Svaret, antall bøker solgt, kan gis i en melding.

  1. Dim stdset as dao.recordset
  2. Dim strsql as string
  3. Dim totalSalg as Long
  4.  
  5. ‘antar at comboboksen heter cmbTittel
  6. strsql = “SELECT tittel, antall FROM Salg WHERE tittel = ‘“ & cmbTittel & “‘“
  7. set stdset = currentdb.openrecordset(strsql)
  8.  
  9. Do until stdset.eof
  10.     totalSalg = totalSalg + stdset!antall
  11.     stdset.movenext
  12. Loop
  13.  
  14. Msgbox(“Det er solgt “ & totalSalg & “ av boken “ & cmbTittel)

Oppgave 1.2 Antall større salg

Skjemaet har en knapp Større salg. Her skal vi kun telle opp salg der antallet er 2 eller høyere. Programmer koden for dette.

  1. ‘Antar at vi her skal summere antallet salg med mer enn to bøker, 
  2. ‘fremfor antallet solgte bøker i disse ordrene.
  3. ‘Alternativ en
  4. Dim stdset as dao.recordset
  5. Dim strsql as string
  6. Dim antSalg as Long
  7.  
  8. ‘antar at comboboksen heter cmbTittel
  9. strsql = “SELECT tittel, antall FROM Salg WHERE tittel = ‘“ & cmbTittel & “‘ AND antall > 1”
  10. set stdset = currentdb.openrecordset(strsql)
  11.  
  12. Do until stdset.eof
  13.     antSalg = antSalg + 1
  14.     stdset.movenext
  15. Loop
  16.  
  17. Msgbox(“Det er “ & totalSalg & “ salg med to eller flere bøker.”)
  18.  
  19. ‘Alternativ to
  20. Dim stdset as dao.recordset
  21. Dim strsql as string
  22. Dim antSalg as Long
  23.  
  24. ‘antar at comboboksen heter cmbTittel
  25. strsql = “SELECT tittel, antall FROM Salg WHERE tittel = ‘“ & cmbTittel & “‘“
  26. set stdset = currentdb.openrecordset(strsql)
  27.  
  28. Do until stdset.eof
  29.     If antall > 1 then
  30.         antSalg = antSalg + 1
  31.     End if
  32.     stdset.movenext
  33. Loop
  34.  
  35. Msgbox(“Det er “ & antSalg & “ salg med to eller flere bøker.”)


1.3 Inntekter

I systemet ligger en tabell Prisliste med følgende felt:
Tittel
Pris
I grensesnittet er det en knapp for Finn sum. Når denne trykkes skal systemet regne ut summen i kroner av alle salg for den oppgitte boken. Programmer dette. Svaret (summen) gis som en melding.

  1. dim stdset as dao.recordset
  2. dim strsql as string
  3. dim sum as double
  4.  
  5. ‘Ville opprettet en spørring, som henter inn “Pris” fra tabellen “Prisliste”, “Tittel” fra “Salg” og “Antall” fra “Salg”. I tillegg ville jeg hentet inn ordrenr. eller lignende fra “Salg” - slik at jeg får opp alle unike salg i oversikten.
  6. strsql = “SELECT * FROM qrySalg WHERE Tittel = *” & cmbTittel & “‘“
  7. set stdset = currentdb.openrecordset(strsql)
  8.  
  9. Do Until stdset.EOF
  10.     sum = sum + (stdset!Pris * stdset!Antall)
  11.     stdset.movenext
  12. Loop
  13. Msgbox(“Det er solgt for “ & sum & “ kroner av boken “ & cmbTittel)


Oppgave 1.4 Velg ut år

Beskriv en komboboks der bruker kan velge et årstall (vis SQL setningen som henter årstall fra salg). Løs oppgave 1.1 på nytt, men ta nå kun med bøker solgt i det oppgitte året.

'SQL-setning for comboboksen cmbÅr: “SELECT DISTINCT Year(salgsdato) FROM Salg”
  1. Dim stdset as dao.recordset
  2. Dim strsql as string
  3. Dim totalSalg as Long
  4.  
  5. ‘antar at comboboksene heter cmbTittel og cmbÅr
  6. strsql = “SELECT tittel, antall FROM Salg WHERE tittel = ‘“ & cmbTittel & “‘ AND YEAR(salgsdato) = “ & cmbÅr
  7. set stdset = currentdb.openrecordset(strsql)
  8.  
  9. Do until stdset.eof
  10.     totalSalg = totalSalg + stdset!antall
  11.     stdset.movenext
  12. Loop
  13.  
  14. Msgbox(“Det er solgt “ & totalSalg & “ av boken “ & cmbTittel & “ i “ & cmbÅr)

Under innskriving av tekst er det lett å legge inn for mange blanke. Programmer knappen Fjern unødvendige blanke som fjerner alle forekomster av to eller flere blanke etter hverandre.

  1. ‘antar at teksten ligger lagret i variabelen “tekst”
  2. Dim ord() as String
  3. Dim ferdigtekst as string
  4. ord = Split(tekst, “ “)
  5. For i = Lbound(ord) to Ubound(ord)
  6.     If not ord(i) = “” Then
  7.     ferdigtekst = ferdigtekst & tekst & “ “
  8. Next i

Forlaget i oppgave 1 har en egen avdeling for fagbøker. Disse har sitt eget datasystem med tabellen Salg. Her legger de inn salg i hver måned. Etter at måneden er over sender de innholdet av Salg til hovedkontoret som en tekstfil med navn salgsdata.txt i følgende format som du ser i bildet ovenfor.

Altså dato, tittel og antall solgt med en blank mellom hvert datafelt. Programmer en knapp Importer som leser data i tekstfilen (salgsdata.txt) og legger dette inn i tabellen Salg i hovedkontorets system. Du kan gå ut fra at tekstfilen ligger i samme mappe som programmet.

Vil løsningen din fungere om det er blanke tegn i boktittelen, for eksempel ”Programmering VB” og ”Betonglære 1”? Beskriv hvordan du vil løse dette.

  1. Dim filnavn, linje, tittel as String
  2. Dim filnr, antSolgt as Long
  3. dim dato as Date
  4. Dim data() as String
  5. filnavn = CurrentProject.Path & “/salgsdata.txt” ‘leser inn filen fra samme mappe som Access-filen
  6. filnr = FreeFile()
  7.  
  8. Open filnavn for Input as #filnr
  9. Do until EOF(filnr)
  10.     Line Input #filnr, linje
  11.     tittel = “”
  12.     data = Split(linje, “ “)
  13.     dato = data(LBound(data))
  14.     antSolgt = data(Ubound(data))
  15.     
  16.     For i = (Lbound(data) + 1) to (Ubound(data) - 1)
  17.         tittel = tittel & data(i) & “ “
  18.     Next i
  19.     tittel = Mid(tittel,1,Len(tittel) - 1) 
  20. ‘fjerner det overflødige mellomrommet etter tittelen
  21.  
  22. strsql = “INSERT INTO Salg ([Dato], [Tittel], [Antall]) VALUES (“ & dato & “, ‘“ & tittel & “‘,” & antSolgt & “)”
  23. currentdb.execute(strsql) 
  24. Loop
  25. Close #filnr

Oppgave 4.1 Innlesing til array

Programmer en knapp LesInn som leser inn antallet fra tabellen Salg til et array.

  1. Dim arrSalg as Long()
  2. Dim i as Long
  3. Dim strsql as string
  4. Dim stdset as dao.recordset
  5.  
  6. strsql = “SELECT Antall FROM Salg ORDER BY Antall”
  7. set stdset = currentdb.openrecordset(strsql)
  8.  
  9. Do until stdset.eof
  10.     i = i + 1
  11.     Redim Preserve arrSalg(1 to i)
  12.     arrSalg(i) = stdset!antall
  13.     stdset.movenext
  14. Loop


4.2 Median, odde antall poster, - alle tall ulike

Programmer algoritmen som finner medianen. Her kan du gå ut fra at det er et odde antall poster (”records”) i arrayet og (ikke helt realistisk) at det ikke er like tall i materialet.

  1. ‘Om vi tar utgangspunkt i et odd antall poster og ingen like tall, er det enkelt
  2. ‘Siden tallene er lest inn i rekkefølge
  3. Dim num as Long
  4. dim median as double
  5. num = Ubound(arrSalg) / 2 + 1
  6. median = arrSalg(num)
  7. Msgbox(“Medianen er “ & median)

4.3 Tilpassing til det generelle tilfellet

Se om du kan tilpasse løsningen slik at den også fungerer om det er et partall antall poster og like tall. Kan du programmere dette er det bra, men har du liten tid kan du si litt om hvordan du vil gjøre dette.

  1. ‘I utgangspunktet er det ikke nødvendig å sortere arrayet, siden dette er lest inn og sortert vha. SQL
  2. ‘Men om dette skal gjøres, kan det gjøres slik:
  3. Dim f, s, tmp, median as Long
  4. For f = Lbound(arrSalg) to Ubound(arrSalg)
  5.     For s = f + 1 to Ubound(arrSalg)
  6.         If arrSalg(f) > arrSalg(s) then
  7.             tmp = arrSalg(s)
  8. arrSalg(s) = arrSalg(f)
  9. arrSalg(f) = tmp
  10. End if
  11. Next s
  12. Next f
  13.  
  14. If (Ubound(arrSalg) mod 2) = 0 Then
  15.     ‘Oddetall
  16.     median = arrSalg(ubound(arrSalg) / 2)
  17. Else
  18.     ‘Partall
  19.     median = (arrSalg(ubound(arrSalg) / 2) + arrSalg(1 + ubound(arrSalg) / 2)) / 2
  20. End if
  21. Msgbox(“Medianen er “ & median)