Praktikopgave hos Royal Greenland

Poul Melchiorsen

Foråret 2003

 

RGTester

-        en webapplikation til brug ved oprettelse og gennemførelse

af medarbejderundersøgelser og videnstests



Indholdsfortegnelse

Indholdsfortegnelse. 2

Projektstyring. 4

Project Scope Management 4

Scope Statement 4

Work Breakdown Structure. 5

Milestones: 5

Analyse. 6

Systemdefinition. 6

Hændelsestabel 6

Klasser 6

Hændelser 6

Hændelsestabel 7

Klassediagram.. 8

Adfærdsmønstre. 9

Forfatter 9

Medarbejder 9

Undersøgelse. 10

Undersøgelsesskabelon. 10

Test 10

Spørgsmål 11

Svar 11

Besvarelse. 12

Opdateret hændelsestabel 13

Brugsmønstre. 14

Aktører 14

Brugsmønstre. 14

Aktørtabel 15

Funktioner 15

Administration af undersøgelser og tests. 15

Gennemførelse af undersøgelser og tests. 15

Grænseflader 16

Brugergrænseflade. 16

Systemgrænseflade. 16

Design. 17

Arkitektur 17

Modelkomponent 18

Funktionskomponent 20

Besvarelsesinformation. 20

E/R-diagram.. 22

Flowchart 23

Storyboard. 24

Startside. 24

Login. 24

Undersøgelsesoversigt 25

Opret spørgsmål 25

SpørgsmålOversigt – Medarbejder 26

SQL-design. 27

HentData. 27

IlægData. 27

OpdaterData. 28

Centrale kodestumper 29

Aflæsning af valgt udformning af spørgeskemaer 29

Opbygning af skemaerne. 30

Aflæsning af besvarelserne. 32

”Nice to have”. 37


Projektstyring

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.

Project Scope Management

Scope Statement

Work Breakdown Structure

OrganisationsdiagramFigur 1

Milestones:


Analyse

Systemdefinition

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.

Hændelsestabel

Klasser

Undersøgelse

Medarbejder

Test

Spørgsmål

Svar

Forfatter

Hændelser

Oprettet/Redigeret/Slettet = Administreret

Deltager

Besvaret

Afsluttet

Udløbet

Eksporteret


Hændelsestabel

 

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.

 


Klassediagram

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.


Adfærdsmønstre

Forfatter

 

Figur 4

Medarbejder

Figur 5

 

 

 

 

 

 

 

                                                                                


Undersøgelse

Figur 6

Undersøgelsesskabelon

Figur 7

Test

Figur 8

Spørgsmål

Figur 9

Svar

Figur 10


Besvarelse

Figur 11


Opdateret hændelsestabel

 

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


Brugsmønstre

Aktører

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.

Brugsmønstre

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ørtabel

 

Aktører

 

 

 

Brugsmønstre

Medarbejder

Forfatter

Administrator

Tidsovervåger

Undersøgelsesadministration

 

ü

 

ü

Medarbejderadministration

 

ü

 

 

Forfatteradministration

 

 

ü

 

Besvarelse

ü

 

 

 

Eksport

 

ü

 

 

Figur 13

Funktioner

Administration af undersøgelser og tests


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


Gennemførelse af undersøgelser og tests


Funktion

Opret besvarelse

Opret svar

Rediger svar

Afslut besvarelse


Kompleksitet

Simpel

Simpel

Simpel

Simpel
Type

Opdater

Opdater

Opdater

Opdater



Grænseflader

Brugergrænseflade

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.

Systemgrænseflade

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.


Design

Arkitektur

 

Figur 14


Modelkomponent

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

Funktionskomponent

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

Besvarelsesinformation

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.

  1. Information om undersøgelser uden tests
    Der er brug for at dele denne funktion op i følgende deloperationer:
    TælSvar – som kunne udmønte sig således:

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

  1. Information om undersøgelser med tests
    TælRigtigeSvar

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


E/R-diagram

 

 



Flowchart

 



Storyboard

Startside

Figur 240000000000

Login

Figur 250000000001

Undersøgelsesoversigt

Figur 26 - 0000020201

Opret spørgsmål

Figur 27 - 0002020201

SpørgsmålOversigt – Medarbejder

Figur 28 - 0000010301


SQL-design

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:

HentData

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

IlægData

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

OpdaterData

CREATE PROCEDURE OpdaterSvarTekst

(

@intSendtSvarTekstID int,

@strSendtSvarTekstIndhold nvarchar(50)

)

AS

UPDATE       SvarTekst

SET               svarTekstIndhold = @strSendtSvarTekstIndhold

WHERE        svarTekstID = @intSendtSvarTekstID

GO


Centrale kodestumper

Centralt i systemet ligger aflæsningen af hvordan forfatteren vælger at spørgeskemaerne skal se ud.

Aflæsning af valgt udformning af spørgeskemaer

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.

Opbygning af skemaerne

 

    '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

 

 

Aflæsning af besvarelserne

'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

 


”Nice to have”