Hallo,
ich habe eine Suchformular dem ein qryQuartettSuche zugrunde liegt und auch funktioniert. Nun wollte ich aber wenn das Formular geöffnet ist die Sortierung über eine Schaltfläche ändern, von SpielNr. auf Spiel-ID, also mehr oder weniger dynamisch. Dazu habe ich die Schaltfläche cmdIDSortieren erstellt, mit dem Ereignis beim Klicken folgenden VBA Code integriert.
Private Sub cmdIDSortieren_Click()
Dim strsql As String
strsql = "SELECT tblSpiele.SpielID,
tblVerlag.Verlag,
tblSpiele.SpielNr,
tblSpiele.SpTitel,
tblSerien.Serie,
tblKategorie.Kategorie,
tblSpiele.Ausgabejahr,
tblSpiele.Preis,
tblHaendler.VerkNn,
tblBildmotive.Bildmotiv,
tblVerlag.BilderOrdner,
tblSpiele.Verzeichnisname,
tblBilderZuSpiel.BildDateiName " _
& "FROM tblVerlag
RIGHT JOIN ((tblSerien
RIGHT JOIN (tblKategorie
RIGHT JOIN (tblHaendler
RIGHT JOIN tblSpiele ON tblHaendler.HaendlerID = tblSpiele.HaendlerID_F) ON tblKategorie.KategorieID = tblSpiele.KategorieID_F) ON tblSerien.SerieID = tblSpiele.SerieID_F)
INNER JOIN (tblBildmotive
INNER JOIN tblBilderZuSpiel ON tblBildmotive.BildMotivID = tblBilderZuSpiel.BildmotivID_F) ON tblSpiele.SpielID = tblBilderZuSpiel.SpielID_F) ON tblVerlag.VerlagID = tblSpiele.VerlagID_F " _
& "WHERE (((tblBildmotive.Bildmotiv) = Deckblatt (DB)
OR (tblBildmotive.Bildmotiv) = Schachtel-DB)
AND ((Nz([tblVerlag].[Verlag])) LIKE " * " & [Formulare]![frmQuartettSuche]![cboVerlagSuche] & " * ")
AND ((Nz([tblSpiele].[SpielNr])) LIKE " * " & [Formulare]![frmQuartettSuche]![txtSpieleNr] & " * ")
AND ((Nz([tblSpiele].[SpTitel])) LIKE " * " & [Formulare]![frmQuartettSuche]![txtSpielTitel] & " * ")
AND ((Nz([tblSerien].[Serie])) LIKE " * " & [Formulare]![frmQuartettSuche]![cboSerienSuche] & " * ")
AND ((Nz([tblKategorie].[Kategorie])) LIKE " * " & [Formulare]![frmQuartettSuche]![cboKategorieSuche] & " * ")
AND ((Nz([tblSpiele].[Ausgabejahr])) LIKE " * " & [Formulare]![frmQuartettSuche]![txtAusgabejahr] & " * ")
AND ((Nz([tblSpiele].[Preis])) LIKE " * " & [Formulare]![frmQuartettSuche]![txtPreisFilter] & " * ")
AND ((Nz([tblHaendler].[VerkNn])) LIKE " * " & [Formulare]![frmQuartettSuche]![txtHaendler] & " * ")) " _
& "ORDER BY tblSpiele.SpielNr"
Me.RecordSource = strsql
End Sub
Führe ich den Code jetzt aus, dann meckert er eben Laufzeitfehler 13 --> Typen unverträglich, das debuggen markiert dann den ganzen Teil ab strsql = bis zum ende des Order by.
Es ist bis auf die Änderung der Order der gleiche SQL Code, die der Query zugrunde liegt. Da er beim ersten Ausführen die "" bei tblBildmotive.Bildmotiv) = "Deckblatt (DB)" OR (tblBildmotive.Bildmotiv) = "Schachtel-DB")
anmeckerte, und nach entfernen nicht mehr, dachte ich schon, es liegt an den vielen "*" etc. in der Where Anweisung. Aber dem ist nicht so. Was ist falsch und wer kann mir da helfen?
Gruß Andreas
Im gebundenen Formular kannst Du die OrderBy-Eigenschaft setzen und mit OrderByOn die Sortierung an- oder abschalten.
Hallo Lachtaube,
ich verstehe es nicht ganz :(.
Du meinst also in den Eigenschaften des Formular --> Daten --> Beim Laden sortieren Ja oder nein oder ist das ein Zusatz, den ich im VBA setzen muss? Wenn ich den dort setze, dann ist der doch "fix", was ich ja nicht will, oder??
Wenn ich dazu etwas auf den DonKarls Access Seiten lese http://www.donkarl.com/FAQ/FAQ4Formulare.htm (http://www.donkarl.com/FAQ/FAQ4Formulare.htm), 4.7 Sortierung im Formular ändern, selbst dann blick ich es nicht :(.Er verweist eigentlich auf die SQL Variante, welche ich zu nutzen versuche. Kannst du mich ein wenig mehr "drauf stupsen"?
Gruß Andreas
Andreas, Du wirst es kaum glauben, aber beide Eigenschaften lassen sich während das Formular angezeigt wird, mittels VBA oder Makros zuweisen, was übrigens für fast alle Eigenschaften gilt, ohne sie im Entwurf speichern zu müssen.
Irgendwo in den Unweiten Deines VBA-Formularcode steht dann: Me.OrderBy = "SpieleNr" 'oder "SpieleNr DESC"
Me.OrderByOn = True
'oder
Me.OrderBy = "AusgabeJahr, OriginalPreis DESC"
Me.OrderByOn = True
Diese Information kann auch bei Don Karl nachgelesen werden. Über dir Wirkung von Prefessionalität kann man getelter Meinung sein, und wenn man beim Entladen den Wert auf vbNullString setzt, wird auch nichts gespeichert, egal welche Einstellung im Formular vorliegt.
Wo ist das Problem?
Hi,
das Problem ist, dass ich nun mal etwas schwer von Begriff bin, da wirst auch du leider nichts mehr dran ändern können :(.
Ich hab das jetzt hinbekommen, aber hab ein Folgeproblem dadurch. Ich versuche es mal verständlich zu erklären. Das frmQuartettSuche wird ja mit einer qryQuartettSuche befüttert. Der SQL String hat zum Abschluss einen ORDER BY SpielID. Ich habe jetzt beim Spaltenlabel der SpielNr als Ereignis beim klicken folgendes hinzugefügt:
Private Sub lblSpielNr_Click()
Me.OrderBy = "SpielNr"
Me.OrderByOn = True
End Sub
Solange ich True als OrderByOn habe, ist das Problem dass Access den Filter beim erneuten öffnen wieder anwendet. Also habe ich noch zusätzlich beim laden des Formular folgendes gesetzt:
Private Sub Form_Load()
Me.OrderBy = "SpielID"
Me.OrderByOn = True
End Sub
Aber es ist noch eine Funktion, wie ich nicht weiß, wie ich das löse. Ich kann im Suchformular alle Suchfelder mit einem Commandbutton zurücksetzen.
Private Sub cmdFilterloeschen_Click()
Me.cboKategorieSuche = ""
Me.cboSerienSuche = ""
Me.cboVerlagSuche = ""
Me.txtSpieleNr = ""
Me.txtSpielTitel = ""
Me.txtPreisFilter = ""
Me.txtAusgabejahr = ""
Me.txtHaendler = ""
Me.Requery
End Sub
Betätige ich diesen, nachdem ich eine Sortierung der SpielNr gemacht habe, dann wendet er logischerweise auch den Filter beim anzeigen aller Datensätze wieder an. Ich muss also in diesem Zurücksetzen einen Event mit einbauen, einen reload der Form, oder? Ein Me.refresh brachte keine Lösung. Wie bekomme ich das hin?
Gruß Andreas
Ich kann Dir bei der Ausführung zu dem Knopf gedanklich nicht folgen. Was passiert und was soll passieren?
Nur soviel: Steuerelemente setzt man auf Null und nicht auf "".
Hallo,
Zitatden Filter beim erneuten öffnen wieder
dafür gibt es das Form-Eigenschaft "Beim Laden sortieren"..
Zitatin diesem Zurücksetzen einen Event mit einbauen
Der "Event" könnte heißen: Nach nichts sortieren....
Me.Orderby = ""
Me.OrderbyOn = True
wobei es sinnvoller wäre, nach dem Ausgangs-(Anfangs-)zustand zu sortieren
oder gleich ein Me.Requery abzusetzen.
Hi,
Zitat von: Lachtaube am September 20, 2017, 11:38:14
Nur soviel: Steuerelemente setzt man auf Null und nicht auf "".
Den Hinweis mit "" auf Null habe ich abgeändert, danke.
Zitat von: Lachtaube am September 20, 2017, 11:38:14
Ich kann Dir bei der Ausführung zu dem Knopf gedanklich nicht folgen. Was passiert und was soll passieren?
Dieser von dir betitelte Knopf soll nur die Suchfilter, welche ich während einer Suche nach Verlag, oder Preis etc setze zurücksetzen, eben auf Null. Aber dann zieht nicht die ursprüngliche OrderBy SpielID, da ich in der vorherigen Suche nach SpielNr sortiert habe. Wenn ich das mache, dann zeigt er wieder alle Datensätze an, aber sortiert nach SpielNr., was ich nciht will! Es soll dann wieder der Ursprung, OrderBy SpielID, aktiv sein. Genau das muss ich in die "knopfaktion" reinbringen, muss passieren, da ich ja das Formular nicht schließen und wieder öffnen will um das zu erreichen.
Me.Requery wie Franz es aufführt habe ich ja schon drin in der "Knopfaktion". Hmmm ist das jetzt verständlich gewesen?
Gruß Andreas
Hallo Andreas,
ZitatMe.Requery wie Franz es aufführt habe ich ja schon drin in der "Knopfaktion".
Und was hindert dich daran die Neusortierung da auch unterzubringen?
I-Ü. würde ich das Sortieren in eine Sub auslagern, da du es ja an
verschiedenen Stellen im Formular benötigst.
Private Sub SortiereForm( _
Optional ByVal Sortierfeld As String = "")
Me.OrderBy = Sortierfeld
Me.OrderByOn = True
End Sub
gruss ekkehard
Hi Ekkehard,
Zitat von: Beaker s.a. am September 20, 2017, 12:55:37
ZitatMe.Requery wie Franz es aufführt habe ich ja schon drin in der "Knopfaktion".
Und was hindert dich daran die Neusortierung da auch unterzubringen?
Ja nix, ist ja genau meine Frage, ich bekomme es ja nur nicht hin :(. Wenn ich jetzt diese Knopfaktion erweitere
Private Sub cmdFilterloeschen_Click()
Me.cboKategorieSuche = Null
Me.cboSerienSuche = Null
Me.cboVerlagSuche = Null
Me.txtSpieleNr = Null
Me.txtSpielTitel = Null
Me.txtPreisFilter = Null
Me.txtAusgabejahr = Null
Me.txtHaendler = Null
Me.Requery
Me.OrderBy = Me.SpielID
Me.OrderByOn = True
End Sub
dann meckert er Laufzeitfehler 3709 an, dass "Der Suchschlüssel in keinem Datensatz gefunden wurde", der Debugger springt dann genau zu Me.OrderBy = Me.SpielID. Was ist das Problem?
Zitat von: Beaker s.a. am September 20, 2017, 12:55:37
I-Ü. würde ich das Sortieren in eine Sub auslagern, da du es ja an
verschiedenen Stellen im Formular benötigst.
Private Sub SortiereForm( _
Optional ByVal Sortierfeld As String = "")
Me.OrderBy = Sortierfeld
Me.OrderByOn = True
End Sub
Das auslagern habe ich ja gemacht, es geht mir lediglich noch um die Sortierung nach dem Zurücksetzen der Suchkriterien. Da ist es wohl am geschicktesten, man bringt es mit in die Aktion des Zurücksetzens mit rein.
Gruß Andreas
Dass in OrderBy ein Text in Form eines vorhandenen Feldnamens oder die Positionszahl einer vorhandenen Spalte stehen muss, hast Du verstanden?
"1" sortiert aufsteigend nach der ersten Spalte, egal wie sie heißt.
"1 DESC" auch - nur halt absteigend.
"2" nach der zweiten Spalte, usw. und
"4711" führt zur Fehlermeldung, weil es nicht soviele Spalten gibt.
Wenn man aber "SpielID", statt es dem Zufall zu überlassen, zuweist, dürfte die Aussicht auf Erfolg größer sein. :)
Hi,
Zitat von: Lachtaube am September 20, 2017, 14:17:21
Dass in OrderBy ein Text in Form eines vorhandenen Feldnamens oder die Positionszahl einer vorhandenen Spalte stehen muss, hast Du verstanden?
wenn du den Satz so anfängst, dann gehe ich davon aus, dass du der Meinung bist dass ich es wohl nicht verstanden habe, auch wenn ich schon der Meinung bin :(.
Zitat von: Lachtaube am September 20, 2017, 14:17:21
"1" sortiert aufsteigend nach der ersten Spalte, egal wie sie heißt.
"1 DESC" auch - nur halt absteigend.
"2" nach der zweiten Spalte, usw. und
"4711" führt zur Fehlermeldung, weil es nicht soviele Spalten gibt.
Wenn man aber "SpielID", statt es dem Zufall zu überlassen, zuweist, dürfte die Aussicht auf Erfolg größer sein. :)
Genau da hatte ich meinen Fehler, ich hatte zwar das Feld aber die Quotas vergessen :(. Ich habe es von
Me.OrderBy = Me.SpielID
auf
Me.OrderBy = "SpielID"
umgestellt und schon funktioniert es. Zuvor habe ich das mit der "1" gemacht, das hat natürlich auch funktioniert. Wusste ich nicht, dass ich auch nach Spaltennumer sortieren kann. Okay, danke für die Geduld.
Gruß Andreas