PDA

Vollständige Version anzeigen : Zufälligen Datensatz auslesen


obismarck
23.10.2003, 16:39
Ich möchte im Formular einen zufälligen Datensatz aus der Tabelle "Daten" auslesen lassen. Wie funktioniert das?

peterffw
23.10.2003, 16:49
Kannst Du vielleicht etwas genauer werden was Du vorhast?
So ist das ein bisschen wenig zum weiterhelfen

Servus
Peter :p

Johnny Loser
23.10.2003, 17:05
In einem Ereignis eines "gebundenen" Formulars kannst Du folgenden Code schreiben:

Dim rs As Recordset, i As Integer
Set rs = Me.RecordsetClone
Randomize
i = Int(rs.RecordCount * Rnd)
rs.MoveFirst
For i = 0 To i - 1
rs.MoveNext
Next i
Me.Bookmark = rs.Bookmark
Sobald das Ereignis ausgelöst wird, wird per Zufall zu einem Datensatz gesprungen.

obismarck
24.10.2003, 09:50
Danke für den Tipp. Wenn ich den Befehl beim Laden des Formulars ausführen will, funktioniert es allerdings nicht.

Johnny Loser
24.10.2003, 10:01
Setze den ZeitgeberIntervall auf 1 und füge den Code in das Zeitgeber-Ereignis ein, dann funktioniert's.

Private Sub Form_Timer()
Dim rs As Recordset, i As Integer
Set rs = Me.RecordsetClone
Randomize
i = Int(rs.RecordCount * Rnd)
rs.MoveFirst
For i = 0 To i - 1
rs.MoveNext
Next i
Me.Bookmark = rs.Bookmark
TimerInterval = 0 'Wichtig: TimerInterval auf 0 setzen
End Sub

obismarck
24.10.2003, 14:38
Funktioniert jetzt, aber beim Laden des Formulars zeigt er von den insgesamt 13 Datensätzen immer nur den ersten oder den zweiten an. Woran könnte das liegen?

Robert B., München
24.10.2003, 16:43
Schon mal in dieser Richtung gespielt zB. im Form Open:

<code>
Me.Requery
Randomize
DoCmd.GoToRecord acDataForm ,,,Int(DCount("*","tblDaten") * Rnd)
</code>

Gruß
Robert

Johnny Loser
24.10.2003, 22:17
Warum nur 2 Datensätze widergegeben werden, ist mir unklar. Du könntest Dir mal über MsgBox rs.RecordCount die Anzahl der gefundenen Datensätze anzeigen lassen. Sollte eigentlich der Anzahl der Datensätze Deiner Datenherkunft entsprechen.


...aber Robert hat Recht, es geht auch einfacher:

Sub Form_Open(Cancel As Integer)
Randomize
DoCmd.GoToRecord acDataForm, "DeinFormular", acGoTo, Int(DCount("*", "DeineTabelle") * Rnd)
End Sub

obismarck
27.10.2003, 13:29
Danke für die Tipps, meistens funktionierts auch, aber manchmal kommt folgende Fehlermeldung:

Laufzeitfehler 2505
Ein Ausdruck, der im Argument 4 steht, hat einen für dieses Argument unzulässigen Wert.

Woran könnte das liegen?

Robert B., München
27.10.2003, 18:28
Vermutlich kommt für die Zufallszahl manchmal 0 raus, was vermutlich nicht zulässig ist :rolleyes:.
Probiers daher mal so:


Sub Form_Open(Cancel As Integer)
dim p as long
Randomize
p = Int(DCount("*", "DeineTabelle") * Rnd)
if p then DoCmd.GoToRecord acDataForm, "DeinFormular", acGoTo, p
End Sub


Gruß
Robert

Johnny Loser
27.10.2003, 20:44
Logisch!

Rnd gibt einen Wert <1 zurück.

Wenn Du also 10 Datensätze hast ist...

...das kleinste Produkt Int(10*0) = Int(0) = 0
...das grösste Produkt Int(10*0,99999...) = Int(9,99999...) = 9

Läßt Du alles, wie es ist, wirst Du den 10. Datensatz nie sehen und beim Versuch zum 0. Datensatz zu wechseln, eben genau Deine Fehlermeldung bekommen.

Ergo mußt Du zum Produkt 1 addieren, damit Du die Datensätze 1-10 ansprechen kannst.


