Avatar billede wandaxp Praktikant
25. oktober 2007 - 19:17 Der er 26 kommentarer og
1 løsning

Langsom menu?

Hej er der en der kan hjælpe mig med at lave denne menu hurtigere?
Den reager for langsom når den skal vise menuen, den står og tænker i ca. 10 sek for at hente menu teksterne fra databasen?

Her er koden:


<link rel="stylesheet" type="text/css" href="css/menu.css" />
<html>
<!--#include file="ssi/45tn73gf4347y.asp"-->
<head>
<script type="text/javascript" language="javascript">
function show_element(element_id)
    {
    // Hide the 'Show' link
    document.getElementById(element_id + "_show").style.visibility="hidden";
    document.getElementById(element_id + "_show").style.display="none";

    // Show the 'Hide' link
    document.getElementById(element_id + "_hide").style.visibility="visible";
    document.getElementById(element_id + "_hide").style.display="block";

    // Show the DIV box
    document.getElementById(element_id).style.visibility="visible";
    document.getElementById(element_id).style.display="block";
    }

function hide_element(element_id)
    {
    // Hide the 'Hide' link
    document.getElementById(element_id + "_hide").style.visibility="hidden";
    document.getElementById(element_id + "_hide").style.display="none";

    // Show the 'Show' link
    document.getElementById(element_id + "_show").style.visibility="visible";
    document.getElementById(element_id + "_show").style.display="block";

    // Hide the DIV box
    document.getElementById(element_id).style.visibility="hidden";
    document.getElementById(element_id).style.display="none";
    }
</script>
</head>
<body bgcolor="#004000" backgroundcolor="#004000" bgproperties="fixed">
<base target="hoved">
<%
Dim iChoice, OkChoice, dbKategori_et, dbKategori_to, dbKategori_tre
' Læser brugerens valg
iChoice = Request.QueryString("valg")
' Udfører brugerens valg...
%>

<table width="145" border="0" align="left" cellpadding="0" cellspacing="0">
    <tr>
        <td background="baggrund/top.png" height="66" valign="top"></td>
    </tr>
    <tr>
        <td background="baggrund/midt.png" height="*" valign="top">
<table width="145" height="100%" border="0" cellpadding="0" cellspacing="0">
    <tr>
        <td width="11" align="left"></td>
        <td width="125" valign="top"><font color="#ffffff">
     
<a href="hoved.asp" target="HOVED" title="Velkomst siden" onmouseover="window.status='Velkomst siden';return true">Hovedside</a><br><br>

<%

' Funktion til at erstatte danske bogstaver (æ,ø,å), for at sikre at de ser rigtige ud i browseren
function replace_danish_letters(word)
    if instr(lcase(word), "æ") or instr(lcase(word), "ø") or instr(lcase(word), "å") then
        word = replace(replace(replace(word, "æ", "&aelig;"), "ø", "&oslash;"), "å", "&aring;")
        word = replace(replace(replace(word, "Æ", "&AElig;"), "Ø", "&Oslash;"), "Å", "&Aring;")
    end if

    replace_danish_letters = word
end function


' Tager alt fra tabellen "kategori_et"
set dbKategori_et = con.execute("select distinct kategori1 from varer where Kategori1<>NULL order by kategori1 asc")
' Tjekker om tabellen er tom
if not (dbKategori_et.bof or dbKategori_et.eof) then
    ' Hvis den ikke er tom, loop igennem alt den finder
    do until dbKategori_et.eof
        ' Laver en <div> rundt om kategori navnet, så den kan styres ved hjælp af CSS
        response.write "<div class='kategori_et'>"
        %>
        <!-- Laver links til at vise og skjule kategorien -->
        <table border="0" cellspacing="0" cellpadding="0" id="1.<%=dbKategori_et("kategori1")%>_show" class="show">
        <tr>
            <td width="15">
            <a
            onclick="show_element('1.<%=dbKategori_et("kategori1")%>');
            <% 'Looper gennem alle andre kategorier på niveau 1, og skjuler dem
            set dbKategori_et_cats = con.execute("select distinct kategori1 from varer where Kategori1<>NULL")
       
            if not (dbKategori_et_cats.bof or dbKategori_et_cats.eof) then
                do until dbKategori_et_cats.eof
                    if dbKategori_et_cats("kategori1") <> dbKategori_et("kategori1") then
                        response.write "hide_element('1." &dbKategori_et_cats("kategori1")& "');"
                    end if
               
                    set dbKategori_et_elements = con.execute("select * from varer where kategori1='" &dbKategori_et_cats("kategori1")& "'")
               
                    'Skjuler alle åbner kategorier på niveau 2
                    if not (dbKategori_et_elements.bof or dbKategori_et_elements.eof) then
                        do until dbKategori_et_elements.eof
                            response.write "hide_element('2." &dbKategori_et_elements("kategori2")& "');"
                       
                            dbKategori_et_elements.movenext
                        loop
                    end if
               
                    dbKategori_et_cats.movenext
                loop
            end if
            %>
            ">
            <!-- Tegn der bliver vist når kategorien er lukket -->
            <img src=billeder/plus.png height=13 width=13>
            </a>
            </td>
       
            <td>
            <a href="vare/vare.asp?Kategori1=<%=replace_danish_letters(dbKategori_et("kategori1"))%>&Kategori2=NA&Kategori3=NA&Tilbud=NA&Nyhed=NA&SOEG=NA" target="HOVED" title="<%=replace_danish_letters(dbKategori_et("kategori1"))%>">
            <!-- Tekst der bliver vist når kategorien er lukket -->
            <%=replace_danish_letters(dbKategori_et("kategori1"))%>
            </a>
            </td>
        </tr>
        </table>
   
        <table border="0" cellspacing="0" cellpadding="0" id="1.<%=dbKategori_et("kategori1")%>_hide" class="hide">
        <tr>
            <td width="15">
            <a
            onclick="hide_element('1.<%=dbKategori_et("kategori1")%>');
            <% 'Skjuler alle kategorier
            set dbKategori_et_elements = con.execute("select * from varer where kategori1='" &dbKategori_et("kategori1")& "'")
       
            if not (dbKategori_et_elements.bof or dbKategori_et_elements.eof) then
                do until dbKategori_et_elements.eof
                    response.write "hide_element('2." &dbKategori_et_elements("kategori2")& "');"
               
                    dbKategori_et_elements.movenext
                loop
            end if
            %>
            ">
            <!-- Tegn der bliver vist når kategorien er åben -->
            <img src=billeder/minus.png height=13 width=13>
            </a>
            </td>
       
            <td>
            <a href="vare/vare.asp?Kategori1=<%=replace_danish_letters(dbKategori_et("kategori1"))%>&Kategori2=NA&Kategori3=NA&Tilbud=NA&Nyhed=NA&SOEG=NA" target="HOVED" title="<%=replace_danish_letters(dbKategori_et("kategori1"))%>">
            <!-- Tekst der bliver vist når kategorien er åben -->
            <%=replace_danish_letters(dbKategori_et("kategori1"))%>
            </a>
            </td>
        </tr>
        </table>
        <%
        response.write "</div>"
   
        ' Smider en DIV rundt om alle kategorier på niveau 1
        response.write "<div id='1." &dbKategori_et("kategori1")& "' class='cat_1'>"
        ' Tager alt fra tabellen "kategori_to", som hører til den nuværende record i tabellen "kategori_et"
        set dbKategori_to = con.execute("select distinct kategori2 from varer where kategori1='" &dbKategori_et("kategori1")& "' order by kategori2 asc")
        ' Tjekker om tabellen er tom
        if not (dbKategori_to.bof or dbKategori_to.eof) then
            ' Hvis den ikke er tom, loop igennem alt den finder
            do until dbKategori_to.eof
                ' Laver en <div> rundt om kategori navnet, så den kan styres ved hjælp af CSS
                response.write "<div class='kategori_to'>"
                %>
                <table border="0" cellspacing="0" cellpadding="0" id="2.<%=dbKategori_to("kategori2")%>_show" class="show">
                <tr>
                    <td width="15">
                    <a
                    onclick="show_element('2.<%=dbKategori_to("kategori2")%>');
                    <%
                    set dbKategori_to_cats = con.execute("select distinct kategori2 from varer where kategori1='" &dbKategori_et("kategori1")& "'")
               
                    if not (dbKategori_to_cats.bof or dbKategori_to_cats.eof) then
                        do until dbKategori_to_cats.eof
                            if dbKategori_to_cats("kategori2") <> dbKategori_to("kategori2") then
                                response.write "hide_element('2." &dbKategori_to_cats("kategori2")& "');"
                            end if
                       
                            dbKategori_to_cats.movenext
                        loop
                    end if
                    %>
                    ">
                    <!-- Tegn der bliver vist når kategorien er lukket -->
                    <%
                    set dbKategori_to_tom = con.execute("select distinct kategori3 from varer where (kategori1='" & dbKategori_et("kategori1") & "' AND kategori2='" &dbKategori_to("kategori2")& "' AND kategori3<> NULL)")
                    if not (dbKategori_to_tom.bof or dbKategori_to_tom.eof) then
                    %>
                    <img src=billeder/plus.png height=13 width=13>
                    <%end if%>
                    </a>
                    </td>
               
                    <td>
                    <a href="vare/vare.asp?Kategori1=<%=replace_danish_letters(dbKategori_et("kategori1"))%>&Kategori2=<%=replace_danish_letters(dbKategori_to("kategori2"))%>&Kategori3=NA&Tilbud=NA&Nyhed=NA&SOEG=NA" target="HOVED" title="<%=replace_danish_letters(dbKategori_et("kategori1") & " - " & dbKategori_to("kategori2"))%>">
                    <!-- Tekst der bliver vist når kategorien er lukket -->
                    <%=replace_danish_letters(dbKategori_to("kategori2"))%>
                    </a>
                    </td>
                </tr>
                </table>
           
                <table border="0" cellspacing="0" cellpadding="0" id="2.<%=dbKategori_to("kategori2")%>_hide" class="hide">
                <tr>
                    <td width="15">
                    <a onclick="hide_element('2.<%=dbKategori_to("kategori2")%>');">
                    <!-- Tegn der bliver vist når kategorien er åben -->
                    <%
                    set dbKategori_to_tom = con.execute("select distinct kategori3 from varer where (kategori1='" & dbKategori_et("kategori1") & "' AND kategori2='" &dbKategori_to("kategori2")& "' AND kategori3<> NULL)")
                    if not (dbKategori_to_tom.bof or dbKategori_to_tom.eof) then
                    %>
                    <img src=billeder/minus.png height=13 width=13>
                    <%end if%>
                    </a>

                    </td>
               
                    <td>
                    <a href="vare/vare.asp?Kategori1=<%=replace_danish_letters(dbKategori_et("kategori1"))%>&Kategori2=<%=replace_danish_letters(dbKategori_to("kategori2"))%>&Kategori3=NA&Tilbud=NA&Nyhed=NA&SOEG=NA" target="HOVED" title="<%=replace_danish_letters(dbKategori_et("kategori1") & " - " & dbKategori_to("kategori2"))%>">
                    <!-- Tekst der bliver vist når kategorien er åben -->
                    <%=replace_danish_letters(dbKategori_to("kategori2"))%>
                    </a>
                    </td>
                </tr>
                </table>
                <%
                response.write "</div>"
           
                ' Smider en DIV rundt om alle kategorier på niveau 2
                response.write "<div id='2." &dbKategori_to("kategori2")& "' class='cat_2'>"
                ' Tager alt fra tabellen "kategori_tre", som hører til den nuværende record i tabellen "kategori_to"
                set dbKategori_tre = con.execute("select distinct kategori3 from varer where (kategori2='" &dbKategori_to("kategori2")& "' AND kategori3<> NULL) order by kategori3 asc")
                ' Tjekker om tabellen er tom
                if not (dbKategori_tre.bof or dbKategori_tre.eof) then
                    ' Hvis den ikke er tom, loop igennem alt den finder
                    do until dbKategori_tre.eof
                        ' Laver en <div> rundt om kategori navnet, så den kan styres ved hjælp af CSS
                        response.write "<div class='kategori_tre'>"

%>
                    <a href="vare/vare.asp?Kategori1=<%=replace_danish_letters(dbKategori_et("kategori1"))%>&Kategori2=<%=replace_danish_letters(dbKategori_to("kategori2"))%>&Kategori3=<%=replace_danish_letters(dbKategori_tre("kategori3"))%>&Tilbud=NA&Nyhed=NA&SOEG=NA" target="HOVED" title="<%=replace_danish_letters(dbKategori_et("kategori1") & " - " & dbKategori_to("kategori2") & " - " & dbKategori_tre("kategori3"))%>"><%=replace_danish_letters(dbKategori_tre("kategori3"))%></a>

<%                      response.write "</div>"
                   
                        dbKategori_tre.movenext
                    loop
                else
                    ' Hvis den er tom, skriv en besked (kan selvfølgelig fjernes)
                end if
                response.write "</div>"
                dbKategori_to.movenext
            loop
        else
            ' Hvis den er tom, skriv en besked (kan selvfølgelig fjernes)
        end if
        response.write "</div>"
        dbKategori_et.movenext
    loop
else
    ' Hvis den er tom, skriv en besked (kan selvfølgelig fjernes)
end if


con.close
set con = nothing
%>

        </font></td>
        <td width="9" align="right"></td>
    </tr>
</table>

        </td>
    </tr>
    <tr>
        <td background="baggrund/bund.png" height="61" valign="bottom"></td>
    </tr>
</table>
</body>
</html>

Jeg sender gerne 200 for et hurtigt svar som virker :-)
Avatar billede wandaxp Praktikant
25. oktober 2007 - 22:55 #1
De 2 steder der står stjerne ved har jeg nu ændret stjernen til Kategori1, Kategori2
men det hjælper ikke andet en få milisekunder...

HJÆLLPPPP...
Avatar billede wandaxp Praktikant
25. oktober 2007 - 23:32 #2
Hvis nogen kan hjælpe så sig evt. en pris, så kan vi muligvis også finde ud af det?
Avatar billede soerenlyn Nybegynder
25. oktober 2007 - 23:37 #3
Jeg kan umiddelbart ikke overskue din kode og hvad den gør, men der er ufatteligt mannge loop's, er det nødvendigt? De tager nok lang tid, så hvis de kunne sorteres fra ville det nok hjælpe ..
Avatar billede wandaxp Praktikant
26. oktober 2007 - 00:25 #4
Tjaaa jeg kan ikke helt se hvilke jeg kan undvære, da SQL sætningerne først finder alle forskellige i Kategori1 så danner den listen med alle dem den finder i kategori2 og under kategori2 danner den alle menu punkter fra Kategori3, ved hjælp af javascripten skjuler den så menupunkterne bortset fra den man er inde under.
Men med ca. 3800 numrer i databasen så tager den ca. 10 sek. om at hente menuen og det er alt for lang tid...
Avatar billede w13 Novice
26. oktober 2007 - 00:27 #5
3800 poster _er_ mange at hente ud af en database. Muligvis skulle du også undersøge, hvordan du kan optimere den.
Avatar billede w13 Novice
26. oktober 2007 - 00:29 #6
Især Access er slem, når man har en del poster.
Avatar billede wandaxp Praktikant
26. oktober 2007 - 00:34 #7
Det er en access database, ville det kunne hjælpe væsentligt at ændre det til mysql?
Avatar billede w13 Novice
26. oktober 2007 - 00:37 #8
Det tror jeg. Men det er ikke lige mit felt. =) Ved bare, Access er slemt :P
Avatar billede soerenlyn Nybegynder
26. oktober 2007 - 00:42 #9
Jeg tror det vil tage lidt tid lige meget hvilken database man bruger når man har 3800 poster :o
Avatar billede wandaxp Praktikant
26. oktober 2007 - 07:33 #10
Tjaaa nogen der kan overskue hvordan man gør koden hurtigere, så må jeg jo se om det kan hjælpe først ellers må jeg skifte databasen om?
Avatar billede wandaxp Praktikant
26. oktober 2007 - 07:53 #11
Der var ingen problemer med hastigheden da der var ca 1700 numrer men (ca. 1 sek.) men 3800 numrer så skulle den bare tage 10 sek.?
Avatar billede soerenlyn Nybegynder
26. oktober 2007 - 11:44 #12
Hvad er det koden gør? Jeg kan se at du også opretter forbindelse hele tiden, og henter nogenlunde det samme? Måske man kunne gøre det mere færre db-kald?
Avatar billede w13 Novice
26. oktober 2007 - 15:05 #13
Jeg kan heller ikke overskue koden. Men nu mere, du kan skrabe fra, især mht. databasekald, nu bedre.

Du har bl.a. en funktion, der ændrer alle æ,ø,å til HTML-tegn, så de ser rigtige ud. Hvis bare du bruger det rigtige charset i HTML og ASP, skulle det ikke være nødvendigt at lave de ekstra tegn i dit dokument.
Avatar billede wandaxp Praktikant
26. oktober 2007 - 15:40 #14
Soerenlyn - Ja det ville klart være bedre med færre DB kald, mne jeg ved ikke helt hvordan jeg kan gøre det!!!

w13 - Jeg har prøvet at fjerne den kode det ændre det, men den giver ikke meget hastighed det er højest ½ sek. det giver det er også noget alt er værd at tage med men ved du hvordan man sætter charsættet så?
Avatar billede w13 Novice
26. oktober 2007 - 15:44 #15
Jo, men nu flere poster du får, nu hurtigere vil det gå, plus at din kode vil blive mindre og mere overskuelig og derved lettere at rette. =)

HTML:

<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">

ASP:

Response.Charset="iso-8859-1"
(inde i en ASP-kode, naturligvis)

