Juni 24, 2021, 20:54:55

Neuigkeiten:

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


Sortierung in Abfrage über Button

Begonnen von ThomasR, Mai 03, 2021, 11:30:28

⏪ vorheriges - nächstes ⏩

ThomasR

Guten Tag zusammen

Ich stehe gerade so richtig auf dem Schlauch. Gibt es aber des öfter, da ich nicht viel Ahnung habe von Access.

Ich habe in eine Abfrage für eine zufällige Reihenfolge eine Feld RND ZZG(ID) erstellt und nach diesem sortiert (Sortierung Aufsteigend). Im Formular konnte ich via einen Button Me.Requery aktualisieren und die Anordnung wurde neu gemischt. Bis dahin funktioniert das einwandfrei.

Jetzt ist neu der Wunsch aufgetaucht, dass ich zwischen alphabetisch und RND umschalten kann (im Formular mittels Schaltflächen). Wenn ich nun im Formular die Sortierung der Spalte wechsle (Set.OrderBy "RND ASC" bzw. SetOrderBY "Wort ASC") funktioniert das grundsätzlich, aber die Reihenfolge bei RND bleibt immer gleich.

Ich denke der Grund ist, dass die Sortierung im Formular passiert und nicht wie vorher in der Abfrage.

Wie kann ich die Sortierung aus dem Formular heraus in der Abfrage ändern?

Danke.

DF6GL

Hallo,

erstelle zwei SQL-Strings, einen mit der zufälligen Sortierung und einen zweiten mit der alfanumerischen Sortierung. Weise diese dann je nach Button-Klick der Recordsource des Forms zu.


ebs17

Zitatdie Reihenfolge bei RND bleibt immer gleich
Richtiger Zufall ist gar nicht so einfach, insbesondere wenn die Maschine eigentlich nur einen festen Algorithmus abarbeitet, auch bei der Erstellung von Zufallszahlen.
Du könntest Randomize ins Spiel bringen und derart den Initialwert für die Zufallszahlenberechnung beeinflussen.
Mit freundlichem Glück Auf!

Eberhard

ThomasR

Dachte mir schon das es in die sql Richtung gehen wird. Das ist eines meiner vielen "Schwarzen Löcher".

Deshalb beginne ich mit einer Verständnisfrage. In der Abfrage (Entwurfsansicht) kann man zu den Feldern Sortierung, Kriterien eintragen. Diese beziehen sich auf die entsprechenden Tabelle. Daraus mach Access dann auch eine SQL Abfrage, welche man sich in der Ansicht "SQL-Ansicht" ansehen kann.
Ist das soweit richtig?

Wenn ich nun einen zusätzlichen sql String aus der Form ausführe, wird diese "Anweisung" zusätzlich als Bedingung ergänzt ?

"SELECT * FROM qryZufall WHERE Wort ORDER BY Rnd([ID]) DESC" ist das die richtige Richtung?


DF6GL

Hallo,

die Richtung hat zwar einen Öffnungswinkel von 180°, aber naja..   ;)


Zeig doch mal den in der SQL-Ansicht im Abfrageentwurf sichtbaren SQL-String...


Im Prinzip so:


Select * from tblTabelle Order by Word desc

liefert alle Tabellenfelder(-spalten) in alphanumerisch absteigender Reihenfolge des Inhalts von Feld "Word" (sofern dies den Datentxp TEXT besitzt)



Select * from tblTabelle Order by Word asc

liefert aufsteigende Reihenfolge.



Me.Recordsource = "Select * from tblTabelle Order by RND([ID])"
liefert die Datensätze in zufälliger Reihenfolge. Dabei ist es unerheblich, ob die generierte Zufallszahl auf oder absteigend sortiert wird.


Diese SQL-Strings müssen in je einem Button-Klick-Event der Recordsource des Forms zugewiesen werden, damit die Abfrage auch ausgeführt wird:

Dazu den Hinweis von ebs berücksichtigen (Randomize).


ThomasR

Mai 04, 2021, 12:48:03 #5 Letzte Bearbeitung: Mai 04, 2021, 15:52:41 von ThomasR
Guten Morgen

Hier der SQL aus der Abfrage:

