webForumDet fria alternativet

Problem vid hämtning från två tabeller i Access-databas

Databaser & SQL

17 svar · 1 181 visningar · startad av lbs129

Medlem sedan apr. 200899 inlägg
Frågan#1

Hej!

Jag är inte så vidare kunnig inom ASP, men jag försöker i alla fall att bygga ett länkarkiv som är baserat på en Access-databas. Länkarna är sorterade i kategorier, men problemet är att i databasens första tabell där all information om länkarna finns, lagras bara kategorins ID, inte dess namn. När jag sedan ska skriva ut informationen om länkarna vill jag att det ska stå vilken kategori en länk tillhör. Det blir problematiskt eftersom kategoriernas namn ligger i en annan tabell, och för att veta vilken kategori det är behöver jag länkens kategori-ID från den andra tabellen.

Alltså behöver jag hämta data från två tabeller, och där en kolumn i den första tabellen talar om från vilket ID informationen i den andra tabellen ska hämtas. Den kod jag har nu skriver ut den första länkens kategorinamn på alla posterna!

<%
	Set Connect = Server.CreateObject("ADODB.Connection") 
	Connect.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("db/lankar.mdb")
	Set RecSet = Server.CreateObject("ADODB.Recordset")
	Set RecSet2 = Server.CreateObject("ADODB.Recordset")	
	
	SQL = "SELECT * FROM lankar"
	SQL = SQL & " ORDER BY inlagd DESC"
	RecSet.Open SQL, Connect, adOpenStatic, adLockOptimistic
	
	SQL2 = "SELECT * FROM kategorier WHERE id = " & RecSet("kategori")
	RecSet2.Open SQL2, Connect, adOpenStatic, adLockOptimistic
%>
	<% Do Until RecSet.EOF %>
	<li>
	<div id="tips<%=RecSet("id")%>">
		<p><span class="rubrik"><a href="?vad=ut&id=<%=RecSet("id")%>" target="_blank"><%=RecSet("rubrik")%></a></span><br>
		<span class="beskrivning"><%=RecSet("beskrivning")%></span><br>
		<span class="info">Kategori: <a href="?visa=kategori&katid=<%=RecSet("kategori")%>"><%=RecSet2("namn")%></a>&nbsp;|&nbsp;Antal klick: <%=RecSet("antalklick")%>&nbsp;|&nbsp;Inlagd: <%=RecSet("inlagd")%></p></span>
	</div>
	</li>
<%
	RecSet.MoveNext
	Loop
	
	RecSet.Close
	Connect.Close
	Set RecSet = Nothing
	Set Connect = Nothing
%>

Tack på förhand! :)

Mvh Johan

Medlem sedan maj 200591 inlägg
#2

Du ska använda en JOIN:

SELECT lankar.*, kategorier.namn AS kategorinamn FROM lankar JOIN kategorier ON lankar.kategori=kategorier.id

Då får du med kategorinamnet i ditt recordset genom att bara skriva RecSet("kategorinamn").

Det blir alltså såhär på ett ungefär:

<%
	Set Connect = Server.CreateObject("ADODB.Connection") 
	Connect.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("db/lankar.mdb")
	Set RecSet = Server.CreateObject("ADODB.Recordset")
	
	SQL = "SELECT lankar.*,kategorier.namn AS kategorinamn FROM lankar JOIN kategorier on kategori.id=lankar.kategori ORDER BY inlagd DESC"
	RecSet.Open SQL, Connect, adOpenStatic, adLockOptimistic
	
	Do Until RecSet.EOF %>

	<li>
	<div id="tips<%=RecSet("id")%>">
		<p><span class="rubrik"><a href="?vad=ut&id=<%=RecSet("id")%>" target="_blank"><%=RecSet("rubrik")%></a></span><br>
		<span class="beskrivning"><%=RecSet("beskrivning")%></span><br>
		<span class="info">Kategori: <a href="?visa=kategori&katid=<%=RecSet("kategori")%>"><%=RecSet("kategorinamn")%></a>&nbsp;|&nbsp;Antal klick: <%=RecSet("antalklick")%>&nbsp;|&nbsp;Inlagd: <%=RecSet("inlagd")%></p></span>
	</div>
	</li>

	<%
	RecSet.MoveNext
	Loop
	
	RecSet.Close
	Connect.Close
	Set RecSet = Nothing
	Set Connect = Nothing
%>
Medlem sedan apr. 200899 inlägg
#3

Hej!

Tack så mycket för ditt svar! :)

Tyvärr får jag följande felmeddelande, där rad 110 är SQL-frågan:

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

[Microsoft][ODBC Microsoft Access Driver] Syntax error in FROM clause. 

/lankar.asp, line 110

Mvh Johan

Medlem sedan maj 200591 inlägg
#4

Testa att ändra "JOIN" till "INNER JOIN", tror detta är en liten Access-specialité... :OO

Medlem sedan apr. 200899 inlägg
#5

Hej!

Tyvärr hjälpte det inte, nu får jag detta felmeddelande istället:

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

[Microsoft][ODBC Microsoft Access Driver] Syntax error in JOIN operation. 

/lankar.asp, line 110

Mvh Johan

Medlem sedan maj 200591 inlägg
#6

Skriv ut hela din SQL-fråga som den ser ut nu.

Medlem sedan apr. 200899 inlägg
#7

Hela SQL-frågan:

SQL = "SELECT lankar.*,kategorier.namn AS kategorinamn FROM lankar INNER JOIN kategorier on kategori.id=lankar.kategori ORDER BY inlagd DESC"

Mvh Johan

Medlem sedan maj 200591 inlägg
#8

Du får kolla så att kolumnnamnen stämmer överens med de som du har i databasen. Lite svårt att hjälpa när man inte har hela databasen.

Exempelvis så ska det nog vara kategorier.id=lankar.kategori och inte kategori.id=lankar.kategori.

Medlem sedan feb. 2006144 inlägg
#9

Testa detta:

SQL = "SELECT * FROM lankar, kategorier WHERE kategorier.id = lankar.kategori ORDER BY lankar.inlagd DESC"

Jag utgår då ifrån att du har en kolumn i tabellen lankar som heter kategori och som dels är av samma datatyp som kolumnen id i tabellen kategorier samt att de matchar varandra. Du får med en massa saker som du säkerligen inte har behov av men det kan man fixa till sen.

Medlem sedan apr. 200899 inlägg
#10

Tack för all hjälp! :)
Både Baltizs och HammerBoys lösningar fungerar! Vilken bör jag använda? Hammerboys lösning förstår jag hur den fungerar, Baltiz lösning skulle jag gärna vilja ha lite förklarad om det inte är för mycket begärt.

Mvh Johan

Medlem sedan feb. 2006144 inlägg
#11

Same shit men olika sätt att skriva det på. Baltizs sätt är väl lite mer korrekt eftersom du inte bara kan göra en INNER JOIN utan även en OUTER JOIN. Du kan dessutom göra en LEFT OUTER JOIN eller en RIGHT OUTER JOIN. Allt beroende på vad man vill få fram men just i det här exemplet funkar både Baltizs sätt (som är mer korrekt) och mitt sätt (som är enklare att förstå).

Medlem sedan juli 20003 825 inlägg
#12

Jag tror att jag nog hade gjort så här:

SQL = "SELECT l.intID, l.strName, k.intID, k.strName FROM [länkar] l, [kategorier] k
WHERE l.intKategoriID = k.intID ORDER BY l.dteCreated DESC;"

set mySQL = Conn.Execute(SQL)

Sen dunkar du in allt i en array, under förutsättning att det finns några poster;

IF NOT mySQL.EOF THEN myRow = mySQL.GetRows()

stänger databasen.

längre ner på sidan listar du dina länkar:

IF IsArray(myRow) THEN
  FOR j = 0 TO UBound(myRow,2)
    response.write "ID på post:" & myRow(0,j)
    response.write "Namn på post:" & myRow(1,j)
    response.write "ID på Kategori:" & myRow(2,j)
    response.write "Namn på Kategori:" & myRow(3,j) & "<br>"

  NEXT
END IF

*****
Beskrivning av array:

Det är som ett rutnät, ett fisknät, där första platsen är 0,0

0,0   1,0   2,0   3,0
0,1   1,1   2,1   3,1
0,2   1,2   2,2   3,2

För att ta din kod som exempel: du vet hur många platser du har i sidled. Du frågar efter ID, namn på länk, ID , namn på kategori

Fyra saker frågar du efter.

Första saken har position 0, andra 1, tredje 2 och fjärde 3.

j i exemplet ovan beror på hur många poster som finns, som uppfyller kriteriet.

UBound betyder UPPER BOUND och betyder "sista posten", eller "posten längst upp". Typ... Det finns även LBound, Lower bound, men i detta fallet vet man att första posten alltid är noll, 0.

ID för första posten är 0,0 namnet = 0,1

Kan vara lite bökigt att greppa men du har stor nytta i resten av ditt liv om du tar dig tid att använda dessa kunskaper.

Medlem sedan apr. 200899 inlägg
#13

Hej!

