Avatar billede xcover Nybegynder
14. januar 2008 - 00:21 Der er 13 kommentarer og
1 løsning

Langsom ASP kode

Hejsa,

Jeg er ved at bygge en "vagt kalender" - som giver mig en del problemer - dvs. siden tager ca. 20 sek. at loade, hvilket er alt for langsomt ;)

Sådan gør jeg:
Først hentes alle brugerne ud af databasen, derefter loopes hver enkelt bruger ca. 30 gange, altså en kalender måned. Inde i det loop henter jeg så også yderlige ting fra databasen...
Så der er altså vildt mange forbindelser til databasen.

Er der en som evt. vil kigge min kode igennem og evt. komme med rettelser eller andre gode forslag ? Ville gerne kunne loade siden hurtigere nemlig.

På forhånd tak!

KODEN:
sql = "SELECT * FROM bruger ORDER BY gruppe_id,navn"
SET rs = Conn.execute(sql)
    IF NOT rs.EOF THEN
        DO UNTIL rs.EOF
        resultat_bruger_id_2_iframe = resultat_bruger_id_2_iframe & rs("id") &","

        Response.Write "</tr><tr>"
       
        FOR t=1 TO intDayInMonth
           
            feltnr = feltnr + 1
            dtmDate = DateSerial(intYear,intMonth,t)
            dtmDay = arrDayNames(Weekday(dtmDate)-1)
           
            sql2 = "SELECT vagtreg.id,vagtreg.vagter_id,vagter.farve,vagter.start_tid,vagter.slut_tid FROM vagtreg,vagter WHERE vagtreg.vagter_id = vagter.id AND vagtreg.bruger_id = '"& rs("id") &"' AND vagtreg.dato = '"& FormatDateDDMMYYYY(dtmDate) &"'"
            SET rs2 = Conn.execute(sql2)
            IF NOT rs2.EOF THEN
                vagtreg_id            = rs2("id")
                vagtreg_vagter_id    = rs2("vagter_id")
                td_bgcolor            = rs2("farve")
                vagter_start_tid    = rs2("start_tid")
                vagter_slut_tid        = rs2("slut_tid")
            ELSE
                vagtreg_vagter_id = ""
                vagter_start_tid    = "08:30"
                vagter_slut_tid        = "15:54"
            END IF
            rs2.close
            SET rs2 = NOTHING
            SET sql2 = NOTHING
                           
            IF td_bgcolor <> "" THEN
                Response.Write "<td bgcolor='"& td_bgcolor &"' height='"& table_height_bottom &"' id='td_"& dtmDate &"_"& rs("id") &"' valign='top'>"
            ELSE IF dtmDay = "Lørdag" OR dtmDay = "Søndag" THEN
                enuWeekday = TRUE
                Response.Write "<td bgcolor='#C0C0C0' height='"& table_height_bottom &"' id='td_"& dtmDate &"_"& rs("id") &"' valign='top'>"
            ELSE
                enuWeekday = FALSE
                Response.Write "<td height='"& table_height_bottom &"' id='td_"& dtmDate &"_"& rs("id") &"' valign='top'>"
            END IF
            END IF
           
            td_bgcolor = ""
           
            IF rq_kalender = "plan" THEN
                Response.Write "<input class='form_input' type='text' name='tekst' value='' size='16' /><br/>"
           
                Response.Write "<select name='select_"& dtmDate &"_"& rs("id") &"' id='select_id_"& dtmDate &"_"& rs("id") &"' class='form_input' onchange=""document.getElementById('iframe_vagter_update').setAttribute('src','iframe_vagter_update.asp?'+this.value);"" tabindex='"& feltnr &"'>"
                Response.Write "<option value='bruger_id="& rs("id") &"&dato="& dtmDate &"&vagt_id=0&feltnr="& feltnr &"'></option>"
           
           
                sql2 = "SELECT id,navn FROM vagter ORDER BY start_tid"
                SET rs2 = Conn.execute(sql2)
                    IF NOT rs2.EOF THEN
                        DO UNTIL rs2.EOF
                           
                            IF vagtreg_vagter_id = rs2("id") THEN
                                selected = " selected='selected' "
                            ELSE
                                selected = ""
                            END IF
                           
                            Response.Write "<option '"& selected &"' accesskey='"& feltnr &"' name='"& rs2("id") &"' value='bruger_id="& rs("id") &"&dato="& dtmDate &"&vagt_id="& rs2("id") &"'>"& rs2("navn") &"</option>"
                            rs2.movenext
                        LOOP
                    END IF
                rs2.close
                SET rs2 = NOTHING
                SET sql2 = NOTHING
                Response.Write "<option name='' value=''>----------</option>"
                Response.Write "<option name='' value='slet_id="& vagtreg_id &"'>(SLET VAGT)</option>"
                Response.Write "</select>"
                Response.Write "<br/>"
                Response.Write "Flag:<input type='checkbox' name='flag' value='flag'>"
            END IF               
            Response.Write "</td>"
           
        NEXT
       
        rs.movenext
        LOOP
    END IF
