Supportnet Computer
Planet of Tech

Supportnet / Forum / Datenbanken

Filtern im Formular





Frage

Halllo da bin ich wieder. Ich bräuchte mal wieder eine Filterfunktion: Also ich habe 3 Felder: Kennzeichen (Kombinationsfeld), Datum von , Datum bis Ich möchte jetzt, daß der vorliegende Datenbestand nach Kennzeichen gefiltert wird. Und danach das FEld DAtum eingegrenzt mit den FEldern DAtumvon und DAtumbis. Möglich ? Gruß Reinicke

Antwort 1 von Renegade

mit oder ohne VBA?

Antwort 2 von Reinicke

Egal!
Ich bin für beides dankbar.
Ich glaube VBA ist eleganter, oder ?

Gruß Reinicke

Antwort 3 von Renegade

ok dann werd ich mal mein Statement abgeben ;-)

Du brauchst natürlich die Datumsangaben aus den Eingabefeldern, um die Eingabe zu erleichtern und Fehler auszuschliessen könntest du mit den Date - Time Picker - Control arbeiten, ist ein ActiveX - Control. Die Daten kannst du dann in einen Select - Statement nutzen.

Beispiel für den String:
strSql = "SELECT * FROM tbTabelle WHERE ZEITRAUM >= '" & Eingabefeld1 & "' AND ZEITRAUM <= '" & Eingabefeld2 & "'"

Diesen String weist du dem Formular zu mit

Me.Form.RecordSource = strSql

evtl. noch nen Requery falls es nicht gleich dargestellt wird.

Wenn du die Zuweisung nicht innerhalb des Formulars, sondern über ein Modul zuweisen willst musst du statt "ME" "FORM_<<Formularname>>".Form..... nutzen

Also ich hoffe das hilft dir weiter

Antwort 4 von Reinicke

Hallo Renegade,

das kriege ich leider nicht so hin.
Ich habe im Formular von Textfelder "Datumvon" und "Datumbis". Da die Datensätze in dem Formular schon aufgrund eines SQL-Statements gebildet werden, fragt mich jetzt die abgewandelte o.g. Zeile nach dem Inhalt der Felder.

strSql = "SELECT [Wareneingang und Rechnung].Rechnungsdatum, Bestellungen.[Bestell-Nr], Bestellungen.Lieferant, Bestellungen.Bezug, [Wareneingang und Rechnung].[Bemerkung Wareneingang], [Wareneingang und Rechnung].Rechnungsbetrag, [Wareneingang und Rechnung].[Rechnung Weiterleitung], [Wareneingang und Rechnung].Storno, [Wareneingang und Rechnung].[Buchungs-Vermerk], [Wareneingang und Rechnung].Rechnungsnummer, Format([Rechnungsdatum],'yyyy') AS Rechnungsjahr, [Lieferantenstammdaten Abfrage].[L-Name], Kostenstelle.Kennzeichen FROM ((Bestellungen INNER JOIN [Lieferantenstammdaten Abfrage] ON Bestellungen.Lieferant = [Lieferantenstammdaten Abfrage].ID) INNER JOIN (Buchungsbelege INNER JOIN Kostenstelle ON Buchungsbelege.KFZ_Kennzeichen = Kostenstelle.ID) ON Bestellungen.[Bestell-Nr] = Buchungsbelege.[Bestell-Nr]) INNER JOIN [Wareneingang und Rechnung] ON Bestellungen.[Bestell-Nr] = [Wareneingang und Rechnung].[Bestell-Nr]" & _
"WHERE ((([Wareneingang und Rechnung].Rechnungsdatum) Between [Datumvon] And [Datumbis])" & _
"AND (([Wareneingang und Rechnung].Storno)=No Or ([Wareneingang und Rechnung].Storno) Is Null)) ORDER BY [Wareneingang und Rechnung].Rechnungsdatum, Bestellungen.[Bestell-Nr];"
Me.Form.RecordSource = strSql


Antwort 5 von Knubbel

@Reinicke
Ich bin kein Profi, daher meine Frage, was soll die Anfrage "Filtern im Formular"?

Nach meinem Verständnis von relationalen Datenbanken werden Filterprobleme (Datensatzauswahlen) über Abfragen gelöst, und anschliessend Formulare / Berichte auf diese Abfragen bezogen.
Liege ich hier falsch?

mfg Knubbel

Antwort 6 von Reinicke

Hallo Knubbel,

der Grundgedanke von Dir ist schon richtig. Wenn man aber eine Abfrage auf mehrere Tabellen gemacht hat, und man jetzt möchte, daß diese weiter per Kombinationsfeld oder Zeitraum eingegrenzt werden sollen.

Die Lösung habe ich auch gestern nach langem Nachdenken selber gefunden:


Dim datev As String, dateb As String

datev = Format(Me.Datumvon, "mm dd yy")
dateb = Format(Me.Datumbis, "mm dd yy")

