FilterStringBuilder & Co.

Diskussionen über den Quellcode (Module, Klassenstruktur, Schnittstellen u.s.w.) der Access Code Library

Re: FilterStringBuilder & Co.

Beitragvon Josef Pötzl » Mi 20. Apr 2016, 22:49

Nächste Erweiterung:

Feldname In (select ...)
Code: Alles auswählen
With New FilterStringBuilder

   With .AddSubSelectCriteria("fiXyz", SQL_In, "Select idXyz From Tabelle", , SQL_Or)
      .Add "x", SQL_Numeric, SQL_Equal, 4
      .Add "y", SQL_Numeric, SQL_Equal, 5
   End With
   Debug.Print .ToString
   
End With

ergibt:
(fiXyz In (Select idXyz From Tabelle Where (x = 4) Or (y = 5)))



Exists (select ...)
Code: Alles auswählen
With New FilterStringBuilder

   With .AddExistsCriteria("Select * From Tabelle")
      .AddCriteria "idXyz = T2.fiXyz"
      .Add "x", SQL_Numeric, SQL_Equal, 4
   End With
   Debug.Print .ToString
   
End With

ergibt:
(Exists (Select * From Tabelle Where (idXyz = T2.fiXyz) And (x = 4)))
Josef Pötzl
Moderator
 
Beiträge: 725
Registriert: Mo 30. Nov 2009, 11:08
Wohnort: Klagenfurt
Accessversion: 2010 (2013)

Re: FilterStringBuilder & Co.

Beitragvon Andreas Vogt » Do 21. Apr 2016, 19:58

Hallo Josef,
die Erweiterungen finde ich sehr sinnvoll, haben aber imo auch Schwächen.
SQL_Or bezieht sich auf alle Vergleiche, lässt also gemischt And/Or nicht zu.

Gruß Andreas
Andreas Vogt
Entwickler
 
Beiträge: 151
Registriert: Do 18. Mär 2010, 19:00
Wohnort: Offenburg
Accessversion: 2.0, 97, 2002, 2003, 2007, 2010
Access-Erfahrung: Fortgeschritten

Re: FilterStringBuilder & Co.

Beitragvon Josef Pötzl » Do 21. Apr 2016, 20:47

Hallo Andreas!

Wenn du And und Or gemischt verwenden willst, kannst du dafür die ConditionGroup verwenden.

Beispiel:
Code: Alles auswählen
With New FilterStringBuilder

   .Add "a", SQL_Numeric, SQL_Equal, 123

   With .AddSubSelectCriteria("fiXyz", SQL_In + SQL_Not, "Select idXyz From Tabelle", True, SQL_And)
      .Add "b", SQL_Text, SQL_Equal, "xyz"
      With .NewConditionGroup(SQL_Or)
         .Add "x", SQL_Numeric, SQL_Equal, 4
         .Add "y", SQL_Numeric, SQL_Equal, 5
      End With
   End With
   Debug.Print .ToString
   
End With
 


Ergebnis:
((a = 123)) And (fiXyz Not In (Select idXyz From Tabelle Where ((b = 'xyz')) And ((x = 4) Or (y = 5))))

LG
Josef
Josef Pötzl
Moderator
 
Beiträge: 725
Registriert: Mo 30. Nov 2009, 11:08
Wohnort: Klagenfurt
Accessversion: 2010 (2013)

Re: FilterStringBuilder & Co.

Beitragvon Josef Pötzl » So 24. Apr 2016, 00:05

Nächste Erweiterung: Aus Textwert mit ; ein Array erzeugen und die einzelnen Werte zum Filtern verwenden.

Code: Alles auswählen
With New FilterStringBuilder

   .Add "X", SQL_Text, SQL_Like + SQL_Add_WildCardSuffix, Array("a", "b", "c")
   .Add "Y", SQL_Text, SQL_Like + SQL_Add_WildCardSuffix, Split("a;b;c", ";")
   .Add "Z", SQL_Text, SQL_Like + SQL_Add_WildCardSuffix + SQL_SplitValueToArray, "a;b;c"
   
   Debug.Print .ToString
   
End With

Alle 3 Zeilen (X, Y, Z) erzeugen die gleiche Syntax für den Filterausdruck.

