Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
1. Suchformular in 10 Minuten erstellt
Gehe zu Seite Zurück  1, 2, 3, 4  Weiter
zurück: Tabelle mit Daten - Zahlenfeld in AutoNumber konvertieren weiter: Access Logo (Splashscreen) austauschen Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Antwort Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
04. Mai 2011, 12:45
Rufname:

AW: 1. Suchformular in 10 Minuten erstellt - AW: 1. Suchformular in 10 Minuten erstellt

Nach oben
       

Hallo zusammen,

hier mal wieder eine kleine Erweiterung für die Filterfelder auf Klassenmodulbasis.

Neu:
  • keine Fehlermeldung bei "AllowValueListEdits" bei Access-Versionen vor A2007
  • bei Datumswerten muß kein korrektes Datum mehr eingegeben werden, wenn der FilterType "Empty" oder "Not Empty" ist
  • aktivierte Filter werden nun mit einem farbigen Rahmen versehen (bei Checkboxen farbiger Schatten), Farbe und Rahmenstärke sind einstellbar
Die vollständige Initialisierung der Filterfelder sieht also nun so aus:
Code:
    With objFilter
        .FilterShowActive = True
        .FilterShowActive_BorderColor = vbYellow
        .FilterShowActive_BorderWidth = 2
        .InitControls Me
        .FilterSetOnForm = True
        .FilterVersion = enmCCFilterVersion_ADOServerFilter
        .FilterUseCallbackBeforeFilter = False
        .FilterUseCallbackAfterFilter = False
    End With
Die drei "ShowActive"-Einstellungen können weggelassen werden, die Standardeinstellung für "ShowActive" ist "True", die Farbe ist "vbRed" und die Rahmenstärke ist 3. Wenn die Parameter verwendet werden sollen, müssen sie vor dem Aufruf von "InitControls" stehen, sonst werden sie ignoriert und die Standardeinstellungen verwendet.

Da jeder Filter aus einem Set von Löschknopf, bis zu zwei Comboboxen/Textboxen oder einer Checkbox und einer FilterType-Combobox bestehen kann, gibt es jeweils getrennte Einstellungen für Rahmenstärke und Rahmenfarbe. Die Einstellungen oben setzen diese für alle Filter-Controls gleich, wenn man aber getrennte Einstellungen verwenden möchte, kann man mit einer Schleife durch die Collection "CollFilters" laufen, die alle Filter enthält, und deren Eigenschaften "FilterField_ShowActiveColor" und "FilterField_ShowActiveBorderWidth" individuell einstellen.

Vorteil ist, daß man bei Filterung eines Formulars sofort sieht, welche Filter man gerade gesetzt hat.

Wie beim letzten Mal können die Klassenmodule aus einer Datenbank, die diese verwendet, einfach entfernt und die neuen importiert werden (am einfachsten im VBA-Editor).

Viel Spaß damit

Christian



FilterV2_2.zip
 Beschreibung:
Neue Version V2.2, voll abwärtskompatibel mit der Neuerung, daß aktive Filter nun farblich markiert werden (individuell einstellbar).

Download
 Dateiname:  FilterV2_2.zip
 Dateigröße:  15.62 KB
 Heruntergeladen:  516 mal

derArb
getting better


Verfasst am:
20. Aug 2011, 18:29
Rufname: derArb
Wohnort: Berlin


AW: 1. Suchformular in 10 Minuten erstellt - AW: 1. Suchformular in 10 Minuten erstellt

Nach oben
       

Hallo,
ein herzliches Danke an Christian, den Bitsqueezer für diese so effektive, aber doch simple
Alternative zum Formular in 10 Minuten. (Endlich hab ich mir das mal angeschaut)
Ich finde, dass diese Version einen eigenen Tipps & Tricks Thread haben sollte, weil sie doch ganz entscheidend anders aufbaut, als das klassische "Suchformular in 10 Minuten"
Wenn es auch noch eine On Change Version gäbe (einfache Version), schmeiss ich meine mühsam gebaute Funktion weg.
Code:
Function fncSucheTextOderZahl_LIKE(Formular As Access.Form _
                                 , Datenquelle As String, Feldname As String _
                                 , Suchfeld As String)
'in beliebigem Formular in ein Steuerelementereignis z.Beispiel:
'Private Sub NachnameFilter_Change()
'    fncSucheTextOderZahl_LIKE Me, Me.RecordSource, NACHNAME.Name _
'                            , NachnameFilter.Name
'End Sub
'####Tipp von Steffen0815
'Private Sub NachnameFilter_KeyPress(KeyAscii As Integer)
'    If KeyAscii = Asc(" ") Then KeyAscii = 160 ' Dauerleerzeichen
'End Sub
'oder
'Private Sub StrasseFilter_Change()
'    fncSucheTextOderZahl_LIKE Me, Me.RecordSource, Strasse.Name _
'                            , StrasseFilter.Name
'End Sub
'Private Sub StrasseFilter_KeyPress(KeyAscii As Integer)
'    If KeyAscii = Asc(" ") Then KeyAscii = 160 ' Dauerleerzeichen
'End Sub
On Error GoTo Fehler
    Dim strSuchText As String
    Dim rs As DAO.Recordset
    Dim strSQL As String
   
    'Suchmethode wechseln (Like *.* oder Like .*)
    Select Case Formular!SuchrahmenAuswahl
      Case 1
        Formular!BezFilter.Caption = ""
        strSuchText = Formular(Suchfeld).Text
        If strSuchText <> "" Then
            Formular.Filter = Feldname & " Like '*" _
                            & Replace(strSuchText, Chr(160), " ") & "*'"
            Formular.FilterOn = True
'####Tipp von Steffen0815
            strSQL = "SELECT " & Feldname _
                    & " FROM " & Datenquelle _
                   & " WHERE " & Feldname & " Like '*" _
                               & Replace(strSuchText, Chr(160), " ") & "*'"
            Set rs = CurrentDb.OpenRecordset(strSQL)
            If rs.RecordCount = 0 Then
                Formular!BezFilter.Caption = Feldname _
                                           & " gefiltert nach: * " _
                                           & strSuchText & " *"
                MsgBox "nix gefunden"
                Formular.Filter = ""
                Formular.FilterOn = False
                rs.Close
                Set rs = Nothing
                Formular!BezFilter.Caption = ""
                Exit Function
            End If
            Formular!BezFilter.Caption = Feldname & " gefiltert nach: * " _
                                       & strSuchText & " *"
          Else
            Formular.Filter = ""
            Formular.FilterOn = False
        End If
      Case 2
        Formular!BezFilter.Caption = ""
        strSuchText = Formular(Suchfeld).Text
        If strSuchText <> "" Then
            Formular.Filter = Feldname & " Like '" _
                            & Replace(strSuchText, Chr(160), " ") & "*'"
            Formular.FilterOn = True
'####Tipp von Steffen0815
            strSQL = "SELECT " & Feldname _
                    & " FROM " & Datenquelle _
                   & " WHERE " & Feldname & " Like '" _
                               & Replace(strSuchText, Chr(160), " ") & "*'"
            Set rs = CurrentDb.OpenRecordset(strSQL)
            If rs.RecordCount = 0 Then
                Formular!BezFilter.Caption = Feldname & " gefiltert nach:  " _
                                           & strSuchText & " *"
                MsgBox "nix gefunden"
                Formular.Filter = ""
                Formular.FilterOn = False
                rs.Close
                Set rs = Nothing
                Formular!BezFilter.Caption = ""
                Exit Function
            End If
            Formular!BezFilter.Caption = Feldname & " gefiltert nach:  " _
                                       & strSuchText & " *"
          Else
            Formular.Filter = ""
            Formular.FilterOn = False
        End If
    End Select
    Formular(Suchfeld).SetFocus
    Formular(Suchfeld).SelStart = Len(Formular(Suchfeld).Text)
exit_Fehler:
    Exit Function
Fehler:
    MsgBox "Fehler... Bitte nochmal versuchen"
    Resume exit_Fehler
End Function

_________________
MfG
derArb

Scio me nihil scire...Εν οίδα οτι ουδέν οίδα... Ich weiss, dass ich nichts weiss (Sokrates)
Ich bevorzuge Beiträge mit korrekter deutscher Grammatik.
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
21. Aug 2011, 01:45
Rufname:

AW: 1. Suchformular in 10 Minuten erstellt - AW: 1. Suchformular in 10 Minuten erstellt

Nach oben
       

Hallo derArb,

danke, freut mich, daß Dir meine Filterklasse gefällt.
Wie gewünscht habe ich die Klasse um eine OnChange-Version ergänzt. Damit je nach Anwendungsfall mit oder ohne OnChange verwendet werden kann, gibt es auch noch eine neue Option namens "FilterAllowOnChange", die standardmäßig auf "False" gesetzt ist, damit die Filter kompatibel zur Version 2.2 bleiben.

