Herzlichen Dank dafür!
Holger
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
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
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
> 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."
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
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
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
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
Joo, das würde auch eher zur Fehlermeldung passen.
Nur, was filtert er dann eigentlich? --> Mysteriös. :-)
--
Servus
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.
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
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
Danke nochmals für die Hilfe und vor allem für die Ausdauer!!!
Gruß,
Holger