[ASP] Array, items geordend weergeven

Pagina: 1
Acties:

  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
Dit is min of meer een vervolg op mijn vorige vraag, daarin kreeg ik als antwoord dat ik een "fout" datamodel gebruikte...

[rml][ ASP] sql / recordset vraag[/rml]

Ik heb het datamodel inmiddels veranderd en gebruik tegenwoordig ook arrays om mijn recordset in te laden...

Ik zit nu echter met een probleem, ik heb de volgende structuur in mijn access tabelletje:

mID | relatie | niveau

Nu wil ik een sitemap samenstellen waarin alle niveau's terug komen, ik kan op zich met een sql query alle items ophalen...
SQL:
1
2
3
sqlstring = "SELECT menu.* "_
            & "FROM menu "_
            & "WHERE actief='J';"


De vraag is echter, hoe geef ik deze items weer...

ASP:
1
2
3
4
5
For num_rows = 0 To Ubound(sitemapARR,2)
    Response.Write("<tr><td>")
    Response.Write(menulink(een functie die een hyperlinkje maakt))
    Response.Write("</td><td>" & sitemapARR(ARR_beschrijving, num_rows) & "</td></tr>")
Next


Als ik zoiets als bovenstaande neerzet krijg ik niet de output die ik hebben wil, het hele verhaal moet namelijk gesorteerd worden op de manier die ik wil, dat is op zich ook nog wel te realiseren met door middel van een functie die ik op aspfaqs heb gevonden. Maar, hoe krijg ik het nu voor mekaar om onderliggende items weer te geven dus:

item1
-item1.1
--item1.1.1
---item1.1.1.1
----etc.

BVD

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


Verwijderd

Dit is geen triviaal probleem, dus tenzij iemand veel vrije tijd heeft en dit helemaal voor jou uitwerkt, denk ik dat je toch wat meer initiatief moet tonen in het vinden van een oplossing. Wat heb jij bijvoorbeeld tot nu toe bedacht?

Je kan dit op een paar manieren oplossen, waarbij een recursieve functie het mooist en efficients zou zijn, maar niet erg eenvoudig is om te programmeren. Je moet daarin ongeveer het volgende doen:
1) is dit het kleinste item dat nog niet afgedrukt is op het huidige nivo? Zo ja, ga door. Zo niet, zoek verder.
2) Heeft dit item 'child items'? Zo ja, ga verder met child items. Zo nee, druk dit item af, en onthoudt dit. Herhaal vanaf 1.

HTH :)

  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
Verwijderd schreef op 28 november 2002 @ 03:25:
Dit is geen triviaal probleem, dus tenzij iemand veel vrije tijd heeft en dit helemaal voor jou uitwerkt, denk ik dat je toch wat meer initiatief moet tonen in het vinden van een oplossing. Wat heb jij bijvoorbeeld tot nu toe bedacht?

Je kan dit op een paar manieren oplossen, waarbij een recursieve functie het mooist en efficients zou zijn, maar niet erg eenvoudig is om te programmeren. Je moet daarin ongeveer het volgende doen:
1) is dit het kleinste item dat nog niet afgedrukt is op het huidige nivo? Zo ja, ga door. Zo niet, zoek verder.
2) Heeft dit item 'child items'? Zo ja, ga verder met child items. Zo nee, druk dit item af, en onthoudt dit. Herhaal vanaf 1.

HTH :)
Even een iets andere insteek, het aantal niveau's wat maximaal zal worden bereikt is 9. Kan ik deze niet net zo goed via 9 recordsets oproepen? Is misschien minder fraai, maar, is het zo nadelig voor de performance dat de hele site meteen niet meer draait? :?

Dit zeg ik trouwens omdat ik gewoon niet de programmeer kwaliteiten heb om bovenstaande functie in mekaar te zetten...

[ Voor 7% gewijzigd door faabman op 28-11-2002 12:38 ]

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


Verwijderd

Als je ze al in de Query ordent en groepeert... Helpt dat misschien?

Verwijderd

FvKnijff schreef op 28 november 2002 @ 12:37:
Even een iets andere insteek, het aantal niveau's wat maximaal zal worden bereikt is 9. Kan ik deze niet net zo goed via 9 recordsets oproepen? Is misschien minder fraai, maar, is het zo nadelig voor de performance dat de hele site meteen niet meer draait? :?
Dus jij wilt dan maar 9 recordsets aanmaken. Dat zal de netwerk beheerder niet zo leuk vinden.

[ Voor 5% gewijzigd door Verwijderd op 28-11-2002 15:34 ]


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
Ik heb nu zelf het een en ander gesleuteld...

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<%
dim topARR
dim subARR

sqlstring = "SELECT menu.* "_
            & "FROM menu "_
            & "WHERE niveau=0 AND actief='J' "_
            & "ORDER BY volgorde;"
RSa.Open sqlstring, Con, 3, 1
    topARR = RSa.GetRows()
RSa.Close


For num_rows = 0 To UBound(topARR,2)
    Response.Write("<tr><td>" & topARR(ARR_naam, num_rows) & "</td>")
    Response.Write("<td>" & topARR(ARR_beschrijving, num_rows) & "</td></tr>")
        sitemap topARR(ARR_mID, num_rows), 0
    Response.Write("<tr><td><hr size=""1"" /></td></tr>")
Next

Function sitemap(f_mID, f_niveau)
    dim f_numrows
    f_niveau = CInt(f_niveau) + 1
    If f_niveau < 9 Then
        sqlstring = "SELECT menu.* "_
                    & "FROM menu "_
                    & "WHERE relatie=" & f_mID & " AND actief='J' "_
                    & "ORDER BY menu.volgorde;"
        RSa.Open sqlstring, Con, 3, 1
            If Not RSa.Recordcount = 0 Then
                subARR = RSa.GetRows()
            End If
        RSa.Close
            For f_numrows = 0 To Ubound(subARR, 2)
                Response.Write("<tr><td>" & subARR(ARR_naam, num_rows) & "</td>")
                Response.Write("<td>" & subARR(ARR_beschrijving, num_rows) & "</td></tr>")              
                sitemap subARR(ARR_mID, num_rows), f_niveau
            Next
    End If
End Function
%>


Dit geeft de volgende foutmelding, ik snap alleen niet waarom? Zat heel even te denken aan een redim, maar, dat is volgens mij niet hiervoor bedoelt.

code:
1
2
3
4
Soort fout:
Runtimefout Microsoft VBScript (0x800A000A)
Deze matrix ligt vast of is tijdelijk vergrendeld.: 'subARR'
/intranet/includes/main/inc_sitemap.asp, line 31


Kan iemand me misschien een zetje in de goede richting geven? Of ben ik helemaal in de verkeerde richting bezig? (dan begin ik namelijk weerk gewoon overnieuw >:)) .

BVD

edit:
Sorry als ik de layout een beetje sloop, maar, anders ziet mijn code er wel errug brak uit...

[ Voor 18% gewijzigd door faabman op 29-11-2002 20:38 ]

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
Hopende dat iemand mij kan helpen

Ik heb op het internet gezocht naar recursieve funties en ben daarbij het volgende tegen gekomen http://www.aspfaqs.com/webtech/060299-2.shtml en denk dat ik begrijp wat er met recursieve functies wordt bedoelt.

Ik weet ook wat het probleem is met de foutmelding in het vorige stukje, ik kan niet een array oproepen terwijl de array nog open staat. Ik weet alleen niet hoe ik dit op moet lossen. Ik heb de search (en hiermee bedoel ik dus ook google) hier al meerdere keren op doorzocht, maar, kan heel weinig vinden.

Om nu nogmaals mijn vraag te stellen... Hoe kan ik de items die onder de topitem vallen weergeven in 1 of misschien 2 recordsets / arrays.

Ik heb zelf wel aan de oplossing gedacht om in de tabel een veld in te bakken waar een soort volgorde in staat die alle items op de juiste manier neerzet, maar, dat is niet de methode waarop ik alle items weer wil geven.

Ik heb het gevoel dat ik op een dood spoor zit |:( dus hoop dat iemand mij kan helpen

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
mmm, ondertussen heb ik het datamodel nog ietsjes aangepast, ik heb nu de kolommen mID en relatie, aan de hand hiervan moet ik in mijn ogen ook alles kunnen bepalen. Ik heb al heel wat faqs doorgelezen en Google / GoT searches achter de rug, maar, weet nog steeds niet hoe ik dit (en met dit bedoel ik de vraag waarmee ik dit topic heb geopend) mooi op het scherm krijg zonder gebruik te maken van een heel aantal recordsets, dat wordt idd errug langzaam :o

[ Voor 8% gewijzigd door faabman op 01-12-2002 20:34 ]

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
Ik heb het nu opgelost zoals hieronder te zien, is geen fraaie oplossing, maar, het werkt wel :D (mocht er iemand zijn die een beter idee heeft dan hoor ik dat uiteraard graag :D)

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
<%
dim sitemapARR
dim strniveau

Response.Write("<table border=""0"" width=""100%"" cellspacing=""0"" cellpadding=""0""><tr>")
Response.Write("<td><b>" & titel_site & " Sitemap</b><hr size=""1""></td>")
Response.Write("</tr>")

sqlstring = "SELECT menu.* "_
            & "FROM menu "_
            & "WHERE menu.actief='J'"_
            & "ORDER BY menu.relatie, menu.volgorde;"
RSa.Open sqlstring, Con, 3, 1
    sitemapARR = RSa.GetRows()
RSa.Close

For num_rows = 0 To Ubound(sitemapARR,2)
    If sitemapARR(ARR_relatie, num_rows) = 0 Then
            Response.Write("<tr><td>" & spaties(0))
            Response.Write(menulink())
            Response.Write("</td><td>" & sitemapARR(ARR_beschrijving, num_rows) & "</td></tr>")
            submenuitemA(sitemapARR(ARR_mID, num_rows))
    End If
Next

Function submenuitemA(f_smID)
    dim subrowsA
    For subrowsA = 0 To Ubound(sitemapARR,2)
        If sitemapARR(ARR_relatie, subrowsA) = f_smID And sitemapARR(ARR_relatie, subrowsA) <> 0 Then
                Response.Write("<tr><td>" & spaties(1))
                Response.Write(menulink())
                Response.Write("</td><td>" & sitemapARR(ARR_beschrijving, subrowsA) & "</td></tr>")
                submenuitemB(sitemapARR(ARR_mID, subrowsA))
        End If
    Next
End Function

Function submenuitemB(f_ssmID)
    dim subrowsB
    For subrowsB = 0 To Ubound(sitemapARR,2)
        If sitemapARR(ARR_relatie, subrowsB) = f_ssmID And sitemapARR(ARR_relatie, subrowsB) <> 0 Then
                Response.Write("<tr><td>" & spaties(2))
                Response.Write(menulink())
                Response.Write("</td><td>" & sitemapARR(ARR_beschrijving, subrowsB) & "</td></tr>")
                submenuitemC(sitemapARR(ARR_mID, subrowsB))
        End If
    Next
End Function

Function submenuitemC(f_ssmID)
    dim subrowsC
    For subrowsC = 0 To Ubound(sitemapARR,2)
        If sitemapARR(ARR_relatie, subrowsC) = f_ssmID And sitemapARR(ARR_relatie, subrowsC) <> 0 Then
                Response.Write("<tr><td>" & spaties(3))
                Response.Write(menulink())
                Response.Write("</td><td>" & sitemapARR(ARR_beschrijving, subrowsC) & "</td></tr>")
                submenuitemD(sitemapARR(ARR_mID, subrowsC))
        End If
    Next
End Function

Function submenuitemD(f_ssmID)
    dim subrowsD
    For subrowsD = 0 To Ubound(sitemapARR,2)
        If sitemapARR(ARR_relatie, subrowsD) = f_ssmID And sitemapARR(ARR_relatie, subrowsD) <> 0 Then
                Response.Write("<tr><td>" & spaties(4))
                Response.Write(menulink())
                Response.Write("</td><td>" & sitemapARR(ARR_beschrijving, subrowsD) & "</td></tr>")
                submenuitemE(sitemapARR(ARR_mID, subrowsD))
        End If
    Next
End Function

Function submenuitemE(f_ssmID)
    dim subrowsE
    For subrowsE = 0 To Ubound(sitemapARR,2)
        If sitemapARR(ARR_relatie, subrowsE) = f_ssmID And sitemapARR(ARR_relatie, subrowsE) <> 0 Then
                Response.Write("<tr><td>" & spaties(5))
                Response.Write(menulink())
                Response.Write("</td><td>" & sitemapARR(ARR_beschrijving, subrowsE) & "</td></tr>")
                submenuitemF(sitemapARR(ARR_mID, subrowsE))
        End If
    Next
End Function

Function submenuitemF(f_ssmID)
    dim subrowsF
    For subrowsF = 0 To Ubound(sitemapARR,2)
        If sitemapARR(ARR_relatie, subrowsF) = f_ssmID And sitemapARR(ARR_relatie, subrowsF) <> 0 Then
                Response.Write("<tr><td>" & spaties(6))
                Response.Write(menulink())
                Response.Write("</td><td>" & sitemapARR(ARR_beschrijving, subrowsF) & "</td></tr>")
                submenuitemG(sitemapARR(ARR_mID, subrowsF))
        End If
    Next
End Function

Function submenuitemG(f_ssmID)
    dim subrowsG
    For subrowsG = 0 To Ubound(sitemapARR,2)
        If sitemapARR(ARR_relatie, subrowsG) = f_ssmID And sitemapARR(ARR_relatie, subrowsG) <> 0 Then
                Response.Write("<tr><td>" & spaties(7))
                Response.Write(menulink())
                Response.Write("</td><td>" & sitemapARR(ARR_beschrijving, subrowsG) & "</td></tr>")
        End If
    Next
End Function
Response.Write("</table>")

Function spaties(f_niveau)
    Select Case f_niveau
        Case 0
        spaties = ""
        Case 1
        spaties = "&nbsp;"
        Case 2
        spaties = "&nbsp;&nbsp;"
        Case 3
        spaties = "&nbsp;&nbsp;&nbsp;"
        Case 4
        spaties = "&nbsp;&nbsp;&nbsp;&nbsp;"
        Case 5
        spaties = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
        Case 6
        spaties = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
        Case 7
        spaties = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
    End Select
End Function
%>


Oww, by the weg, ik heb het dus opgelost door gewoon een zootje functies achter mekaar te plakken die telkens weer opnieuw door de array loopen.....

[ Voor 17% gewijzigd door faabman op 02-12-2002 01:33 . Reden: Layout probleempje ]

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

Tip: niet oplossen in ASP maar in de SQL zelf. ( SQL Procedures ).

En anders moet je toch eens zeer zeker gaan kijken naar recursiviteit. Je kan alle functies van submenuitemA...submenuitemG functies in EEN functie definieren, want in principe doen ze allemaal hetzelfde.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


Verwijderd

Waarom heb je allemaal functies die het zelfde doen :? Door een beetje slim te werk gaan kan je dit in 1 functie proppen (Ooit gehoord van een teller ;) )