Wenn Du also OnChange verwenden willst, mußt Du vor ".InitControls Me" die Zeile ".FilterAllowChanges = True" schreiben.

Die "OnChange"-Funktion ist nur für einfache Felder aktiviert und nur für Text oder Zahlen (bei einem Datum macht ein Filter erst Sinn, wenn das Datum vollständig eingegeben wurde und ein Von-Bis-Filter benötigt mindestens die Eingabe im zweiten Feld, um sinnvoll zu sein, bei einer Checkbox ist es ja auch klar).

Die Filterfunktion war hier mal ein eigener Thread, bis die Moderatoren die beiden zusammengeklebt haben und beiden ein eigenes "Nachgefragt"-Thema gegeben haben - was regelmäßig zu Verwirrungen führt.

Ich würde Dir übrigens empfehlen, die OnChange-Funktion nur für relativ kleine Recordsets anzuwenden, bei größeren ist sie nicht performant genug.

Die angehängte Datei enthält wieder nur die Klassen als Textdatei, einfach importieren (da voll kompatibel zur alten Version, kann man diese auch einfach entfernen und die neuen importieren).

Bitte beachten, daß in beiden Filterklassen die Konstanten am Anfang eingestellt werden müssen, je nachdem, ob ADO oder DAO. Die Dateien im Anhang sind momentan auf DAO eingestellt. Die OnChange-Funktion ist bislang nur mit DAO getestet, ob das mit ADO/SQL Server/ADP auch so (und schnell genug) funktioniert, weiß ich nicht, habe ich noch nicht getestet.

Gruß

Christian

PS.: Hier noch ein Link zu einem kleinen Bugfix, der einen falsch zusammengesetzten Filter bei Verwendung von "Begins Not With" ergibt, gefunden von HyperLord. Es müssen nur zwei Zeilen Code in der Reihenfolge ausgetauscht werden, hier beschrieben:

AW: Suchformular in 10 Minuten erstellt Nachgefragt



FilterV2_3.zip
 Beschreibung:
Neue Version, die einen optional einstellbaren OnChange-Event für die einfachen Filterfelder zuläßt

Download
 Dateiname:  FilterV2_3.zip
 Dateigröße:  15.94 KB
 Heruntergeladen:  423 mal

schrilles
Neuling


Verfasst am:
18. Sep 2011, 09:26
Rufname:

AW: 1. Suchformular in 10 Minuten erstellt - AW: 1. Suchformular in 10 Minuten erstellt

Nach oben
       

Habe lange im Netz gesucht bis ich diese Lösung gefunden habe.
Da ich eine Datenbank mit A 2003 erstelle ist dies die optimale Lösung.
Auch für mich als Anfänger leicht verständlich.
Super.
Danke für diesen Beitrag.
Hat mir optimal geholfen.
Adelho
Neuling


Verfasst am:
30. Sep 2011, 12:53
Rufname:


AW: 1. Suchformular in 10 Minuten erstellt - AW: 1. Suchformular in 10 Minuten erstellt

Nach oben
       

Hallo,

erstmal wollte ich mich bedanken, ich habe mir die Datei mit den Filterformularen runtergeladen und das ist wirklich super gemacht und echt hilfreich. Ich habe allerdings ein Problem auf das in dem Thread nicht hingewiesen wird (habe es zumindest nicht gesehen, kann auch sein das ichs einfach so blöd gebaut hab das es normal gar nich vorkommt Laughing )

Ich habe in der zu durchsuchenden Tabelle/Abfrage mehrere Felder in denen mehrere Werte stehen können. Also mehrere Mitarbeiter bearbeiten einen Kunden zB. Das hab ich durch Kombifelder auf einem Formular gelöst, so das man einfach nur anklickt welche Mitarbeiter an dem Projekt gearbeitet haben. Das bedeutet aber ja das ich dann in der Tabelle mehrere Werte in diesem Feld stehen habe. zB " 6; 7 "
Ich möchte jetzt einfach mit dem Contains Filter zB die " 7 " eingeben um zusehen an welchen Projekten der Mitarbeiter nun alles gearbeitet hat. Nur wenn ich das mache bekomme ich folgende Fehlermeldung:
Zitat:
Laufzeitfehler '3831'

