[ASP] Array eerst dan do while? of gewoon een foutieve code?

Pagina: 1
Acties:

  • blijhoofd_bennie
  • Registratie: Maart 2000
  • Niet online

blijhoofd_bennie

Wasser für alle!!

Topicstarter
Ik zit met een probleempje, ik heb de volgende code (zie hieronder)

(* heb het zo goed mogelijk proberen uit te lijnen)

code:
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
 rsTypen.MoveFirst                          
 While not rsTypen.EOF  
  %>
  <tr>
   <td width=40%>   
    <table border=0 width=70% align=right>
     <tr>
      <td>                          
      </td> 
     </tr>
    </table>    
   </td>
   <td>
 <%
 'Hier wordt gekeken of de gebruiker vakken geselecteerd heeft.
  If not blnProductType = "" then
  'Zijn er vakken geselecteerd wordt de onderstaande lus weergegeven.
   For i=0 to (Ubound(arrProductType))  
   'Hier wordt door alle array waarden gelust.
    If arrProductType(i) = cStr(rsTypen("TypeID")) then
    %>
    <input type=checkbox checked value=<%=rsTypen("TypeID")%> name=chkbTypen>
     <font face=Arial size=3 tabindex=10>
      <%=rsTypen("TypeCode")%> 
     </font>
    <%
    Else
    %>
    <input type=checkbox value=<%=rsTypen("TypeID")%> name=chkbTypen>
     <font face=Arial size=3 tabindex=10>
      <%=rsTypen("TypeCode")%> 
     </font>
    <%
    End if
   Next
  Else
  %>
  <input type=checkbox value=<%=rsTypen("TypeID")%> name=chkbTypen>
    <font face=Arial size=3 tabindex=10>
     <%=rsTypen("TypeCode")%>               
    </font>
  <%                            
  End if                                
  %>
    </td>
  </tr> 
  <%
 rsTypen.MoveNext                           
 Wend


Doel van de code:
Controleren of een gebruiker een bepaald type heeft geselecteerd. Vervolgens deze weer te selecteren als er een fout optreedt. Bijv. de gebruiker heeft niet alle velden ingevoerd en wordt terug gestuurd naar het invul scherm. De gebruiker had bijvoobeeld de typen 1 en 3 van de 10 geselecteerd en dus moeten deze opnieuw geselecteerd worden wanneer er terug wordt gegaan naar het vorige scherm.

De wijze van checken:
De gekozen waarden van de gebruiker worden in een array gezet. Vervolgens worden de waarden van de gebruiker vergeleken met de typen (=recordset). Een recordset wordt dus vergeleken met een array.

Probleem:
De bovenstaande code gaat goed zolang de betreffende array maar 1 waarde bevat. Bevat deze meerdere waarden dan worden het aantal type lijsten maal array waarden weergegeven. Dit houdt in dat als de array 2 waarden bevat een lijst met typen weergegeven wordt, waarvan het veld van de eerste array (dus 3) wel geselecteerd wordt. En vervolgens wordt er nogmaals een tweede type lijst weergegeven (waarvan geen enkele is geselecteerd).

Bevindingen:
Ben al een tijdje aan het kijken en dacht zelf tot de volgende conclusie te zijn gekomen. Onafhankelijk of ik eerste een array doe met daarin een while went lus of omgekeerd dat eerst de array wordt uitgelezen

Want als ik de array uitlees gaat mijn code de mist in. Als ik gewoon door de records lus en zeg bijvoorbeeld selecteer vak waar ID = 5 dan gaat het goed. Maar doe ik dezelfde code, maar sluit deze gewoon in, in een array (waar verder helemaal niets gechecked wordt, alleen array wordt uitgelezen) dan geeft ie hetzelfde probleem als bij "Probleem:". Dus het aantal weergegeven typelijsten gelijk is aan het aantal array waarden.

Vraag:
Kunnen jullie me misschien helpen, misschien zit er gewoon een fout in de code en zie ik hem nu ff niet (komt wel eens vaker voor). Of klopt het dus dat een array uitlezen eerst wordt uitgevoerd (dus for next loop) en dan later een while went?

Oplossing:
Ik probeer nu alle typen ook in een array te zetten en dus een array met een array te vergelijken om te kijken of het zo wel werkt.

(*Hoop dat mijn vraag een beetje duidelijk is)

  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 15-04 15:52
Je kunt proberen te Redimmen met het keyword preserve.
Je array word namelijk bij iedere pass door de loop leeg gegooit.

Ik heb eens het zelfde probleem gehad.

ASP:
1
2
3
4
5
6
Dim myArray()

        For i = 1 To iAantal
            Redim Preserve myArray(i)
            myArray(i) = iets
        Next

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


  • Vaudtje
  • Registratie: April 2002
  • Niet online
