Hej! Nu har jag gjort så att den bara hämtar recordsetet en gång, men den måste fortfarande hoppa runt en väldig massa och det tar för lång tid. Jag kan inget om det här men jag har deklarerat recordsetet som ADODB. Dessutom så kan jag inte gå till en viss position med Move utan måste använda moveFirst först. Så skall det väl inte vara? Tacksam för all hjälp! Låt säga att du har en identity-kolumn (SQL server) eller AutoNumber (access) (lägg till en om du inte har det) och att du aldrig raderar poster från tabellen, då skulle du kunna göra så här : Tack så mycket för hjälpen, det är på ställen som sådana här som mänskligheten visar sin bästa sida! Tyvärr så förstår jag inte riktigt hur jag skall göra. Jag har en kolumn med id-nummer som går från typ 9000 till 12000. Är det det du menar? Jag kommer inte att ta bort några värden. Jag har en Access-databas. Det vore väldigt snällt om någon kunde visa hur jag skulle skriva för att välja ut ett slumptal ur de 30 högsta procenten! De skall sorteras utifrån fältet "typ" och id-fältet heter "id". Tack på förhand! Förresten, är det rimligt hinna göra 50000 kollar på 10 sekunder? Om det inte alls är det så kanske det inte är värt. Det är alltså ca 3000 poster du ska slumpa fram 50000 från? (samma post hämtas flera gånger alltså) Detta gör man nog snabbast på det sättet du gör (hur lång tid tar det?), annars skulle det gå åt 50000 anrop till databasen, det klarar du inte på 10 s. Jag har kommit fram till att det nog tar för lång tid med databasen. Som det är nu så tar det flera minuter (vilket jag tycker verkar lite suspekt!). Nu blir väl detta lite off-topic men jag hoppas att det är ok. Hur tycker ni att jag skall lösa det hela? Finns det någon datastruktur i VB som är väldigt snabb? Jag vill alltså lägga in ett par 1000 värdepar och sortera dem. Sedan vill jag välja ut en slumpmässig post. Kan du inte lägga in talen i en Array och sedan sortera med någon sorteringsalgoritm (borde finnas massor om man googlar lite)? Är du säker på att det är själva move-instruktionen på recordsetet som tar tid och inte något i din behandling av respektive post i recordsetet. Typ samma som föregående postare,en jag postar det ändå. :) Tack till alla som hjälpt mig! Det verkar som felet ligger någon annanstans men jag kan inte hitta det. Jag valde att läsa in databasen till en array och läsa ur den istället.Slumpa i recordset
Jag har en databas med ett par tusen poster där jag först vill välja t.ex. de största 30% och sen slumpmässigt ta fram ett av de värdena. Nu gör jag det genom att hämta hela recordsetet och sen använda move till en slumpmässig position. Det här görs 50000 gånger och får inte ta mer än kanske 10 s. Jag behöver hjälp för att snabba upp det! Finns det något sätt att antingen hämta just ett värde eller för att hämta recordsetet slumpat så att jag kan använda moveNext?Sv: Slumpa i recordset
Sv:Slumpa i recordset
SELECT * FROM [Tabell] WHERE [ID]=
CAST(RAND()*(SELECT COUNT([ID]) FROM [Tabell]) AS INT)
Om du raderar poster från tabellen så får du ju "hål" i identitykolumnen och då bli det inte lika enkelt längre. Då kan du i en SP loopa tills du får en träff :
DECLARE @Max int
DECLARE @Min int
DECLARE @Done bit
DECLARE @Rnd int
SET @Done=0
WHILE @Done<>1
BEGIN
SELECT @Max=MAX([ID]) FROM [Tabell]
SELECT @Min=MIN([ID]) FROM [Tabell]
SET @Rnd=CAST(RAND()*@Max AS INT)+@Min
IF EXISTS(SELECT * FROM [Tabell] WHERE [ID]=@Rnd)
BEGIN
SET @Done=1
SELECT * FROM [Tabell] WHERE [ID]=@Rnd
END
END
GO
Ps. Byt ut [ID] mot din identity-kolumns namn och [Tabell] mot tabellnamnet.
Sv: Slumpa i recordset
Sv:Slumpa i recordset
Sv: Slumpa i recordset
/JohanSv:Slumpa i recordset
Sv: Slumpa i recordset
/JohanSv: Slumpa i recordset
Jag gjorde en liten test i VB enligt nedan, har inte klockat den exakt men det tar ca 1 sekund att köra på min laptop men jag har kanske missat något i frågeställningen.
<code>
Const ANTAL_SLUMPADE = 50000
Dim rs As ADODB.Recordset
Dim i As Long
Dim temp As Integer
Randomize
'initiera recordset som föreställer ditt rs med 30 poster
Set rs = New ADODB.Recordset
rs.Fields.Append "MyField", adInteger
rs.Open
For i = 1 To 30
rs.AddNew "MyField", i
Next
'Använd posterna i RS enligt slumpad ordning
For i = 1 To ANTAL_SLUMPADE
rs.AbsolutePosition = CInt((30 - 1) * Rnd + 1)
'Symboliskt användande av slumpat data från recordsetet.
temp = rs.Fields("MyField").Value
'Debug.Print temp 'Med Debug enablat tar det ca 9 sek att köra hela funktionen
Next
rs.Close
End Sub
</code>Sv:Slumpa i recordset
10.000 värden skapas och slumpas sedan fram..
Mindre än 1 sek på min P4 @ 3 Ghz.. :)
<code>
Private Sub Command1_Click()
Dim rs As ADODB.Recordset
Dim i As Long
Dim randomID As Long
Dim min As Long, max As Long
Dim dataStr(1) As String
Set rs = New ADODB.Recordset
rs.CursorLocation = adUseClient
rs.Fields.Append "ID", adInteger, 4
rs.Fields.Append "Text", adVarChar, 30
rs.Open
min = 1
max = 10000
dataStr(0) = "Text "
For i = min To max
rs.AddNew
rs.Fields(0).Value = i
dataStr(1) = i
rs.Fields(1).Value = Join(dataStr, "")
Next
randomID = CLng((max - min + 1) * Rnd) + min
rs.AbsolutePosition = randomID
MsgBox "Random stuff: " & vbCrLf & _
rs.GetString(adClipString, 1, ", ")
rs.Close
End Sub
</code>Sv: Slumpa i recordset