Zoals dusty al zei kan je dit (waarschijnlijk) beter met sql doen.

[ Voor 19% gewijzigd door Verwijderd op 02-12-2002 09:08 ]


  • Mart!
  • Registratie: Februari 2000
  • Laatst online: 23-08 14:17
FvKnijff schreef op 29 november 2002 @ 20:37:
Ik heb nu zelf het een en ander gesleuteld...
[[... Hier stond een hele lap code ...]]
Dit geeft de volgende foutmelding, ik snap alleen niet waarom? Zat heel even te denken aan een redim, maar, dat is volgens mij niet hiervoor bedoelt.

code:
1
2
3
4
Soort fout:
Runtimefout Microsoft VBScript (0x800A000A)
Deze matrix ligt vast of is tijdelijk vergrendeld.: 'subARR'
/intranet/includes/main/inc_sitemap.asp, line 31
Op zich was je hier een heel eind op weg door gebruik van recursiviteit. Alleen de foutmelding ontstaat omdat je subARR niet ge'dim't hebt. hierdoor wordt het als GLOBALE variabele gezien. Deze kun je niet meerdere keren vullen met de functie Recordset.GetRows(). Als je subARR binnen de functie definieerd, dan zul je zien dat het al een stuk beter werkt

  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
Oke mensen, allemaal bedankt, dit is het uiteindelijk geworden...