Sorry, zie niet direct in je code wat er fout gaat (je haalt niet je array en de recordset door elkaar? Dat de recordset de ingevulde waarden bevat en de array de mogelijke waarden)
Maar ik heb wel een opmerkinkje over de code :P
Je hebt er nl. veel keren hetzelfde in staan, en volgens mij kan dat compacter (zelfs zonder een else)
Ik moet bekennen dat mijn ASP skillz zeer limited zijn, maar ik hoop dat dit een zinnige suggestie is.... volgens mij moet de fout nu ook makkelijker op te sporen zijn.

edit:
En jawel hoor: volgens mij heb ik je code nu onbewust gefixored :*)
Klopt dat? En zie je ook waarom?

ASP.NET Visual Basic:
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
dim checkboxText
rsTypen.MoveFirst                           
 While not rsTypen.EOF 
    'resetten checkboxText
    checkboxText = ""
%>
  <tr>
   <td width=40%>   
    <table border=0 width=70% align=right>
     <tr>
      <td>                          
      </td> 
     </tr>
    </table>    
   </td>
   <td>
 <%
 'Hier wordt gekeken of de gebruiker vakken geselecteerd heeft.
  If not blnProductType = "" then
  'Zijn er vakken geselecteerd wordt de onderstaande lus weergegeven.
   For i=0 to (Ubound(arrProductType))  
   'Hier wordt door alle array waarden gelust.
    If arrProductType(i) = cStr(rsTypen("TypeID")) then
      checkboxText = "checked" 'de checkbox moet aangevinkt worden
    End if
   Next
  End if                                
%>
'Om niet de drie keer dezelfde checkbox in je code te 
'hebben, alleen ff de "checked" erbij zetten als dat nodig blijkt
    <input type=checkbox value=<%=rsTypen("TypeID")%> name=chkbTypen [b]<%=checkBoxText%>[/b]>
     <font face=Arial size=3 tabindex=10>
      <%=rsTypen("TypeCode")%> 
     </font>
    </td>
  </tr> 
  <%
 rsTypen.MoveNext                           
 Wend

In deeze zin staan drie fauten


  • blijhoofd_bennie
  • Registratie: Maart 2000
  • Niet online

blijhoofd_bennie

Wasser für alle!!

Topicstarter
Vaudtje schreef op 19 september 2002 @ 22:08:
Sorry, zie niet direct in je code wat er fout gaat (je haalt niet je array en de recordset door elkaar? Dat de recordset de ingevulde waarden bevat en de array de mogelijke waarden)
Maar ik heb wel een opmerkinkje over de code :P
Je hebt er nl. veel keren hetzelfde in staan, en volgens mij kan dat compacter (zelfs zonder een else)
Ik moet bekennen dat mijn ASP skillz zeer limited zijn, maar ik hoop dat dit een zinnige suggestie is.... volgens mij moet de fout nu ook makkelijker op te sporen zijn.

edit:
En jawel hoor: volgens mij heb ik je code nu onbewust gefixored :*)
Klopt dat? En zie je ook waarom?

ASP.NET Visual Basic:
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
dim checkboxText
rsTypen.MoveFirst                           
 While not rsTypen.EOF 
    'resetten checkboxText
    checkboxText = ""
%>
  <tr>
   <td width=40%>   
    <table border=0 width=70% align=right>
     <tr>
      <td>                          
      </td> 
     </tr>
    </table>    
   </td>
   <td>
 <%
 'Hier wordt gekeken of de gebruiker vakken geselecteerd heeft.
  If not blnProductType = "" then
  'Zijn er vakken geselecteerd wordt de onderstaande lus weergegeven.
   For i=0 to (Ubound(arrProductType))  
   'Hier wordt door alle array waarden gelust.
    If arrProductType(i) = cStr(rsTypen("TypeID")) then
      checkboxText = "checked" 'de checkbox moet aangevinkt worden
    End if
   Next
  End if                                
%>
'Om niet de drie keer dezelfde checkbox in je code te 
'hebben, alleen ff de "checked" erbij zetten als dat nodig blijkt
    <input type=checkbox value=<%=rsTypen("TypeID")%> name=chkbTypen [b]<%=checkBoxText%>[/b]>
     <font face=Arial size=3 tabindex=10>
      <%=rsTypen("TypeCode")%> 
     </font>
    </td>
  </tr> 
  <%
 rsTypen.MoveNext                           
 Wend
Bijna gefixed. Hij wordt niet meer dubbel, nu alleen nog ff kijken waarom ie niet twee of meerderen velden selecteert. En dat zou misschien wel met Redim Preserve myArray(i) (ken hem zo nog niet) moeten.


Oh ja met dat dubbel op kan wel eens kloppen, heb de behoefte vaak te veel checks in te bouwen (ja waarom weet ik niet onder het motto liever te veel dan te weinig).

  • Vaudtje
  • Registratie: April 2002
  • Niet online
