18. april 2002 - 11:34Der er
62 kommentarer og 2 løsninger
Hvordan laver man det rigtige opslag
Jeg har følgende:
Database: kursus.mdb
Tabel: kursus og ansvar (er flettet sammen fra to baser)
I kursus er der en post der hedder Kkategori som skal findes i hele basen. Alle poster der har samme Kkategori skal derefter listes efter hinanden. Derunder næste Kkategori med tilhørende visning. Og så videre intil der ikke er flere i basen. Helst med 10 visninger pr. side, men mulighed for at se de næste 10. Eventuelt kunne alle Kkategori'er listes så man kan klikke på en Kkategori og så se alle kurser der hører dertil. Det ville nok være det bedste.
Når man har fundet og får vist listen skal man f. eks. kunne klikke på en af de viste så man kan se yderligere oplysninger. Når ydeligere oplysninger vises er der i kursus en post der hedder ANSVARLIG som er navnet på den der står for et kursus. I ansvar står samme navn i NAVN og også emailen på vedkommende i posten EMAIL som gerne skulle flettes sammen så der vises et MAILTO: link til vedkommende.
Det skal bruges til at vise indholdet som beskrevet ovenfor på en webside.
Er her en der kunne tænke sig at komme med eksempler, og hvormage point skal det koste ?
Ok, du har slet ikke åbnet din database fra din side? Prøv det her: Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../databaser/kursus.mdb") set rst = Server.CreateObject("ADODB.Recordset") sql = "SELECT * FROM 'kursus og ansvar' ORDER BY Kkategori" rst.Open sql, Conn, 3, 3
Det forudsætter at din database ligger i en mappe der hedder databaser, på samme niveau som den mappe siden ligger i.
Synes godt om
Slettet bruger
18. april 2002 - 12:09#4
Jeg havde lavet følgende test:
<% ' Åben Connection til databasen set conn = Server.CreateObject("ADODB.Connection") conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & server.mappath("kursus.mdb") & ";"
set rs = Server.CreateObject("ADODB.Recordset") rs.Open strsql, conn, 1, 2
SELECT * FROM 'kursus og ansvar' ORDER BY Kkategori
Do While (NOT rs.EOF)
Response.Write rs("KKATEGORI")
rs.MoveNext Loop
' Luk recordset og connection rs.Close Set rs = Nothing conn.Close Set conn = Nothing %>
Synes godt om
Slettet bruger
18. april 2002 - 12:20#5
Nu ser koden sådan ud: <% ' Åben Connection til databasen set conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & server.mappath("kursus.mdb") & ";" set rst = Server.CreateObject("ADODB.Recordset") sql = "SELECT * FROM 'kursus og ansvar' ORDER BY Kkategori" rst.Open sql, Conn, 3, 3 Do While (NOT rst.EOF) Response.Write rst("KKATEGORI") rst.MoveNext Loop ' Luk recordset og connection rst.Close Set rst = Nothing conn.Close Set conn = Nothing %>
og jeg får fejl:
Microsoft OLE DB Provider for ODBC Drivers (0x80004005) [Microsoft][ODBC Microsoft Access Driver] Syntax error in query. Incomplete query clause.
Det kunne du jo bare have sagt. Så skal din sql sætning se således ud. sql = "SELECT * FROM kursus ORDER BY Kkategori;" Så får du kun den ene tabel med, kursus. Hvis du vil koble de to tabeller sammen, kræver det at de bliver koblet sammen via et felt de deler. Det er lidt bøvlet at fortælle, uden at vide hvordan dine tabeller ser ud, og hvordan du havdde tænkt dig at slutresultatet skulle se ud.
Tabel: kursus og ansvar (er flettet sammen fra to baser) forstår jeg som en tabel, der er flettet sammen fra to databaser. Ellers skulle der vel have stået tabelLER SKAL flettes sammen til en tabel. Hvad er i øvrigt forskellen på det eagleeye skrev som sql, og det jeg skrev?
Synes godt om
Slettet bruger
18. april 2002 - 12:50#14
Jeg har flettet dem sammen i Access. Det ser ud til at den linie jeg skulle bruge er ens ? Men eagleeye spurgte om relationerne. Ellers ved jeg ikke hvad du mener med det.
I første omgang ville jeg gerne have det til at virke som jeg skrev første indlæg.
Den næste sql du skal lave skal hente information ud fra ansvar. Du laver et link til en ny side ala <a href="ansvarlig.asp?navn=<%=rs("ansvarlig")%>"><%=rs("ansvarlig")%></a> på den anden side, som i dette tilfælde hedder ansvarlig, skal din sql sætning se således ud: sql = "SELECT * FROM ansvar WHERE navn = " & request.querystring("navn") Hvis du også skal bruge oplysninger fra tabellen kursus, er du nok nød til at hente et id med.
Det var bare denne linie: eagleeye >> nu får jeg udskrevet Kkategori en masse gange under hinanden, så nu er der da adgang til basen Da vi begge skrev den samme sql sætning, undrede det mig at du kun henvendte dig til eagleeye.
Synes godt om
Slettet bruger
18. april 2002 - 13:00#17
Det var nok fordi jeg klippede hans linie over :-) Det var skam ikke for at fornærme nogen. Jeg er lidt forvirret over dette her. Som du skriver det nu, tyder det på at der skal være to databaser. Jeg har alt hvad jeg skal bruge i KURSUS, men samme navn står i tabellen ANSVAR og i den er der en post med EMAIL og den skal bruges til at lave navnet fra KURSUS til en mailto: link. Det virker meget uoverskueligt, derfor skrev jeg som jeg gjorde i starten.
Synes godt om
Slettet bruger
18. april 2002 - 13:01#18
Der er jo også mange linier der er det samme i Kkategori og de skal jo kun skrives 1 gang hver.
Jeg er slet ikke med på hvad det er du vil frem til. Som jeg har forstået det, vil du have en liste over kurser opdelt efter kategori. Når man så klikker på et kursus, kommer der nogle ekstra informationer frem, bla andet om den ansvarlige. Er det ikke sådan den skal laves?
Jeg tror jeg har misforstået spørgsmålet lidt. Kan evt prøv at skrive det på en anden måde?
kursus: kolonne Kkaterori kolonne ?? list andre, kun relavandte
ansvar: kolonne navn kolonne email kolonne ?? list andre, kun relavandte
Synes godt om
Slettet bruger
18. april 2002 - 13:09#21
Det smarteste er at man laver en liste over kategori. Man kal så kunne klikke på en kategori og alle kurser under den kategori skal vises. Når man så klikker på et kursus kommer alle relevante kurser frem og blandt de oplysninger står så navnet på den der har ansvaret for det pågældende kursus. Det navn skal så laves til en email link så man kan klikke på navnet og postkassen åbner og man kan skrive en mail til vedkommende.
sql = "SELECT DISTINCT Kkategori FROM kursus ORDER BY Kkategori;"
Så får du en liste hvor hvert Kkategori kun skulle være en gang.
Synes godt om
Slettet bruger
18. april 2002 - 13:12#23
Hvis I ser på www.acnord.dk og vælger kurser så tror jeg det hjælper på at se hvad jeg vil :-) Det slog mig lige at de jo er der, men det er sider der laves hver gang og en database til det er jo meget smartere.
næ det skal squ være: sql = "SELECT DISTINCT Kkategori FROM kursus;" prøv lige uden order.
Synes godt om
Slettet bruger
18. april 2002 - 13:19#28
Jeg får nu denne: ADODB.Recordset (0x800A0CC1) Item cannot be found in the collection corresponding to the requested name or ordinal. /test/Default.asp, line 18
Linie 18 er: Response.Write rst("navn") & "<BR>"
og det er ikke kursus tabellen hedder med kurser :-)
Er det det samme du vil lave som asp sider? Det er meget nemt. Du har dine to tabeller kursus og ansvarlig. Du bruger den sql sætning vi fandt frem til før. Du laver et link ligesom det jeg skrev, bare med kurset i stedet for. Jeg går ud fra at det tal der står ved kurset, hedder id i den tabel. <a href="info.asp?id=<%=rs("id")%>"><%=rs("navn")%></a> Så skullle du få navnet af kurset, som link til en side der hedder info.asp. Siden info.asp er identisk med den anden side, i starten, men din sql-sætning er anderledes. sql = "SELECT kursus.id, kursus.dato, kursus.tidspunkt, kursus.pris, kursus.tilmeldingsfrist, ansvar.email FROM kursus INNER JOIN ansvar ON kursus.ansvarlig = ansvar.navn WHERE kursus.id = " &request.querystring("id")
Denne kode giver dig dine overskrifter: <% Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../databaser/kursus.mdb") set rst = Server.CreateObject("ADODB.Recordset") sql = "SELECT * FROM kursus ORDER BY Kkategori" rst.Open sql, Conn, 3, 3 str = "" Do while not rst.EOF if rst("kkategori") <> str then response.write "<b>" & rst("kkategori") & "</b><br>" end if response.write " " & rst("navn") & "<br>" str = rst("kkategori") rst.movenext loop %>
Og denne laver links til en side der hedder info.asp <% Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../databaser/kursus.mdb") set rst = Server.CreateObject("ADODB.Recordset") sql = "SELECT * FROM kursus ORDER BY Kkategori" rst.Open sql, Conn, 3, 3 str = "" Do while not rst.EOF if rst("kkategori") <> str then response.write "<b>" & rst("kkategori") & "</b><br>" end if response.write " <a href='info.asp?id=" & rst("id") & "'>" & rst("navn") & "</a><br>" str = rst("kkategori") rst.movenext loop %>
Synes godt om
Slettet bruger
18. april 2002 - 13:48#36
Nu har jeg ændret den lange linie til: sql = "SELECT kurser.kursusnr, kurser.navn, kurser.startdato, kurser.starttid, kurser.pris, kurser.sidste_tlm, ansvar.email FROM kurser INNER JOIN ansvar ON kurser.ansvarlig = ansvar.navn WHERE kurser.kursusnr = " &request.querystring("kursusnr")
er det helt tosset ?
Men nu vil den ikke skrive noget ud fra basen.
Synes godt om
Slettet bruger
18. april 2002 - 13:52#37
Nu får jeg denne fejl
Microsoft OLE DB Provider for ODBC Drivers (0x80040E14) [Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'kurser.kursusnr ='. /test/Default.asp, line 16
Og din info.asp side kunne se sådan her ud: <% Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../databaser/kursus.mdb") set rst = Server.CreateObject("ADODB.Recordset") sql = "SELECT kursus.id, kursus.dato, kursus.tidspunkt, kursus.pris, kursus.tilmeldingsfrist, ansvar.email FROM kursus INNER JOIN ansvar ON kursus.ansvarlig = ansvar.navn WHERE kursus.id = " &request.querystring("id") rst.Open sql, Conn, 3, 3 for each item in rst.fields response.write item next %> Der regner jeg så med at der er felter i din kursus tabel der hedder tilmeldingsfrist, dato, pris, osv. svarende til de informationer der er i www.acnord.dk.
hvis du laver et link <a href="enside.asp?id=noget"> så hedder det efter ? querystring. Hvis du laver en request.querystring, får du alt hvad der står efter ?. Hvis du skriver requeste.querystring("id") så får du "noget" i dette tilfælde, fordi der står ?id=noget. Hvis du skriver request.querystring("envariabelderikkeeksisterer") så kommer der ingenting ud af det. Håber det forklarede det lidt.
Ja, det blev jeg ikke meget klogere af. Du har koblet to databaser sammen, og kun sendte den ene. Flyt hele tabellen "ansvar" over i din database, ellers kan du ikke lave opslag i den.
<body BGCOLOR="#C0C0C0" COLOR="#000080"> <% Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../databaser/kursus.mdb") set rst = Server.CreateObject("ADODB.Recordset") sql = "SELECT kursusnr, kkategori, navn FROM kurser WHERE kkategori = '" & Request.Querystring("kat") & "';" rst.Open sql, Conn, 3, 3 %> <table width="50%" border="5" cellspacing="2" cellpadding="4" name="kurser"> <tr> <td><%=Request.Querystring("kat")%></td> </tr> <%do while not rst.eof%> <tr> <td><a href="info.asp?nr=<%=rst("kursusnr")%>&kat=<%=request.querystring("kat")%>"><%=rst("kursusnr")%> <%=rst("navn")%></a></td> </tr> <% rst.movenext loop %> </table> </body>
</html> info.asp <html>
<head> <% Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../databaser/kursus.mdb") set rst = Server.CreateObject("ADODB.Recordset") sql = "SELECT * FROM ansvar INNER JOIN kurser ON kurser.ansvarlig = ansvar.navn WHERE kurser.kursusnr = '" & Request.Querystring("nr") & "'" rst.Open sql, Conn, 3, 3 %> <title><%=rst("navn")%></title> </head>
<body BGCOLOR="#C0C0C0" COLOR="#000080"> <table width="50%" border="5" cellspacing="2" cellpadding="4" name="kurser"> <tr> <td><b>Kursus:</b></td> <td><%=rst("kursusnr")%> <%=rst("navn")%></td> </tr> <tr> <td>dato:</td> <td><%=rst("startdato")%></td> </tr> <tr> <td>tidspunkt:</td> <td><%=rst("starttid")%></td> </tr> <tr> <td>målgruppe:</td> <td><%=rst("maalgruppe")%></td> </tr> <tr> <td>pris:</td> <td><%=rst("pris")%></td> </tr> <tr> <td>tilmeldingsfrist:</td> <td><%=rst("sidste_tlm")%></td> </tr> <tr> <td>mødested:</td> <td><%=rst("moedested")%></td> </tr> <tr> <td>instruktør:</td> <td><%=rst("instruktor")%></td> </tr> <tr> <td>kursusansvarlig:</td> <td><a href="mailto:<%=rst("email")%>"><%=rst("ansvarlig")%></a></td> </tr> </table> <br> <a href="default.asp">Tilbage til hovedlisten</a><br> <a href="kategorier.asp?kat=<%=request.querystring("kat")%>">Tilbage til kurser om <%=rst("kkategori")%></a> </body> Du skal igen lige ændre stien til databasen, så det passer med din sti. Forklaring: Den første side, default.asp, finder alle kategorierne i din tabel. Det er du vel med på. Hver gang den skriver en kategori, så laver den også et link til en side der hedder kategorier.asp, og sender en variabel med, kat = "en kategori". Hvis du kigger på siden i din browser, og højreklikker, vælger vis kode, så kan du se at linkene ser sådan her ud: <a href="kategorier.asp?kat=Begynder-/specialundervisning">Begynder-/specialundervisning</a> Når du klikker på en af dem, åbner du siden kategorier.asp. Det er der vel ikke noget sært i. Du henter så variablen kat med kaldet request.querystring("kat"). Den bruger du i din sql sætning ...WHERE kkategori = " & request.querystring("kat") Så har du et recordset med alle de kurser i den pågældende kategori. Dem lister på siden, og igen laver du et link, denne gang sender du kursusnummeret med til siden info.asp. Jeg har så valgt at sende den anden variabel kat med. Den skal også bruges i info.asp. Den sidste side, kalder du al informationen fra det specifikke kursus frem, og henter information om den ansvarlige i tabellen ansvar. Det gør du med sql sætningen: SELECT * FROM ansvar INNER JOIN kurser ON kurser.ansvarlig = ansvar.navn WHERE kurser.kursusnr = '" & Request.Querystring("nr") & "'" Så skriver du al den information ud på siden, det er der vel heller ingen ben i. Til sidst giver du så brugeren mulighed for at gå tilbage til hovedsiden, eller tilbage til den kategori han var i før. Jeg valgte en lidt omstændelig måde at gøre det på, for at være lidt pedagogisk. Det jeg gør er at brge den variabel jeg sendte videre, kat, og laver samme link, som i default.asp, altså <a href="kategorier.asp?kat=<%=request.querystring("kat")%>">. Det svarer jo bare til at trykke tilbage knappen i browseren 1 eller 2 gange, så jeg kunne have skrevet følgende: <a href="#" onclick="history.go(-1)">tilbage</a> <a href="#" onclick="history.go(-2)">2 gange tilbage</a> Men så er vi ovre i javascript.
Hvis du vil lære lidt mere om hvad man kan med asp, skulle du prøve at tage det lidt videre, lave en søge mekanisme, finde alle kurser med en bestemt instruktør, finde alle kurser i et bestemt sted, osv. Det er jo hele styrken i at lave det i en database. Hvis du vil have lidt inspiration, har jeg lavet en halvfærdig site, http://www.mucdesign.dk/detaljer/index.asp.
Synes godt om
Slettet bruger
19. april 2002 - 11:20#54
Du er simpelthen dagens mand i skysovs ;-) Det er jo lige det jeg efterlyste. Det er helt utroligt det kan lade sig gøre.
TUSIND TAK.
Hvad med point. Du kan jo næsten selv bestemme ;-)
Synes godt om
Slettet bruger
19. april 2002 - 11:22#55
Under Idræt er 2374 åbenbart slettet og jeg får en fejl. Kan man tage højde for sådan noget i dit system ?
100 point ville være perfekt, men hvis du ikke har så mange er det ikke det væsentlige. Jeg har ingen akut mangel. Mht fejl, er det som regel det mest bøvlede at tage højde for. I den database jeg har, er der ingen problemer med 2374, den står som den skal. Hvad er det fejlen er? Hvis hele posten er slettet, burde der ikke komme en fejl, den burde bare ikke komme op på skærmen. Er det nummeret der er slettet? Hvilken en af siderne er det der giver problemer?
Synes godt om
Slettet bruger
19. april 2002 - 11:34#57
ADODB.Field (0x80020009) Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record. /test/info.asp
er fejlen når jeg trykker på den. Det er måske databasen der er kludder i, men det skulle jo være den samme som du bruger. Først starter den med kategorier. Så trykker jeg på idræt og derefter på 2374 og så kom den her. Prøv evt. selv på http://195.192.9.228/test/ der ligger det nu.
Du får de 100 og endnu engang tak.
Synes godt om
Slettet bruger
19. april 2002 - 11:37#58
eagleeye for de 20 for at hjælpe med select destinct
og ras200 for at lave stort set det hele. Tak til begge.
Jeg har fundet fejlen, det er fordi der ikke er angivet en ansvarlig for kurset. Så kan den ikke lave koblingen med tabellen ansvar, og så får du et tomt recordset. Du kan vælge at sætte en ansvarlig i databasen, eller lave denne her lappeløsning: <html>
<head> <% Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("../databaser/kursus.mdb") set rst = Server.CreateObject("ADODB.Recordset") sql = "SELECT * FROM ansvar INNER JOIN kurser ON kurser.ansvarlig = ansvar.navn WHERE kurser.kursusnr = '" & Request.Querystring("nr") & "'" rst.Open sql, Conn, 3, 3 a = rst.recordcount if a > 0 then %> <title><%=rst("navn")%></title> </head>
Her tælles antallet af poster i rst, og hvis det ikke er større en nul (det skulle gerne være 1) skriver den informationen ud, uden koblingen til ansvar. Men det er stort set umuligt at tage højde for alle fejl der kan opstå, jeg vil foreslå at du satser på at finde fejlen i databasen, og rette den der, i stedet for at prøve at tage højde for fejlene på dine sider.
Selv tak, og god weekend. Sid nu ikke foran computeren hele tiden, der er også en verden udenfor! Og du skulle virkelg tænke på at folk skal kunne vælge en geografisk location, før de leder efter kurset, og at man kan finde alle kurserne en bestemt person holder. Det ville være temmelig nemt.
Synes godt om
Slettet bruger
19. april 2002 - 11:58#63
Det må være weekendens opgave :-) Det bliver det nu nok ikke, selvom jeg bruger meget tid på det også i fritiden. Men nu vil jeg først give mig til at se om jeg kan forstå hvad der sker i de forskellige filer, og så kan jeg måske lave om på det. Nu har jeg udskrevet originalerne og gemt dem for sig selv, så de ikke bliver væk når man roder med det :-)
Men først ville jeg rydde op i din database, hvis jeg var dig. Der er mange datoer der er sat ind som mødesteder, du har de samme instruktører stående på forskellige mådeer, og meget andet godt.
Synes godt om
Ny brugerNybegynder
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.