Anm.: Interessant wird das Feature, wenn man nicht Werte in VBA schreibt, sondern Werte aus Textfeldern übernimmt, die der Anwender füllt. Bei SQL_SplitValueToArray wirkt immer noch die Null-Prüfung und man muss sich nicht im Code darum kümmern. Wegen: Split(Null, ";"), das zu einem Fehler führen würde.
Josef Pötzl
Moderator
 
Beiträge: 725
Registriert: Mo 30. Nov 2009, 11:08
Wohnort: Klagenfurt
Accessversion: 2010 (2013)

Re: FilterStringBuilder & Co.

Beitragvon Josef Pötzl » So 11. Dez 2016, 18:21

Ab Version 1.5.0 kann man die Codemodule für die Filterung aus dem Repository aktualisieren lassen.

Ablauf:
  1. Klick auf "Klassen installieren"
  2. "Codemodule in Add-In aus SVN-Repository aktualisieren" auswählen
  3. Anschließend das Add-In wie zuvor verwenden (z. B. die in der Anwendung enthaltenen Codemodule aktualisieren, neu einfügen usw.)

Bild
Josef Pötzl
Moderator
 
Beiträge: 725
Registriert: Mo 30. Nov 2009, 11:08
Wohnort: Klagenfurt
Accessversion: 2010 (2013)

Filterbedingungen mit dem ACLib-FilterForm-Wizard gruppieren

Beitragvon RookieOne » Mo 27. Nov 2017, 12:55

Hallo, Josef,

Josef Pötzl hat geschrieben:Nächstes Feature: Filterbedingungen gruppieren (z. B. für Or-Gruppe)


wie kann ich die in deinem Post erwähnten OR-Gruppen mit dem ACLib-FilterForm-Wizard erzeugen? Ich habe das Addin (V 1.6.5) in einem Projekt bei mir eingebaut und die Filtersteuerelemente damit erzeugt. Diese Gruppierungsmöglichkeit habe ich jedoch nicht gefunden.

Gruß, Daniel
RookieOne
 
Beiträge: 4
Registriert: Mo 27. Nov 2017, 12:41
Access-Erfahrung: Grundlagen

Re: Filterbedingungen mit dem ACLib-FilterForm-Wizard gruppi

Beitragvon RookieOne » Mi 29. Nov 2017, 12:35

Ich habe mich noch einmal mit meinem Formular-Code beschäftigt.

In der Prozedur InitFilterControls() habe ich gesehen, das man mit .AddMultiControlCriteria mehrere Felder an den Filter übergeben kann.

Ein „Fragezeichen“ taucht bei mir bei
Code: Alles auswählen
.AddGroup(SQL_And)
bzw.
Code: Alles auswählen
.AddGroup(SQL_Or)
auf. Wie kann ich diese Gruppen einsetzen?

Ein weiteres „Fragezeichen“: Gibt es die Möglichkeit, mehrere Suchbegriffe in einem Textfeld flexibel per AND/OR zu verknüpfen?

Auf jeden Fall wäre es schön, wenn man über den Wizard die wahlweise AND/OR-Verknüpfung steuern könnte und Multicontrols und Gruppen anlegen könnte.

Gruß, Daniel
RookieOne
 
Beiträge: 4
Registriert: Mo 27. Nov 2017, 12:41
Access-Erfahrung: Grundlagen

Re: FilterStringBuilder & Co.

Beitragvon Josef Pötzl » Do 30. Nov 2017, 21:37

Hallo!

AddGroup ist zum Verschachteln von And/Or-Gruppen.

Beispielsweise:
Code: Alles auswählen
.. where FeldABC = 5 AND (FeldXYZ = 1 or Feld123 = 2)


Prinzip mit FilterStringBuilder (ist bei FilterControlManager aber ähnlich)
Code: Alles auswählen
With New FilterStringBuilder

   .Add "FeldABC", SQL_Numeric, SQL_Equal, 5
   with .AddGroup(SQL_OR)
        .Add "FeldXYZ", SQL_Numeric, SQL_Equal, 1
        .Add "Feld123", SQL_Numeric, SQL_Equal, 2
   End With

   Debug.Print .ToString
   