offtopic:
Wat een mega kwoot :D Hoewel mijn code natuurlijk Godlike O-) is, hoef je hem niet perse helemaal te herhalen ;)


Misschien nog eens ten overvloede:
De reden dat hij de checkboxes dus dubbel afdrukte, is omdat het afdrukken binnen de For-loop van de array stond. In mijn poging je code op te schonen, kwam hij er automatisch buiten te staan.
Je wil maar een checkbox per Type, niet een checkbox per Type per ingevulde waarde.

Ter optimalisatie kun je trouwens overwegen tussen regels 24 & 25 een break te zetten. Als je eenmaal een match hebt gevonden, hoef je niet verder door de array te sjezen :)
nu alleen nog ff kijken waarom ie niet twee of meerderen velden selecteert
Okee dan :P
Hoe lees je de checkboxen server-side weer uit? Ze hebben namelijk allemaal dezelfde naam. :+ :>

ASP.NET Visual Basic:
1
name=chkbTypen

In deeze zin staan drie fauten


  • blijhoofd_bennie
  • Registratie: Maart 2000
  • Niet online

blijhoofd_bennie

Wasser für alle!!

Topicstarter
Vaudtje schreef op 19 september 2002 @ 23:01:


[...]


Okee dan :P
Hoe lees je de checkboxen server-side weer uit? Ze hebben namelijk allemaal dezelfde naam. :+ :>

ASP.NET Visual Basic:
1
name=chkbTypen
Ok mocht je mega code niet meer herhalen :P. Maar uuhm dat ze dezelfde naam hebben is geen probleem. Een variabele kan in ASP namelijk meerdere waarden bevatten. Het werkt ongeveer allemaal zo, ik selecteer een aantal velden (allemaal naam checkbox) en deze worden doorgegeven aan een andere form. Dit form checked van zijn er wel typen ingevuld (en of andere velden etc). Is dit niet het geval, dan worden de correcte variabelen terug gegeven. De variabele checkbox wordt terug gegeven met meerdere waarden (dit gaat goed). Vervolgens zet ik deze variabelen op het invul form in een array, waarna ik vervolgens door de array loop (of kan dit niet werken?).

  • Vaudtje
  • Registratie: April 2002
  • Niet online
blijhoofd_bennie schreef op 19 September 2002 @ 23:19:
[...]

Maar uuhm dat ze dezelfde naam hebben is geen probleem. Een variabele kan in ASP namelijk meerdere waarden bevatten.
:o :o |:( duh! Je hebt helemaal gelijk :D
De variabele checkbox wordt terug gegeven met meerdere waarden (dit gaat goed). Vervolgens zet ik deze variabelen op het invul form in een array, waarna ik vervolgens door de array loop.
Het lijkt me met wat ik nu zie het meest logische dat er iets misgaat met het vullen van de array.
Als je tussentijds de lengte van de array verandert met behulp van redim (bv. iedere keer dat je een waarde toevoegd zoals 4of9 deed) moet je idd preserve gebruiken, anders wordt je array steeds leeggegooid.
Maar volgens mij weet je de maximale lengte van de array al, of niet? Die is nl. gelijk aan rsTypen.recordCount <--- bestaat iets dergelijks?
In dat geval kan je voor het vullen de redim eenmalig uitvoeren.

:O moet nu gaan :z :Z , ik kijk hier morgen weer.

In deeze zin staan drie fauten


  • blijhoofd_bennie
  • Registratie: Maart 2000
  • Niet online

blijhoofd_bennie

Wasser für alle!!

Topicstarter
Vaudtje schreef op 19 september 2002 @ 23:38:
[...]

:o :o |:( duh! Je hebt helemaal gelijk :D


[...]

Het lijkt me met wat ik nu zie het meest logische dat er iets misgaat met het vullen van de array.
Als je tussentijds de lengte van de array verandert met behulp van redim (bv. iedere keer dat je een waarde toevoegd zoals 4of9 deed) moet je idd preserve gebruiken, anders wordt je array steeds leeggegooid.
Maar volgens mij weet je de maximale lengte van de array al, of niet? Die is nl. gelijk aan rsTypen.recordCount <--- bestaat iets dergelijks?
In dat geval kan je voor het vullen de redim eenmalig uitvoeren.

:O moet nu gaan :z :Z , ik kijk hier morgen weer.
offtopic:
Wilde niet zeggen dat ik gelijk had :P


Hieronder het stukje code waar je kunt zien dat ik de array vul
Vervolgens loop ik dan door de array met for next.

code:
1
2
3
4
5
6
7
8
9
blnProductType = TRIM(Request.Form("productType"))
If not blnProductType = "" then
Response.Write blnProductType
arrProductType = blnProductType
'split maakt van de arraywaarde een string
arrProductType = split(arrProductType,",")
Else
blnProductType = ""
End if


Zal dat redim morgen eens bekijken, ga nu ook pitten :Z
Pagina: 1