webForumDet fria alternativet

Slumpa fram poster i Access med ASP

ASPur ASP

4 svar · 1 827 visningar · startad av Fireh

Medlem sedan jan. 2003173 inlägg
Frågan#1

Den här tråden kanske ska ligga i nån Databas-del istället, men jag börjar här.

Jag skulle vilja slumpa fram 2 poster ur en Access-databas. Går det att göra direkt i frågan eller finns det nån slump-funktion i ASP man kan använda sig av för att få fram ett tal/ID att plocka fram ur databasen?

Medlem sedan nov. 20017 144 inlägg
#2

Sök ex. på : slump* databas

Det är en mycket vanlig fråga.

Medlem sedan jan. 2003173 inlägg
#3

Jag tyckte att jag gjorde det utan att hitta några vettiga svar. I alla fall inte innehållande Access. För MySQL/SQL kunde man skriva ORDER BY RAND(), men det fungerade inte i Access :(

Medlem sedan jan. 2003438 inlägg
#4

Kanske kan hjälpa

http://www.guffa.com/Programming_article.asp?id=37

Medlem sedan sep. 20026 425 inlägg
#5

Slumpa poster ur en databas

Introduktion

Ibland vill man kanske slumpa fram en post bland flera ur en databas och exempelvis presentera den på sin startsida eller liknande. Man kanske vill slumpa fram ett citat ur en citatdatabas, ett användarnamn från en medlemsdatabas etc. Då ställs man inför det faktumet att man inte kan slumpa fram någon post för man har ingen som helst aning om hur man gör det. I denna lektion går jag igenom hur man slumpar fram en specifik post ur en databas, dels med GetRows(), dels på "vanligt" vis.

Slumpa med GetRows()

Jag har i två tidigare lektioner förklarat en del om GetRows() och hur man använder metoden. Om du inte läst någon av lektionerna rekommenderar jag att du gör det. I alla fall - hur slumpar man fram en post ur en databas med hjälp av GetRows()? Jo, det är faktiskt ganska enkelt. Man använder GetRows() tillsammans med Randomize och funktionen Rnd(). Jag visar koden:

<%
Dim Cn, Rs, recArr, Rand_nr, Id, Namn, Land

Set Cn = Server.CreateObject("ADODB.Connection")
Cn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("db_random.mdb")

Set Rs = Cn.Execute("Select Id, Namn, Land From tbl_random")

If Rs.EOF Then
Response.Write "Inga poster i databasen än.."
Rs.Close : Set Rs = Nothing
Cn.Close : Set Cn = Nothing

Else
recArr = Rs.GetRows()

Rs.Close : Set Rs = Nothing
Cn.Close : Set Cn = Nothing

Randomize

Number = Round(Rnd*UBound(recArr,2))

Id = recArr(0,Number)
Namn = recArr(1,Number)
Land = recArr(2,Number)

Response.Write Id & ". " & Namn & ", " & Land
End If %>

Vi har först och främst en databas med namnet db_random och tabellen tbl_random. I databasen har vi tre fält - Id, Namn och Land. Vi vill sedan slumpa fram ett tal som står för ett id-nummer som finns i databasen och sedan skriva ut all info ur databasen för just den post med det id-numret som slumpades.
Som vanligt ansluter vi först till databasen och exekverar sedan en SQL-sats. Om det inte fanns någon post i databasen så får man ett meddelande "Inga poster i databasen än..", och stänger öppna objekt. Om det fanns poster i databasen använder vi nu variabeln recArr med metoden GetRows() för att ta reda på hur många poster det finns i databasen.
Sedan använder vi Randomize, som på svenska betyder slumpa, och slumpar fram ett nummer mellan 0 och det högsta id-numret i databasen-1. Vi använder oss av funktionen Rnd() för att avrunda det slumpade talet till närmsta heltal då det ju inte finns något id-nummer i databasen som heter 1,374 eller dylikt.

I och med att vi använder arrayer så räknas 0 som en post och man startar med elementet 0, alltså inte med 1. Så om talet 0 slumpas ut visas post 1 ur databasen, talet 4 ger post 5 ur databasen etc. Mer om arrayer kan du läsa här: arrayer.

Sedan låter vi variablerna Id, Namn och Land få värdena för posten med id-numret som slumpades ut. Beroende på om man enbart vill ha enstaka poster ur databasen och inte alla får man anpassa SQL-satsen efter det samt ta bort/lägga till fler variabler och öka elementen, recArr(2,Number, med +1 för varje nytt fält man vill ha fram ur sin databas. Slutligen skriver vi ut respektive fält som vi vill ha utskrivna på sidan..

Slumpa vanligt

Koden nedan visar hur man slumpar fram poster på "vanligt" vis - utan GetRows(). Prestandaskillnaden är minimal mellan GetRows() och denna metod utan GetRows() men om du har en massa fält i databasen som du vill ska slumpas ut, kanske över 10-15 fält så används GetRows() med mer nytta.
Här kommer koden för vanlig slumpning utan GetRows():

<% Dim Cn, Rs, Antal, Rand_nr
Set Cn = Server.CreateObject("ADODB.Connection")
Cn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("db_random.mdb")

Set Rs = Cn.Execute("Select Id, Namn, Land From tbl_random")

If Rs.EOF Then
Response.Write "Inga poster att slumpa än.."
Rs.Close : Set Rs = Nothing
Cn.Close : Set Cn = Nothing

Else
With Rs
.Close
.Cursortype=3
.Open
End With
Antal = Rs.RecordCount

Randomize
Rand_nr = Int(Rnd * Antal)

Rs.Move Rand_nr

Response.Write Rs("Id") & ". " & Rs("Namn") & ", " & Rs("Land")
Rs.Close : Set Rs = Nothing
Cn.Close : Set Cn = Nothing
End If %>

Vad händer här då? Jo, vi använder oss av en speciell konstant som kallas adOpenStatic (3) för att vi över huvud taget ska kunna slumpa fram en post. adOpenStatic tillåter att man hoppar fram och tillbaka mellan posterna i databasen vilket vi ju kommer göra.
Vidare har vi variabeln Antal som får samma värde som det finns antalet poster i databasen (Rs.RecordCount).
Sedan använder vi återigen Randomize och låter variabeln Rand_nr få ett värde mellan 0 och Antal. Sedan flyttar vi med Rs.Move till den aktuella posten och skriver ut dess värden. Slutligen stänger vi ner objekten..

128 ms totalt · 3 externa anrop · v20260731065814-full.25f56b17
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)