MS-Office-Forum
Google
   

Zurück   MS-Office-Forum > Microsoft Access & Datenbanken > Microsoft Access - Code Archiv
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads Der Renner, 11 Entwicklertools für Access, Tipps & Trick und offene Datenbanken zum einzigartigen Preis.
Themen-Optionen Ansicht
Alt 20.01.2014, 19:12   #1
Josef P.
MOF Guru
MOF Guru
Standard Demo-Datenbank - SQL-Filterausdruck generieren

Hallo!

Da ich im Forum regelmäßig sehe, dass das Zusammensetzen von Filterausdrücken (z. B. für Formular) Probleme bereitet, gibt es nun eine kleine Klasse, die das übernimmt. ;-)

Der Code in einem Formular sieht dann z. B. so aus:
PHP-Code:

Private Function UseFilter()

   
Me.Filter CreateFilterString
   Me
.FilterOn = (Len(Me.Filter) > 0)

End Function

Private Function 
CreateFilterString() As String

   With 
New FilterStringBuilder

      
' 1. Filter (Zahlen) '
      
.Add "ZahlenFeld1"SQL_NumericmodListboxHelper.GetSelectedListboxItemArray(Me.lstFilter10), SQL_In
   
      
' 2. Filter (Text) '
      
.Add "TextFeld1"SQL_TextmodListboxHelper.GetSelectedListboxItemArray(Me.lstFilter20), SQL_In
   
      
' * 3. Filter (Text / like) '
      
.Add "TextFeld2"SQL_TextMe.txtFilterLike.ValueSQL_Like

      
' 4. Filter (Zahl / >= ) '
      
.Add "ZahlenFeld2"SQL_NumericMe.txtFilterZG.ValueSQL_GreaterThan SQL_Equal

      
' 5. Filter (Zahl between X and Y) '
      
.Add "ZahlenFeld3"SQL_NumericMe.txtFilterZB1.ValueSQL_BetweenMe.txtFilterZB2.Value


      
'Filterstring zusammenstellen '
       
CreateFilterString = .ToString(" AND ")

      
'Anm.: Wenn ein Steuerelement NULL enthält, wird standardmäßig kein Filterausdruck für dieses Steuerelement erzeugt. ("Standardmäßig, da man dieses Verhalten über Methoden-Parameter verändern kann.) '

   
End With

End 
Function 
(Details siehe Beispiel-DB)

Den Code gibt es auch in der Code-Bibliothek von access-codelib.net.


Über Anregungen zur Code-Verbesserung würde ich mich freuen.

mfg
Josef

Geändert von Josef P. (20.01.2014 um 19:17 Uhr).
Josef P. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 22.01.2014, 22:24   #2
Josef P.
Threadstarter Threadstarter
MOF Guru
MOF Guru
Standard

Update: (Beispiel-DB wurde aktualisiert)

Als Alternative zur Übergabe der Filterwerte kann man nun die Steuerelemente selbst an eine Klasse übergeben.

Formularcode zum Filtern sieht beispielsweise wie folgt aus:
Code:

Option Compare Database
Option Explicit

Private WithEvents m_FilterControlManager As FilterControlManager

Private Sub Form_Load()
   InitFilterControlManager
End Sub

Private Sub m_FilterControlManager_FilterStringChanged(ByVal NewFilterString As String)
   With Me.ZuFilterndesUnterFormular.Form
      .Filter = NewFilterString
      .FilterOn = (Len(.Filter) > 0)
   End With
End Sub

Private Property Get FilterControlManager() As FilterControlManager
   Set FilterControlManager = m_FilterControlManager
End Property

Private Sub InitFilterControlManager()
   Set m_FilterControlManager = New FilterControlManager
   InitFilterControls
   m_FilterControlManager.AutoFilterOn = Nz(Me.cbAutoFilter.Value, False)
End Sub