rs.close
SET rs = NOTHING
SET sql = NOTHING
Avatar billede xcover Nybegynder
14. januar 2008 - 00:22 #1
Det skal lige siges at linie 9 altså:
FOR t=1 TO intDayInMonth

Den looper jo altså ca. 30 gange... altså alle dage i måneden.
Avatar billede gammelhat Nybegynder
14. januar 2008 - 01:46 #2
den indre sql må kunne laves med en between på datoen, så du får et samlet udtræk fra hele måneden i et kald
Avatar billede xcover Nybegynder
14. januar 2008 - 05:40 #3
gammelhat
Ja, det ville jeg normalt også gøre - men det er ikke alle dato´er som står i databasen - jeg skal bare have udskrevet en hel måned af gangen - og derefter tilknytte de vagter som er vagtsat, det er ikke alle dage som er det, men derfor skal dagene vises alligevel...

Så det er derfor jeg ikke ved hvordan jeg drejer denne ;)
Avatar billede gammelhat Nybegynder
14. januar 2008 - 06:29 #4
Noget i denne stil måske

rs2 = select alle vagter i denne måned, order by dato

FOR t=1 TO intDayInMonth
    If denne_dag = rs2("dato") The
        ' fundet
        rs2.MoveNext
    End If
Next
Avatar billede gammelhat Nybegynder
14. januar 2008 - 06:33 #5
Er der sat index på de rigtige felter i databasen?
Avatar billede xcover Nybegynder
14. januar 2008 - 06:48 #6
gammelhat ->
Jeg bliver nød til at hente alle brugerne ud først og loope dem - det er brugerne som er hele rammen for kalenderen,.

Index ? Hjælper de meget ? Der er meget få poster i databasen, lige nu er der måske 300 indtastet vagter, og det tager VILDT lang tid at loade...

Det er endda på en MSSQL server.
Avatar billede gammelhat Nybegynder
14. januar 2008 - 07:12 #7
Jeg tænkte at du bare skulle lade bruger-udtrækket være, og så udføre én rs2 for hver bruger, i stedet for som nu, hvor du laver 30 kald for hver bruger

Der står lidt om index her:
http://msdn2.microsoft.com/en-us/library/ms172984.aspx
Avatar billede softspot Forsker
14. januar 2008 - 08:59 #8
Problemet er helt klart alle de opslag du laver til i databasen (som du selv er inde på).

Som gammelhat nævner, er der ikke nogen grund til at lave en statisk forespørgsel 600 gange, dvs.

sql2 = "SELECT id,navn FROM vagter ORDER BY start_tid"

når den bare kan laves én gang og caches i f.eks. et 2D array, vha. rs.getRows (tror jeg nok den hedder. Faktisk kunne det være du skulle starte med at få den ud af din løkke...
Avatar billede softspot Forsker
14. januar 2008 - 10:48 #9
Jeg ville forsøge dette:

Først og fremmest kalde tabellen med vagter inden den store løkke:

sql = "SELECT id, navn FROM vagter ORDER BY start_tid"
SET rs = Conn.execute(sql)
IF NOT rs.EOF THEN
  arrVagter = rs.GetRows()
END IF
rs.close
set rs = nothing

Og så bruge denne kode til at generere din dropdown med vagter:

FOR EACH vagt IN arrVagter
  IF vagtreg_vagter_id = vagt(0) THEN
    selected = " selected='selected' "
  ELSE
    selected = ""
  END IF
                           
  Response.Write "<option '"& selected &"' accesskey='"& feltnr &"' name='"& vagt(0) &"' value='bruger_id="& rs("id") &"&dato="& dtmDate &"&vagt_id="& vagt(0) &"'>"& vagt(1) &"</option>"
NEXT


Det er aldeles utestet, så lad høre hvad dine erfaringer med koden er :-)
Avatar billede softspot Forsker
14. januar 2008 - 10:51 #10
Lige nogle kommentarer til "livrem og seler". Du behøver ikke checke for rs.EOF inden du kører en løkke med precheck

DO UNTIL rs.eof

da dette til terminere løkken inden du når at lave ulykker :)

Og så skal du ikke sætte sql = NOTHING, da sql er en streng - og nothing benyttes kun til objekter.
Avatar billede xcover Nybegynder
16. januar 2008 - 16:24 #11
-> softspot
100000 Mange tak, jeg vil afprøve det som det første i morgen når jeg kommer på job.
Glæder mig til at teste det, tak tak ;)
Avatar billede xcover Nybegynder
18. januar 2008 - 21:10 #12
-> softspot
Jeg vil sige at resultatet blev godt nok lidt anderledels, men du mig godt nok på rette kurs der... 10000000 takker endnu engang ;)

Smid svaar ;)
Avatar billede softspot Forsker
03. april 2008 - 12:27 #13
Jeg undskylder! Jeg har ikke fanget denne bøn om svar, men det kommer her... velbekomme :)
Avatar billede softspot Forsker
16. april 2008 - 09:19 #14
Tak for point :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester