Avatar billede rille101 Nybegynder
25. juli 2005 - 16:00 Der er 25 kommentarer og
1 løsning

Menu baseret på database

Hej
Jeg har lavet en simpel menu i en tabel.
Denne skal styres fra en database (slut med det simple for mig:)

Databasen:

Tabel varer:
titel      tekst      emne
ølglas    blabla    glas
tekande    blabla    porcelæn
osv...

("glas" og "porcelæn" bliver slået op i en tabel "emner")

Det færdige resultat skal se nogenlunde sådan ud:

Emner:
  Porcelæn [2]
  Glas [6]
  mønter [13]
  belysning [4]
osv...

Hvis vi f.eks. kigger nærmere på punktet Glas, så er "Glas" skrevet som HTML. [6] skal være en sammentælling af antallet af poster, hvori der står "Glas", under feltet "emne"

Hvis der ikke findes nogle poster der har "glas" som emne , Så skal menupunktet "glas" ikke vises.
(må være noget med en if sætning, ved bare ikke hvordan)

"Glas [6]" skal være et link der viderefører alle poster hvor emne = Glas.

Side 2 skal fange de data der bliver sendt med. Hvis id=glas  lister den alle glasgenstande op. Hvis id=porcelæn listes alle porcelænsgenstande op. (kan man det?)

Er der nogen der kan hjælpe mig med denne (for mig) komplicerede kodning?
Avatar billede softspot Forsker
25. juli 2005 - 17:01 #1
Du skal ud i noget med at joine og tælle. Det kunne være noget i stil med:

SELECT V.Titel, Count(E.emne) AS AntalEmner
FROM Varer AS V
INNER JOIN Emner AS E ON V.emne = E.ID
GROUP BY V.titel

Dette skulle give et resultat med flg. felter:
Titel
AntalEmner

Jeg antager i dette eksempel at du har flg. tabeller:
Varer =
  titel  (som er f.eks. ølglas)
+ emne    (som er en fremmednøgle der peger på primærnøglen i emner)
+ tekst 

Emner =
  ID      (som er primærnøgle)
+ emne    (som er teksten for emnet)

Desuden forventes det at du benytter Access (ellers skal du fjerne AS efter tabelnavnene i JOIN-udtrykket).
Avatar billede rille101 Nybegynder
25. juli 2005 - 17:21 #2
Hej softspot, og tak for din hurtige respons.
jeg bruger Access

I tabellen "emner" har jeg kun feltet emne, da de alligevel er unikke for den tabel.
Derfor har jeg så udskiftet E.ID med E.emne

Når jeg bruger din sql sætning, så skriver den alle poster ud, og ved AntalEmner, skriver den 1 ud for hver, men den tæller dem ikke sammen.
Når jeg laver en
<%=(RSantik.Fields.Item("AntalEmner").Value)%>
Står der således bare [1], men på den anden side, fortæller den streng jeg laver jo heller ikke hvilket emne den skal tælle sammen...
Avatar billede softspot Forsker
25. juli 2005 - 17:22 #3
Hmm... mon jeg lige skal kigge lidt på GROUP BY...

Øjeblik :)
Avatar billede softspot Forsker
25. juli 2005 - 17:27 #4
Står teksten til et emne på selve varen, altså er nøglen den faktiske tekst (f.eks. "glas"), for så behøver du ikke lave en join, så burde du bare kunne gruppere på emne i varetabellen...
Avatar billede softspot Forsker
25. juli 2005 - 17:29 #5
sludder du skal stadig gruppere på title, men altså undlade JOIN. Således

SELECT titel, COUNT(emne) AS antalEmner
FROM Varer
GROUP BY titel
Avatar billede softspot Forsker
25. juli 2005 - 17:32 #6
Nå, det lader til at jeg har fået startet på det forkerte udtræk - undskyld. Du skal jo bruge emneteksten og antallet af gange det er brugt. Det må være således:

SELECT emne, COUNT(emne) AS antalEmner
FROM varer
GROUP BY emne
Avatar billede rille101 Nybegynder
25. juli 2005 - 17:42 #7
Ja tredje gang var lykkens gang :), det virker med at tælle antallet af emner.
Hvordan får jeg den så til at skrive ud?
Som sagt, når jeg bruger
<%=(RSantik.Fields.Item("AntalEmner").Value)%>
Tager den vel bare den første og bedste post og skriver ud...
Avatar billede softspot Forsker
25. juli 2005 - 17:49 #8
Noget i stil med dette:

<%
response.write "Emner:<br>"
do while not rsantik.eof
  response.write "&nbsp;&nbsp;" & cstr(rsantik("emne")) & " [" & cint(rsantik("antalEmner")) & "]<br>"
  rsantik.movenext
loop
%>
Avatar billede softspot Forsker
25. juli 2005 - 17:52 #9
...og et svar hvis det skulle blive nødvendigt :)
Avatar billede rille101 Nybegynder
25. juli 2005 - 18:42 #10
Du er ihvertfald sikker på halvdelen af pointene, for det du har givet mig, virker 100%.
Jeg må dog lige vente med at give dig dine points, indtil nogen har hjulpet mig med 2. halvdel af spørgsmålet(linkfunktionen), ellers er der vist nogen der bliver tvære!
Avatar billede softspot Forsker
25. juli 2005 - 19:07 #11
Ups! Den del havde jeg slet ikke set, sorry.

Så skal du ændre loopet til at se således ud:

<%
response.write "Emner:<br>"
do while not rsantik.eof
  response.write "&nbsp;&nbsp;<a href=""side2.asp?id=" & cstr(rsantik("emne")) & """>"
  response.write cstr(rsantik("emne")) & " [" & cint(rsantik("antalEmner")) & "]</a><br>"
  rsantik.movenext
loop
%>

På side 2 skal du så bruge flg. SQL:

SQL = "SELECT titel, tekst, emne" & _
"FROM varer " & _
"WHERE emne = '" & cstr(request.querystring("emne")) & "'"

Derefter skal du indsætte flg. loop:

<%
response.write "<table>"
do while not rsantik.eof
  response.write "<tr>"
  response.write "<td>" & cstr(rsantik("titel")) & "</td>"
  response.write "<td>" & cstr(rsantik("tekst")) & "</td>"
  response.write "<td>" & cstr(rsantik("emne")) & "</td>"
  response.write "</tr>"
  rsantik.movenext
loop
response.write "</table>"
%>
Avatar billede rille101 Nybegynder
25. juli 2005 - 20:58 #12
Ok, det var godt du var hooked på sidste del også :)

Når jeg indsætter din linkfunktion, kan jeg kun se "Emner:"
Løkken vises ikke

Tjek lige dette.

Jeg har selv tilpasset din response.write, så de nu looper inde i en tabel.

<table width="90%"  border="0" align="right" cellpadding="0" cellspacing="0">
<%
do while not rsantik.eof
%>
              <tr>
                <td height="20" valign="bottom" > <div align="left" class="style12"><a href=""side2.asp?id=" & cstr(rsantik("emne")) & """>
                  <strong>&#8226;<%response.write "&nbsp;&nbsp;" & cstr(rsantik("emne"))%></strong></a>&nbsp;<%response.write "[" & cint(rsantik("antalEmner")) & "]"%>
</div></td>
              </tr>
<%
  rsantik.movenext
loop
%>
            </table>

Løkken fungerer, og IE registrerer godt nok at der er et link, men desværre fører linket bare til localhost/antik.
Avatar billede softspot Forsker
25. juli 2005 - 23:01 #13
Du har blandet HTML og serverside script lidt sammen. Jeg tænker specielt på den del hvor du trækker rsantik("emne") ud til href i dit link. Enten så skal du lave inline script omkring det udtræk (se eksempel 1), ellers skal du gøre som jeg gjorde og lave det hele som script (det performer iflg. diverse kilder også bedre hvis man undgår at skifte mellem serverside script og HTML - se eksempel 2)

Eksempel 1:
<table width="90%"  border="0" align="right" cellpadding="0" cellspacing="0">
<%
do while not rsantik.eof
%>
<tr>
  <td height="20" valign="bottom">
    <div align="left" class="style12"><a href="side2.asp?id=<%= cstr(rsantik("emne")) %>">
      <strong>&#8226;&nbsp;&nbsp;<%= cstr(rsantik("emne")) %></strong></a>&nbsp;[<%= cint(rsantik("antalEmner")) %>]
      </div></td>
  </tr>
<%
  rsantik.movenext
loop
%>
</table>