strSql = "SELECT [Wareneingang und Rechnung].Rechnungsdatum, Bestellungen.[Bestell-Nr], Bestellungen.Lieferant, Bestellungen.Bezug, [Wareneingang und Rechnung].[Bemerkung Wareneingang], [Wareneingang und Rechnung].Rechnungsbetrag, [Wareneingang und Rechnung].[Rechnung Weiterleitung], [Wareneingang und Rechnung].Storno, [Wareneingang und Rechnung].[Buchungs-Vermerk], [Wareneingang und Rechnung].Rechnungsnummer, Format([Rechnungsdatum],'yyyy') AS Rechnungsjahr, [Lieferantenstammdaten Abfrage].[L-Name], Kostenstelle.Kennzeichen FROM ((Bestellungen INNER JOIN [Lieferantenstammdaten Abfrage] ON Bestellungen.Lieferant = [Lieferantenstammdaten Abfrage].ID) INNER JOIN (Buchungsbelege INNER JOIN Kostenstelle ON Buchungsbelege.KFZ_Kennzeichen = Kostenstelle.ID) ON Bestellungen.[Bestell-Nr] = Buchungsbelege.[Bestell-Nr]) INNER JOIN [Wareneingang und Rechnung] ON Bestellungen.[Bestell-Nr] = [Wareneingang und Rechnung].[Bestell-Nr]" & _
         "WHERE ((([Wareneingang und Rechnung].Rechnungsdatum) Between #" & datev & "# and #" & dateb & "#) " & _
         "AND (([Wareneingang und Rechnung].Storno) = No Or ([Wareneingang und Rechnung].Storno) Is Null) " & _
         "AND ((Kostenstelle.Kennzeichen)= '" & Me.Sucheingabe & "')) ORDER BY [Wareneingang und Rechnung].Rechnungsdatum, Bestellungen.[Bestell-Nr];"
Me.Form.RecordSource = strSql


Antwort 7 von Knubbel

@Reinicke!

Danke für die Antwort und den Code.

Da ich kein VB kenne, finde ich Deine Lösung sehr unübersichtlich.

Darf ich meinen Lösungsvorschlag (ohne VB) mal aufzeigen?

Wenn ich Deinen Code richtig entschlüsselt habe, hast Du in der DB folgende
Tabellen mit den Feldern:

Tab1) [Wareneingang und Rechnung]
- Bestell-Nr
- Rechnungsdatum
- Bemerkung Wareneingang
- Rechnungsbetrag
- Rechnung Weiterleitung
- Storno
- Buchungsvermerk
- Rechnungsnummer

Tab2) [Bestellungen]
- Bestell-Nr
- Lieferant (ID)
- Bezug

Tab3) [Lieferantenstammdaten Abfrage], kann auch eine Abfrage sein
- L-Name
- ID

Tab4) [Kostenstelle]
- Kennzeichen
- ID

Tab5) [Buchungsbelege]
- KFZ-Kennzeichen
- Bestell-Nr

Erstelle nun eine Abfrage, in die Du alle 5 obigen Tabellen/Abfragen
mit den benötigten Feldern einbeziehst.
Die einzelnen Tabellen bringst Du nun wie folgt in Beziehung:

[Wareneingang und Rechnung].Bestell-Nr ------ [Bestellungen].Bestell-Nr
[Bestellungen].Bestell-Nr ----- [Buchungsbelege]. Bestell-Nr
[Bestellungen].Lieferant ------ [Lieferantenstammdaten Abfrage].ID
[Kostenstelle].ID ---- [Buchungsbelege].KFZ-Kennzeichen

Hiermit hast Du alle Tabellen verknüpft (synchronisiert).

Nun zu Deinem Auswahlproblem:
Im Feld „Storno“ gibst Du in Kriterien ein „Nein oder Null“
da nur nach Datensätzen ausgesucht werden soll, die nicht storniert wurden.

Nun legst Du ein neues Formular an, z.B. „Auswahlmaske“, in das Du Deine Auswahlkriterien einträgst. In diesem Formular hast Du folgende Felder:
- Kennzeichen (als Kombinationsfeld) Name: Kennzeichen
- Von Datum (nicht gebundenes Feld) Name: VonDat
- Bis Datum (nicht gebundenes Feld) Name: BisDat
- Befehlsschaltfläche, z.B. mit der Beschriftung „Datensätze zeigen“, mit der Funktion
„Beim Klicken“ Makro: öffnen.Formular....(Ergebnis). Hierzu später.

In Deine Abfrage von vorher trägst Du nun in die Kriterienzeile der Felder folgendes ein:
Feld Kennzeichen: Wie[Formulare]![Auswahlmaske]![Kennzeichen]
Feld Rechnungsdatum Zwischen[Formulare]![Auswahlmaske]![VonDat]_Und_[Formulare]!_
[Auswahlmaske]![BisDat]
Hierdurch wird Deine Datenbank nach den vorgewählten Kriterien gefiltert.

Nun zum Makro, was durch Klick auf die Befehlsschaltfläche gestartet wird:
Hiermit öffnest Du Dein (schon entwickeltes) Formular, in dem Du die Filterergebnisse darstellen möchtest. Datenherkunft für dieses Formular ist die o.a. Abfrage.
Du musst nun noch überlegen, ob innerhalb des Makros das Formular „Auswahlmaske“ geschlossen werden soll, oder ob Du weitere Auswahlen durchführen möchtest.

Hallo Reinicke,
wenn auch meine vorstehenden Ausführungen evtl. umständlich aussehen, glaube ich jedoch, sind diese einfacher als Dein VB-Code, da einfacher nachvollziehbar (zumindest für Leute wie mich, die kein VB können)

mfg Knubbel



Antwort 8 von Reinicke

Hallo Knubbel,

erst einmal großes Lob für diese super Analyse und Aufschlüsselung.
Also ich habe mir Deinen Vorschlag mal angeschaut und festgestellt, daß ich ja in der Abfrage wie auf ein Feld in einem Formular beziehen kann.
Das war eigentlich meine allererste Frage (s.o.)
Das ich die ganze Sache bisher mit VBA gelöst habe, lag daran, daß ich dies als ersten Anhaltspunkt hatte. Ich bin nämlich auch kein Z werde Deinen Vorschlag parallel umsetzen und mal schauen was meine Kollegen dazu sagen.

Auf jeden Fall großen Dank!!!

Gruß Kai Reinicke

Ich möchte kostenlos eine Frage an die Mitglieder stellen:


Ähnliche Themen:


Suche in allen vorhandenen Beiträgen: