none
Datensatz per Zufallswahl

    Frage

  • Ich habe eine Frage, die für jeden Profi wahrscheinlich ziemlich einfach ist:

    In einer Access-DB mit angenommen 100 Datensätzen, soll - wenn im Formular auf einen Button gedrückt wird - nicht der nächste sondern irgendein zufälliger Datensatz ausgewählt und angezeigt werden.

    Bis zur Sortierung per Autowert/Zufallszahl bin ich schon gekommen.

    Die Reihenfolge der Datensätze müsste aber mit jedem Neustart der Datenbank geändert sein!

    Wie kann ich das hinterlegen?

    Dann wäre es außerdem noch optimal, wenn pro Datenbanksitzung jeder Datensatz auch nur 1x erscheint - solange, bis alle Datensätze durch sind.



    • Bearbeitet griko777 Donnerstag, 3. April 2014 18:37
    Donnerstag, 3. April 2014 18:33

Antworten

  • Hi,

    SELECT

    SELECT   TOP 1
             ID
             Spalte1,
             Spalte2,
             ...
    FROM     Tabelle
    WHERE    ID NOT IN ( SELECT RecordId FROM UsedIds )
    ORDER BY RND( ID )
    

    Du müsstest dann nur noch die selektierte ID in eine Tabelle (bei mir UsedIds) schreiben. Dann kommt die solange nicht wieder im Ergebnis vor, bis die ID aus der Tabelle gelöscht wird.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort vorgeschlagen Stefan FalzMVP Mittwoch, 9. April 2014 09:47
    • Als Antwort markiert griko777 Mittwoch, 9. April 2014 15:19
    Donnerstag, 3. April 2014 20:50

