Neuigkeiten:

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

Mobiles Hauptmenü

Datensätze mit VBA in einem Endlosformular filtern

Begonnen von Kannkaumvba, April 21, 2015, 09:46:04

⏪ vorheriges - nächstes ⏩

Kannkaumvba

Hallo Forum,

ich möchte in einem Endlosformular über eine Filterfunktion Datensätze suchen. Dazu habe ich im Formularkopf diverse ungebundene Textfelder eingerichtet, nach deren Inhalt die Felder im Detailbereich gefiltert werden sollen.

Die Filter sollen nicht einzeln, sondern dynamisch miteinander filtern.

Das Formular zieht seine Daten aus einer Abfrage, in der die Datensätze mittels festem Kriterium vorgefiltert wurden.

Der Filter soll wie folgt funktionieren:
- Filtern nach Nummern (eindeutig), Filter: TextSucheDokumentID, Feld: [DokumentID]
- Filtern nach Text (eindeutig), Filter: TextSucheErsteller, Feld: [DokumentErsteller]
- Filtern nach Text (enthält), Filter: TextSucheTitel , Feld [DokumentTitel]
- Filtern nach Datum (von/bis), Filter: DatumSucheVon; DatumSucheBis, Feld: [DokumentErstelldatum]

TextSucheErsteller ist ein ungebundenes Kombinationsfled, das seinen Inhalt aus einer Abfrage zieht. Diese Abfrage greift auf ein zusammengesetztes Feld [BenutzerName] zurück, welches aus den Feldern ''[BenutzerNachname]''&'', ''&''[BenutzerVorname]'' gebildet wird.

Folgenden Code verwende ich z.B. für das Filtern in [DokumenID].

Private Sub TextSucheDokumentID_AfterUpdate()
Me.FilterOn = False
If TextSucheDokumentID <> "" Then
    Me.Filter = "DokumentID=" & TextSucheDokumentID.Value
    Me.FilterOn = True
End If
End Sub


Das klappt zwar auch, aber folgende Probleme tauchen auf:
- Verwende ich diesen Filter zusammen mit einem anderen Nummern-Filter, filtern diese getrennt.
- Beim Filtern nach TextSucheErsteller erhalte ich den Lauftzeitfehler 3075 ,,Syntaxfehler (Komma) in Abfrageausdruck..."

Darüber hinaus habe ich noch keine Vorstellung, wie ein Filter mit Eigenschaft "enthält" oder die Suche nach einem Datumsbereich zu realisieren wäre.

Kann mir da irgend jemand helfen???

Vielen Dank im Voraus


Wurliwurm

Damit Du da nicht in den Wald kommst mit den vielen Filterbedingungen, die gleichzeitig erfüllt sein müssen, würde ich vorab eine gewisse Struktur reinbauen.

Das Setzen der Filter ist in den Ereignissen zu den Steuerelementen "_AfterUpdate()" nicht gut aufgehoben. Besser ist eine zentrale Routine, die parameterlos aufgerufen wird und die einzelnen Steuerelemente abfragt. Diese Parameterlose Routine wird aus den Ereignissen der Steuerelemente aufgerufen. Dann würde ich eine weitere Routine erstellen, die alle diese Werte als Eingabeparameter erhält und daraus (mittels Fallunterscheidungen) einen Filterstring verkettet. Dieser kann dann mit Me.Filter wirksam werden.

Für "enthält" würde ich mir die Doku zum Ausdruck "LIKE" ansehen

Kannkaumvba

Hallo Wurliwurm,

ich habe das schon mal über eine zentrale Routine (Code aus Forum) versucht, bekomme dann aber einen Laufzeitfehler bei:

Dim lvw As MSComctlLib.ListView


Sieht so aus als müsste ich meine Datenbank konfigurieren. Ich weiss aber nicht was und wo??

Start der Routine:

Private Sub Search(lngPersonID As Long)
Dim rst As DAO.Recordset
Dim aryCriteria() As String
Dim lngCriteriaCounter As String
Dim strCriteria As String
Dim lvw As MSComctlLib.ListView
Dim lit As MSComctlLib.ListItem


Die Routine wird im Formularkopf über einen Button getriggert:

Private Sub btnSuche_Click()
Search 0
End Sub


Gruss

MaggieMay

Hi,

ZitatBeim Filtern nach TextSucheErsteller erhalte ich den Lauftzeitfehler 3075
Texte müssen in Hochkommata gesetzt werden.

ZitatCode aus Forum
Gib bitte einen Link zu Quelle an, damit man nachvollziehen kann worum es sich handelt.

Zitatbekomme dann aber einen Laufzeitfehler
Fehlermeldungen sind grundsätzlich zu zitieren, ansonsten ist der Hinweis wertlos.

ZitatDim lvw As MSComctlLib.ListView
Was hast du denn da mit dem ListView-Steuerelement im Sinn?
Freundliche Grüße
MaggieMay

Wurliwurm

Sieht so aus, als würdest Du ein besonderes Listensteuerelement verwenden, welches extra über einen Bibliotheksverweis eingebunden werden muß. Eigentlich müßte er dann schon beim Kompilieren den Fehler bringen.


Kannkaumvba

Hallo Maggie,

ZitatGib bitte einen Link zu Quelle an, damit man nachvollziehen kann worum es sich handelt.

Link weiss ich nicht mehr. Könnte höchstens die Datei anhängen.

ZitatFehlermeldungen sind grundsätzlich zu zitieren, ansonsten ist der Hinweis wertlos.

Habs nochmal durchlaufen lassen. Sorry, ist kein Laufzeitfehler sondern Fehler beim Kompilieren: Benutzerdefinierter Typ nicht erkannt.

ZitatWas hast du denn da mit dem ListView-Steuerelement im Sinn?

Ich eigentlich nichts, wie schon mein Benutzername sagt!

Habe diese beiden Zeilen mal aus dem Code geschmissen

Dim lvw As MSComctlLib.ListView
Dim lit As MSComctlLib.ListItem


und siehe da, er filtert korrekt mit enthält Text. Versuchs auch noch mal für die anderen Filter.

Gruss

Kannkaumvba

Hallo,

habe meine Filter soweit eingerichtet und fast alles funktioniert so wie es soll.

Beim Filtern über die ungebundenen Felder SucheDatumVon bis SucheDatumBis habe ich allerdings Probleme mit dem Code.

Hier ein Ausschnitt der Codierung mit einem Filter:

Private Sub Search(lngDokumentID As Long)
Dim rst As DAO.Recordset
Dim aryCriteria() As String
Dim lngCriteriaCounter As String
Dim strCriteria As String

lngCriteriaCounter = -1

If lngDokumentID = 0 Then
    'Bei Suche aus Formularcontrols:

    If Len(Nz(Me.TextSucheCode)) <> 0 Then
        'Code an Kriterienarray anfügen
        lngCriteriaCounter = lngCriteriaCounter + 1 'Zähler erhöhen
        ReDim Preserve aryCriteria(lngCriteriaCounter) 'Array ("Kriterienstapel") erweitern
        aryCriteria(lngCriteriaCounter) = "DokumentCode LIKE '*" & Me.TextSucheCode & "*'" 'neues Kriterium auf Array legen
    End If
   
Else
        'Bei Suche anhand fest vorgegebener PersonID
        lngCriteriaCounter = lngCriteriaCounter + 1
        ReDim Preserve aryCriteria(lngCriteriaCounter)
        aryCriteria(lngCriteriaCounter) = "DokumentID = " & lngDokumentID
End If

'Gesamtkriterium zusammensetzen
strCriteria = Join(aryCriteria, " AND ")

'Datenquelle de Formulars schreiben
If Len(strCriteria) = 0 Then
    Me.RecordSource = "SELECT * FROM QRY_DokumenteSuchen"
Else
    Me.RecordSource = "SELECT * FROM QRY_DokumenteSuchen WHERE " & strCriteria
End If
Me.Detailbereich.Visible = True
End Sub


Hat jemand eine Idee, wie man hier noch einen Datumsfilter mit unterbringen kann?

Vielen Dank im Voraus!

Kannkaumvba

Zitat von: Kannkaumvba am April 21, 2015, 21:05:19
Hallo,

habe meine Filter soweit eingerichtet und fast alles funktioniert so wie es soll.

Beim Filtern über die ungebundenen Felder SucheDatumVon bis SucheDatumBis habe ich allerdings Probleme mit dem Code.

Hier ein Ausschnitt der Codierung mit einem Filter:

Private Sub Search(lngDokumentID As Long)
Dim rst As DAO.Recordset
Dim aryCriteria() As String
Dim lngCriteriaCounter As String
Dim strCriteria As String

lngCriteriaCounter = -1

If lngDokumentID = 0 Then
    'Bei Suche aus Formularcontrols:

    If Len(Nz(Me.TextSucheCode)) <> 0 Then
        'Code an Kriterienarray anfügen
        lngCriteriaCounter = lngCriteriaCounter + 1 'Zähler erhöhen
        ReDim Preserve aryCriteria(lngCriteriaCounter) 'Array ("Kriterienstapel") erweitern
        aryCriteria(lngCriteriaCounter) = "DokumentCode LIKE '*" & Me.TextSucheCode & "*'" 'neues Kriterium auf Array legen
    End If
   
Else
        'Bei Suche anhand fest vorgegebener PersonID
        lngCriteriaCounter = lngCriteriaCounter + 1
        ReDim Preserve aryCriteria(lngCriteriaCounter)
        aryCriteria(lngCriteriaCounter) = "DokumentID = " & lngDokumentID
End If

'Gesamtkriterium zusammensetzen
strCriteria = Join(aryCriteria, " AND ")

'Datenquelle de Formulars schreiben
If Len(strCriteria) = 0 Then
    Me.RecordSource = "SELECT * FROM QRY_DokumenteSuchen"
Else
    Me.RecordSource = "SELECT * FROM QRY_DokumenteSuchen WHERE " & strCriteria
End If
Me.Detailbereich.Visible = True
End Sub


Hat jemand eine Idee, wie man hier noch einen Datumsfilter mit unterbringen kann?

Vielen Dank im Voraus!
Noch eine Frage hierzu: Der Filter befindet sich im Formularkopf eines Endlosformulars. Wie könnte man die gefilterten Datensätze in einem Unterformular anzeigen lassen und das Hauptformular auf einzelenes Formuler einzustellen? Habe versucht den Trigger sowie Filter als Public Function zu deklarieren. Das klappt aber nicht.

Danke und Gruss

MaggieMay

Hallo,

hast du dein Filterproblem mit dem Datum inzwischen gelöst?

Und was genau meinst du hiermit:
ZitatHabe versucht den Trigger sowie Filter als Public Function zu deklarieren.
Beschreibe bitte ausführlicher wie du vorgegangen bist.
Soll das HF durch das UF gesteuert werden, d.h. den dort markierten Datensatz anzeigen?
Freundliche Grüße
MaggieMay

Kannkaumvba

Hallo Maggie,
ich bin in der Zwischenzeit nicht dazu gekommen mich mit dem Problem weiter zu beschäftigen. Bzgl. Datumsfilter werde ich wohl über ein Kombinationsfeld die Auswahl von Jahren vorgeben und dann über die Like-Funktion filtern. Das ist eigentlich für meine Zwecke ausreichend.
Zu Deiner Frage: Ich habe lediglich die Deklaration der Schaltfläche und des Filters von Private Sub auf Public Function gesetzt. Das hat aber nichts gebracht. Auch die Unterbringung des Codes in einem Modul hat nicht geholfen.
Ja, ich will den Filter im HF unterbringen und auf die Datensätze in einem UF anwenden. Am Besten wäre es, wenn ich einen globalen Filter hätte, auf den von jedem HF aus zugegriffen werden könnte, der dann im aktiven UF filtert. Brauchst
Hättest Du da einen Tipp für mich?

Vielen Dank!
Gruss