Begge placeres omkring toppen af dokumentet.
Avatar billede wandaxp Praktikant
26. oktober 2007 - 23:28 #16
Ja, det har jeg så gjort, men det ændre desværre intet på tiden for at hente siden desværre, jeg er stadig åben overfor muligheder og vil på mandag finde ud af om jeg kan få ændret mit webhotel til mysql database istedet...
Avatar billede w13 Novice
26. oktober 2007 - 23:35 #17
Jeg har lige læst, at det kommer til at gå langsommere med ASP, hvis man åbner og lukker koden mange gange med <% og %>. Dvs. at det vil være hurtigst, hvis du, så vidt muligt, holder din ASP-kode åben og ikke skifter så meget mellem HTML og ASP, men lader din ASP-kode skrive HTML'en, på nær de steder, hvor der er rigtig meget HTML ad gangen.

En anden ting, der ta'r lang tid, er at bruge Response.Write mange gange. Derfor plejer jeg personligt at sammensætte al HTML-koden i en string, som jeg kan skrive med Response.Write én gang. F.eks.:

sWrite="Hello"
sWrite=sWrite&" "
sWrite=sWrite&"World"

Response.Write sWrite

Fremfor:

Response.Write "Hello"
Response.Write " "
Response.Write "World"
Avatar billede w13 Novice
26. oktober 2007 - 23:36 #18
Hvis du ku' mindske HTML-koden ville det derfor også være et plus. (Det er det vel altid! =)
Avatar billede wandaxp Praktikant
27. oktober 2007 - 02:25 #19
Ja lidt er altid noget, men jeg mangler bare at få den kogt ned med en tid på ca. 7-9 sek. så det er nok enten database kaldene eller databasen jeg skal have ændret på?
Nogen der ved hvor man kan finde en god Access database konverteringsprogram til MySQL database?
Avatar billede wandaxp Praktikant
01. november 2007 - 18:01 #20
Homm når jeg laver et søgningsudtræk derfra hvor den skal søge alle felter for alle varer igennem og skal finde alle steder hvor der står nogle bestemte ord, så kommer resultatet MEGET hurtigt, så det er kun i menuen problemet er, er der en der kan se hvordan den kan optimeres til at blive hurtigere?

Jeg vil gerne betale noget for det hvis det kan hjælpe?
Avatar billede w13 Novice
01. november 2007 - 18:06 #21
Du kan lukke her (opret svar og tag selv point) og så prøve igen med dit nye ønske. Tror ikke, der er mange, der gider læse alt dette her igennem. =)
Avatar billede wandaxp Praktikant
01. november 2007 - 21:43 #22
Hvis i begge laver et svar dele i pointene :-)
For i har stadig virkelig hjulpet mig med at finde frem til dette... :-)

1000 TAK
Avatar billede w13 Novice
01. november 2007 - 22:32 #23
Okidoke! :)
Avatar billede w13 Novice
04. november 2007 - 01:21 #24
Takker for point!
Avatar billede w13 Novice
04. november 2007 - 01:25 #25
Soerenlyn>> Du kan få halvdelen her: http://www.eksperten.dk/spm/804220 =)
Avatar billede wandaxp Praktikant
04. november 2007 - 22:33 #26
Ups ja der var ikke lige den sidste med sorry :-/
Avatar billede melieha Nybegynder
06. november 2007 - 23:25 #27
Uden at jeg har taget et komplet overblik over din kode burde du kunne vinde rigtig meget ved at bruge getrows, hvis ellers jeg ser koden rigtigt.
Så vidt jeg kan se looper du dine data igennem MANGE gange (Altså ens eller næsten ens SQL kald), hvis du i stedet for laver et getrows kald kan du gøre det i ASP'en i stedet for at åbne og lukke databasen så mange gange.
Jeg lavede engang et system hvor man lavede en masse sager og så undersager, allerede ved et par hundrede sager var loadtiden på flere sekunder, da jeg konverterede til getrows (Som faktisk ikke var SÅ besværligt endda) røg den ned på langt under et halvt sekund for de største kald, og gerne 1/10 eller mindre normalt, og det ligger den stadig på, og det er et system der nu indeholder mange 1.000 sager og undersager.
Jeg tror det er der eller ved at bruge nogle mere avancerede sql (I MSSQL eksempelvis) løsninger :)

Igen har jeg ikke helt fået overblik over hvad din kode skal gøre, men det kunne også tænkes at et SQL join kunne klare meget af presset :) Eller ved at lave et SQL view i MSSQL.
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