Eksempel 2:
<%
response.write "<table width=""90%"" border=""0"" align=""right"" cellpadding=""0"" cellspacing=""0"">" & vbCrLf
do while not rsantik.eof
  response.write " <tr>" & vbCrLf
  response.write "  <td height=""20"" valign=""bottom"">" & vbCrLf
  response.write "    <div align=""left"" class=""style12""><a href=""side2.asp?id=" & cstr(rsantik("emne")) & """>" & vbCrLf
  response.write "      <strong>&#8226;&nbsp;&nbsp;" & cstr(rsantik("emne")) & "</strong></a>&nbsp;[" & cint(rsantik("antalEmner")) & "]" & vbCrLf
  response.write "      </div></td>" & vbCrLf
  response.write "  </tr>" & vbCrLf

  rsantik.movenext
loop

response.write "</table>" & vbCrLf
Avatar billede softspot Forsker
25. juli 2005 - 23:05 #14
Hvis du er træt af alle de der dobbelte anførselstegn kan du bruge apostrof til attributværdierne i HTML - det bliver nok lidt lettere at overskue på den måde :)

Eksempel:
response.write "  <td height='20' valign='bottom'>" & vbCrLf

Ja, man kan i mange tilfælde endda undlade apostrof/anførselstegn omkring attributter i HTML-kode (hvis det er en sammenhængende streng, dvs. ingen mellemrum).

Eksempel:
response.write "  <td height=20 valign=bottom>" & vbCrLf
Avatar billede softspot Forsker
25. juli 2005 - 23:10 #15
Vær dog opmærksom på at den sidste metode er gammeldags og bør undgås aht. kompatibilitet med nyere HTML-standarder)... :)
Avatar billede rille101 Nybegynder
26. juli 2005 - 10:14 #16
Det går nok med anførelsestegnene, så dem holder jeg mig bare til...

OK nu virker linfunktionen, og vi nærmer os den totale løsning!

Der er lige en fejl på side2.asp

Der opstod en Microsoft VBScript-kørselsfejl fejl '800a01a8'
Et objekt er obligatorisk: ''

/antik/side2.asp, linje 18

16  <%
17  response.write "<table>"
18  do while not rsantik.eof
19  response.write "<tr>"
20  response.write "<td>" & cstr(rsantik("titel")) & "</td>"
21  response.write "<td>" & cstr(rsantik("tekst")) & "</td>"
22  response.write "</tr>"
23  rsantik.movenext
24  loop
25  response.write "</table>"
26  %>
Avatar billede softspot Forsker
26. juli 2005 - 11:30 #17
Ja, du skal også hente data fra databasen på denne side som du har gjort på den første side hvor du genererer menuen...

rsantik er naturligvis stadig det resultat dine connection.execute returnerer.
Avatar billede softspot Forsker
26. juli 2005 - 11:31 #18
Vis evt. hele koden fra den første side, hvis du ikke kan få side to's kode til at hænge sammen :)
Avatar billede rille101 Nybegynder
26. juli 2005 - 13:00 #19
Ok her får du lige koden, for jeg er nemlig ikke helt med... :)

Side 1:
Mit Recordset

<%
Dim RSantik
Dim RSantik_numRows

Set RSantik = Server.CreateObject("ADODB.Recordset")
RSantik.ActiveConnection = MM_antik_STRING
RSantik.Source = "SELECT emne, COUNT(emne) AS antalEmner  FROM varer  GROUP BY emne"
RSantik.CursorType = 0
RSantik.CursorLocation = 2
RSantik.LockType = 1
RSantik.Open()

RSantik_numRows = 0
%>

og længere nede på samme side har jeg så:

<%
do while not rsantik.eof
%>
              <tr>
                <td height="20" valign="bottom" > <div align="left" class="style12"><a href="side2.asp?id=<%= cstr(rsantik("emne")) %>">
                  <strong>&#8226;<%response.write "&nbsp;&nbsp;" & cstr(rsantik("emne"))%></strong></a>&nbsp;<%response.write "[" & cint(rsantik("antalEmner")) & "]"%>
</div></td>
              </tr>
<%
  rsantik.movenext
loop
%>
Avatar billede softspot Forsker
26. juli 2005 - 13:11 #20
For at bruge din egen terminologi:

<%
Dim RSantik
Dim RSantik_numRows
Dim SQL

SQL = "SELECT titel, tekst, emne" & _
      "FROM varer " & _
      "WHERE emne = '" & cstr(request.querystring("emne")) & "'"

Set RSantik = Server.CreateObject("ADODB.Recordset")
RSantik.ActiveConnection = MM_antik_STRING
RSantik.Source = SQL
RSantik.CursorType = 0
RSantik.CursorLocation = 2
RSantik.LockType = 1
RSantik.Open()

RSantik_numRows = 0

response.write "<table>"
do while not RSantik.eof
  response.write "<tr>"
  response.write "<td>" & cstr(RSantik("titel")) & "</td>"
  response.write "<td>" & cstr(RSantik("tekst")) & "</td>"
  response.write "</tr>"
  RSantik.movenext
loop
response.write "</table>"
RSantik.Close
set RSantik = nothing
%>
Avatar billede rille101 Nybegynder
26. juli 2005 - 13:30 #21
Jeg får lige nu denne fejl:

Microsoft OLE DB Provider for ODBC Drivers fejl '80040e14'

[Microsoft][ODBC Microsoft Access-driver] Der er en syntaksfejl, fordi der mangler en operator. i forespørgselsudtrykket "emneFROM varer WHERE emne = ''".

/antik/side2.asp, linje 18
Avatar billede softspot Forsker
26. juli 2005 - 13:39 #22
Prøv at udskifte den nuværende SQL med denne:

SQL = "SELECT titel, tekst, emne " & _
      "FROM varer " & _
      "WHERE emne = '" & cstr(request.querystring("emne")) & "'"
Avatar billede softspot Forsker
26. juli 2005 - 13:43 #23
Det kan da godt være du skal ændre den til flg. i stedet (da du benytter "id" som parameter og ikke "emne" som jeg har antaget):

SQL = "SELECT titel, tekst, emne " & _
      "FROM varer " & _
      "WHERE emne = '" & cstr(request.querystring("id")) & "'"
Avatar billede softspot Forsker
26. juli 2005 - 13:43 #24
...og det var altså ikke din skyld - det var mig der havde overset det :)
Avatar billede rille101 Nybegynder
26. juli 2005 - 13:51 #25
Pyt det gjorde ikke ondt :)

Softspot, du er sgu klog. Alt virker perfekt!
Mange tak for hjælpen!
Avatar billede softspot Forsker
26. juli 2005 - 14:05 #26
Klog og klog... jeg har været der før ;)

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