Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

ID per Zufallsgenerator auswählen

Begonnen von Gockel67, Oktober 01, 2025, 08:33:38

⏪ vorheriges - nächstes ⏩

Gockel67

Moin Gemeinde,

aus einer Tabelle (tblBilder) der relative Pfade zu Bildern enthält soll per Zufallsgenerator ein Bild ausgewählt und in einem Bildfeld dargestellt werden.

Wie bewerkstellige ich sowas?

Liebe Grüße
Jörg

werner budde

Auf die Schnelle:
die VBA-Funktion  Rnd() erzeugt eine Zufallszahl (Double) zwischen 0 und 1.
Die könntest Du dann mit der höchsten vorkommenden ID multiplizieren und per Int(..)
daraus eine Ganzzahl bilden.
Restproblem: wenn bei den ID's in Deiner Tabelle Lücken vorkommen (aufgrund früherer Löschvorgänge),
müsste man weiterfeilen ...
Gruß Werner

Knobbi38

Hallo,

z.B. so und mit dem ">=" ist das Restproblem auch gelöst:
SELECT TOP 1 ID
FROM tabelle
WHERE ID >= Int(Rnd(Timer())*(SELECT MAX(ID) FROM tabelle) + 1)

Knobbi38

PhilS

Zitat von: werner budde am Oktober 01, 2025, 10:04:35Restproblem: wenn bei den ID's in Deiner Tabelle Lücken vorkommen (aufgrund früherer Löschvorgänge),
müsste man weiterfeilen ...
Eine Lösung wäre es, die Ids der Datensätze in ein Array zu laden und dann, wie von @werner budde angedacht, eine Id aus diesem Array zu ermitteln. - Wenn viele Datensätze in der Tabellen sind, ist das allerdings suboptimal.

Der Lösungsvorschlag von @Knobbi38 ist wesentlich eleganter und sicher auch performanter. Wenn allerdings Lücken in der Id-Sequenz in der Tabelle sind, werden die den Lücken folgenden Datensätze überproportional häufig ausgewählt werden.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Knobbi38

#4
Hallo,

den Einwand von Phil gilt es natürlich zu berücksichtigen. Wenn das ein Problem darstellt, muß man entweder die Lücken berücksichtigen, z.B. in dem eine fortlaufende RowNumber generiert und mit einbezogen wird oder aber man nimmt eine Zufällige Sortierung:
SELECT  TOP 1 ID
FROM Tabelle
ORDER BY RND(ID)
Allerdings ist diese Lösung dann nicht mehr performant und belastet das System enorm.

U.U. könnte auch eine VBA Funktion hilfreich sein:
Public Function GetRndRecValue(ByVal Tablename As String, ByVal Fieldname As String) As Variant
  Dim lngCount As Long
  Dim rst As DAO.Recordset
 
  lngCount = DCount("*", Tablename)
  Set rst = CurrentDb.OpenRecordset(Tablename, RecordsetTypeEnum.dbOpenTable, RecordsetOptionEnum.dbReadOnly)
  rst.Move Int(lngCount * Rnd + 1)
  GetRndRecValue = rst.Fields(Fieldname).Value
  rst.Close
End Function

Knobbi38

Knobbi38

Hallo Jörg,

du hast jetzt mehrere Möglichkeiten aufgezeigt bekommen, wie du einen zufälligen Datensatz auswählen kannst. Für die Anzeige deines Bildes kannst du jetzt z.B. die VBA Funktion verwenden und das Feld mit dem Pfad auswählen und dieses als Ausdruck für die Datenquelle des Bild-Steuerelements verwenden.

Knobbi38

Gockel67

Hallo Knobi38,

danke für deine Hilfe. Ich hab versucht die VBA-Funktion zu verwenden. Ich bekomme allerdings die Fehlermeldung 3219 'Unzulässige Operation' die sich auf die Zeile
Set rst = CurrentDb.OpenRecordset(Tablename, RecordsetTypeEnum.dbOpenTable, RecordsetOptionEnum.dbReadOnly)
bezieht.

Oder ist mein Aufruf falsche?
Bild.Picture = CurrentProject.Path & GetRndRecValue("tblBild", "Bildpfad")

Wäre lieb wenn du mir da nochmal weiterhelfen könntest.

Normalo0815

#7
Hallo Gockel67!

Eine andere Möglichkeit wäre mit Hilfe von SELECT TOP:
Public Function GetRndRecVal(ByVal Tablename As String, ByVal IDname As String, ByVal Fieldname As String) As String
  Dim strSQL As String
  GetRndRecVal = ""      ' Null vermeiden, weil die Picture-Eigenschaft nur String aufnehmen kann.
  On Error Resume Next   ' Bei Auftreten eines Fehlers gibt die Funktion einen Nullstring zurück (also kein Bildpfad).
  strSQL = "SELECT TOP 1 " & Fieldname & " FROM ( SELECT TOP " & Int(DCount("*", Tablename) * Rnd) + 1 & " " & IDname & ", " & Fieldname & " FROM " & Tablename & " ORDER BY " & IDname & " ) ORDER BY " & IDname & " DESC"
' debug.print strsql
  GetRndRecVal = CurrentDb.OpenRecordset(strSQL).Fields(Fieldname) & ""   ' & "" = Null vermeiden
End Function

Bild.Picture = CurrentProject.Path & GetRndRecVal("tblBild", "deinIDAutowertfeldname", "Bildpfad")
Freundliche Grüße
Normalo0815   :)

Gockel67

Hallo Normalo0815,

danke. So funktioniert es.

Knobbi38

Hallo Jörg,

wenn du in der Zeile den Fehler 3129 bekommst, deutet es darauf hin, daß die Tabelle nicht in dem Modus geöffnet werden kann. Alternativ kannst du auch dieses verwenden:
Set rst = CurrentDb.OpenRecordset(Tablename, RecordsetTypeEnum.dbOpenSnapshot)

Knobbi38