Neuigkeiten:

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

Mobiles Hauptmenü

Parameterabfrage / benutzerdefinierte Sortierung

Begonnen von bluvi, Januar 28, 2017, 01:33:50

⏪ vorheriges - nächstes ⏩

bluvi

Guten Abend zusammen,

ich möchte in einer Datenbank eine benutzerdefinierte Suche einrichten, über welche der Anwender a) nach zwei bestimmten Kriterien (Aktenzeichen und Aktentitel) suchen und b) anschließend festlegen können soll, in welcher Sortierreihenfolge die Ergebnisse ausgegeben werden.

Teil a) funktioniert bereits reibungslos - ich habe ein Formular angelegt und darin zwei ungebundene Textfelder eingerichtet, in die man einen oder beide Werte eingeben kann. Am Ende des Formulars befindet sich nun eine Schaltfläche, die beim Anklicken den oder die eingegebenen Suchbegriff(e) an eine Abfrage weiterleitet - das passt alles und liefert die gewünschten Ergebnisse.

Teil b), also die Sortierung, ist mein Problem. Ich habe mir überlegt, eine Optionsgruppe einzurichten, in der man auswählen kann, ob man


  • nach Aktenzeichen aufsteigend
  • nach Aktenzeichen absteigend
  • nach Aktentitel aufsteigend
oder
  • nach Aktentitel absteigend

sortieren möchte. Ich habe nur leider keine Ahnung, wie ich die Variable der Optionsgruppe an die Abfrage übergeben und wie ich es einrichten kann, dass aus dem Variablenwert später ein "ORDER BY Aktenzeichen ASC bzw. DESC" oder ein "ORDER BY Aktentitel ASC bzw. DESC" wird?

Ich bin an vielen anderen Stellen im Netz schon darüber gestolpert, dass die Variable wohl erst in ein Modul muss und von da aus in der Abfrage weiterverwendet werden kann, aber ich bin da leider noch nicht so fit, als dass ich verstanden hätte, was genau ich da tun müsste und wie es funktioniert.

Es wäre sehr nett, wenn sich jemand, der mehr Ahnung davon hat, des Problems mal annehmen könnte.

Viele Grüße

Holger

Lachtaube

Ein Optionsrahmen liefert nach Auswahl einer Option einen Zahlenwert, der von Dir jeder Option zugeordnet wurde, und jederzeit ausgewertet werden kann.
Grüße von der (⌒▽⌒)

bluvi

Guten Morgen Lachtaube,

danke dir für deine Antwort. Das bestätigt mir meine Annahme zur Funktionsweise, löst aber leider noch nicht mein Problem, denn

Zitatund jederzeit ausgewertet werden kann

ist ja genau mein Problem - ich weiß eben nicht, wie ich gerade das anstellen soll.

Viele Grüße

Holger

Lachtaube

Mit Me.NameDesOptionsrahmen erfährst Du den Wert der ausgewählten Option (Null bei fehlender Auswahl) des Rahmens und kannst anschließend daraus Deine Sortierrichtung ableiten. Luft-Code:Private Sub NameDesOptionsrahmens_AfterUpdate()
   Select Case Me.NameDesOptionsrahmens
   Case 1:
      SortOrderVar = "ORDER BY FeldnameA"
   Case 2:
      SortOrderVar = "ORDER BY FeldnameA DESC"
   'usw.
   End Select
End Sub

Grüße von der (⌒▽⌒)

bluvi

Hallo Lachtaube,

interpretiere ich deinen Vorschlag so richtig:

1. Im Formular frmAktenSuche richte ich folgende Ereignisprozedur ein:

Option Compare Database

Private Sub optSortwahl_AfterUpdate()
   Select Case Me.optSortwahl
   Case 1:
      SortOrderVar = "ORDER BY tblAkten.txtAktenzeichen"
   Case 2:
      SortOrderVar = "ORDER BY tblAkten.txtAktenzeichen DESC"
   Case 3:
      SortOrderVar = "ORDER BY tblAkten.txtAktentitel"
   Case 4:
      SortOrderVar = "ORDER BY tblAkten.Aktentitel DESC"
   End Select
End Sub



2. Der Code der Abfrage qryAktenSuche wäre dann

SELECT txtAktenzeichen, txtAktentitel
FROM tblAkten
WHERE (((txtAktenzeichen)
LIKE forms!frmAktenSuche!srcAktenzeichen)
AND ((txtAktentitel)
LIKE forms!frmAktenSuche!srcAktentitel))
OR (((txtAktentitel)
LIKE forms!frmAktenSuche!srcAktentitel)
AND ((forms!frmAktenSuche!srcAktenzeichen)
IS NULL))
OR (((txtAktenzeichen)
LIKE forms!frmAktenSuche!srcAktenzeichen)
AND ((forms!frmAktenSuche!srcAktentitel)
IS NULL))
OR (((forms!frmAktenSuche!srcAktenzeichen)
IS NULL)
AND ((forms!frmAktenSuche!srcAktentitel)
IS NULL));

Bis dahin funktioniert auch alles.

Beim Code der Abfrage müsste ja dann als letzte Zeile "nur" noch ein
ORDER BY ...
ergänzt werden.

Gebe ich dort z. B. manuell ein:
ORDER BY txtAktenzeichen DESC, funktioniert es.

Trage ich aber statt "txtAktenzeichen DESC" dort "SortOrderVar" oder "optSortwahl" ein, kommt wieder eine Parameter-Abfrage, d. h. das Queryset kann offenbar damit noch nichts anfangen.

Ich hab dann - Donkarl 3.15 folgend - mal probiert, ein Modul anzulegen, in dem folgendes steht:

Public Function fctSendVar()

  fctSendVar = SortOrderVar

End Function


und habe dann die Abfrage mit
ORDER BY fctSendVar()
enden lassen - dann funktioniert die Abfrage zwar ohne weitere Parameterabfrage, aber die Ergebnisse sind danach willkürlich sortiert statt so wie gewünscht. Das war es also auch nicht...

Bliebe also immer noch die Frage offen: Was muss hinter "ORDER BY" eingetragen werden?

Viele Grüße

Holger

Beaker s.a.

Hallo Holger,
Wofür wird die Abfrage denn anschliessend verwendet?
Ich würde die Abfrage im Code zusammensetzen und zuweisen.
strSQL = "SELECT txtAktenzeichen, txtAktentitel " _
& "FROM tblAkten " _
& "WHERE (((txtAktenzeichen) " _
& "LIKE forms!frmAktenSuche!srcAktenzeichen) " _
& "AND ((txtAktentitel) " _
& "LIKE forms!frmAktenSuche!srcAktentitel)) " _
& "OR (((txtAktentitel) " _
& "LIKE forms!frmAktenSuche!srcAktentitel) " _
& "AND ((forms!frmAktenSuche!srcAktenzeichen) IS NULL)) " _
& "OR (((txtAktenzeichen) " _
& "LIKE forms!frmAktenSuche!srcAktenzeichen) " _
& "AND ((forms!frmAktenSuche!srcAktentitel) IS NULL)) " _
& "OR (((forms!frmAktenSuche!srcAktenzeichen) " _
& "IS NULL) " _
& "AND ((forms!frmAktenSuche!srcAktentitel) IS NULL)) " _
& SortOrderVar    ' <-- siehe unten

(nicht auf Syntaxfehler geprüft; - Klammerinvasion und so)

Ich vermute, dass SortOrderVar eine nicht deklarierte Variable ist, da ein Option Explicit im Formularkopf fehlt.
Trage dieses zu deiner eigenen Sicherheit in jeden Formularkopf ein. Kannst du auch automatisch (leider nicht
nachträglich) eintragen lassen indem du die Option "Variablendeklaration erforderlich" anhakst.

Noch eine Anmerkung, LIKE ohne Jokerzeichen (* ?) macht IMO keinen Sinn. Ausser deine Anwender wissen um deren
Verwendung, dann ist es o.k., dann setzten sie sie selber. Ansonsten bleibt dazu die Frage, ob überhaupt nach Teilstrings
gesucht werden soll. Bei einem Titel eher ja, beim AZ denke ich eher nicht.


gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

bluvi

Hallo Ekkehard,