Sub Form_Open(Cancel As Integer)
Randomize
DoCmd.GoToRecord acDataForm, "DeinFormular", acGoTo, Int(DCount("*", "DeineTabelle") * Rnd) + 1
End Sub

obismarck
28.10.2003, 08:22
Danke vielmals für die Hilfe!
Funktioniert nun wunderbar!

Schöne Grüße aus Südtirol von einem Access-Newbie!

FixFox
28.10.2003, 14:53
Ist es auch möglich aus einer Tabelle / Formular mehrere Datensätze auf einmal auszuwählen (z.B. 10 per Zufall) - um anschliessend z.B. einen Muliple-Choise-Test mit Fragen zu erstellen?

Danke

Johnny Loser
28.10.2003, 16:17
Dies ist theoretisch und praktisch möglich. Allerdings ist es abhängig davon, wie Du Dir die Auswahl und Anzeige der durch Zufall ausgewählten Datensätze vorstellst.

Um Dir hier entscheidende Tips geben zu können, müßten wir mehr über Dein Datenbank-Konzept wissen...

FixFox
28.10.2003, 20:06
Hallo, das Grundgerüst soll eine Tabelle mit 6 Feldern sein „Nr“ “Frage“ „A“ „B“ „C“ „RAntw - im Feld „Nr“ ist die Nummer der Frage, unter „Frage“ steht die eigentliche Frage und je eine Antwort unter A;B;C; - eine davon ist natürlich richtig …die Angabe der richtigen Antwort (z.B. „A“) erfolgt unter „RAntw“. Wenn man nun einmal von 300 DS dieser Art ausgeht wäre es jetzt wünschenswert auf einen Button zu drücken der z.B. 30 zufällige DS auswählt (nicht doppelt) und in einem Formular bzw. Bericht anzeigt. Bei jedem klicken des Buttons müssen andere Fragen zusammen gestellt werden. Um darauf aufzubauen wäre ein Code dafür nicht schlecht! Danke im vorraus

Johnny Loser
29.10.2003, 07:52
Am einfachsten ist es, beim Öffnen des Formulars in einer Schleife 10 verschiedene Nummern zu ermitteln, die entweder in einer Array-Variablen oder aber in einer Tabelle geschrieben werden, die dann als Basis für die Erstellung des Formular.RecordSource herangezogen wird.

Ich zeige jetzt nur die Möglichkeit der Verwendung einer zweiten Tabelle auf, da mir die andere Lösung adhoc nicht einfällt.

Du legst Dir eine Tabelle an (z.B. tblZufallsnummern) mit einem Feld (z.B. fldNr), welches indiziert ohne Duplikate ist vom Typ Long Integer.

Danach in die Öffnen-Prozedur Deines Formulars folgenden Code:

Private Sub Form_Open(Cancel As Integer)

' Zufallsgenerator aktivieren
Randomize

' Letzte Nummern löschen
CurrentDB.Execute("DELETE FROM tblZufallsnummern")

' Schleife durchlaufen, bis mehr als 10 Nummern in tblZufallsnummern vorhanden sind
Do While Not DCount("*", "tblZufallsnummern") > 9

' Zu zufälligem Datensatz springen
DoCmd.GoToRecord acDataForm, "DeinFormular", acGoTo, Int(DCount("*", "DeineTabelle") * Rnd) + 1

' Nummer der Frage in tblZufallsnummern anfügen
' Doppelte Nummern sind durch die eindeutige Indizierung ausgeschlossen
CurrentDb.Execute("INSERT INTO tblZufallsnummern (fldNr) SELECT " & Me!NrFeld & " AS n")

Loop

' Datenherkunft des Formulars neu zuweisen
Me.RecordSource = "SELECT DeineTabelle.* FROM DeineTabelle INNER JOIN tblZufallsnummern ON (DeineTabelle.Nr = tblZufallsnummern.fldNr)"

' Formular aktualisieren
Me.Requery

End Sub

FixFox
31.10.2003, 14:10
Danke! Ich werde es mal ausprobieren
Mfg

FixFox
05.11.2003, 19:26
Hallo,
habe den oben genannten Code eingebunden. Ich bekomme aber ständig die Fehlermeldung "Syntaxfehler in der Insert into Anweisung"

Gibt es dafür eine Erklärung?

Danke