|
| SQL - at trække 5 tilfældige id-numre ud a~ Fra : Jakob Munck |
Dato : 23-12-01 20:13 |
|
Jeg har en site med artikler ( www.ansgar.dk ) og jeg vil gerne - som
"smagsprøve" - vise de besøgende et kort uddrag af 5 af artiklerne på sitens
forside. Men det skal være skiftende artikler der vises uddrag af, og derfor
søger jeg den SQL-kode der skal anvendes for at trække 5 tilfældige artikler
ud. Hvis jeg skriver således:
sSql = "SELECT TOP 5 * FROM artikler ORDER BY ID DESC;"
så får jeg bare de 5 artikler med de højeste ID-numre, og det er ikke godt
nok. Det skal forandre sig fra dag til dag, og da rækken af ID-numre
artiklerne ligger under er ikke kontinuerlig, kan jeg ikke bare vælge
tilfældige tal ud, for visse af de tal der genereres på denne måde, vil ikke
kunne anvendes, da dette ID-nummer ikke eksisterer.
Problemer er altså, hvordan jeg får udvalgt 5 forskellige faktisk
eksisterende ID-numre til de artikler der skal vises.
Hvem har en idé om hvordan dette gøres?
v.h.
Jakob Munck
| |
Jakob Andersen (23-12-2001)
| Kommentar Fra : Jakob Andersen |
Dato : 23-12-01 20:33 |
|
"Jakob Munck" <jakob.munck@tdcadsl.dk> wrote in message
news:3c262b49$0$62876$edfadb0f@dspool01.news.tele.dk...
> Jeg har en site med artikler ( www.ansgar.dk ) og jeg vil gerne - som
> "smagsprøve" - vise de besøgende et kort uddrag af 5 af artiklerne på
sitens
> forside. Men det skal være skiftende artikler der vises uddrag af, og
derfor
> søger jeg den SQL-kode der skal anvendes for at trække 5 tilfældige
artikler
> ud.
Hvilken Database bruger du?
Hvis du bruger MS SQL 7 eller 2000 kan du bruge(Virker vist kun på
Windows2000):
SELECT TOP Y [kolonne1, kolonne2,...kolonnex] FROM [tabelnavn] ORDER BY
NEWID()
Hvor Y angiver hvor mange records du vil have returneret. Denne måde kan dog
give problemer ved større tabeller og derfor anbefales det at du bruger
noget ala dette(og helst i en stored procedure):
< http://www.mssqlserver.com/faq/development-randomrows.asp>
Hvis du derimod skulle være så uheldig at bruge access kan du gøre noget ala
dette:
<%
'Vi definerer vores connection objekt
Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "Din connectionstring"
'Vi tæller hvor mange poster der er i tabellen og gemmer i en variabel
Dim objRS, iAntal
Set objRS = objConn.Execute("SELECT COUNT(IDKolonne) FROM [Tabelnavn]")
iAntal = objRS(0)
'Vi henter samtlige ider fra tabellen
Set objRS = objConn.Execute("SELECT IDKollone FROM [Tabelnavn]")
'Vi skal bruge en tæller variebel for at holde øje med hvor vi er i
arrayet
Dim iTaeller
iTaeller = 0
'Vi definerer et array til at putte alle Id numrene i.
Dim Poster
ReDim Poster(iAntal)
'For hver post indlæses id'et i arrayet
Do while Not objRS.EOF
Poster(iTaeller) = objRS(0)
iTaeller = iTaeller + 1
objRS.Movenext
Loop
'Vi kalder Randomize for at få et "seed" til rnd funktionen
Randomize
Dim Post, iPostid
'Udfra antallet af poster finder vi et nummer og henter det tilsvarende
nummer i arrayet
Post = cLng( rnd * iAntal + 0.5)
iPostid = Poster(Post)
'Rydder op....
Erase Poster
'Vi kan nu hente posten udfra idnummeret vi har gemt og udskrive den....
Set objRS = objConn.Execute("SELECT [Kolonne1, Kolonne2,.... , Kolonnex]
FROM [Tabelnavn] WHERE IDKolonne=" & iPostid)
If Not objRS.EOF Then
'Udskriv post
End If
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
%>
Alt ovenstående er ikke testet, så råb højt hvis det ikke virker.
--
Jakob Andersen
| |
Jakob Munck (23-12-2001)
| Kommentar Fra : Jakob Munck |
Dato : 23-12-01 23:28 |
|
Hej Jakob Andersen
Jeg bruger Access. Det er flot kode du har lavet, og jeg forsøger at
implementere den, men jeg får denne fejlmelding:
-----------------------------------------
Microsoft OLE DB Provider for ODBC Drivers (0x80040E10)
[Microsoft][ODBC Microsoft Access-driver] Der er for få parametre. Der var
ventet 1.
/Ansgar/ansgar.asp, line 151
------------------------------------------
Det handler om denne del af din kode:
<%
.......................
'Vi kan nu hente posten udfra idnummeret vi har gemt og udskrive den....
Set objRS = objConn.Execute("SELECT [Kolonne1, Kolonne2,.... , Kolonnex]
FROM [Tabelnavn] WHERE IDKolonne=" & iPostid)
If Not objRS.EOF Then
'Udskriv post
End If
.......
%>
hvor jeg har indsat mine fejltnavne i stedet for "Kolonne1, Kolonne2,.....".
Det ser sådan ud:
<%
.......
Set objRS = Conn.Execute("SELECT forfatter, overskrift, tekst FROM
artikler WHERE ID=" & "iPostid")
If Not objRS.EOF Then
.......
%>
Jeg er i tvivl om hvorvidt jeg skal skrive feltnavnene her, eller om
felterne skal angives på en anden måde, f.eks. med numre? Det virker i
hvert fald endnu ikke. Men hvor er fejlen?
v.h.
Jakob Munck
| |
Jakob Andersen (23-12-2001)
| Kommentar Fra : Jakob Andersen |
Dato : 23-12-01 23:26 |
|
"Jakob Munck" <jakob.munck@tdcadsl.dk> wrote in message
news:3c2658f9$0$46382$edfadb0f@dspool01.news.tele.dk...
> Hej Jakob Andersen
Jamen, godaften. Og god jul.
> hvor jeg har indsat mine fejltnavne i stedet for "Kolonne1,
Kolonne2,.....".
> Det ser sådan ud:
>
> <%
> ......
> Set objRS = Conn.Execute("SELECT forfatter, overskrift, tekst FROM
> artikler WHERE ID=" & "iPostid")
> If Not objRS.EOF Then
> ......
> %>
Det skal se sådan her ud(Og stå på 1 linie):
Set objRS = Conn.Execute("SELECT forfatter, overskrift, tekst FROM artikler
WHERE ID=" & "iPostid)
| |
Jakob Munck (23-12-2001)
| Kommentar Fra : Jakob Munck |
Dato : 23-12-01 23:51 |
|
Hej igen
God Jul også til dig og tak for din særdeles kompetente hjælp.
Som du skriver er der et ulige antal citationstegn i SQL-sætningen og det
virker ikke rigtigt. Det giver da også følgende fejlmelding:
Strengkonstanten er uafsluttet
/Ansgar/ansgar.asp, line 151, column 98
Set objRS = Conn.Execute("SELECT forfatter, overskrift, tekst FROM artikler
WHERE ID=" & "iPostid)
v.h.
Jakob Munck
| |
Jakob Munck (24-12-2001)
| Kommentar Fra : Jakob Munck |
Dato : 24-12-01 00:03 |
|
Jeg har løst syntaks-problemet (tror jeg) ved i stedet at skrive sætningen
sådan:
Set objRS = Conn.Execute("SELECT forfatter, overskrift, tekst FROM artikler
WHERE ID= '" & iPostid & "'")
Men det giver så en anden fejl,
Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
[Microsoft][ODBC Microsoft Access-driver] Datatyperne stemmer ikke overens i
kriterieudtrykket.
/Ansgar/ansgar.asp, line 151
Altså.........?
v.h.
Jakob
| |
Jakob Andersen (24-12-2001)
| Kommentar Fra : Jakob Andersen |
Dato : 24-12-01 01:59 |
|
"Jakob Munck" <jakob.munck@tdcadsl.dk> wrote in message
news:3c26614c$0$46337$edfadb0f@dspool01.news.tele.dk...
> Men det giver så en anden fejl,
>
> Microsoft OLE DB Provider for ODBC Drivers (0x80040E07)
> [Microsoft][ODBC Microsoft Access-driver] Datatyperne stemmer ikke overens
i
> kriterieudtrykket.
> /Ansgar/ansgar.asp, line 151
Det skal se sådan her ud(Og stå på 1 linie):
Set objRS = Conn.Execute("SELECT forfatter, overskrift, tekst FROM artikler
WHERE ID=" & iPostid)
--
Jakob Andersen
| |
Jakob Munck (24-12-2001)
| Kommentar Fra : Jakob Munck |
Dato : 24-12-01 10:15 |
|
Så virker koden, men den udskrives bare kun én tilfældig udvalgt record, og
ikke de 5 som den gerne skulle. Der er altså stadig et eller andet der skal
rettes. Koden - i sin helhed - ser nu sådan ud:
<%
'Vi definerer vores connection objekt
Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "DRIVER={Microsoft Access Driver
(*.mdb)};DBQ="&Server.MapPath("dbansgar.mdb")
'Vi tæller hvor mange poster der er i tabellen og gemmer i en variabel
Dim objRS, iAntal
Set objRS = objConn.Execute("SELECT COUNT(ID) FROM [artikler]")
iAntal = objRS(0)
'Vi henter samtlige ider fra tabellen
Set objRS = objConn.Execute("SELECT ID FROM [artikler]")
'Vi skal bruge en tæller variebel for at holde øje med hvor vi er i
arrayet
Dim iTaeller
iTaeller = 0
'Vi definerer et array til at putte alle Id numrene i.
Dim Poster
ReDim Poster(iAntal)
'For hver post indlæses id'et i arrayet
Do while Not objRS.EOF
Poster(iTaeller) = objRS(0)
iTaeller = iTaeller + 1
objRS.Movenext
Loop
'Vi kalder Randomize for at få et "seed" til rnd funktionen
Randomize
Dim Post, iPostid
'Udfra antallet af poster finder vi et nummer og henter det tilsvarende
nummer i arrayet
Post = cLng( rnd * iAntal + 0.5)
iPostid = Poster(Post)
'Rydder op....
Erase Poster
'Vi kan nu hente posten udfra idnummeret vi har gemt og udskrive den....
Set objRS = objConn.Execute("SELECT forfatter,overskrift,tekst FROM
artikler WHERE ID=" & iPostid)
If Not objRS.EOF Then
'Udskriv post
Do While Not objRS.EOF
Response.Write "<tr><td align=center>"
Response.Write objRS.Fields("forfatter")
Response.Write "</td></tr><tr><td>"
Response.Write objRS.Fields("overskrift")
Response.Write "</b></td></tr><tr><td align=left>"
Response.Write Left(objRS.Fields("tekst"),100)
Response.Write "<br></td></tr><tr><td>"
Response.Write "<br></td></tr>"
objRS.MoveNext
loop
End if
objRS.Close
Set objRS = Nothing
objConn.Close
Set objConn = Nothing
%>
</table>
</body>
</html>
Hvad skal rettes for at den udskriver 5 tilfældige records, og ikke kun én?
v.h.
Jakob Munck
| |
Anders (24-12-2001)
| Kommentar Fra : Anders |
Dato : 24-12-01 11:26 |
|
Jakob Munck wrote in dk.edb.internet.webdesign.serverside.asp:
> Så virker koden, men den udskrives bare kun én tilfældig udvalgt record, og
> ikke de 5 som den gerne skulle. Der er altså stadig et eller andet der skal
> rettes. Koden - i sin helhed - ser nu sådan ud:
>
> <%
> 'Vi definerer vores connection objekt
> Dim objConn
> Set objConn = Server.CreateObject("ADODB.Connection")
> objConn.Open "DRIVER={Microsoft Access Driver
> (*.mdb)};DBQ="&Server.MapPath("dbansgar.mdb")
>
> 'Vi tæller hvor mange poster der er i tabellen og gemmer i en
variabel
> Dim objRS, iAntal
> Set objRS = objConn.Execute("SELECT COUNT(ID) FROM [artikler]")
> iAntal = objRS(0)
>
> 'Vi henter samtlige ider fra tabellen
> Set objRS = objConn.Execute("SELECT ID FROM [artikler]")
>
> 'Vi skal bruge en tæller variebel for at holde øje med hvor vi er i
> arrayet
> Dim iTaeller
> iTaeller = 0
>
> 'Vi definerer et array til at putte alle Id numrene i.
> Dim Poster
> ReDim Poster(iAntal)
>
> 'For hver post indlæses id'et i arrayet
> Do while Not objRS.EOF
> Poster(iTaeller) = objRS(0)
> iTaeller = iTaeller + 1
> objRS.Movenext
> Loop
>
> 'Vi kalder Randomize for at få et "seed" til rnd funktionen
> Randomize
> Dim Post, iPostid
>
> 'Udfra antallet af poster finder vi et nummer og henter det
tilsvarende
> nummer i arrayet
> Post = cLng( rnd * iAntal + 0.5)
> iPostid = Poster(Post)
>
> 'Rydder op....
> Erase Poster
>
> 'Vi kan nu hente posten udfra idnummeret vi har gemt og udskrive
den....
> Set objRS = objConn.Execute("SELECT forfatter,overskrift,tekst FROM
> artikler WHERE ID=" & iPostid)
>
>
> If Not objRS.EOF Then
>
> 'Udskriv post
>
> Do While Not objRS.EOF
> Response.Write "<tr><td align=center>"
> Response.Write objRS.Fields("forfatter")
> Response.Write "</td></tr><tr><td>"
> Response.Write objRS.Fields("overskrift")
> Response.Write "</b></td></tr><tr><td align=left>"
> Response.Write Left(objRS.Fields("tekst"),100)
> Response.Write "<br></td></tr><tr><td>"
> Response.Write "<br></td></tr>"
>
> objRS.MoveNext
> loop
>
> End if
>
> objRS.Close
> Set objRS = Nothing
>
> objConn.Close
> Set objConn = Nothing
> %>
>
> </table>
>
> </body>
> </html>
>
>
> Hvad skal rettes for at den udskriver 5 tilfældige records, og ikke kun én?
Du kunne jo bare have koden fem gange!
> v.h.
> Jakob Munck
--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP ???
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Jakob Munck (24-12-2001)
| Kommentar Fra : Jakob Munck |
Dato : 24-12-01 11:48 |
|
>
> Du kunne jo bare have koden fem gange!
>
ja, det kunne jeg selvfølgelig, men jeg forestiller mig at det kan løses en
smule mere elegant og effektivt for serveren.
Hvordan får man et recordset på 5 records i stedet for det nuværende, der -
så vidt jeg kan se - kun indeholder én record?
jm
| |
Jakob Andersen (24-12-2001)
| Kommentar Fra : Jakob Andersen |
Dato : 24-12-01 11:57 |
|
"Jakob Munck" <jakob.munck@tdcadsl.dk> wrote in message
news:3c26f0b7$0$62900$edfadb0f@dspool01.news.tele.dk...
> Så virker koden, men den udskrives bare kun én tilfældig udvalgt record,
og
> ikke de 5 som den gerne skulle. Der er altså stadig et eller andet der
skal
> rettes. Koden - i sin helhed - ser nu sådan ud:
Jeg har lige strikket noget sammen til dig.
<%
Option Explicit
CONST iHvormangePoster = 5
Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "DRIVER={Microsoft Access
Driver(*.mdb)};DBQ="&Server.MapPath("dbansgar.mdb")
Dim objRS
Set objRS = objConn.Execute("SELECT AID FROM tblAktuelt")
Dim Poster
Poster = objRS.GetRows
Dim iAntal
iAntal = UBound( Poster, 2 )
Dim iValgtePoster, strValgtePoster, iTaeller
iValgtePoster = ""
strValgtePoster = ""
iTaeller = 0
Randomize
Do While iTaeller < iHvormangePoster
Dim iValgt
iValgt = Int( Rnd * iAntal ) + 1
If InStr( strValgtePoster, "*" & iValgt & "*") = 0 Then
iValgtePoster = iValgtePoster & "*" & iValgt & "*"
strValgtePoster = strValgtePoster & "," & Poster(0,iValgt)
iTaeller = iTaeller + 1
End If
Loop
strValgtePoster = Mid( strValgtePoster, 2 )
Set objRS = objConn.Execute("SELECT forfatter,overskrift,tekst FROM
artikler WHERE ID IN (" & strValgtePoster & ")")
Do While Not objRS.EOF
Response.Write "<tr><td align=center>"
Response.Write objRS.Fields("forfatter")
Response.Write "</td></tr><tr><td>"
Response.Write objRS.Fields("overskrift")
Response.Write "</b></td></tr><tr><td align=left>"
Response.Write Left(objRS.Fields("tekst"),100)
Response.Write "<br></td></tr><tr><td>"
Response.Write "<br></td></tr>"
objRS.MoveNext
Loop
%>
| |
Jakob Munck (24-12-2001)
| Kommentar Fra : Jakob Munck |
Dato : 24-12-01 13:38 |
|
Hej igen og tak for din hjælp.
Jeg tror det nærmer sig et anvendeligt resultat, men der er stadig fejl i
denne kode. Fejlmeldingen jeg får er denne (markeret med => i koden):
---------------------------------
[Microsoft][ODBC Microsoft Access-driver] Der er en syntaksfejl, fordi der
mangler en operator. i forespørgselsudtrykket "ID IN (,,,,)".
/Ansgar/vaelg_tilfaeldige2.asp, line 48
-----------------------------
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<meta name="Ansgar.dk" content="Artikler, debat">
<title>Ansgar.dk</title>
<LINK href="ansgar.css" rel="stylesheet" type="text/css">
</head>
<body>
<table border="2" width="100%" align="center" bordercolor="0000ff"
cellpadding="4">
<%
'Option Explicit
CONST iHvormangePoster = 5
Dim objConn
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Open "DRIVER={Microsoft Access Driver
(*.mdb)};DBQ="&Server.MapPath("dbansgar.mdb")
Dim objRS
Set objRS = objConn.Execute("SELECT * FROM artikler")
Dim Poster
Poster = objRS.GetRows
Dim iAntal
iAntal = UBound( Poster, 2 )
Dim iValgtePoster, strValgtePoster, iTaeller
iValgtePoster = ""
strValgtePoster = ""
iTaeller = 0
Randomize
Do While iTaeller < iHvormangePoster
Dim iValgt
iValgt = Int( Rnd * iAntal ) + 1
If InStr( strValgtePoster, "*" & iValgt & "*") = 0 Then
iValgtePoster = iValgtePoster & "*" & iValgt & "*"
strValgtePoster = strValgtePoster & "," & Poster(0,iValgt)
iTaeller = iTaeller + 1
End If
Loop
strValgtePoster = Mid( strValgtePoster, 2 )
=> Set objRS = objConn.Execute("SELECT forfatter,overskrift,tekst FROM
artikler WHERE ID IN (" & strValgtePoster & ")")
Do While Not objRS.EOF
Response.Write "<tr><td align=center>"
Response.Write objRS.Fields("forfatter")
Response.Write "</td></tr><tr><td>"
Response.Write objRS.Fields("overskrift")
Response.Write "</b></td></tr><tr><td align=left>"
Response.Write Left(objRS.Fields("tekst"),100)
Response.Write "<br></td></tr><tr><td>"
Response.Write "<br></td></tr>"
objRS.MoveNext
Loop
%>
</table>
</body>
</html>
Koden er for avanceret til at jeg selv kan regne ud hvor fejlen er, desværre
!
v.h.
Jakob Munck
| |
Jakob Andersen (24-12-2001)
| Kommentar Fra : Jakob Andersen |
Dato : 24-12-01 13:51 |
|
"Jakob Munck" <jakob.munck@tdcadsl.dk> wrote in message
news:3c272037$0$62866$edfadb0f@dspool01.news.tele.dk...
> Hej igen og tak for din hjælp.
>
> Jeg tror det nærmer sig et anvendeligt resultat, men der er stadig fejl i
> denne kode. Fejlmeldingen jeg får er denne (markeret med => i koden):
>
> ---------------------------------
>
> [Microsoft][ODBC Microsoft Access-driver] Der er en syntaksfejl, fordi der
> mangler en operator. i forespørgselsudtrykket "ID IN (,,,,)".
> /Ansgar/vaelg_tilfaeldige2.asp, line 48
Nedenstående skal stå på en linie:
Set objRS = objConn.Execute("SELECT forfatter,overskrift,tekst FROM artikler
WHERE [ID] IN (" & strValgtePoster & ")")
| |
Jakob Munck (24-12-2001)
| Kommentar Fra : Jakob Munck |
Dato : 24-12-01 14:19 |
|
>
> Nedenstående skal stå på en linie:
> Set objRS = objConn.Execute("SELECT forfatter,overskrift,tekst FROM
artikler
> WHERE [ID] IN (" & strValgtePoster & ")")
>
Det gør det skam også, måske ikke her, men i den kode jeg forsøger at
eksekvere. Så det er ikke det, som er fejlen.
jm
| |
Jakob Munck (25-12-2001)
| Kommentar Fra : Jakob Munck |
Dato : 25-12-01 17:23 |
|
Nu har jeg testet den første kode som er foreslået i denne tråd, og den duer
fint hvis man kun skal hente én tilfældig record. Men hvis man forsøger at
gentage den f.eks. 5 gange for at få 5 tilfældige records, giver den
fejlmelding ca. i hvert 10. forsøg.
Problemet med at finde en brugbar kode, der kan trække 5 tilfældige records
ud af en tabel (hvor rækken af ID-numre ikke er kontinuerlig) er altså
stadig ikke løst.
v.h.
Jakob Munck
| |
Jakob Andersen (25-12-2001)
| Kommentar Fra : Jakob Andersen |
Dato : 25-12-01 17:42 |
|
Jakob Munck wrote in dk.edb.internet.webdesign.serverside.asp:
> Problemet med at finde en brugbar kode, der kan trække 5 tilfældige records
> ud af en tabel (hvor rækken af ID-numre ikke er kontinuerlig) er altså
> stadig ikke løst.
Jeg har i mellemtiden haft testet den kode jeg gav dig til sidste der trækker
fem records ud, den virker fint. Men jeg tester godtnok på en SQL Server, da
jeg ikke har en access på min maskine....
--
Vil du lære at kode HTML, XHTML, CSS, SSI eller ASP ???
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
Jakob Munck (25-12-2001)
| Kommentar Fra : Jakob Munck |
Dato : 25-12-01 19:35 |
|
>
> Jeg har i mellemtiden haft testet den kode jeg gav dig til sidste der
trækker
> fem records ud, den virker fint. Men jeg tester godtnok på en SQL Server,
da
> jeg ikke har en access på min maskine....
>
OK, så er det nok det, der er forskellen. På Access fungerer det i hvert
fald ikke, så jeg leder efter noget andet.
Men tak for hjælpen alligevel.
v.h.
Jakob Munck
| |
Jakob Andersen (25-12-2001)
| Kommentar Fra : Jakob Andersen |
Dato : 25-12-01 22:01 |
|
"Jakob Munck" <jakob.munck@tdcadsl.dk> wrote in message
news:3c28c576$0$55589$edfadb0f@dspool01.news.tele.dk...
> OK, så er det nok det, der er forskellen. På Access fungerer det i hvert
> fald ikke, så jeg leder efter noget andet.
´
Hov, hov.. Klap lige hesten... Hvis der er en der gidder at sende mig en
access database på jakob@effectus.dk så skal jeg nok lige kigge på det...
--
Jakob Andersen
| |
Jakob Andersen (26-12-2001)
| Kommentar Fra : Jakob Andersen |
Dato : 26-12-01 01:42 |
|
"Jakob Andersen" <jakob@effectus.dk> wrote in message
news:a0apmb$1410$1@news.cybercity.dk...
> Hov, hov.. Klap lige hesten... Hvis der er en der gidder at sende mig en
> access database på jakob@effectus.dk så skal jeg nok lige kigge på det...
Så blev jeg lidt for utålmodig så jeg fandt lige en Northwind database (MS
testdatabase) og lavede et eksempel med den:
<URL: http://advice.dk/jakob/random.asp>
--
Jakob Andersen
| |
Jakob Munck (26-12-2001)
| Kommentar Fra : Jakob Munck |
Dato : 26-12-01 08:03 |
|
Hatten af for dig Jakob Andersen, koden virker og den giver ikke
fejlmeldinger - heller ikke med Access. Det var lige det jeg søgte efter.
Ros, respekt og mange tak for din indsats. Du er bare GOD !
v.h.
Jakob Munck
| |
Allan Ebdrup (30-12-2001)
| Kommentar Fra : Allan Ebdrup |
Dato : 30-12-01 18:34 |
|
"Jakob Munck" <jakob.munck@tdcadsl.dk> wrote in message
news:3c28a66e$0$55546$edfadb0f@dspool01.news.tele.dk...
> Nu har jeg testet den første kode som er foreslået i denne tråd, og den
duer
> fint hvis man kun skal hente én tilfældig record. Men hvis man forsøger at
> gentage den f.eks. 5 gange for at få 5 tilfældige records, giver den
> fejlmelding ca. i hvert 10. forsøg.
1) Fejl i hvert 10. forsøg tyder på at der er noget fundamentalt galt med
koden.
2) Du kan ikke være sikker på at den tilfældigt valgte record ikke
tilfældigvis bliver den samme.
> Problemet med at finde en brugbar kode, der kan trække 5 tilfældige
records
> ud af en tabel (hvor rækken af ID-numre ikke er kontinuerlig) er altså
> stadig ikke løst.
Her er et forslag jeg ved kan laves, men i skal arbejde med det.
1) Lav en kode der vælger 5 ikke-ens tal mellem 1 og antallet af poster. *
2) Hent ID feltet for alle poster med clienstide cursor. **
3) Brug de tilfældigt valgte numre fra 1) til at hoppe til
objRs.AbsolutePosition og gem ID'et fra den post du er hoppet til.
4) Lav en "SELECT WHERE ID=<<ID1>> OR ID=<<ID2>> OR ....", hvor ID1, ID2,
.... er ID'erne fra 3).
* Det er her den eneste virkelige udfordring ligger.
** Hvis tabellen har over fx 10.000 poster kan man begynde at undersøge om
en serverside cursor giver bedre performance, og det gør problemet noget
mere komplekst, det har næppe relevans for de fleste anvendelser.
MVH
Allan Ebdrup
| |
Allan Ebdrup (30-12-2001)
| Kommentar Fra : Allan Ebdrup |
Dato : 30-12-01 18:44 |
|
"Allan Ebdrup" <ebdrup@ti-fire.dk> wrote in message
news:<a0nj4s$2g6o$1@news.cybercity.dk>...
> "Jakob Munck" <jakob.munck@tdcadsl.dk> wrote in message
> news:3c28a66e$0$55546$edfadb0f@dspool01.news.tele.dk...
> > Nu har jeg testet den første kode som er foreslået i denne tråd, og den
> duer
> > fint hvis man kun skal hente én tilfældig record. Men hvis man forsøger
at
> > gentage den f.eks. 5 gange for at få 5 tilfældige records, giver den
> > fejlmelding ca. i hvert 10. forsøg.
>
> 2) Du kan ikke være sikker på at den tilfældigt valgte record ikke
> tilfældigvis bliver den samme.
Det tager jeg lige tilbage, men:
1) Du har et "problem" med koden som den er nu hvis du vil vælge 5 poster og
der kun er 4 i databasen.
2) Et mindre mere teoretisk problem med algoritmen du benytter er hvis du fx
skal vælge 100 tilfældige poster ud af 101 så kan der komme temmeligt mange
forsøg hvor man vil vælge en post og den allerede er valgt, teoretisk
uendeligt lang tid (for slet ikke at snakke om 10000 ud af 10001 osv.).
Men hvis det virker som det skal er det jo nok godt nok.
MVH
Allan Ebdrup
| |
Jakob Andersen (01-01-2002)
| Kommentar Fra : Jakob Andersen |
Dato : 01-01-02 15:05 |
|
"Allan Ebdrup" <ebdrup@ti-fire.dk> wrote in message
news:a0njnc$2hec$1@news.cybercity.dk...
> Det tager jeg lige tilbage, men:
Ok.
> 1) Du har et "problem" med koden som den er nu hvis du vil vælge 5 poster
og
> der kun er 4 i databasen.
Det kan man jo lave et simpelt tjek på:
If antalposter < 6 Then
' Udskriv alle
Else
'Udfør random kode
End if
> 2) Et mindre mere teoretisk problem med algoritmen du benytter er hvis du
fx
> skal vælge 100 tilfældige poster ud af 101 så kan der komme temmeligt
mange
> forsøg hvor man vil vælge en post og den allerede er valgt, teoretisk
> uendeligt lang tid (for slet ikke at snakke om 10000 ud af 10001 osv.).
I access er der åbenbart ikke andre muligheder, men hvis du har et forslag
hvor man undgår disse mange gentagelser vil jeg da frygtelig gerne se det.
--
Jakob Andersen
| |
Allan Ebdrup (01-01-2002)
| Kommentar Fra : Allan Ebdrup |
Dato : 01-01-02 23:38 |
|
"Jakob Andersen" <jakob@effectus.dk> wrote in message
news:a0sfrb$302n$1@news.cybercity.dk...
> "Allan Ebdrup" <ebdrup@ti-fire.dk> wrote in message
> news:a0njnc$2hec$1@news.cybercity.dk...
> > Det tager jeg lige tilbage, men:
>
> Ok.
>
>
> > 1) Du har et "problem" med koden som den er nu hvis du vil vælge 5
poster
> og
> > der kun er 4 i databasen.
>
> Det kan man jo lave et simpelt tjek på:
>
>
> If antalposter < 6 Then
> ' Udskriv alle
> Else
> 'Udfør random kode
> End if
Yep, men løsningen kan laves noget pænere med en generel funktion til at
udvælge X tilfældige og ikke-ens poster fra en tabel, og een gang for alle
tage højde for den slags tilfælde.
> > 2) Et mindre mere teoretisk problem med algoritmen du benytter er hvis
du
> fx
> > skal vælge 100 tilfældige poster ud af 101 så kan der komme temmeligt
> mange
> > forsøg hvor man vil vælge en post og den allerede er valgt, teoretisk
> > uendeligt lang tid (for slet ikke at snakke om 10000 ud af 10001 osv.).
>
> I access er der åbenbart ikke andre muligheder, men hvis du har et forslag
> hvor man undgår disse mange gentagelser vil jeg da frygtelig gerne se det.
Jeg foreslår at gøre som i min forrige post. Til trin 1 hvor du skal vælge 5
tilfældige, ikke-ens heltal mellem 1 og antallet af poster, så har jeg lavet
en algoritme der gør det, den er lidt langhåret at beskrive, men det kan
lade sig gøre - jeg vil kigge i gemmerne oppe på arbejdet. Eller prøv at
lave den selv.
MVH
Allan Ebdrup
| |
Jakob Andersen (02-01-2002)
| Kommentar Fra : Jakob Andersen |
Dato : 02-01-02 11:51 |
|
"Allan Ebdrup" <ebdrup@ti-fire.dk> wrote in message
news:a0tdnp$19n7$1@news.cybercity.dk...
> Jeg foreslår at gøre som i min forrige post. Til trin 1 hvor du skal vælge
5
> tilfældige, ikke-ens heltal mellem 1 og antallet af poster, så har jeg
lavet
> en algoritme der gør det, den er lidt langhåret at beskrive, men det kan
> lade sig gøre - jeg vil kigge i gemmerne oppe på arbejdet. Eller prøv at
> lave den selv.
Det er jo for så vidt også det der gøres i mit eksempel..
1.Antallet af poster trækkes ud
2. Id'erne hives ud i et array
3.Der vælges 5 tilfældige numre mellem 1 og antallet af poster
4.Idnumrene fra de 5 tilfældige poster vælges i arrayet
5. Posterne med de 5 id numre hentes fra databasen og udskrives.
--
Jakob Andersen
| |
|
|