SELECT tblMaster.ID, Rnd([ID]) AS RND, tblMaster.Wort, tblMaster.Umschreibung, tblMaster.Definition, tblStatus.Status, tblKategorie.Kategorie, tblLektion.Stufe, tblLektion.Einheit, tblLektion.Untereinheit, tblDialekte.ZH, tblDialekte.BS, tblDialekte.BE, tblDialekte.LU, tblDialekte.SG, tblMaster.VideodateiName, tblMaster.BspVideoDateinamen, tblMaster.BspVideoText, tblMaster.Merkliste1_ID, tblMaster.Merkliste2_ID, tblMaster.Merkliste3_ID
FROM tblStatus INNER JOIN (tblKategorie INNER JOIN (tblDialekte INNER JOIN (tblLektion INNER JOIN tblMaster ON tblLektion.LektionID = tblMaster.ID) ON tblDialekte.DialektID = tblMaster.ID) ON tblKategorie.KategorieID = tblMaster.Kategorie_ID) ON tblStatus.StatusID = tblMaster.Status_ID
WHERE (((tblStatus.Status) Like "*" & [Formulare]![frmZufall]![kfStatus2] & "*") AND ((tblKategorie.Kategorie) Like "*" & [Formulare]![frmZufall]![kfKategorie2] & "*") AND ((tblLektion.Stufe) Like IIf([Formulare]![frmZufall]![Rahmen_Stufe2]=1,1,IIf([Formulare]![frmZufall]![Rahmen_Stufe2]=2,2,IIf([Formulare]![frmZufall]![Rahmen_Stufe2]=3,3,IIf([Formulare]![frmZufall]![Rahmen_Stufe2]=4,4,IIf([Formulare]![frmZufall]![Rahmen_Stufe2]=5,"n.v.","*")))))) AND ((tblLektion.Einheit) Like IIf([Formulare]![frmZufall]![Rahmen_Einheit2]=1,1,IIf([Formulare]![frmZufall]![Rahmen_Einheit2]=2,2,IIf([Formulare]![frmZufall]![Rahmen_Einheit2]=3,3,IIf([Formulare]![frmZufall]![Rahmen_Einheit2]=4,4,IIf([Formulare]![frmZufall]![Rahmen_Einheit2]=5,"n.v.","*")))))) AND ((tblLektion.Untereinheit) Like IIf([Formulare]![frmZufall]![Rahmen_Untereinheit2]=1,"a",IIf([Formulare]![frmZufall]![Rahmen_Untereinheit2]=2,"b",IIf([Formulare]![frmZufall]![Rahmen_Untereinheit2]=3,"c",IIf([Formulare]![frmZufall]![Rahmen_Untereinheit2]=4,"d",IIf([Formulare]![frmZufall]![Rahmen_Untereinheit2]=5,"n.v.","*")))))) AND ((tblDialekte.ZH) Like IIf([Formulare]![frmZufall]![KK_ZH2]=-1,1,"*")) AND ((tblDialekte.BS) Like IIf([Formulare]![frmZufall]![KK_BS2]=-1,1,"*")) AND ((tblDialekte.BE) Like IIf([Formulare]![frmZufall]![KK_BE2]=-1,1,"*")) AND ((tblDialekte.LU) Like IIf([Formulare]![frmZufall]![KK_LU2]=-1,1,"*")) AND ((tblDialekte.SG) Like IIf([Formulare]![frmZufall]![KK_SG2]=-1,1,"*")) AND ((tblMaster.Merkliste1_ID) Like IIf([Formulare]![frmZufall]![KK_Ml1]=-1,-1,"*")) AND ((tblMaster.Merkliste2_ID) Like IIf([Formulare]![frmZufall]![KK_Ml2]=-1,-1,"*")) AND ((tblMaster.Merkliste3_ID) Like IIf([Formulare]![frmZufall]![KK_Ml3]=-1,-1,"*")));

Hierzu "Me.Recordsource = "Select * from tblTabelle Order by RND([ID])" habe ich eine Frage. Das Feld RND gibt es nur in der Abfrage, nicht aber in der Tabelle. Ich verspüre deshalb das "Bedürfnis" als "from" die Abfrage zu nennen. Aber das ist dann wohl die gegenüberliegende Seite des Öffnungswinkels.....

Me.RecordSource = "Select * from tblMaster Order by RND([ID])" funktioniert! Allerdings verlieren danach die Spalten Kategorie, Status, ZH, BE, LU, ......bis Untereinheit die Daten im Formular. Es erschient #Name?. Ist das weil das "Select * from tblTabelle Order by RND([ID])" die SQL aus dem Abfrageentwurf überlagert anstelle ergänzt?

Beaker s.a.

Hallo Thomas,
Wer solche Monster braucht, sollte lieber noch mal von vorne
anfangen, und erst mal das Datenmodell bereinigen sprich:
normalisieren.

gruss ekkehard
--
Beaker s.a., der lieber an seinem eigenen Projekt arbeiten würde/sollte, aber irgendwie immer gerne seinen Senf dazu gibt ;-)
S.M.I².L.E.

ThomasR

Hallo ekkehard
Danke für deinen Tipp. Ich habe schon einmal Hinweise in die Richtung "normalisieren" erhalten. Danach hebe ich einige Daten in andere Tabellen verschoben. Ich sehe da noch weitere die ich Untertabellen verschieben kann.
Wo ich aber nicht durchblicke ist; das sql Monster ist aus den Kriterien der Abfrage. Wird dieser nach einer Normalisierung wirklich anders?
Lg Thomas

DF6GL

Hallo,

ZitatWird dieser nach einer Normalisierung wirklich anders


totsicher

Diese IIF -Escalation ist, dazu noch mit Formular-Steuerelement-Referenzen, völlig "daneben" (sorry ;) )

PhilS

Zitat von: ThomasR am Mai 06, 2021, 16:39:43Wo ich aber nicht durchblicke ist; das sql Monster ist aus den Kriterien der Abfrage. Wird dieser nach einer Normalisierung wirklich anders?
Normalisierung ist zwar schon das richtige Stichwort, aber hier tendenziell irreführend, weil das IIF-Monster (soweit ich auf den ersten Blick erkenne) nicht durch die übliche Tabellennormalisierung vertrieben werden kann.

Die Ursache für das IIF-Monster ist, dass dir ca. 3 Tabellen scheinbar komplett fehlen.

Die Werte der Formularsteuerelemente von Rahmen_Stufe2, Rahmen_Einheit2 und Rahmen_Untereinheit2 gehören jeweils in eine Tabelle, die den Steuerlemente-Wert und den "Daten-Wert" (z.B. tblLektion.Stufe) zusammenfasst. Wenn du dann diese Tabellen in die Abfrage aufnimmst, kannst du direkt die Steuerlemente-Werte als Kriterien verwenden und das Monster ist fort.
Access DevTools - Find and Replace
Komfortables Suchen und Ersetzen in den Entwurfseigenschaften von Access-Objekten. In Abfragen, Formularen, Berichten und VBA-Code - Überall und rasend schnell!