Een leuke recursieve functie

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<%
Response.Write("<table border=""0"" width=""100%"" cellspacing=""0"" cellpadding=""0""><tr>")
Response.Write("<td colspan=""2""><b>" & titel_site & " Sitemap</b><hr size=""1""></td>")
Response.Write("</tr>")

For num_rows = 0 To Ubound(menuitemsARR,2)
    If menuitemsARR(ARR_relatie, num_rows) = 0 Then
            Response.Write("<tr><td>" & spaties(0))
            Response.Write(menulink())
            Response.Write("</td><td>" & menuitemsARR(ARR_beschrijving, num_rows) & "</td></tr>")
            submenuitem menuitemsARR(ARR_mID, num_rows), 1
    End If
Next

Function submenuitem(f_mID, f_niveau)
    dim subrows
    For subrows = 0 To Ubound(menuitemsARR,2)
        If menuitemsARR(ARR_relatie, subrows) = f_mID And menuitemsARR(ARR_relatie, subrows) <> 0 Then
                Response.Write("<tr><td>" & spaties(f_niveau))
                Response.Write(menulink())
                Response.Write("</td><td>" & menuitemsARR(ARR_beschrijving, subrows) & "</td></tr>")
                submenuitem menuitemsARR(ARR_mID, subrows), f_niveau + 1
        End If
    Next
End Function

Response.Write("</table>")

Function spaties(f_niveau)
    Select Case f_niveau
        Case 0
        spaties = ""
        Case 1
        spaties = "&nbsp;"
        Case 2
        spaties = "&nbsp;&nbsp;"
        Case 3
        spaties = "&nbsp;&nbsp;&nbsp;"
        Case 4
        spaties = "&nbsp;&nbsp;&nbsp;&nbsp;"
        Case 5
        spaties = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
        Case 6
        spaties = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
        Case 7
        spaties = "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"
    End Select
End Function
%>


Ik heb alleen nog een vraag, is het mogelijk om met spaties te vermenigvuldigen??

Zoals jullie hier kunnen zien doe ik het nu met een functie waarin ik dat handmatig weergeef, maar, het lijkt mij veel leuker als ik er een vermenigvuldiging van kan maken...

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 15:58

gorgi_19

Kruimeltjes zijn weer op :9

Je kan het in een simpele for-loop gooien.
code:
1
2
3
4
5
Dim spaties
spaties = ""
For I = 1 to intAantalSpaties
    spaties = spaties & "&nbsp;"
Next

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
gorgi_19 schreef op 02 december 2002 @ 19:53:
Je kan het in een simpele for-loop gooien.
code:
1
2
3
4
5
Dim spaties
spaties = ""
For I = 1 to intAantalSpaties
    spaties = spaties & "&nbsp;"
Next
Dank je :D, zat weer eens veel te moeilijk te denken 8)7

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 21-02 00:06

dusty

Celebrate Life!

FvKnijff schreef op 02 December 2002 @ 20:00:
[...]


Dank je :D, zat weer eens veel te moeilijk te denken 8)7


Je kan het ook binnen de recursieve functie mee geven en dan bij het aanroepen van zijn eigen functie er een extra " " eraan plakken.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR

Pagina: 1