Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Nach Filterkriterum prüfen, ob Datensätze vorhanden sind

570 views
Skip to first unread message

Holger D.

unread,
Apr 20, 2009, 4:50:01 AM4/20/09
to
Hallo NG,
ich habe eine Frage.
Per VBA habe ich einen strFilter einer Tabelle zugewiesen und möchte nun im
Code abfragen, ob wirklich Datensätze zu den entsprechenden Filterkriterien
vorhanden sind.
Leider fehlt mir dafür die Programmierkenntnis. Kann mir jemand einen Tip
geben?

Herzlichen Dank dafür!
Holger

Karl Donaubauer

unread,
Apr 20, 2009, 4:58:26 AM4/20/09
to
Holger D. wrote:
> Per VBA habe ich einen strFilter einer Tabelle zugewiesen und möchte nun
> im Code abfragen, ob wirklich Datensätze zu den entsprechenden
> Filterkriterien vorhanden sind.
> Leider fehlt mir dafür die Programmierkenntnis. Kann mir jemand einen Tip
> geben?

Es ist nicht ganz klar, wie du das machst:


> Per VBA habe ich einen strFilter einer Tabelle zugewiesen

Falls du keine Tabelle sondern ein Formular meinst, dann kannst du
nach dem Setzen des Filters so prüfen:

If Me.RecordsetClone.RecordCount = 0 Then

oder ab A00 alternativ auch:

If Me.Recordset.RecordCount = 0 Then

--
HTH
Karl
********* Ich beantworte keine Access-Fragen per Email. *********
Access-FAQ: http://www.donkarl.com
3. SQL Server-Entwickler-Konferenz - Nürnberg im Mai

Holger D.

unread,
Apr 20, 2009, 5:38:09 AM4/20/09
to
Hallo Karl,

mein Code bei einem Form_Load sieht so aus:
strFilter2 = "Verfahren <> 'Strahlschmelzen' OR Verfahren = 'Strahlschmelzen'"
Me.Filter = strFilter2
Me.FilterOn = True

Und nun möchte ich direkt im Anschluss prüfen, ob eine Auswahl in der
Tabelle zutrifft. Also etwa:

If Me.Filter=0 Then
MsgBox "Ihre Auswahl erzielt keinen Treffer." & vbNewLine & _
"Bitte prüfen Sie ihre Eingabe."
me.Form1.close
End If

Das funktioniert jedoch nicht.

Danke für die Hilfe!!

Gruß,
Holger

Jens Schilling

unread,
Apr 20, 2009, 6:16:20 AM4/20/09
to
Hallo, Holger

Holger D. wrote:
> Me.Filter = strFilter2

Hier weist Du dem Filter den Wert aus der Variablen strFilter2 zu, und
willst dann ....

> If Me.Filter=0 Then


hier prüfen, ob dieser "=0" is!

Was erwartest Du denn dann als Ergebnis ?

Wenn's noch nicht klar ist, lass' Dir mit Msgbox Me.Filter den Wert
ausgeben.

>> If Me.Recordset.RecordCount = 0 Then

Dies sollte die Lösung sein.

Gruss
Jens

Thomas Winkler

unread,
Apr 20, 2009, 6:20:45 AM4/20/09
to
Hi,

> mein Code bei einem Form_Load sieht so aus:
> strFilter2 = "Verfahren <> 'Strahlschmelzen' OR Verfahren = 'Strahlschmelzen'"

Wenn Du dein Filterkriterium so formulierst, kannst Du es auch
weglassen. Denn jedes Verfahren ist entweder *gleich* 'Strahlschmelzen'
oder eben 'ungleich'.


> Me.Filter = strFilter2
> Me.FilterOn = True
>
> Und nun möchte ich direkt im Anschluss prüfen, ob eine Auswahl in der
> Tabelle zutrifft. Also etwa:
>
> If Me.Filter=0 Then

Me.Filter hast Du ja oben erst einen String zugewiesen. Warum soll
dieser hier plötzlich nicht mehr drin stehen sondern eine Zahl?

Welche Eigenschaft die von Dir gesuchte Anzahl der Treffer enthält, hat
Karl Dir bereits geschrieben.

HTH

Thomas

--
"Access? Damit arbeite ich nicht. Das ist doch nur ein abgespecktes Excel."

Holger D.

unread,
Apr 20, 2009, 7:15:01 AM4/20/09
to
Hi,

danke für die Antwort. Die Befüllung der Variable strFilter geschieht anhand
mehrerer Kriterien und das

> > strFilter2 = "Verfahren <> 'Strahlschmelzen' OR Verfahren = 'Strahlschmelzen'"

ist nur ein Beispiel.

Leider funktioniert der Ausdruck nicht. Ich habe schrieben:

If Me.Recordset.RecordCount = 0 Then

MsgBox "Ihre Auswahl erzielt keinen Treffer." & vbNewLine & _
"Bitte prüfen Sie ihre Eingabe."

und es kommt die Fehlermeldung '91'. Objektvariable oder With-Blockvariable
nicht festgelegt.

Was mache ich falsch?

Danke für eine Reaktion.

Gruß,
Holger

Karl Donaubauer

unread,
Apr 20, 2009, 7:24:48 AM4/20/09
to
Holger D. wrote:
> ...

> danke für die Antwort. Die Befüllung der Variable strFilter geschieht
> anhand mehrerer Kriterien und das
>>> strFilter2 = "Verfahren <> 'Strahlschmelzen' OR Verfahren =
>>> 'Strahlschmelzen'" ist nur ein Beispiel.
>
> Leider funktioniert der Ausdruck nicht. Ich habe schrieben:
>
> If Me.Recordset.RecordCount = 0 Then
> MsgBox "Ihre Auswahl erzielt keinen Treffer." & vbNewLine & _
> "Bitte prüfen Sie ihre Eingabe."
>
> und es kommt die Fehlermeldung '91'. Objektvariable oder
> With-Blockvariable nicht festgelegt.
>
> Was mache ich falsch?

Mein Code war nur ein Beispiel, und jetzt siehst du, wohin sowas führt. :-)
Es fehlt der Abschluss des If-Then-Konstruktes:

If Me.Recordset.RecordCount = 0 Then
MsgBox "Ihre Auswahl erzielt keinen Treffer." & vbNewLine & _
"Bitte prüfen Sie ihre Eingabe."

End If

Jens Schilling

unread,
Apr 20, 2009, 7:43:11 AM4/20/09
to
Hallo, Karl

Karl Donaubauer wrote:
>> und es kommt die Fehlermeldung '91'. Objektvariable oder
>> With-Blockvariable nicht festgelegt.
>>
>> Was mache ich falsch?
>
> Mein Code war nur ein Beispiel, und jetzt siehst du, wohin sowas
> führt. :-) Es fehlt der Abschluss des If-Then-Konstruktes:
>
> If Me.Recordset.RecordCount = 0 Then
> MsgBox "Ihre Auswahl erzielt keinen Treffer." & vbNewLine & _
> "Bitte prüfen Sie ihre Eingabe."
> End If

Das war auch mein erster Gedanke, neige aber jetzt zu der Vermutung, dass es
sich um ein ungebundenes Formular handeln könnte....

Tschüs
Jens


Holger D.

unread,
Apr 20, 2009, 7:36:01 AM4/20/09
to
Ja, sorry! Demnächst sollte ich da genauer beschreiben, was ich vor habe.
Entschuldigung!

Danke für den Hinweis, jedoch hatte ich einfach beim str-Copy das "End if"
nicht mitgenommen, so dass der Fehler dennoch auftritt..

Danke für die Hilfe!
Gruß,
Holger

Karl Donaubauer

unread,
Apr 20, 2009, 7:55:44 AM4/20/09
to
Hallo, Jens!

Joo, das würde auch eher zur Fehlermeldung passen.
Nur, was filtert er dann eigentlich? --> Mysteriös. :-)

--
Servus

Holger D.

unread,
Apr 20, 2009, 8:30:01 AM4/20/09
to
...sowas viel zum Thema Genauigkeit! Sorry, ich bin heute echt nicht so ganz
auf der Höhe.... Der Befehl soll auf eine Abfrage zugreifen, nicht auf eine
Tabelle...

Karl Donaubauer

unread,
Apr 20, 2009, 8:57:19 AM4/20/09
to
Holger D. wrote:
> ...
>> "Karl Donaubauer" wrote:
>>>> ...

>>>> Leider funktioniert der Ausdruck nicht. Ich habe schrieben:
>>>>
>>>> If Me.Recordset.RecordCount = 0 Then
>>>> MsgBox "Ihre Auswahl erzielt keinen Treffer." & vbNewLine & _
>>>> "Bitte prüfen Sie ihre Eingabe."
>>>>
>>>> und es kommt die Fehlermeldung '91'. Objektvariable oder
>>>> With-Blockvariable nicht festgelegt.
>>> ...

>>> Es fehlt der Abschluss des If-Then-Konstruktes:
>>>
>>> If Me.Recordset.RecordCount = 0 Then
>>> MsgBox "Ihre Auswahl erzielt keinen Treffer." & vbNewLine & _
>>> "Bitte prüfen Sie ihre Eingabe."
>>> End If
> ...

>> Danke für den Hinweis, jedoch hatte ich einfach beim str-Copy das
>> "End if" nicht mitgenommen, so dass der Fehler dennoch auftritt..
>
> ...sowas viel zum Thema Genauigkeit! Sorry, ich bin heute echt nicht
> so ganz auf der Höhe.... Der Befehl soll auf eine Abfrage zugreifen,
> nicht auf eine Tabelle...

Wie weiter unten schon von Jens angeführt:

Ist das Formular an diese Abfrage gebunden oder nicht?
D.h. steht der Name der Abfrage oder ein SQL-Text in der Eigenschaft
"Datenherkunft" des Formulares?
Wenn nein, ist der Fehler logisch, weil kein Recordset da ist.

Dann läuft aber auch dein anfänglich als erfolgreich geschildertes
Filter-Setzen ins Leere und wäre es Zeit, die Situation nochmal
genauer zu erläutern.

Holger D.

unread,
Apr 22, 2009, 4:24:01 AM4/22/09
to
Hallo,

entschuldigung, ich war einen Tag raus.

Also, hier mein komplettes Vorhaben:

Ich habe ein Formular, in dem auf Basis einer Abfrage Textfelder,
Kombinationsfelder und Listenfelder vorhanden sind. Diese werden eben aus der
Abfrage beim Laden befüllt.

Wenn der Benutzer nun Dinge in den Textfelder einträgt oder eine Auswahl bei
den Kombinationsfelder bzw. Listenfeldern trifft und dann auf "weiter"
klickt, so öffnet sich ein neues Formular. Dieses Formular soll dann nur noch
die jenigen Datensätze anzeigen, die der vorherigen Auswahl entspricht. Das
funktioniert auch gut mit dem Filterkriterium.

Das ist der Code, der bei Betätigen auf "weiter" abgearbeitet wird:

strFilter2 = strFilter

If Me.Maschinenauswahl.Value <> "" Then
strFilter2 = strFilter2 & _
" AND Maschinentyp = '" & Me!Maschinenauswahl & "' "
End If

If strFilter2 = "" Then
strFilter2 = "Verfahren ='Strahlschmelzen' OR Verfahren<> 'Strahlschmelzen'"
End If

If Me.SchichtVon.Value <> "" Then
SchichtVon = Replace(Me!SchichtVon, ",", ".")
strFilter2 = "( " & strFilter2 & " ) " & _
" AND Schichtdicke_Max <= " & SchichtVon
End If

If Me.SchichtBis.Value <> "" Then
SchichtBis = Replace(Me!SchichtBis, ",", ".")
strFilter2 = strFilter2 & _
" AND Schichtdicke_Min >= " & SchichtBis
End If

'If Me.GenauigkeitVon.Value <> "" Then
'GenauigkeitVon = Replace(Me!GenauigkeitVon, ",", ".")
'strFilter2 = strFilter2 & _
'" AND Bauteilgroeße_x = " & GenauigkeitVon
'End If

'If Me.GenauigkeitBis.Value <> "" Then
'GenauigkeitBis = Replace(Me!GenauigkeitBis, ",", ".")
'strFilter2 = strFilter2 & _
'" AND Bauteilgroeße_y = " & GenauigkeitBis
'End If

If Me.BauteilX.Value <> "" Then
BauteilX = Replace(Me!BauteilX, ",", ".")
strFilter2 = strFilter2 & _
" AND Bauteilgroeße_x >= " & BauteilX
End If

If Me.BauteilY.Value <> "" Then
BauteilY = Replace(Me!BauteilY, ",", ".")
strFilter2 = strFilter2 & _
" AND Bauteilgroeße_y >= " & BauteilY
End If

If Me.BauteilZ.Value <> "" Then
BauteilZ = Replace(Me!BauteilZ, ",", ".")
strFilter2 = strFilter2 & _
" AND Bauteilgroeße_z >= " & BauteilZ
End If

stDocName = "Verfahrensauswahl_2"
DoCmd.OpenForm stDocName, , , stLinkCriteria

Dabei ist strFilter und strFilter2 als public deklariert und funktioniert
auch übergreifend.

Beim Laden des nächsten Formulars steht dann:

Private Sub Form_Load()

If strFilter2 = "" Then


strFilter2 = "Verfahren <> 'Strahlschmelzen' OR Verfahren = 'Strahlschmelzen'"

End If

MsgBox strFilter2


Me.Filter = strFilter2
Me.FilterOn = True


Me.ListeVerfahren.RowSource = "SELECT DISTINCT Verfahren " & _
"FROM Abfrage_Gesamt " & _
"WHERE " & strFilter2

Me.Material.RowSource = "SELECT DISTINCT Material " & _
"FROM Abfrage_Gesamt " & _
"WHERE " & strFilter2
Me.ListeMaschinen.RowSource = "SELECT DISTINCT Maschinentyp " & _
"FROM Abfrage_Gesamt " & _
"WHERE " & strFilter2

'ListeSortieren Me.ListeMaschinen

'ListeSortieren Me.ListeVerfahren

End Sub

Nun möchte ich aber beim Laden abfragen, ob überhaupt Datensätze bei der
zuvor geführten Eingabe vorhanden sind. Wenn nicht, so erscheint eine MsgBox
und die Prozedur wird zurück geführt.

Und genau dieser Schritt, also das abfragen, ob in der Abfrage
(Abfrage_Gesamt) mit dem strFilter2 Datensätze vorhanden sind, funktioniert
bei mir nicht.


Danke nochmals für die Hilfe... Ich weiß, ich bin ein schwerer Fall. ;-)

Gruß,
Holger

Karl Donaubauer

unread,
Apr 22, 2009, 4:54:46 AM4/22/09
to
Holger D. wrote:
> ...

> Ich habe ein Formular, in dem auf Basis einer Abfrage Textfelder,
> Kombinationsfelder und Listenfelder vorhanden sind. Diese werden eben aus
> der Abfrage beim Laden befüllt.

Das hier betrifft unsere (entscheidende) Nachfrage, und die ist mit


"aus der Abfrage beim Laden befüllt."

noch immer nicht eindeutig beantwortet, nämlich ob dieses Formular
gebunden ist oder nicht. Ich hatte auch noch versucht, es deutlicher
anhand der Eigenschaften zu erfragen.

> Wenn der Benutzer nun Dinge in den Textfelder einträgt oder eine Auswahl
> bei den Kombinationsfelder bzw. Listenfeldern trifft und dann auf "weiter"
> klickt, so öffnet sich ein neues Formular. Dieses Formular soll dann nur
> noch die jenigen Datensätze anzeigen, die der vorherigen Auswahl
> entspricht. Das funktioniert auch gut mit dem Filterkriterium.
>
> Das ist der Code, der bei Betätigen auf "weiter" abgearbeitet wird:
>
> strFilter2 = strFilter
>
> If Me.Maschinenauswahl.Value <> "" Then
> strFilter2 = strFilter2 & _
> " AND Maschinentyp = '" & Me!Maschinenauswahl & "' "
> End If
>
>
> If strFilter2 = "" Then
> strFilter2 = "Verfahren ='Strahlschmelzen' OR Verfahren<>
> 'Strahlschmelzen'"
> End If

Wenn man ein Kriterium braucht, das sicher alle Datensätze bringt,
verwendet man üblicherweise: 1=1
Damit bremst man die Geschichte nicht durch unnötige Vergleiche
mit Feldern.

> ...


> stDocName = "Verfahrensauswahl_2"
> DoCmd.OpenForm stDocName, , , stLinkCriteria

Ok, dann vermute ich mal, dass das filternde Formular ungebunden
und das hier geöffnete Formular an etwas anderes gebunden ist.

> Dabei ist strFilter und strFilter2 als public deklariert und funktioniert
> auch übergreifend.
>
> Beim Laden des nächsten Formulars steht dann:
>
> Private Sub Form_Load()
>
> If strFilter2 = "" Then
> strFilter2 = "Verfahren <> 'Strahlschmelzen' OR Verfahren =
> 'Strahlschmelzen'" End If

s.o.

> ...


> Me.ListeVerfahren.RowSource = "SELECT DISTINCT Verfahren " & _
> "FROM Abfrage_Gesamt " & _
> "WHERE " & strFilter2

>...


> Nun möchte ich aber beim Laden abfragen, ob überhaupt Datensätze bei der
> zuvor geführten Eingabe vorhanden sind. Wenn nicht, so erscheint eine
> MsgBox und die Prozedur wird zurück geführt.

Du kannst vor diesen Zuweisungen sowas veranstalten:

Dim rs As DAO.Recordset
Set rs = Currentdb.OpenRecordset("SELECT Verfahren " & _
"FROM Abfrage_Gesamt " & _
"WHERE " & strFilter2)

If rs.BOF Then


MsgBox "Ihre Auswahl erzielt keinen Treffer." & vbNewLine & _
"Bitte prüfen Sie ihre Eingabe."
End If

s.a. Datensätze zählen
www.donkarl.com?FAQ6.17

--
HTH

Holger D.

unread,
Apr 22, 2009, 5:27:02 AM4/22/09
to
SUUPPEERR!!
Danke für die Hilfe. Genau so habe ich mir das vorgestellt und es
funktioniert wunderbar!

Danke nochmals für die Hilfe und vor allem für die Ausdauer!!!

Gruß,
Holger

0 new messages