Das mehrwertige Feld [kun_mitarbeiter] kann nicht in einer WHERE- oder einer HAVING Klausel verwendet werden.
Danke schonmal und hoffe das mir jemand helfen kann,
Adelho
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
13. Nov 2011, 00:36
Rufname:

AW: 1. Suchformular in 10 Minuten erstellt - AW: 1. Suchformular in 10 Minuten erstellt

Nach oben
       

Bitsqueezer am 30. Sep 2011 um 14:50 hat folgendes geschrieben:
Hallo Adelho,

die Filterklassen wurden in erster Linie für SQL Server gemacht und nur nebenbei auch für Access angepaßt. Mehrwertige Felder sind eine (unsinnige) Neuigkeit, die es nur in Access gibt und die man absolut vermeiden sollte, da man es immer mit einer entsprechenden 1:n-Tabelle ordentlich lösen kann. Dann kann man auch eine entsprechende Abfrage bauen, die die n-Seite in ein Feld mit Semikolon getrennt zusammenfassen kann - und in so einer Abfrage funktioniert auch der Filter wie von Dir gewünscht.
Natürlich muß man in dem Fall die Funktionalität der mehrwertigen Felder mit eigenen Formularen selbst programmieren - aber dafür hat man auch eine richtige Datenbank mit korrekten Beziehungen, die auch per SQL korrekt abfragbar ist und nicht diesen Krampf, den sich Microsoft hier ausgedacht hat.
Wenn Du weiterhin mehrwertige Felder verwenden möchtest, mußt Du Dir selbst einen Weg ausdenken, diese in einfache Textfelder zu übersetzen. Ich kann Dir nur dringend empfehlen, sie so bald wie möglich aus Deiner Datenbank zu entfernen (stell' Dir nur mal vor, Du mußt später auf einen Datenbankserver upsizen, weil die Datenbank für Access zu groß wird, dann viel Spaß mit mehrwertigen Feldern...).

Gruß

Christian

Hallo,

es ist mal wieder Zeit für einen Update...Smile

Ich habe die Filterklassen wieder um ein paar neue Features erweitert, die allerdings auch ein paar Module und Klassen mehr benötigen. Der Code zur Verwendung ist wie gewohnt extrem kurz und hat sich seit dem letzten Mal nicht geändert. Die oben beschriebene "OnChange"-Erweiterung ist natürlich ebenfalls mit drin.

Neu in dieser Version:
  • Zusätzlich zu den Comboboxen, mit denen man den Filtertyp einstellen kann ("Enthält, Enthält nicht" usw.) gibt es nun auch ein Kontextmenü, wenn man mit der rechten Maustaste auf das Filterfeld klickt. Darin sind alle Filterfunktionen, der Filtertyp als Untermenü und zusätzlich Cut, Copy, Paste enthalten, so daß man auch auf die Funktionen des Standard-Kontextmenüs nicht verzichten muß.
    Vorteil: Man muß nun weder Löschbuttons noch Filtertyp-Comboboxen einfügen, die ein enges Formular-Design überfrachten könnten, es genügt nun das Einfügen der Filterfelder nach oben beschriebenem Konzept der Namensgebung.
  • Die Filter können nun auch in einem Hauptformular platziert werden und Felder aus einem Unterformular filtern. In der angehängten Demo ist ein Beispielformular, daß diese Methode zeigt. Die "InitControls"-Methode wurde dazu um einen optionalen Parameter ergänzt, in dem das Formular angegeben werden muß, in dem nach den Filterfeldern gesucht werden soll. Der Aufruf ist dann: "objFilter.InitControls Me, Me.Parent" in einem Unterformular.
  • Die Filterfelder sind nun auch übersetzbar. Die ebenfalls im Anhang enthaltene XML-Datei "Translations.xml", die die Übersetzungstexte enthält, muß nur im gleichen Ordner wie die Datenbank liegen. Die Datei ist natürlich erweiterbar, der Aufbau ist selbsterklärend. Die Translation-Klasse wurde an anderer Stelle hier im Tips & Tricks Forum schon von mir vorgestellt und näher erläutert.
Das ganze ist noch nicht im harten Alltagsbetrieb getestet, aber das darf dann jeder selbst noch machen...Smile

Gruß

Christian



FilterV2_6.zip
 Beschreibung:
Filterfelder V2.6 im Format A2007

Download
 Dateiname:  FilterV2_6.zip
 Dateigröße:  302.41 KB
 Heruntergeladen:  457 mal


Module.zip
 Beschreibung:
Zum Importieren in andere Access-Versionen die reinen Moduldateien als Textdateien

Download
 Dateiname:  Module.zip
 Dateigröße:  26.13 KB
 Heruntergeladen:  253 mal

v3nt
Gast


Verfasst am:
15. Nov 2011, 09:38
Rufname:

AW: 1. Suchformular in 10 Minuten erstellt - AW: 1. Suchformular in 10 Minuten erstellt

Nach oben
       

Hallöle. Wollte nur mal Danke sagen. Hat mir astrein geholfen und hat mir den Tag gerettet Razz
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
21. Dez 2011, 19:32
Rufname:

AW: 1. Suchformular in 10 Minuten erstellt - AW: 1. Suchformular in 10 Minuten erstellt

Nach oben
       

Hier noch die Demo-Datenbank, umgewandelt in die Formate A2000-A2003.


FilterV2_6_2000-2003.zip
 Beschreibung:
Filter V2.6 in den Formaten A2000-A2003

Download
 Dateiname:  FilterV2_6_2000-2003.zip
 Dateigröße:  584.44 KB
 Heruntergeladen:  337 mal

JMalberg
Es wird so langsam sinnig ...


Verfasst am:
19. Jan 2012, 18:34
Rufname:
Wohnort: Saarbrücken

AW: 1. Suchformular in 10 Minuten erstellt - AW: 1. Suchformular in 10 Minuten erstellt

Nach oben
       

JMalberg am 19. Jan 2012 um 17:17 hat folgendes geschrieben:
Ich glaube ich habe noch einen Fehler entdeckt.

Wird bei der Eingabe des Filters im Filter_Feld durch den Filter kein Datensatz ermittelt, so wird der gesamte Feldinhalt von Filter_Feld markiert. Dass ist soweit ja ok.

Tippt der User nun einfach weiter wird der bisherige Inhalt gelöscht, dann das neu eingetippte als neuer Filterstring angenommen und der Code stoppt mit Fehler 2182 (Verweis auf Eigenschaft/Moethode nur wenn Steuerelemet den Fokus hat) in clsCCFilterField
Code:
Private Sub prv_ctlFilterFromText_Change()
    Dim intCursorPosition As Integer
    Dim intSelLength As Integer
    If prv_ctlFilterToText Is Nothing And prv_ctlFilterToCombobox Is Nothing Then
        With prv_ctlFilterFromText
            intCursorPosition = .SelStart
            intSelLength = .SelLength
            Me.FilterApply bolUseText:=True  '<<---- Fehler 2182 ###########
            procParentFilterApply
            On Error Resume Next
            .SetFocus
            .SelLength = intSelLength
            .SelStart = intCursorPosition
        End With
    End If
End Sub
Wie kann das abgefangen werden oder wie kann eine Meldung ausgegeben werden, dass keine Records ermittelt wurden?

Hier noch zwei Änderungen um den Code auch in Access2003 mit VBA<7 laufen lassen zu können:
Code:
        .AllowValueListEdits 'gibt es erst ab Acc2007
in clsCCFilter
Code:
Private Sub procFillLogicCombobox(ctl As Access.ComboBox)
    If Not ctl Is Nothing Then
        Set Me.FilterLogicCombobox = ctl
        With prv_ctlFilterLogicCombobox
            .RowSourceType = "Value List"
            Do Until .ListCount = 0
                .RemoveItem 0
            Loop
            Select Case Me.FilterLanguage
                Case enmCCFilterAvlLang_EN
                    .RowSource = cFILTERLOGIC_EN
                Case enmCCFilterAvlLang_DE
                    .RowSource = cFILTERLOGIC_DE
            End Select
            .ColumnCount = 2
            .ColumnHeads = False
            .ColumnWidths = "0cm;5cm"
            .ListRows = 2
            .Value = .ItemData(0)
            .LimitToList = True
            .ListWidth = 2000
            ' AllowValueListEdits gibt es erst ab Access 2007
            On Error Resume Next
            #If VBA7 Then
                .AllowValueListEdits = False
            #End If
        End With
    End If
End Sub
in clsCCFilterField
Code:
Public Sub FillFilterType(Optional bolChangeFilterTypes As Boolean = False)
    Dim strNames() As String
    Dim strTypes() As String
    Dim i As Long
    Dim strValueList As String
    Dim bolSetRow As Boolean
   
    ' Default für alle Fälle, falls unten nicht richtig zugewiesen wird
    prv_strFilterType = cFTYPE_EQUAL
    prv_strFilterTypeEntries = ""
    prv_strFilterTypeValues = ""
   
    Select Case Me.FilterParent.FilterLanguage
        Case enmCCFilterAvlLang_DE
            strNames = Split(cFTYPE_Names_DE, ",")
        Case enmCCFilterAvlLang_EN
            strNames = Split(cFTYPE_Names_EN, ",")
    End Select
    strTypes = Split(cFTYPE_Values, ",")
   
    For i = 0 To UBound(strNames)
        If bolChangeFilterTypes Then
            Select Case prv_enmFilterFieldType
                Case enmCCFilterFieldType_Boolean
                    Select Case strTypes(i)
                        ' Nur diese Filtertypen in der FilterTypes-Combobox für
                        ' Boolean-Werte erlauben
                        Case cFTYPE_EQUAL, cFTYPE_ISNULL, cFTYPE_ISNOTNULL
                            bolSetRow = True
                        Case Else
                            bolSetRow = False
                    End Select
                Case enmCCFilterFieldType_Date, enmCCFilterFieldType_Number
                    Select Case strTypes(i)
                        ' Diese FilterTypes aus numerischen und Datumsfeldern entfernen
                        Case cFTYPE_BEGINSWITH, cFTYPE_BEGINSNOTWITH, _
                             cFTYPE_ENDSWITH, cFTYPE_ENDSNOTWITH, _
                             cFTYPE_LIKE, cFTYPE_NOTLIKE
                            bolSetRow = False
                        Case Else
                            bolSetRow = True
                    End Select
                Case enmCCFilterFieldType_Text
                    bolSetRow = True
            End Select
        Else
            bolSetRow = True
        End If
       
        If bolSetRow Then
            strValueList = strValueList & """" & strTypes(i) & """;""" & strNames(i) & """;"
            prv_strFilterTypeEntries = prv_strFilterTypeEntries & strNames(i) & ","
            prv_strFilterTypeValues = prv_strFilterTypeValues & strTypes(i) & ","
        End If
    Next
    If Len(strValueList) > 2 Then strValueList = Left(strValueList, Len(strValueList) - 2)
    If Len(prv_strFilterTypeEntries) > 1 Then prv_strFilterTypeEntries = Left(prv_strFilterTypeEntries, Len(prv_strFilterTypeEntries) - 1)
    If Len(prv_strFilterTypeValues) > 1 Then prv_strFilterTypeValues = Left(prv_strFilterTypeValues, Len(prv_strFilterTypeValues) - 1)
       
    If Not prv_ctlFilterType Is Nothing Then
        With prv_ctlFilterType
            .RowSourceType = "Value List"
            Do Until .ListCount = 0
                .RemoveItem 0
            Loop
            .RowSource = strValueList
            .ColumnCount = 2
            .ColumnHeads = False
            .ColumnWidths = "0cm;4cm"
            .ListRows = 20
            .LimitToList = True
            .ListWidth = 1800
            #If VBA7 Then
                .AllowValueListEdits = False
            #End If
        End With
    End If
    procSetDefaultFilterType
End Sub

_________________
Gruß
Jürgen

Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie!
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
19. Jan 2012, 19:18
Rufname:

AW: 1. Suchformular in 10 Minuten erstellt - AW: 1. Suchformular in 10 Minuten erstellt

Nach oben
       

Hallo Jürgen,

danke für die Hinweise, das mit AllowValueListEdits ist bekannt, habe ich schon mal hier geschrieben, die Zeile kann auch einfach entfernt werden, ist für den Filter nicht unbedingt entscheidend. Leider verschieben die Mods wichtige Hinweise ja immer in den "Nachgefragt"-Thread, da findet niemand mehr etwas wieder.

Das andere Problem kann ich leider nicht nachvollziehen, in meiner Demodatenbank funktioniert es ohne Probleme, egal, ob etwas gefunden wird oder nicht. Da die Filterklasse keine Fehlerbehandlung verwendet, landet man immer im nächsthöheren Prozess, der Fehlerbehandlung verwendet. Der genaue Fehler passiert also eigentlich in "FilterApply", da müßtest Du einen Breakpoint setzen und den Fehler neu testen und dann im Einzelschritt durchgehen (langsam, denn wenn Du auf die Fehlerzeile triffst, landest Du wieder in der übergeordneten Funktion und wenn Du dann die Zeile nicht mitbekommen hast, mußt Du wieder von vorn anfangen - oder einfach temporär eine Fehlerbehandlung in FilterApply einsetzen).

Eine Meldung würde ich allerdings nicht ausgeben, es sei denn, auf einem Label, denn so eine Messagebox nervt nur, und daß nichts gefunden wurde, sieht man ja, muß man nicht noch extra gesagt bekommen. Aber wenn, dann gibt es ja noch die Callback-Funktionen aus dem Interface (Anleitung siehe oben), mit dem man nach Anwendung des Filters ja die Anzahl Datensätze ermitteln kann, wenn man das noch irgendwie melden möchte.

Gruß

Christian
JMalberg
Es wird so langsam sinnig ...


Verfasst am:
20. Jan 2012, 10:03
Rufname:
Wohnort: Saarbrücken

Re: AW: 1. Suchformular in 10 Minuten erstellt - Re: AW: 1. Suchformular in 10 Minuten erstellt

Nach oben
       

Hallo Christian,

die Fehlermeldung lässt sich auch in deinen Demo-DBs reproduzieren in dem du im Form .AllowAdditions = False setzt, also ein Endlosformular ohne Datensatzeinfügen.

_________________
Gruß
Jürgen

Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie!
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
20. Jan 2012, 13:31
Rufname:

AW: 1. Suchformular in 10 Minuten erstellt - AW: 1. Suchformular in 10 Minuten erstellt

Nach oben
       

Hallo Jürgen,

danke für den Hinweis, ja, damit konnte ich es auch reproduzieren.
Der Fehler tritt tatsächlich nur in der Konstellation auf, wenn man die OnChange-Methode einsetzt (also kontinuierliche Filteranpassung beim Tippen) zusammen mit einem nicht änderbaren Recordset.

Nach einigen Versuchen kann ich nur vermuten, daß es sich um ein Access Problem handelt. Der Fehler wird verursacht, weil das Modul clsCCFilterFiels versucht, die Eigenschaft "Text" auszulesen, die ja bekanntlich den Textfeldinhalt wiedergibt, solange man noch in dem Feld ist. Obwohl "Screen.ActiveControl" den Namen dieses Feldes ausspuckt, sagt Access, es könne nicht auf die Eigenschaft Text zugreifen, weil es nicht den Fokus hat. Auch ein vorheriges explizites Setzen des Fokus führt da zu keinem Erfolg. Ich habe hier einen Workaround, der zumindest die Fehlermeldung behebt, bei der Eingabe aber zu etwas seltsamen Seiteneffekten führt (kann man schwer beschreiben, einfach mal ausprobieren).

Man muß in clsCCFilterField in der Prozedur FilterApply die IF-Abfrage mit bolUseText folgendermaßen modifizieren:
Code:
    If bolUseText Then
        On Error Resume Next
        ctlFrom.Parent.SetFocus
        ctlFrom.SetFocus
        varValueFrom = ctlFrom.Text
        If Err.Number <> 0 Then
            varValueFrom = ctlFrom.Value
        End If
        On Error GoTo 0
      Else
        varValueFrom = ctlFrom.Value
    End If
Wenn dann .Text nicht funktioniert, wird stattdessen .Value verwendet.

Wie gesagt - das Problem tritt nur bei Verwendung von OnChange in Kombination mit einer nicht updatebaren Abfrage auf, die OnChange-Methode ist ohnehin eher nicht zu empfehlen, da jeder getippte Buchstabe eine neue Filterung auslöst, was zu Problemen führen kann, wenn man sehr viele Datensätze hat oder im Netzwerk auf die Daten zugreifen muß.

Gruß

Christian
JMalberg
Es wird so langsam sinnig ...


Verfasst am:
20. Jan 2012, 14:43
Rufname:
Wohnort: Saarbrücken

AW: 1. Suchformular in 10 Minuten erstellt - AW: 1. Suchformular in 10 Minuten erstellt

Nach oben
       

Ist das so vorgesehen, dass procParentFilterApply in clsCCFilterField
Code:
Private Sub procParentFilterApply()
    If Not Me.FilterParent Is Nothing Then Me.FilterParent.FilterApply
End Sub
immer ausgeführt wird?
Dies tritt bei mir auf und dadurch wird auch FilterApply immer zweimal ausgeführt, nimmt aber beim 2.mal aus Comboboxen die mit "0cm;..." (1.Spalte ausblenden) formatiert sind dann den Wert aus der 2.Spalte.

Ich versuche mal, dass zumindest bei Comboboxen immer anhand des .BoundColumn die richtige Spalte gewählt wird. Wo muss ich das ändern?

_________________
Gruß
Jürgen

Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie!
Bitsqueezer
Office-VBA-Programmierer


Verfasst am:
20. Jan 2012, 15:20
Rufname:

AW: 1. Suchformular in 10 Minuten erstellt - AW: 1. Suchformular in 10 Minuten erstellt

Nach oben
       

Hallo Jürgen,

ja, das ist der Link zu der Basisklasse clsCCFilter, die alle Filter aus allen Filterfelder-Objekten (clsCCFilterField) entnimmt, einen Gesamtfilter daraus zusammensetzt und diesen dann als Filter einstellt. Nur so ist es möglich, daß man auch einzelne Filter aus dem gesamten Filter wieder entfernen kann.

Das Problem mit der Combobox tritt beim Standardfilter (ohne OnChange) nicht auf, weder mit einspaltigen noch zweispaltigen Comboboxen. Wenn ich in der Demodatenbank in der FilterDemo3 (mit den Comboboxen) in der ID-Spalte die Combobox auf zwei Spalten erweitere, so daß in der zweiten z.B. der Username angezeigt wird, und die erste ausblende, kann ich weiterhin problemlos filtern. Auch mit der Einstellung AllowAdditions=False.

Bei der Combobox mit OnChange funktioniert sie allerdings nicht mehr (also mit "frmFilterDemo", wenn man die zweispaltige Combobox hier in die ID-Spalte einsetzt). Dazu muß man sagen, daß die Combobox-Idee natürlich war, daß diese auch nur eine Spalte enthält, nämlich die gruppierten Daten der Suchspalte, mehr braucht man ja auch nicht. Wenn ich nach Username suche, setze ich eine Combobox in der Username-Spalte ein, wenn ich eine ID suche, dann eine ID-Combobox in der ID-Spalte. Wozu sollte es gut sein, eine ID zu suchen in der ID-Spalte, aber dort den Namen des Users einzugeben? Macht für mich keinen Sinn. Die Geschichte mit der zweispaltigen Combobox und ausgeblendeter ID ist immer da sinnvoll, wo man die ID verbergen möchte und nur den Namen anzeigen möchte, zum Beispiel in einem Eingabeformular, wo man den Namen anzeigen möchte, aber die ID im Datensatz gespeichert werden soll. In einem Endlosformular kann man aber einfach eine Spalte mit dem Namen anzeigen und da den Filter einsetzen.

Auf die BoundColumn zuzugreifen, sollte auch nicht notwendig sein, denn die Default-Eigenschaft "Value" der Combobox zeigt immer auf die Werte aus der gebundenen Spalte. Warum die mehrspaltige Combobox bei Verwendung von OnChange ausflippt, konnte ich auf die Schnelle auch nicht feststellen, aber aus genannten Gründen halte ich die Variante auch nicht wirklich für notwendig.

Gruß

Christian
JMalberg
Es wird so langsam sinnig ...


Verfasst am:
20. Jan 2012, 15:25
Rufname:
Wohnort: Saarbrücken


Re: AW: 1. Suchformular in 10 Minuten erstellt - Re: AW: 1. Suchformular in 10 Minuten erstellt

Nach oben
       

Achso ganz vergessen.
Bitsqueezer - 20. Jan 2012, 12:31 hat folgendes geschrieben:
...
Man muß in clsCCFilterField in der Prozedur FilterApply die IF-Abfrage mit bolUseText folgendermaßen modifizieren:
Code:
    If bolUseText Then
        On Error Resume Next
        ctlFrom.Parent.SetFocus
        ctlFrom.SetFocus
        varValueFrom = ctlFrom.Text
        If Err.Number <> 0 Then
            varValueFrom = ctlFrom.Value
        End If
        On Error GoTo 0
      Else
        varValueFrom = ctlFrom.Value
    End If
...
Funktioniert!
_________________
Gruß
Jürgen

Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie!
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Gehe zu Seite Zurück  1, 2, 3, 4  Weiter
Diese Seite Freunden empfehlen

Seite 3 von 4
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Macromedia Dreamweaver