End With



Gibt es die Möglichkeit, mehrere Suchbegriffe in einem Textfeld flexibel per AND/OR zu verknüpfen?

Wenn du in ein Textfeld mehrere Werte eingeben willst und dann getrennt nach diesen Wörtern filtern willst, kannst du
Code: Alles auswählen
.Add "Datenfeld", SQL_Text, SQL_Like + SQL_SplitValueToArray, Me.DeineTextbox

ausprobieren.
Damit wird ein Or-Filtertext zusammengestellt. Eine Und-Verknüpfung der Werte ist nicht implementiert. Das müsstest dann als "AdditionalFilter" selbst ergänzen oder das Framework mit dieser Funkionalität erweitern.

Auf jeden Fall wäre es schön, wenn man über den Wizard die wahlweise AND/OR-Verknüpfung steuern könnte und Multicontrols und Gruppen anlegen könnte.

Da bin ich mir nicht so sicher, ob das für den Wizard gut ist, da damit die Konfiguration komplexer wird. Ich bin da eher der Meinung, wenn jemand mit Or/And-Gruppen einen SQL-Text erzeugen will, dann kann der auch so gu programmieren, dass er die Zeilen im Code selbst anpasst.
Anm.: ich verwende z. B. den Wizard nur zum schnellen Einfügen des Codes und der Datenfelder in die Filterprozeduren. Den Rest programmiere ich dann direkt in VBA.

Wenn es dir gelingt, den Wizard zu zu gestalten, dass das Verwenden von Gruppen intuitiv bedienbar ist, bin ich aber gerne dazu bereit, dass wir das gemeinsam implementieren.

mfg
Josef
Josef Pötzl
Moderator
 
Beiträge: 725
Registriert: Mo 30. Nov 2009, 11:08
Wohnort: Klagenfurt
Accessversion: 2010 (2013)

Re: FilterStringBuilder & Co.

Beitragvon RookieOne » Fr 1. Dez 2017, 11:22

Hallo, Josef,

zuerst vielen Dank für die Antworten! :)

ich habe SQL_SplitValueToArray eingesetzt und Access meldet mir nun den Laufzeitfehler 424 zurück („Objekt erforderlich“).

In der Prozedur InitFilterControls() hatte ich die Zeile folgendermaßen angepasst:

Code: Alles auswählen
.Add "Institut", SQL_Text, SQL_Like + SQL_Add_WildCardSuffix + SQL_SplitValueToArray, Null, Me.fctlInstitut0


Was habe ich übersehen?

Die übrigen Felder werden alle mit .AddMultiControlCriteria hinzugefügt.

Das produziert einen Typenunverträglichkeitsfehler in der Prozedur InitFilterControlManager() bei
Code: Alles auswählen
m_FilterControlManager.AutoFilterOn = Nz(Me.cbAutoFilter.Value, False)
:?
RookieOne
 
Beiträge: 4
Registriert: Mo 27. Nov 2017, 12:41
Access-Erfahrung: Grundlagen

Re: FilterStringBuilder & Co.

Beitragvon Josef Pötzl » Fr 1. Dez 2017, 12:08

RookieOne hat geschrieben:Laufzeitfehler 424 zurück („Objekt erforderlich“).
[{..]
Code: Alles auswählen
.Add "Institut", SQL_Text, SQL_Like + SQL_Add_WildCardSuffix + SQL_SplitValueToArray, Null, Me.fctlInstitut0

Du übergibst Null an den Parameter "ControlRef" statt der Referenz auf das Control.


Interface:
Code: Alles auswählen
Public Sub Add(ByVal DataFieldName As String, ByVal DataType As SqlFieldDataType, _
               ByVal RelationalOperator As SqlRelationalOperators, _
               ByVal ControlRef As Control, _
      Optional ByVal Control2Ref As Control = Nothing, _
      Optional ByVal IgnoreValue As Variant = Null)


mfg
Josef
Josef Pötzl
Moderator
 
Beiträge: 725
Registriert: Mo 30. Nov 2009, 11:08
Wohnort: Klagenfurt
Accessversion: 2010 (2013)

VorherigeNächste

Zurück zu Quellcode

cron