auch dir zunächst ein Dankeschön für die Antwort!

Ich habe die Aktenzeichen-Datenbank für meinen Arbeitgeber erstellt, um eine bisher genutzte uralte Filemaker-Datenbank abzulösen. Die Kollegin, die damit arbeitet, steht oftmals vor dem Problem, dass sie alle Aktenzeichen, die zu einem bestimmten Stichwort gehören, benennen soll (daher das Kriterium "Suche nach Aktentitel") bzw. dass sie zu einem bestimmten Aktenzeichen alle Teilakten zusammensuchen soll.

Meine Idee ist daher dieses Suchfeld, in dem sie sowohl nach Aktenzeichen als auch nach Aktentitel suchen kann - siehe beiliegendes Bild. Das Thema Jokerzeichen habe ich übrigens dabei bereits berücksichtigt, aber in meinem Codeschnipsel der Übersichtlichkeit halber weggelassen.

Ziel der ganzen Übung ist letztlich, dass die Ergebnisse der Abfrage einen Bericht befüllen sollen, der dann in Seitenansicht geöffnet wird. Für den Bericht habe ich bereits ein benutzerdefiniertes "entschlacktes" Menüband eingerichtet, auf welchem sich die Schaltflächen zum Drucken, zum Generieren einer PDF-Datei oder zum Schließen der Seitenansicht befinden, sodass die Kollegin ihr Suchergebnis ausdrucken oder als PDF speichern kann.

Das Problem scheint in der Tat zu sein, dass die Variable nicht deklariert ist. Ich habe jetzt im Formular oberhalb des Option Compare Database noch ergänzt:
Option Explicit

Auch das "Variablendeklaration erforderlich" habe ich aktivieren können.

Trifft man nun in der Optionsgruppe eine Auswahl, erhalte ich die Info "Fehler beim Kompilieren: Variable nicht definiert."

Also habe ich im VBA-Code unterhalb "Private Sub optSortwahl_AfterUpdate()" noch ergänzt:
Dim SortOrderVar As String

Nun kann ich im Formular wieder fehlerlos Suchworte eingeben und in der Optionsgruppe eine Auswahl treffen, allerdings sind die Ergebnisse immer noch unsortiert, wenn ich mit Klick auf die Schaltfläche die Abfrage starte...

Viele Grüße

Holger

Beaker s.a.

Hallo Holger,
Zitatallerdings sind die Ergebnisse immer noch unsortiert,
Wo? Auf dem Bericht?
Zeige bitte den Code der Schaltfläche.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

bluvi

#8
Hallo Ekkehard,

aktuell werden die Daten ja erstmal nur an die Abfrage übergeben, den Bericht habe ich im nächsten Schritt geplant, d. h. den gibt es noch nicht.

Die Schaltfläche habe ich mit einem Makro versehen - siehe angehängter Screenshot.

Viele Grüße

Holger

bluvi

Hier mal noch beigefügt die Beispiel-Datenbank, mit der ich experimentiere.

Viele Grüße

Holger

MzKlMu

#10
Hallo,
kannst Du mal erklären, was Du da jetzt vorhast ?
Beim Suchen Button gibt es keinen Code. Die Abfrage verwendet keinen Joker, es sind daher immer kompltette Inhalte zu suchen.

Entscheide Dich durchgängig für VBA. Makros sind auch in den neueren Versionen problematisch. Du wirst so gut wie keine Hilfe dazu finden/bekommen.
In der MDB gibt es nach der Konvertierung keine Makros mehr.
Gruß Klaus

bluvi

Hallo Klaus,

Zitatkannst Du mal erklären, was Du da jetzt vorhast ?
Das hatte ich zuvor schon erklärt: Mein Ziel ist eine benutzerdefinierte Suchmaske, über die meine Kollegin a) nach Aktenzeichen und / oder b) nach Aktentiteln suchen kann. Weiter soll sie die Möglichkeit haben, die Ergebnisse entweder nach a) oder b) jeweils auf- oder absteigend zu sortieren. Mit Klick auf den Button "Suche starten" soll dann in der Endversion ein Bericht geöffnet werden, die die Ergebnisse in der voreingestellten Sortierung ausgibt.

