Praktikopgave hos Royal
Greenland
Poul
Foråret 2003
RGTester
-
en webapplikation
til brug ved oprettelse og gennemførelse
af medarbejderundersøgelser og videnstests
Administration
af undersøgelser og tests
Gennemførelse
af undersøgelser og tests
SpørgsmålOversigt
– Medarbejder
Aflæsning
af valgt udformning af spørgeskemaer
Projektstyringsdelen er ikke fuldt afsluttet og blot
tilføjet for min egen skyld. Som hjælp til projektstyringen er oprettet en Excel-fil med dagsskemaer og faktisk udført arbejde i
forhold til planlagt.
Figur 1
Et system til at håndtere gennemførelse og oprettelse af tilfredshedsundersøgelser og test af medarbejderes vidensniveau. Systemet udarbejdes i .NET og er baseret på en intranetserver, der anvender Microsoft IIS samt en intern Microsoft SQL 2000-server.
Der vil være to forskellige typer af brugere: Brugere, der har mulighed for at oprette og definere en undersøgelse eller test. Og brugere, der skal besvare spørgsmålene i undersøgelsen eller testen.
Spørgsmål, svar og brugere lagres i en database, hvor en sprogkode vil styre at undersøgelsesdeltagerne får serveret spørgsmålene på enten dansk, engelsk, tysk eller grønlandsk. Brugere skal logge ind i systemet, således at man kun får adgang til de undersøgelser, det er bestemt at man skal kunne se. Log ind skal også sikre at man kun får adgang til at besvare spørgsmålene én gang.
Ved tests af viden skal de afgivne svar holdes op mod rigtige svar. Der kan godt være mere end ét rigtigt svar på et spørgsmål. Svarene skal kunne lagres og eksporteres til f.eks. Microsoft Excel. Evt. skal analyse af tests kunne foretages i systemet.
Tilføjelser:
14/4 2003: Der ønskes mulighed for at kunne hente besvarelsesinformation ud for en given medarbejdertype.
Undersøgelse
Medarbejder
Test
Spørgsmål
Svar
Forfatter
Oprettet/Redigeret/Slettet = Administreret
Deltager
Besvaret
Afsluttet
Udløbet
Eksporteret
|
Klasser |
|
|
|
|
|
|
|
Hændelser |
Undersøgelsesskabelon |
Undersøgelse |
Test |
Spørgsmål |
Svar |
Besvarelse |
Medarbejder |
Forfatter |
Administreret |
ü |
ü |
ü |
ü |
ü |
ü |
ü |
ü(ü) |
Deltager |
|
(ü) |
|
|
|
|
(ü) |
|
Afsluttet |
|
ü |
|
|
|
ü |
(ü) |
(ü) |
Besvaret |
|
|
ü |
ü |
(ü) |
|
(ü) |
|
Udløbet |
|
ü |
|
|
|
|
|
|
Eksporteret |
|
|
|
|
|
ü |
|
|
Verificeret |
|
|
(ü) |
|
ü |
|
|
|
Figur 2
(ü) angiver et aktivt objekt i forhold til en hændelse.
Dvs. objektet udfører hændelsen men påføres den ikke. Forfatter er aktiv i forhold til at administrere Undersøgelse og Forfatter bliver selv administreret. Medarbejder er aktiv ved afslutning af en Besvarelse og ved besvarelse af en Test eller et Spørgsmål. Svar er aktiv ved besvarelse af en Test eller et Spørgsmål. Og Test er
aktiv ved verifikation af et svar.
Figur 3
Person er tilføjet, da nogle egenskaber, vil være de samme for en Forfatter og en Medarbejder. Desuden er Besvarelse tilføjet som en ”container” for Svar. Det skyldes, at en række svar naturligt hænger sammen i en besvarelse. Undersøgelsesskabelon er tilføjet for at kunne gemme undersøgelser, der er udløbet eller afsluttet. – Man kunne forestille sig at en undersøgelse kunne genbruges – evt. med ændringer.
Figur 4
Figur 5
Figur 6
Figur 7
Figur 8
Figur 9
Figur 10
Figur 11
|
Klasser |
|
|
|
|
|
|
|
Hændelser |
Undersøgelsesskabelon |
Undersøgelse |
Test |
Spørgsmål |
Svar |
Besvarelse |
Medarbejder |
Forfatter |
Administreret |
* |
* |
* |
* |
* |
* |
* |
* |
Deltager |
|
* |
|
|
|
|
* |
|
Afsluttet |
|
+ |
|
|
|
+ |
+ |
+ |
Besvaret |
|
|
* |
* |
+ |
|
* |
|
Udløbet |
|
+ |
|
|
|
|
|
|
Eksporteret |
|
|
|
|
|
* |
|
|
Verificeret |
|
|
* |
|
+ |
|
|
|
+ betyder at hændelsen kan forekomme nul eller én gang.
* betyder at hændelsen kan forekomme nul eller flere gange.
Figur 12
Administrator. En person, der kan oprette forfattere i systemet.
Forfatter. En person, der kan oprette undersøgelser og medarbejdere, der skal deltage i undersøgelser.
Medarbejder. En person, der kan deltage i undersøgelser og afgive besvarelser.
Eksempler: Medarbejder A er en meget rutineret bruger af Internettet. Medarbejder B er ikke rutineret i brug af Internettet.
Tidsovervåger. Et element i systemet, der overvåger hvornår en undersøgelse skal slettes fordi den eksisterer længere end sin slutdato.
Undersøgelsesadministration
En forfatter logger sig på systemet og får rettigheder til at oprette, redigere eller slette en undersøgelse. Hvis Opret vælges skal forfatteren give undersøgelsen et navn og en slutdato. Herefter oprettes et spørgsmål. Oprettelse af spørgsmål kan gentages så længe det ønskes og til slut kan undersøgelsen gemmes.
Oprettelse af
spørgsmål
Igangsættes af en forfatter, der er i gang med at oprette en undersøgelse. Spørgsmålet gives et navn og en forklaring (selve spørgsmålet). Svartypen (en eller flere givne svarmuligheder eller tekst) og sprogkode vælges. Det angives om spørgsmålet skal være en test og om det evt. er obligatorisk. - I så fald skal et rigtigt svar lægges ind.
Medarbejderadministration
Igangsættes af en forfatter.
Forfatteradministration
Igangsættes af en administrator.
Besvarelsesinformation
Igangsættes af en forfatter. Det angives hvilken undersøgelse, det drejer sig om. Der kan opnås information om besvarelser af undersøgelser med og uden tests. Hvis der ikke er tests indlagt fås blot svarenes fordeling på hver svarmulighed for alle medarbejdere. Hvis der er tests indlagt skal forfatteren vælge en medarbejder og der vil ved hvert spørgsmål være en angivelse af om svaret er rigtigt eller forkert.
Besvarelse
Igangsættes af en medarbejder.
En medarbejder kan få adgang til de
undersøgelser, der er bestemt for vedkommende, når der er logget ind med ID og
password. Undersøgelser kan besvares en af gangen. En besvarelse vælges og den
er tilgængelig for medarbejderen.
Første spørgsmål vises. Spørgsmålet kan besvares eller medarbejderen kan springe til et andet spørgsmål. Når et spørgsmål
skal besvares, skal medarbejderen angive at det valgte svar er en besvarelse og
et svar vil så blive knyttet til den samlede besvarelse. Et svar kan redigeres
så længe den samlede besvarelse ikke er afsluttet. Når alle obligatoriske
spørgsmål eller alle de spørgsmål, der ønskes besvaret, er besvaret, kan medarbejderen afslutte besvarelsen.
Systemet giver besvarelsen en svardato.
Eksport
Igangsættes af en forfatter.
En forfatter kan få adgang til at
eksportere, når der er logget på. Forfatteren
vælger en undersøgelse og systemet spørger, hvor den kommaseparerede fil med
besvarelsesinformation skal gemmes.
|
Aktører |
|
|
|
Brugsmønstre |
Medarbejder |
Forfatter |
Administrator |
Tidsovervåger |
Undersøgelsesadministration |
|
ü |
|
ü |
Medarbejderadministration |
|
ü |
|
|
Forfatteradministration |
|
|
ü |
|
Besvarelse |
ü |
|
|
|
Eksport |
|
ü |
|
|
Figur 13
Funktion
Opret Medarbejder
Rediger Medarbejder
Slet Medarbejder
Opret Undersøgelse
Rediger Undersøgelse
Slet Undersøgelse
Afslut Undersøgelse
Opret Spørgsmål
Rediger Spørgsmål
Slet Spørgsmål
Undersøgelse udløber
Opret besvarelsesinfo
Eksporter besvarelser
Kompleksitet
Simpel
Simpel
Simpel
Simpel
Simpel
Simpel
Simpel
Simpel
Simpel
Medium
Simpel
Medium
Medium
Type
Opdater
Opdater
Opdater
Opdater
Opdater
Opdater
Opdater
Opdater
Opdater
Opdater
Signalering
Aflæs
Aflæs
Funktion
Opret besvarelse
Opret svar
Rediger svar
Afslut besvarelse
Kompleksitet
Simpel
Simpel
Simpel
Simpel
Type
Opdater
Opdater
Opdater
Opdater
Den overordnede dialogform bliver skemaudfyldelse. Det er
det man vil forvente, når systemet skal håndtere spørgeskemaundersøgelser o.
lign. Her er altså genkendelighed, og indtastningen er gjort så enkel som
muligt. Denne form kræver ingen eller næsten ingen tilvænning.
Systemet vil være forbundet til en MS SQL database. Der er
brug for at sende data til databasen og at hente fra databasen. En
forbindelses-klasse kan stå for at oprette forbindelse til databasen, således
at afsendelse og indhentning af data kan finde sted. For hver klasse i
model-laget (Forfatter, Medarbejder, Undersøgelse, Besvarelse etc.) kan en
kommando-klasse står for at udforme de kommandoer som forbindelses-klassen
behøver for at hente eller bringe data.
Figur 14
Private hændelser – involverer kun ét objekt i problemområdet (se Figur 12):
Udløbet (forekommer højst én gang)
Eksporteret (forekommer flere gange)
Udløbet repræsenteres som tilstandsattribut hos Undersøgelse, mens Eksporteret opnår sin egen klasse. Det kommer til at se således ud:
Figur 15
Og:
Figur 16
Fælles hændelser – involverer flere objekter:
Deltager (involverer Undersøgelse og Medarbejder)
Det skaber en ny Deltager-klasse relateret til både Undersøgelse og Medarbejder:
Afsluttet (Undersøgelse, Besvarelse, Forfatter og Medarbejder)
Her lader vi Afsluttet være attribut på henholdsvis Undersøgelse og Besvarelse og checker at Forfatter og Medarbejder har adgang til disse attributter – det har de (se Figur 3)!
Figur 17
Og:
Figur 18
Besvaret er fælles for Test, Spørgsmål og Svar. – Dvs. Besvaret (eller Afgivet) kan være en attribut ved Svar. Og på Figur 3 ser vi at Spørgsmål har direkte adgang til denne attribut, mens Test har det indirekte gennem Spørgsmål. Dvs.:
Figur 19
Verificeret er fælles for Test og Svar. – Verificeret bliver nu en attribut ved Svar, som test har indirekte adgang til via Spørgsmål. Altså:
Figur 20
I denne øvelse skal klasserne tilknyttes metoder, som vi tidligere har listet op. Hvis der er behov for det, lægger vi komplekse funktioner ud i en speciel funktionskomponent. Besvarelsesinformation er tilpas kompleks til at den kan bære en funktionskomponent, så den vil blive designet i en komponent for sig. Resten af funktionerne defineres som metoder på objekterne:
Figur 21
Hvis der er tale om svar, der indeholder tekst vil et
”informationsudtræk” bestå i at gemme tekststrengene i en fil, der så kan
bruges på forskellig måde.
Givet en Undersøgelse er valgt
For hvert Spørgsmål i Undersøgelse
For hver Svarmulighed i Spørgsmål
For hver Medarbejder
Hvis Svarmulighed valgt
Antal Svar tælles op med én
Ellers hvis Svarmulighed ikke er valgt
Der sker ikke noget
Slut Medarbejder
Slut Svarmulighed
Slut Spørgsmål
VisSvar
Givet en Undersøgelse er valgt
For hvert Spørgsmål i Undersøgelse
For hver Svarmulighed i Spørgsmål
Vis TælSvar
Slut Svarmulighed
Slut Spørgsmål
VisSvarProcenter
Givet en Undersøgelse er valgt
For hvert Spørgsmål i Undersøgelse
For hver Svarmulighed i Spørgsmål
SvarProcent =
AntalSvar * 100 / AntalMedarbejdere
Vis SvarProcent
Slut Svarmulighed
Slut Spørgsmål
VisSvarProcenterMedarbejderType
Givet en Undersøgelse og en MedarbejderType er valgt
For hvert Spørgsmål i Undersøgelse
For hver Svarmulighed i Spørgsmål
SvarProcent =
AntalSvar * 100 / AntalMedarbejdere
Vis SvarProcent
Slut Svarmulighed
Slut Spørgsmål
Givet en Undersøgelse er valgt
For hvert Spørgsmål i Undersøgelse
For hver RigtigSvarmulighed i Spørgsmål
For hver Medarbejder
Hvis RigtigSvarmulighed valgt
Antal RigtigtSvar tælles op med én
Ellers hvis RigtigSvarmulighed ikke er valgt
Der sker ikke noget
Slut Medarbejder
Slut Svarmulighed
Slut Spørgsmål
VisSvarFordeling
Givet en Undersøgelse er valgt
For hvert Spørgsmål i Undersøgelse
Vis antal RigtigtSvar * 100 / AntalMedarbejdere
Slut Spørgsmål
Figur 24 – 0000000000
Figur 25 – 0000000001
Figur 26 - 0000020201
Figur 27 - 0002020201
Figur 28 - 0000010301
Jeg har forsøgt at holde data og data’enes indbyggede logik – forespørgsler, opdateringer etc. – i modellaget. Det har jeg gjort vha. Stored Procedures. Grundlæggende benytter jeg mig af tre typer. Jeg giver her blot eksempler på de tre typer:
CREATE PROCEDURE HentUndersøgelseMedarbejderBesvarelseNOTAfsluttet
(
@intSendtMedarbejderID int
)
AS
SELECT dbo.Undersøgelse.undersøgelseID, dbo.Undersøgelse.undersøgelseNavn, dbo.Undersøgelse.undersøgelseForklaring,
dbo.Undersøgelse.undersøgelseForfatterID, dbo.Undersøgelse.undersøgelseStartdato, dbo.Undersøgelse.undersøgelseSlutdato,
dbo.Person.personNavn, dbo.Deltager.deltagerPersonID, dbo.Deltager.deltagerAfsluttet, Person_1.personNavn AS Forfatter
FROM dbo.Undersøgelse INNER JOIN
dbo.Deltager ON dbo.Undersøgelse.undersøgelseID = dbo.Deltager.deltagerUndersøgelseID INNER JOIN
dbo.Person ON dbo.Deltager.deltagerPersonID = dbo.Person.personID INNER JOIN
dbo.Person Person_1 ON dbo.Undersøgelse.undersøgelseForfatterID =
Peson_1.personID
WHERE (dbo.Deltager.deltagerPersonID = @intSendtMedarbejderID)
AND (dbo.Deltager.deltagerAfsluttet = 0)
AND (dbo.Undersøgelse.undersøgelseSlutdato>=DATEPART([day], GETDATE()))
AND (dbo.Undersøgelse.undersøgelseStartdato<=GetDate())
GO
CREATE
PROCEDURE IlægEnMulighedTestSvar
(
@intSendtDeltagerID int,
@intSendtSvarTekstID int,
@intSendtSpørgsmålID int
)
AS
DECLARE @bitRigtigt bit
SET @bitRigtigt = (SELECT
Count(*)
FROM dbo.Test
WHERE (testSpørgsmålID = @intSendtSpørgsmålID) AND (testRigtigSvarTekstID = @intSendtSvarTekstID));
INSERT
INTO TestSvar (testDeltagerID, testSvarSpørgsmålID, testSvarBedømmelse)
VALUES (@intSendtDeltagerID, @intSendtSpørgsmålID,@bitRigtigt);
GO
CREATE
PROCEDURE IlægSvar
(
@intSendtDeltagerID int,
@intSendtUndersøgelseID int,
@intSendtSpørgsmålID int,
@strSendtIndhold nvarchar (50),
@dateSendtSvardato datetime,
@blnSendtAfsluttet bit
)
AS
INSERT INTO Svar (svarDeltagerID, svarSpørgsmålID, svarIndhold)
VALUES (@intSendtDeltagerID, @intSendtSpørgsmålID,
@strSendtIndhold);
SELECT
@@identity;
UPDATE Deltager
SET deltagerSvardato = @dateSendtSvardato, deltagerAfsluttet = @blnSendtAfsluttet
WHERE (deltagerID=@intSendtDeltagerID) AND (deltagerUndersøgelseID = @intSendtUndersøgelseID)
GO
CREATE
PROCEDURE OpdaterSvarTekst
(
@intSendtSvarTekstID int,
@strSendtSvarTekstIndhold nvarchar(50)
)
AS
UPDATE SvarTekst
SET svarTekstIndhold = @strSendtSvarTekstIndhold
WHERE svarTekstID = @intSendtSvarTekstID
GO
Centralt i systemet ligger aflæsningen af hvordan forfatteren vælger at spørgeskemaerne skal se ud.
Private Sub
btnOpret_Click(ByVal
sender As System.Object,
ByVal e As System.EventArgs) Handles btnOpret.Click
'Egenskaber på _mitSpørgsmål sættes
'- typen
gives ved den valgte RadioButton...
'Spørgmålstypen lægges i en session-variabel,
'således at
den huskes til oprettelsen af næste spørgsmål
'- ifald der
skal oprettes en række spørgsmål af ens type.
_mitSpørgsmål.Forklaring = txtSpørgsmål.Text
_mitSpørgsmål.Sprogkode = ddlSprogkode.SelectedItem.Value
If RadioButton1.Checked
Then
_mitSpørgsmål.SpørgsmålType = 1
Session("SpørgsmålType")
= 1
ElseIf RadioButton2.Checked
Then
_mitSpørgsmål.SpørgsmålType = 2
Session("SpørgsmålType")
= 2
ElseIf RadioButton3.Checked
Then
_mitSpørgsmål.SpørgsmålType = 3
Session("SpørgsmålType")
= 3
ElseIf RadioButton4.Checked
Then
_mitSpørgsmål.SpørgsmålType = 4
Session("SpørgsmålType")
= 4
ElseIf RadioButton5.Checked
Then
_mitSpørgsmål.SpørgsmålType = 5
Session("SpørgsmålType")
= 5
End If
_mitSpørgsmål.AntalKnapper = ddlAntalSvarmuligheder.SelectedItem.Value
'Spørgsmålet
lægges i databasen og ID'et returneres...
_mitSpørgsmål.SpørgsmålID = _
_minSpørgsmålCommand.LægSpørgsmålIDatabase
_
(_mitSpørgsmål.UndersøgelseID, _
_mitSpørgsmål.Forklaring, _
_mitSpørgsmål.SpørgsmålType, _
_mitSpørgsmål.Sprogkode, _
_mitSpørgsmål.AntalKnapper)
If chkTest.Checked = False Then
Response.Redirect("opretsvartekst.aspx?test=false&" _
& "antalknapper="
& _mitSpørgsmål.AntalKnapper
_
& "&spoergsmaalid=" & _mitSpørgsmål.SpørgsmålID)
Else
If _mitSpørgsmål.SpørgsmålType = _
Spørgsmål.SpørgsmålTyper.EnMulighed Then
Response.Redirect("opretsvartekst.aspx?test=true&" _
& "type=0&" _
& "antalknapper="
& _mitSpørgsmål.AntalKnapper
_
& "&spoergsmaalid=" & _mitSpørgsmål.SpørgsmålID)
ElseIf _mitSpørgsmål.SpørgsmålType = _
Spørgsmål.SpørgsmålTyper.FlereMuligheder Then
Response.Redirect("opretsvartekst.aspx?test=true&"
_
& "type=1&" _
& "antalknapper="
& _mitSpørgsmål.AntalKnapper
_
& "&spoergsmaalid=" & _mitSpørgsmål.SpørgsmålID)
End If
End
If
End Sub
Et andet af omdrejningspunkterne i systemet er opbygningen af de spørgeskemaer, som en forfatter har valgt for en medarbejder. Skemaerne skal også aflæses, så der sker en del på samme side.
'opdaterer
tabellen til svartekster...
Public Sub OpdaterTabel(ByRef objSendtSpørgsmål
As Spørgsmål)
Dim række As TableRow
Dim
rækkeAndet As TableRow
Dim
celleKontrol As TableCell
Dim
celleSvarTekst As TableCell
Dim
celleAndet As TableCell
Dim
celleTekstBoks As TableCell
tbSvarMuligheder.Rows.Clear()
'så renses CollSvarTekst...
'og en ny
liste af svartekster lægges ind...
Session("Besvarelse").CollSvarTekst.Clear()
'***************************************
'Tabel til
svarmuligheder...
Dim intTæller As Integer
If objSendtSpørgsmål.AntalKnapper > 0 Then
For
intTæller = 1 To _
objSendtSpørgsmål.AntalKnapper
celleKontrol
= New TableCell()
celleSvarTekst
= New TableCell()
række = New TableRow()
If objSendtSpørgsmål.SpørgsmålType = _
EnMulighed Then
række.Cells.Add(celleKontrol)
celleKontrol.Controls.Add(Me.ArrAktueltArray(intTæller
- 1))
ElseIf objSendtSpørgsmål.SpørgsmålType = EnMulighedAndet
Then
række.Cells.Add(celleKontrol)
celleKontrol.Controls.Add(Me.ArrAktueltArray(intTæller
- 1))
ElseIf objSendtSpørgsmål.SpørgsmålType = FlereMuligheder
Then
række.Cells.Add(celleKontrol)
celleKontrol.Controls.Add(Me.ArrAktueltArray(intTæller
- 1))
række.Cells.Add(celleSvarTekst)
ElseIf objSendtSpørgsmål.SpørgsmålType = FlereMulighederAnde
Then
række.Cells.Add(celleKontrol)
celleKontrol.Controls.Add(Me.ArrAktueltArray(intTæller
- 1))
række.Cells.Add(celleSvarTekst)
End
If
tbSvarMuligheder.Rows.Add(række)
Next
Else 'ved KunTekst...
række = New TableRow()
celleAndet = New TableCell()
celleTekstBoks = New TableCell()
række.Cells.Add(celleAndet)
celleAndet.Text = "Skriv dit svar:"
række.Cells.Add(celleTekstBoks)
celleTekstBoks.Controls.Add(Session("AktuelTekstboks"))
tbSvarMuligheder.Rows.Add(række)
End If
'hvis der
skal indsættes et tekstfelt - til "andet"...
If objSendtSpørgsmål.SpørgsmålType = EnMulighedAndet
Or _
objSendtSpørgsmål.SpørgsmålType = FlereMulighederAndet
Then
rækkeAndet
= New TableRow()
celleAndet = New TableCell()
celleTekstBoks = New TableCell()
rækkeAndet.Cells.Add(celleAndet)
celleAndet.Text
= "Andet:"
rækkeAndet.Cells.Add(celleTekstBoks)
celleTekstBoks.Controls.Add(Session("AktuelTekstboks"))
tbSvarMuligheder.Rows.Add(rækkeAndet)
End If
'***************************************
End Sub
'der oprettes et
svar og det fyldes ud...
Private Sub btnBesvar_Click(ByVal sender As
System.Object, ByVal e As System.EventArgs) Handles btnBesvar.Click
Dim intSvarTæller,
intSvarTekstTæller As
Integer
Me.CollSpørgsmål =
Session("CollSpørgsmål")
'et Svar-objekt instantieres...
Session("Besvarelse").AktueltSvar = New Svar()
Me.AktueltSvar =
Session("Besvarelse").AktueltSvar
'læg deltagerID over i det konkrete svar...
Me.AktueltSvar.DeltagerID
= Session("Besvarelse").DeltagerID
'læg spørgmålID over i det konkrete svar...
Me.AktueltSvar.SpørgsmålID
= _
Me.AktueltSpørgsmål.SpørgsmålID
Me.AktueltSvar.Indhold
= ""
'***************************************************
'aflæs det
afgivne svar...
If Me.AktueltSpørgsmål.SpørgsmålType = EnMulighed
Then
Do
If Me.ArrAktueltArray(intSvarTæller).Checked = True
Then
Me.AktueltSvar.Indhold = _
Me.ArrAktueltArray(intSvarTæller).Text
Me.ValgtSvarTekstID =
Me.ArrAktuelleSVarTekstID(intSvarTæller)
End
If
intSvarTæller
+= 1
Loop
Until intSvarTæller = Me.ArrAktueltArray.Length
ElseIf Me.AktueltSpørgsmål.SpørgsmålType
= _
EnMulighedAndet Then
Do
If Me.ArrAktueltArray(intSvarTæller).Checked = True
Then _
Me.AktueltSvar.Indhold = _
Me.ArrAktueltArray(intSvarTæller).Text
intSvarTæller
+= 1
Loop
Until intSvarTæller = Me.ArrAktueltArray.Length
If Not Session("AktuelTekstboks").Text
= "" Then _
Me.AktueltSvar.Indhold += "," & _
Session("AktuelTekstboks").Text
'fjern komma'et først i NyBesvarelse.AktueltSvar.Indhold...
If Me.AktueltSvar.Indhold.StartsWith(",") Then _
Me.AktueltSvar.Indhold = _
Me.AktueltSvar.Indhold.Remove(0,
1)
ElseIf Me.AktueltSpørgsmål.SpørgsmålType
= _
FlereMuligheder Then
Do
If Me.ArrAktueltArray(intSvarTæller).Checked = True
Then
Me.AktueltSvar.Indhold += _
Me.ArrAktueltArray(intSvarTæller).Text &
","
Me.ArrValgtSvarTekstID(intSvarTæller) =
Me.ArrAktuelleSVarTekstID(intSvarTæller)
Else
'hvis
svaret ikke er valgt, kan det
'jo
godt være rigtigt...
Me.ArrValgtSvarTekstID(intSvarTæller) = 0
End
If
intSvarTæller
+= 1
Loop
Until intSvarTæller = Me.ArrAktueltArray.Length
'fjern komma'et sidst i NyBesvarelse.AktueltSvar.Indhold...
If Me.AktueltSvar.Indhold.Length
> 0 Then _
Me.AktueltSvar.Indhold = _
Me.AktueltSvar.Indhold.Remove(
_
Me.AktueltSvar.Indhold.Length()
- 1, 1)
ElseIf Me.AktueltSpørgsmål.SpørgsmålType
= _
FlereMulighederAndet Then
Do
If Me.ArrAktueltArray(intSvarTæller).Checked = True Then _
Me.AktueltSvar.Indhold
+= _
Me.ArrAktueltArray(intSvarTæller).Text &
","
intSvarTæller
+= 1
Loop
Until intSvarTæller = Me.ArrAktueltArray.Length
If Not Session("AktuelTekstboks").Text
= "" Then _
Me.AktueltSvar.Indhold += Session("AktuelTekstboks").Text
'fjern komma'et sidst i NyBesvarelse.AktueltSvar...
Me.AktueltSvar.Indhold
= _
Me.AktueltSvar.Indhold.Remove(Me.AktueltSvar.Indhold.Length()
- 1, 1)
ElseIf Me.AktueltSpørgsmål.SpørgsmålType
= KunTekst Then
Me.AktueltSvar.Indhold
= Session("AktuelTekstboks").Text
End If
'****************************************************
'*****************
'Opdateringer...
'hvis vi er
nået til slutningen af spørgsmålsrækken
'hop tilbage
i rækken...
'men først
skal selected index
aflæses...
dgSpørgsmål.SelectedIndex = Session("dgSpørgsmålPageIndex")
If dgSpørgsmål.SelectedIndex = dgSpørgsmål.PageCount
- 1 Then
dgSpørgsmål.SelectedIndex = dgSpørgsmål.SelectedIndex
- 1
Session("dgSpørgsmålPageIndex")
= dgSpørgsmål.SelectedIndex
End If
'hvis der er mere end et spørgsmål tilbage...
If Me.CollSpørgsmål.Items.Count
> 1 Then
'hvis
undersøgelsen involverer en test...
If Session("Besvarelse").Test Then
'læg
test-svaret i databasen...
If Me.AktueltSpørgsmål.SpørgsmålType = EnMulighed
Then
_objTestSvarCommand.IlægEnMulighedTestSvar(Me.AktueltSvar.DeltagerID,
Me.AktueltSvar.SpørgsmålID,
Me.ValgtSvarTekstID)
ElseIf Me.AktueltSpørgsmål.SpørgsmålType
= FlereMuligheder Then
'hvis
der er flere svarmuligheder skal
'alle
testsvar lægges i databasen...
_objTestSvarCommand.IlægTestSvar(Me.AktueltSvar.DeltagerID,
Me.AktueltSvar.SpørgsmålID,
Me.ArrValgtSvarTekstID)
End
If
End
If
'læg
svaret i databasen...
_objBesvarelseCommand.LægSvarIDatabase _
(Me.AktueltSvar.DeltagerID,
_
Session("Besvarelse").UndersøgelseID, _
Me.AktueltSvar.SpørgsmålID,
_
Me.AktueltSvar.Indhold,
Today(), False)
'spørgsmålet
fjernes...
Me.CollSpørgsmål.FjernSpørgsmålUdfraSpørgsmålID
_
(Me.AktueltSpørgsmål.SpørgsmålID)
Session("CollSpørgsmål")
= Me.CollSpørgsmål
'også i datagrid'et...
OpdaterDatagrid()
'data for
aktuelt spørgsmål opdateres - og
'vis den
rigtige tabel...
Opdaterbel(OpdaterAktueltSpørgsmål(Session("dgSpørgsmålPageIndex")))
'vis det
rigtige sidetal i spørgsmålsrækken
lblPage.Text = dgSpørgsmål.SelectedIndex
+ 1
'vis hvor
mange spørgsmål, der er ubesvarede...
Session("Besvarelse").AktueltAntalSpørgsmål =
Sesson("Besvarelse").CollSpørgsmål.Count
lblResterendeAntal.Text =
CInt(Session("Besvarelse").AktueltAntalSpørgsmål)
'hvis vi er
ved det sidste spørgsmål...
ElseIf Session("Besvarelse").CollSpørgsmål.Items.Count
= 1 Then
'hvis
undersøgelsen involverer en test...
If Session("Besvarelse").Test Then
'læg
test-svaret i databasen...
If Me.AktueltSpørgsmål.SpørgsmålType = EnMulighed
Then
_objTestSvarCommand.IlægEnMulighedTestSvar(Me.AktueltSvar.DeltagerID,
Me.AktueltSvar.SpørgsmålID,
Me.ValgtSvarTekstID)
ElseIf Me.AktueltSpørgsmål.SpørgsmålType
= FlereMuligheder Then
'hvis
der er flere svarmuligheder skal
'alle
testsvar lægges i databasen...
_objTestSvarCommand.IlægTestSvar(Me.AktueltSvar.DeltagerID,
Me.AktueltSvar.SpørgsmålID,
Me.ArrValgtSvarTekstID)
End
If
End
If
'læg
svaret i databasen...
_objBesvarelseCommand.LægSvarIDatabase _
(Me.AktueltSvar.DeltagerID,
_
Session("Besvarelse").UndersøgelseID,
_
Me.AktueltSvar.SpørgsmålID,
_
Me.AktueltSvar.Indhold,
Today(), True)
Session("Besvarelse").CollSpørgsmål = _
Me.CollSpørgsmål.FjernSpørgsmålUdfraSpørgsmålID
_
(Me.AktueltSpørgsmål.SpørgsmålID)
'ryd op
på siden...
FjernSpørgeskema()
lblBesked.Text = "Undersøgelsen er afsluttet"
Session("dgSpørgsmålPageIndex")
= -1
End If
'*****************
End Sub