Private Sub InitFilterControls()

   With m_FilterControlManager.FilterControls
      .Add Me.lstFilter1, "Z1", SQL_Numeric, SQL_In
      .Add Me.lstFilter2, "T1", SQL_Text, SQL_In
      .Add Me.txtFilterLike, "T2", SQL_Text, SQL_Like
      .Add Me.txtFilterZG, "Z2", SQL_Numeric, SQL_GreaterThan + SQL_Equal
      .Add Me.txtFilterZB1, "Z3", SQL_Numeric, SQL_Between, Me.txtFilterZB2
   End With
   
End Sub

Private Sub cbAutoFilter_AfterUpdate()
   Me.cmdCreateFilterString.Enabled = Not Me.cbAutoFilter.Value
   FilterControlManager.AutoFilterOn = Me.cbAutoFilter.Value
End Sub
Anm.: im Formular-Code muss man nicht mehr explizit auf die Änderungen der Filterwerte in den Steuerelementen reagieren - das erledigt die Klasse.

Anwendungsbeispiel: Formular "frm_UseFilter_5_Test"

Geändert von Josef P. (22.01.2014 um 22:50 Uhr).
Josef P. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 28.01.2014, 09:30   #3
Josef P.
Threadstarter Threadstarter
MOF Guru
MOF Guru
Standard

Damit die Bedienung etwas einfacher wird, gibt es nun den Assistenten ACLibFilterFormWizard, der den "Steuerungs-Code" in das Formular und bei Bedarf die benötigten Codemodule in das VBProject einfügt.

mfg
Josef
Josef P. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.05.2015, 15:06   #4
Klaus S. aus B.
MOF User
MOF User
Standard

Hallo Josef,

sieht super aus!

Gibt es dazu ein kleines "How to"?
Bisher ist es mir nicht geglückt das Ding so einzubinden, dass etwas sinnvolles passiert.

Gruß
Klaus
Klaus S. aus B. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 11.05.2015, 15:11   #5
Josef P.
Threadstarter Threadstarter
MOF Guru
MOF Guru
Standard

Hallo!

Welches Ding? Die Klassenstruktur oder der Wizard? ;-)

Kommen Fehlermeldungen?


Ein paar Code-Beispiele zeige ich in im Access-CodeLib-Forum.

mfg
Josef

Geändert von Josef P. (11.05.2015 um 15:48 Uhr).
Josef P. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 01.06.2015, 14:43   #6
Klaus S. aus B.
MOF User
MOF User
Standard

Hallo Josef,

sorry für die schlechte Problembeschreibung.

Ich habe den Wizzard eingebunden, der startet auch wie gewünscht.
Es geht mehr um die das weiter Vorgehen.

Ich bin unschlüssig, wo was rein muss. Ist "Datenfeld" das Steuerelement, dass den Wert enthält, nachdem gefiltert werden soll oder das Feld im Formular, das gefiltert wird?
Dito mit "Steuerelement"?

Was bedeuten die OPtionen des UseFilter-Methode?

Durchschauen kann ich den Code nicht, dazu fehlt mir die Kenntniss und mit "trial and error" bin ich nicht weiter gekommen.

Ein kleiner Tipp wäre echt hilfreich.

Gruß
Klaus
Klaus S. aus B. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 01.06.2015, 14:55   #7
Josef P.
Threadstarter Threadstarter
MOF Guru
MOF Guru
Standard

Hallo Klaus!

In das Textfeld "Datenfeld" im Wizard gehört der Name des Feldes (Attributes) von der Datenherkunft - dieses Feld wird gefiltert.

Im Kombinationsfeld "Steuerelement" wählt man das Steuerelement mit dem zu filternden Wert. (Dieses Steuerelement wird auf Änderung überwacht und bei Änderung wird der Filterausdruck geändert.)
Unter "weitere Steuerelemente" kann man ein (oder mehrere mit Beistrich getrennte) Steuerelementnamen schreiben, deren Werte das gleiche Feld in der Datenquelle filtern sollen (z. B. für einen Between-Filter).


