[ASP]Sortering database records in alphabetische lijst

Pagina: 1
Acties:

  • Kawa
  • Registratie: Juni 2001
  • Laatst online: 19:48
Ik heb een array (ABCArray) met daarin alle letters van het alfabet en hiermee wil ik de records van een tabel sorteren. Het moet er dan als volgt uit komen te zien:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
A
B
 - Benzodiazepinen
C
 - Chloroquine
 - Chloride
 - Chloroform 
D
 - Digoxine
E
F
G
... enz


Het lukt me alleen niet om dit te doen zonder 26 x een database connectie te maken wat natuurlijk niet de bedoeling is. Zie hier het pruts werk:
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
<%
Dim ABCArray, i

ABCArray = Array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z")

Set RS_open_monografie  = Server.CreateObject("ADODB.Recordset")

strSQL = "SELECT * FROM tb_monografie"

For i = 0 to ubound(ABCArray)
Response.Write ABCArray(i) & "<br />"
RS_open_monografie.Open strSQL, Conn, adOpenStatic,adLockReadOnly 

Do while not RS_open_monografie.EOF

      If CStr(Left(Ucase(RS_open_monografie(1)),1)) = ABCArray(i) then
        Response.Write ("&nbsp;-&nbsp;" & RS_open_monografie(1) & "<br />")
      End if

RS_open_monografie.MoveNext
Loop
RS_open_monografie.Close

Next

Set RS_open_monografie = Nothing
%>


Kan iemand me op weg helpen om dit op een nette manier op te lossen?

Oh ja, ik maak gebruik van een Access 2k databeestje

[ Voor 37% gewijzigd door Kawa op 23-12-2003 21:34 . Reden: toevoeging ]


  • Monkeybrains
  • Registratie: Juni 2001
  • Laatst online: 21:02
Sorteren kan je natuurlijk al met de select (select * from tb_monografie order by name). Voor de rest zie ik niet helemaal het nut van het gebruik van de array van letters, maar ik ben ook een asp leek. Als ik het goed begrijp wil je een soortement van treelist maken?

[ Voor 15% gewijzigd door Monkeybrains op 23-12-2003 21:38 ]


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Ik neem aan dat je dit wilt?

Stukje perl (geknipt, ge-edit en geplakt, weet niet of het nog 100% werkt zo)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   $sth = $dbh->prepare("select bandid, bandname from mc_bands order by bandname");
   $sth->bind_columns(\$bandid,\$bandname);

   print "<TABLE><TD>";
   while($sth->fetch()) {
      $bandname =~ /(.)/; #eerste letter komt in $1 te staan
      if ($1 ne $firstchar) {
#nieuwe letter!
         $firstchar = $1;
         print "</TD></TABLE><HR><A NAME=\"$firstchar\"><TABLE><TD VALIGN=TOP WIDTH=40><H2><A HREF=\"#Top\">$firstchar</A></H2></TD><TD>\n"
      };
      print "<A HREF=\"band.pl?id=$bandid\">$bandname</A><BR>\n";
   }
   $sth->finish;
   print "</TD></TABLE><HR>";

[ Voor 22% gewijzigd door Varienaja op 23-12-2003 21:42 ]

Siditamentis astuentis pactum.


  • Kawa
  • Registratie: Juni 2001
  • Laatst online: 19:48
Monkeybrains schreef op 23 december 2003 @ 21:36:
Sorteren kan je natuurlijk al met de select (select * from tb_monografie order by name). Voor de rest zie ik niet helemaal het nut van het gebruik van de array van letters, maar ik ben ook een asp leek. Als ik het goed begrijp wil je een soortement van treelist maken?
Het gaat me inderdaad om de treelist
Dat is precies wat ik wil (qua uiterlijk). Helaas laat dit script alleen de letters zien die ook corresponderen met bestaande records. Ik wil alle 26 letters op scherm, ook als hier geen records mee overeenkomen.

[ Voor 35% gewijzigd door Kawa op 23-12-2003 21:47 ]


  • bramseltje
  • Registratie: September 2001
  • Laatst online: 23-05 10:13
Hmm, mischien kun je iets doen als:

Pseudo code
ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
sql->Select * FROM table ORDER BY name

If dbase.HasRows
    For i = a TO z
       Schrijf(i)
       'Schrijf op welke letter we zijn
       If InString(dbase("naam"), letter) = 1
            schrijf(dbase(velden))
            'schrijf op welke velden je wil uitpoepen
            dbase.MoveNext
            'ga naar het volgende record
       End If
    Next i
Whend


Edit:

het volgende zou beter moeten werken:
code:
1
2
3
4
5
6
7
8
9
10
(select verhaal)

If dbase.HasRows
    For letter = 'a' TO 'z'
         Do While InString(dbase("name"), letter) = 1
                Schrijf(dbase(velden))
                dbase.MoveNext
         Whend
    Next
End If


succes ermee! ;)

[ Voor 37% gewijzigd door bramseltje op 23-12-2003 22:16 ]


  • Kawa
  • Registratie: Juni 2001
  • Laatst online: 19:48
Bramseltje schreef op 23 december 2003 @ 21:59:
Hmm, mischien kun je iets doen als:

Pseudo code
Dat is wat ik nu heb. Het probleem is dat als ik m'n database open thingie buiten de ABCArray loop zet (om dus maar 1 keer een db connectie te openen) de char vergelijking alleen werkt voor de eerste waarde uit de array wat logisch is.

Wat ik natuurlijk wel kan doen (mischien bedoel je dat ook) is eerst alle db velden in een array proppen en deze gebruiken met de ABCArray loop... hmmmm

[ Voor 18% gewijzigd door Kawa op 23-12-2003 22:14 ]


  • bramseltje
  • Registratie: September 2001
  • Laatst online: 23-05 10:13
Kawa schreef op 23 december 2003 @ 22:10:
[...]

Dat is wat ik nu heb. Het probleem is dat als ik m'n database open thingie buiten de ABCArray loop zet (om dus maar 1 keer een db connectie te openen) de char vergelijking alleen werkt voor de eerste waarde uit de array wat logisch is.

Wat ik natuurlijk wel kan doen (mischien bedoel je dat ook) is eerst alle db velden in een array proppen en deze gebruiken met de ABCArray loop... hmmmm
Wat ik probeer te bereiken is dat je niet een array gebruikt, maar gewoon door je recordset loopt. Dus direct de resultaten van je query. In ASP is dat prima mogelijk, en kun je die velden heel eenvoudig uitlezen... Doe ik ook wel ergens in m'n siteje...

  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 18-05 15:53

Jaspertje

Max & Milo.. lief

Wat je 'moet' kan doen is die array met letters gebruiken (a,b, c, d)

Volgende volghorde:

Select uit database order by name
Array maken (a, b, c, d....)

Doorloop de array -->

for i = to Lboud(array) *geloof ik

next
while not rs.eof

Binnen die array ga je kijken -->
if len(rs("record"), 1) = Array(i) then
Zet neer
else *Je bent er voorbij.. je moet i+1 doen
end if
rs.Movenext
wend
Het is een beetje rommelig, het is ook al een beetje laat....

Misschien gaat het ook niet helemaal werken. :)

*optie 2

Ik weet niet of Access met getrows overweg kan (zou niet weten waarom niet)

Maar je kan het ook met 2 arrays doen

[pseudo code]
ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
dim RS_Array
Set rs = Conn.Execute("SELECT * FROM tb_monografie Order By name")
rs_Array = rs.GetRows
Set rs = Nothing

ABCArray = Array("A","B","C","D","E","F","G","H","I","J","
K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z")

i = 0
do until i = 26 ;Alfabet
 do until j = Ubound(rs_Array,2)
  if  ABCArray(i) = len(RS_Array(0,j),1) then 'Het is de letter
  else
  i = i+1
  end if
j = j+1
 loop
 i = i+1
loop
next


Ik weet niet of het uitlezen van array lukt: rs_Array(0,j), dat kan ook andersom zijn.. De 0 is dan de eerste kolom die je uit de SQL terug krijgt.. het is dus mooier om in dit geval Select naam, bla, bla enz.. te doen ipv select *

[ Voor 64% gewijzigd door Jaspertje op 23-12-2003 22:27 ]


  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 18:52

RayNbow

Kirika <3

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
<%
Dim ABCArray, i, HuidigeLetter

ABCArray = Array("A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z")

Set RS_open_monografie  = Server.CreateObject("ADODB.Recordset")
strSQL = "SELECT * FROM tb_monografie ORDER BY name"
RS_open_monografie.Open strSQL, Conn, adOpenStatic,adLockReadOnly

i = 0
Do While i <= UBound(ABCArray)
   Response.Write ABCArray(i) & "<br />"
   
   HuidigeLetter = True
      
   Do While (Not RS_open_monografie.EOF) And HuidigeLetter
      
      If CStr(Left(UCase(RS_open_monografie(1)),1)) = ABCArray(i) Then
         Response.Write "&nbsp;-&nbsp;" & RS_open_monografie(1) & "<br />"
         RS_open_monografie.MoveNext
      Else
         HuidigeLetter = False
      End If
      
   Loop

   i = i + 1

Loop

RS_open_monografie.Close
Set RS_open_monografie = Nothing

%>


EDIT: bug in code 8)7 8)7

[ Voor 49% gewijzigd door RayNbow op 23-12-2003 22:41 ]

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 18:52

RayNbow

Kirika <3

*verkeerde knop gedrukt*

[ Voor 184% gewijzigd door RayNbow op 23-12-2003 22:41 ]

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


  • Kawa
  • Registratie: Juni 2001
  • Laatst online: 19:48
[b][message=19561431,noline]RayNbow schreef op 23 december 2003 @ 22:30 een stukje ubercode :)
bedankt, ook de overige mensen die me op weg hebben geholpen uiteraard _/-\o_ Ik zie door de bomen weer structuur...

[ Voor 3% gewijzigd door Kawa op 23-12-2003 22:53 ]

Pagina: 1