ZitatBeim Suchen Button gibt es keinen Code.
Dazu schrieb ich:
ZitatDie Schaltfläche habe ich mit einem Makro versehen.

ZitatDie Abfrage verwendet keinen Joker
Dazu habe ich mich auch bereits geäußert:
ZitatDas Thema Jokerzeichen habe ich übrigens dabei bereits berücksichtigt, aber in meinem Codeschnipsel der Übersichtlichkeit halber weggelassen.
(und auch in meiner kleinen Test-Datenbank).

ZitatEntscheide Dich durchgängig für VBA.
Würde ich liebend gern, aber ich bin auf dem Gebiet leider noch nicht so fit - deshalb stelle ich ja hier die ganzen dummen Fragen, gebe mich mit funktionierenden Makros zufrieden und bin glücklich darüber, dass sich Leute die Zeit nehmen, mir zu antworten und versuchen, mir bei der Lösung meines Problems zu helfen.

Um deinem Rat zu folgen, habe ich versucht, das Makro in VBA zu konvertieren und die Abfrage darüber zu öffnen. Der Code, der bei der Konvertierung des Makros erzeugt wird, lautet
DoCmd.OpenQuery "qryAktenSuche", acViewPreview, acReadOnly

Öffne ich nun das Formular, gebe einen Suchbegriff ein und klicke auf den Suchen-Button, dankt es mir die Datenbank nun aber leider immer mit einem Laufzeitfehler "3270", mit dem ich nichts anfangen kann: "Eigenschaft nicht gefunden" - also habe ich hier leider schon die nächste Baustelle...

Falls das alles zu kompliziert ist, kann ich mir auch vier identische Abfragen mit jeweils unterschiedlichen Sortierkriterien anlegen und vier Buttons, die auf je eine der Abfragen verweisen. Es kommt dasselbe bei heraus, aber geübten Programmierern treibt dieser Lösungsansatz vermutlich die Tränen in die Augen...

Viele Grüße

Holger

Beaker s.a.

Hallo Holger,
Anbei eine überarbeitete DB.
Die Abfrage habe ich ersatzlos gestrichen.
Ins Formular habe ich Suchfelder/-Funktionalität in den Kopf verschoben
und die Datenfelder im Detailbereich eingefügt. Da wird jetzt "gefiltert".
Das geschieht beim Klick-Ereignis des Buttons, indem die Datenherkunft
des Formulars manipuliert wird. Wenn beide Suchfelder leer sind kannst
du alle DS per Option und Button sortieren.
Einen Bericht kannst du später auch direkt aus dem Form heraus öffnen,
und dabei die (gefilterte) DS-Herkunft übergeben.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

bluvi

Hallo Ekkehard,

vielen Dank für deine Mühen!

Das wäre natürlich auch eine Möglichkeit, das Problem zu lösen. Ich werde es mir mal genau anschauen und probieren, den Bericht aus den gefilterten Ergebnissen zu generieren.

Anbei mal noch der Lösungsansatz, von dem ich in meinem letzten Post berichtet hatte. Ja, ich weiß - Makros sind bäh und vier bis auf die Sortierung identische Abfragen würde man auch nicht machen, aber von der Funktionalität her hätte diese Variante den Charme, dass die Kollegin nur ihre(n) Suchbegriff(e) eingeben muss und danach nur noch einen einzelnen Klick vom gewünschten Bericht entfernt ist.

Auch den anderen Foristen noch mal vielen Dank für eure Lösungsvorschläge und Unterstützung!

Viele Grüße

Holger

Beaker s.a.

Hallo Holger,
Deine Abfragen sind völlig überladen.
Zitatdass die Kollegin nur ihre(n) Suchbegriff(e) eingeben muss und danach nur noch einen einzelnen Klick vom gewünschten Bericht entfernt ist.
Geht doch mit meinem Beispiel auch. Was gefällt dir daran denn nicht?
Du hast bis jetzt auch noch nicht erzählt, was auf dem Bericht ausgegeben
werden soll. Aber auf dem Form noch einen Button zu platzieren, der einen
Bericht öffnet/druckt, ist ja kein grosses Problem.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)