Tack så hemskt mycket för alla svar! Jag känner att jag skulle behöva en bra bok om ASP, gärna på svenska. Någon som har några tips? Jag behöver nämligen läsa på en hel del, nu kan jag bara väldigt grundläggande saker. Vad man ska ha en array till begriper jag inte alls...

Mvh Johan

Medlem sedan dec. 200012 464 inlägg
#14

Flyttas från ASP

Medlem sedan feb. 2006144 inlägg
#15

En variabel är som en behållare i vilken du kan spara ned lite olika värden. Du kan t.ex. ha variabeln "tjej" och lagra namnet "Anna". En array är en samling variabler med ett gemensamt namn där du får åtkomst till resp. värde genom att ange position i arrayen. Du kan t.ex. ha arrayen "tjejer" som innehåller 3 värden: "Anna", "Berit" och "Cissi". tjejer[0] lagrar värdet "Anna", tjejer[1] lagrar värdet "Berit" och tjejer[2] lagrar värdet "Cissi". Notera att en arrays första position alltid är det nollte elementet.

Det som Eclipse skriver om är en flerdimensionell array dvs flera arrayer i arrayen vilket i många fall kan vara behändigt. Du vill kanske även lagra en ålder för varje tjej. Anna kanske är 20 år, Berit 25 och Cissi 30. Då kan du skapa en flerdimensionell array där varje element har en egen array. Vi har arrayen tjejer som i dess första element har en array med 2 värden ("Anna" och "20"). Värdet "Anna" ligger i tjejer[0][0] och värdet "20" finner du i tjejer[0][1]. "Berit" ligger i tjejer[1][0] och "25" i tjejer[1][1]. Du kan enkelt skriva allt eller delar genom att loopa igenom din array.

Vad gäller ASP-litteratur så finns det hur mkt som helst på nätet. Bara att söka...

Medlem sedan apr. 200899 inlägg
#16

Tack för förklaringen, HammerBoy! :)

Mvh Johan

Medlem sedan juli 20003 825 inlägg
#17

Äh, skippa böckerna. Det viktigaste i böckerna står skrivet på forumet. De exempel som finns i böckerna är rätt kassa, omständiga och väldigt röriga.

Men vill du gärna plöja 1.000 sidor i the Ultimate Guide så står det ju säkert något nyttigt... Jag har några ASP-böcker, men det står bara kvalificerad skit i dom. Det är sånna Micriosoftsponsrade biblar... Där finns 990 sidor av saker du inte behöver veta.

De sista 10 nyttiga sidorna är samma som fyller detta forumet.

****

Beskrivning av arrayer:

SQL = "SELECT intID, strName, strPath, strRollOver FROM [menu]"
set mySQL = Conn.Execute(SQL)

IF NOT mySQL.EOF THEN        ' ## end of file, dvs, det finns poster
  arrMenu = mySQL.GetRows()    ' ## skapa en array
END IF

längre ner på sidan:

IF IsArray(arrMenu) THEN
   ' ## jag lägger alltid arrayen i samma lokala variabel
   ' ## på så vis kan jag använda samma kod på många ställen.
   ' ## det är en smaksak, många gör inte så
  myRow = arrMenu

   FOR j = 0 TO UBound(myRow,2) ' ## två för det är en tvådiminsionell array. Dvs som ett rutnät.

     ' ## skriv din meny
     response.write "<a href=" & myRow(2,j) & """>" & myRow(1,j) & "</a><br>"
   NEXT
END IF

Detta innehåller menyn:
intID, strName, strPath, strRollOver

1 , "Hem", "/index.asp", "Vår hemsida"
4 , "Företaget", "/företaget.asp", "Vår business!!"
5 , "Produkter", "/produkter.asp", "Våra grejjer"
6 , "Kontakt", "/kontakt.asp", "Våra kontaktuppgifter"
8 , "Medaretare", "/medarebetare.asp", "Vår grymma staff"
10 , "Erbjudanden", "/erbjudanden.asp", "Kolla här för bra grejjer!!"

På detta viset kan du loopa igenom alla dina menyval. Det är lätt att lägga till eller ta bort val i menyn.

Denna kod är inte att betrakta som komplett. Mest som ett enkelt exempel för att visa nyttan med arrayer och hur man kan använda dom i ett relevant sammahang.

Medlem sedan apr. 200899 inlägg
#18

Tack Eclipse, nu börjar jag förstå vad man kan ha en array till! Apropå böcker, jag lånade för ett tag sedan "Active Server Pages för dummies" på biblioteket. Den var väl rätt så bra, men den var gammal, från 1999.

Mvh Johan

264 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)