Alle Antworten

  • Hi,

    SELECT

    SELECT   TOP 1
             ID
             Spalte1,
             Spalte2,
             ...
    FROM     Tabelle
    WHERE    ID NOT IN ( SELECT RecordId FROM UsedIds )
    ORDER BY RND( ID )
    

    Du müsstest dann nur noch die selektierte ID in eine Tabelle (bei mir UsedIds) schreiben. Dann kommt die solange nicht wieder im Ergebnis vor, bis die ID aus der Tabelle gelöscht wird.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort vorgeschlagen Stefan FalzMVP Mittwoch, 9. April 2014 09:47
    • Als Antwort markiert griko777 Mittwoch, 9. April 2014 15:19
    Donnerstag, 3. April 2014 20:50
  • Vielen Dank für die schnelle Hilfe, die Zufallsauswahl funktioniert jetzt einwandfrei.

    Nur mit dem letzten Teil habe ich noch ein Problem:

    Wie bekomme ich die ID-Daten der bereits aufgerufenen Datensätze in die UsedIDs-Tabelle?

    Freitag, 4. April 2014 13:55
  • Hi,

    nuja, das musst Du schon selbst wissen/machen. Ich weiß ja nicht, wo Du diese Daten abrufst, anzeigst, ... Letztendlich musst Du nach dem Abruf die ID des Datensatzes auslesen und dann bspw. per:

    INSERT INTO UsedIds ( RecordId ) VALUES( <DeineErmittelteId> )
    

    in die Tabelle eintragen.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Freitag, 4. April 2014 13:57
  • Hallo Griko777

    Du willst ja, dass der Benutzer je Session alle abarbeitet. Das heisst, dass Du irgendwo eine Tabelle führen musst, welche Du zu Beginn der Session für den Benutzer löschst (oder wenn alle abgearbeitet sind) und dann fortlaufend füllst.

    Tabelle anlegen (einmalig in der Backend anlegen und dann verlinken, falls Frontend/Backend aufgetrennt):

    CREATE Table UserIDs (UserID TEXT(64), ID LONG, CONSTRAINT UserIDs_PK
    PRIMARY KEY (UserID, ID))

    Dann beim Öffnen der Anwendung (oder wenn der Benutzer die Nummern resetten will oder alle ausgefüllt wurden):

    DELETE FROM UserIDs WHERE UserID = CurrentUser()

    Falls das häufig (ich meine tausende Male oder so pro Tag) gemacht wird, dann kann es sein, dass sich die Backend aufbläht (weil Du viele Datensätze einfügst und wieder löschst). In diesem Fall kannst Du auch eine temporäre Tabelle (in einer lokalen, temporären Datenbank, welche Du jeweils bei Programmstart löschst und neu anlegst) benutzen, die dann keine UserID, sondern nur die ID drin hat. Oder Du definierst eine öffentliche Variable, welche dann die bereits vergebenen IDs z.B. in der Form
    "1, 17, 32, 4"
    drin hat und änderst Deine Abfrage so, dass nur die IDs zurückgegeben werden, welche nicht in der öffentlichen Variablen drin sind (NOT IN (...) statement). Um vom SQL Statement auf diese Variable zugreifen zu können benötigst Du wohl dann auch noch eine öffentliche Funktion wie:

    'Public Variable in einem Standard Modul
    Public strVergebeneIDs As String
    
    'User Defined Funktion, um diese Variable in einem SQL Statement 
    verfügbar zu machen
    Public Function getVergebeneIDs() AS String
     getVergebeneIDs = strVergebeneIDs
    End Function

    HTH
    Henry

    "griko777" schrieb im Newsbeitrag news:25888726-20fa-4185-a171-e33c5a6664ff@communitybridge.codeplex.com...

    Vielen Dank für die schnelle Hilfe, die Zufallsauswahl funktioniert
    jetzt einwandfrei.
    Nur mit dem letzten Teil habe ich noch ein Problem:
    Wie bekomme ich die ID-Daten der bereits aufgerufenen Datensätze in die
    UsedIDs-Tabelle?

    ----- http://social.Msdn.microsoft.com/Forums/de-DE/accessde/thread/09a8d749-f4fd-4656-bc4d-5ec3fcf64d58#25888726-20fa-4185-a171-e33c5a6664ff
    -----

    • Als Antwort vorgeschlagen Stefan FalzMVP Mittwoch, 9. April 2014 09:47
    Montag, 7. April 2014 07:25
  • Vielen Dank für die beiden Lösungsvorschläge, offensichtlich gibt es ja einige mögliche Varianten.

    Da mein Datensatz (nach dem zufälligen erscheinen was prima funktioniert) ja noch geändert wird, war es mir leicht möglich, noch ein berechnetes Feld in die Tabelle einzubauen, das bei einem "Click" einen Zahlenwert erhält (=1). Beim Aufruf des Zufallstreffers wird jetzt immer erstmal geprüft, welcher Wert da steht und es werden dann nur die Datensätze aufgerufen die nicht =1 sind. So kommt ebenfalls keiner doppelt dran.

    Mittwoch, 9. April 2014 04:31
  • Hallo griko777

    Achtung: Mit diesem Ansatz wird Deine Anwendung u.U. nicht Mehrbenutzer fähig. Wenn Du das Kennzeichen in der Original-Tablelle setzt, dann wird er das Kennzeichen überschreiben, das ein anderer Benutzer u.U. gerade bearbeitet, rsp. der andere Benutzer kann dann nicht auch ebenfalls ein eigenes "Zufalls-Set" bearbeiten, weil die bereits bearbeiteten Datensätze vom ersten Benutzer verändert werden. Daher mein Ansatz, eine zusätzliche Tabelle (evtl. sogar lokal) zu verwenden.

    Gruss

    Henry

    PS: Nicht vergessen, jeweils die Antworten als Antwort zu kennzeichnen. Danke.

    Mittwoch, 9. April 2014 05:30
  • Vielen Dank, gute Idee! Die Datenbank muss aber nicht in einer Mehrbenutzerumgebung laufen

    Gruss griko777

    Mittwoch, 9. April 2014 15:18