Die Auswahl "UseFilter-Methode"
Da kannst du auswählen, wie die Filter-Methode gestaltet werden soll.
* auskommentierten BeispielCode einfügen ... es wird eine Filtermethode erzeugt, der Code darin ist aber auskommentiert - also nicht aktiv.
* aktuelles Formular filtern ... daraus entsteht Code mit Me.Filter = ...
* Unterformular ... DAraus entsteht Code mit Me.UFName.Form.Filter = ...

Anm.:
Ich bin gerade dabei, auch den Import des FilterStringBuilder mit dieser Wizard-Maske zu ermöglichen, dann erhält man nur den Filterstring und muss sich selbst um das Anwenden des FilterStrings kümmern.

mfg
Josef
Josef P. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 01.06.2015, 14:56   #8
Klaus S. aus B.
MOF User
MOF User
Standard

...und eine Fehlermeldung bekomme ich auch noch:
Angehängte Grafiken
Dateityp: png fehler.PNG (15,2 KB, 25x aufgerufen)
Klaus S. aus B. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 01.06.2015, 15:01   #9
Josef P.
Threadstarter Threadstarter
MOF Guru
MOF Guru
Standard

.. ich prüfe derzeit nicht, ob es den Eintrag für die Ereignisbehandlung bereits gibt, wenn man den Code einfügen lässt.
Momentan stelle ich mir den Ablauf so vor, dass man in ein Formular ohne bereits vorhandenen FilterManager-Code den "Basiscode" importiert und bei später hinzugefügten Steuerelementen den Code im Formular selbst erweitert. Das sollte eigentlich einfach genug sein.

/edit: Version 1.1.0 ist nun verfügbar - man kann nun als Alternative zur Verwendung der FilterControlManager auch Methoden importieren, die nur den FilterStringBuilder verwenden.

mfg
Josef

Geändert von Josef P. (01.06.2015 um 16:51 Uhr).
Josef P. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 15.10.2015, 12:33   #10
Josef P.
Threadstarter Threadstarter
MOF Guru
MOF Guru
Standard

Update: Der ACLib-Filter-Form-Wizard erstellt mittlerweile lauffähigen Formular-Code für übliche Filterbedingungen.

Video: http://access-codelib.net/videos/ACL...lar-erstellen/

mfg
Josef

Geändert von Josef P. (15.10.2015 um 12:41 Uhr).
Josef P. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.10.2015, 09:26   #11
JPA
MOF Koryphäe
MOF Koryphäe
Standard

Hallo Josef,

schönes Teil für die die nicht so tief in VBA stecken.
Danke für den tollen Beitrag.

Vielleicht eine realisierbare & interessante Erweiterung:
Das Addin könnte auch aufgehen, aus der Formularentwurfsansicht, in dem man bei der Eigenschaft eines Steuerelementes auf die 3 Punkte klickt. Das Steuerlement wäre dem addin dann schon bekannt.

Gruß
JPA
JPA ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.10.2015, 11:07   #12
Josef P.
Threadstarter Threadstarter
MOF Guru
MOF Guru
Standard

Hallo!

Zitat:

... die nicht so tief in VBA stecken.

Die mit VBA geübter sind, lassen die Zeilen für die Filterbedingung leer und ergänzen diese Zeilen nach dem Code-Import manuell. Das geht schneller.


Zitat:

in dem man bei der Eigenschaft eines Steuerelementes auf die 3 Punkte klickt.

Welche Eigenschaft würde passen?
Schön wäre das bei Form.Filter, dort kann man aber so viel ich weiß keinen Wizard einbauen.
Passen würde vielleicht auch ein Eintrag in "Form Wizard".

Einen Nachteil haben diese Einträge aber: man muss Access unter Win7 zuerst als Admin starten, sonst wird das nicht installiert.
Ungeübte User glauben dann, dass das ganze Add-In nicht funktioniert, weil eine Fehlermeldung kommt, wenn man das Add-In mit dem Add-In-Manager ohne Admin-Rechte installiert.

mfg
Josef
Josef P. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 16.10.2015, 11:25   #13
JPA
MOF Koryphäe
MOF Koryphäe
Standard

Code:

...Das geht schneller
Das stimmt
Habe mir auch schon überlegt das meine Addins auch gleich den Code schreiben. So viele ideen, so wenig zeit

Zitat:

man muss Access unter Win7 zuerst als Admin starten, sonst wird das nicht installiert.

Ah, danke für den Hinweis, jetzt brauche ich nicht zu recherchieren warum es bei meinen addins nicht klappt.

G
JPA
JPA ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 20.10.2015, 14:38   #14
Josef P.
Threadstarter Threadstarter
MOF Guru
MOF Guru
Standard

Nächster Ausbau: Filterbedingungen gruppieren (z. B. für Or-Gruppe)

Beispiel:
Code:

With New FilterStringBuilder

   Set .SqlTool = SqlTools.NewInstance("\#yyyy-mm-dd\#", "True", "*")

   .Add "F1", SQL_Numeric, SQL_Equal, 1
   
   With .NewConditionGroup(SQL_Or)
      .Add "F2a", SQL_Text, SQL_Like + SQL_Add_WildCardSuffix, "a"
      .Add "F2b", SQL_Text, SQL_Like + SQL_Add_WildCardSuffix, "a"
      .Add "F2c", SQL_Text, SQL_Like + SQL_Add_WildCardSuffix, "a"
   End With
   With .NewConditionGroup(SQL_Or)
      .Add "F3a", SQL_Boolean, SQL_Equal, True
      .Add "F3b", SQL_Boolean, SQL_Equal, True
      .Add "F3c", SQL_Boolean, SQL_Equal, True
   End With

   Debug.Print .ToString(SQL_And)

End With
Ergebnis:
((F1 = 1)) And ((F2a Like 'a*') Or (F2b Like 'a*') Or (F2c Like 'a*')) And ((F3a = True) Or (F3b = True) Or (F3c = True))
Josef P. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 30.11.2016, 11:26   #15
Josef P.
Threadstarter Threadstarter
MOF Guru
MOF Guru
Standard

Erweiterung im FilterFormWizard: Filtereinträge aus einer Formulardatenquelle (RecordSource-Eigenschaft) generieren lassen.

Vorgehensweise zum Erstellen eines neuen Filterformulars:
  1. Leeres Formular erstellen
  2. Gebundenes Unterformular zur Datenanzeige einfügen oder das neue Formular an eine Datenquelle binden
  3. FilterForm-Wizard starten
  4. Formular auswählen
  5. Datenformular in UseFilter-Methode einstellen - Option 1 oder 2 (Button "FilterControl-Liste mit Namen aus Datenquelle füllen" wird aktiviert)
  6. Filtereinträge aus Datenquelle generieren lassen (neuer Button oberhalb der Filtereinträge)
  7. Falls erforderlich die Vergleichsoperatoren anpassen (Standardmäßig wird bei Text Like mit * am Ende des Suchtextes und sonst = eingestellt.)
  8. Die Comboboxen von "Filter anwenden", "Filter löschen" und "AutoFilter" auf "<Neu erstellen>" setzen
  9. Formular-Code einfügen lassen
  10. Die erzeugten Filter-Steuerelemente optisch aufbereiten (Anordnung, Größe usw.)
  11. Filterformular testen

mfg
Josef

Geändert von Josef P. (30.11.2016 um 11:54 Uhr).
Josef P. ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 Uhr.


Partner und Co.
Access-Paradies -Alles rund um die Datenbank Microsoft Access -Code -Programme-Tools -Tipps   Kostenlose Tipps & Tricks, Downloads und Programme   www.kulpa-online.com - Tipps - Tricks - Tutorials - Meinungen - Downloads uvm...   vb@rchiv · Willkommen in der Welt der VB Programmierung   Access-Garhammer - Hier finden Sie jede Menge Beispiel-Datenbanken zu Access und mehr ...   mcseboard.de   Die Top Seite für Excel-VBA-Makros uvm.

Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.

Copyright ©2000-2010 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günther Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.
Beachten Sie bitte auch unsere Nutzungsbedingungen.