PDA

Vollständige Version anzeigen : IF-Klausel in Filterfunktion!


sergio$HH
26.09.2003, 10:18
Hi Leute,
ich habe ein kleines Problem und ich hoffe ihr könnt mir weiterhelfen.
Ich habe ein Formular Lieferanten, dass ich mit einer Filterfunktion belegt habe.
In ein Textfeld gebe ich z.B.: M* ein und starte den Filter über einen Button. Dies funktioniert auch soweit einwandfrei!
Nun mein Anliegen --> ist für den Suchbegriff kein Datensatz vorhanden wird der Filter trotzdem gesetzt und ich bekomme einen
schönes weises Formular angezeigt, dies möchte der Anwender natürlich nicht. Ich denke, dass ich in den Filter eine "If-Klausel" einbauen muss, jedoch habe ich erst mit VBA angefangen. Ich möchte mich schon mal im voraus bei euch bedanken.



Der Code im Moment:

Private Sub Filter_setzen_Click()

Suchfilter = "[Firma] Like '" & suchen & "*'"
Me.Filter = Suchfilter
Me.FilterOn = True

End Sub
_________________________________________________________
Hier muss ich das irgenwie einbauen??? :( (Mein Vorschlag)

Private Sub Filter_setzen_Click()

Suchfilter = "[Firma] Like '" & suchen & "*'"
Me.Filter = Suchfilter

if Suchfilter > 0 Then
Me.FilterOn = True
else
Debug.Print MsgBox("Es ist kein Datensatz zu diesem Suchbegriff
vorhanden?", vbOKOnly, "Datenbanksystem C&P")
end if
end sub

Bekomme es leider noch nicht hin!!!
_________________________________________________________

Private Sub Filter_entfernen_Click()

On Error GoTo Err_Filter_entfernen_Click
DoCmd.DoMenuItem acFormBar, acRecordsMenu, 3, , acMenuVer70
Exit_Filter_entfernen_Click:
Exit Sub
Err_Filter_entfernen_Click:
MsgBox Err.Description
Resume Exit_Filter_entfernen_Click

Rainer Simon
26.09.2003, 10:24
Hallo Sergio,

vor dem Setzen Deines Filters kannst Du in einer Abfrage die Anzahl der Ergbenissätze bestimmen. Ist dieser Wert Null wird der Hinweis angezeigt und der Filter nicht gesetzt.

Gruß Rainer

sergio$HH
26.09.2003, 10:39
Hi Rainer,
erstmal danke für deine schnelle Antwort - aber wie mache ich so etwas.
Ich muss zuerst der Variablen einen Wert zuweisen, nach diesem Wert suchen und das Ergebnis auswerten - dann muss entschieden werden ob der Filter ausgeführt werden soll oder nicht! Aber wie? :confused:

Rainer Simon
26.09.2003, 10:50
Hallo Sergio,

es gibt generell zwei Möglichkeiten.

1.
Bevor der Filter aktiviert werden soll, machst Du per SQL eine Abfrage, welche die Anzahl der selektierten Datensätze ermittelt. Ist diese Anzahl Null, dann kein Filter.

2.
Nachdem der Filter aktiv ist, prüfst Du, ob es Datensätze gibt. Dazu wertest Du im Ereignis Laden (OnLoad) folgenden Wert aus:
if Me.RecordsetClone.RecordCount=0 _

Rainer Simon
26.09.2003, 10:56
Hallo Sergio,

es gibt generell zwei Möglichkeiten.

1.
Bevor der Filter aktiviert werden soll, machst Du per SQL eine Abfrage, welche die Anzahl der selektierten Datensätze ermittelt. Ist diese Anzahl Null, dann kein Filter. Ist aufwendiger, aber ich halte dies für "eleganter". Vielleicht reicht Dir ja die Nummer 2.

2.
Nachdem der Filter aktiv ist, prüfst Du, ob es Datensätze gibt. Dazu wertest Du im Ereignis Laden (OnLoad) folgenden Wert aus:
if Me.RecordsetClone.RecordCount=0 _
then
Meldung
Filter ausschalten
Prozedur verlassen
endif

Gruß Rainer

sergio$HH
26.09.2003, 11:37
Hi Rainer,
irgendwie bekomme ich es nicht gebacken. Der 2. Lösungsweg filtert das Fromular und gibt die Datensätze aus - dann wird überprüft wieviel Datensätze enthalten sind - sollte kein Datensatz enthalten sein wird der Filter wieder entfernt. Dies bekomme ich leider nicht hin! wo und wie muss ich die Bedingung einsetzten(OnLoad). Und hast du vielleicht ein Beispiel für den 1. Lösungsweg?

sergio$HH
27.09.2003, 22:30
Hi Leute,
vielleicht kann mir ja bitte noch jemand anderes weiterhelfen! Das Filtern funktioniert ja, aber wenn kein Datensatz vorhanden ist wird nur ein weises Formular angezeigt - statt dem weisen Bildschirm würde ich lieber eine MsgBox ausgeben und den Filter wieder deaktivieren oder erst gar nicht setzen.

Im voraus vielen Dank
sergio$HH :hands:

Rainer Simon
29.09.2003, 05:51
Hallo Sergio,

Beispiel für die erste Variante

'sollte der Filter keinen Datensatz anzeigen, dann Position merken
lngUebergabeJahr = Me.txtJahr
lngUebergabeID = Me.txtID
bytUebergabeID2 = Me.txtID2
strSQL = "SELECT Count(*) AS ANZ "
strSQL = strSQL & "FROM tblPB3001"
strSQL = strSQL & "WHERE (((tblPB3001.tblPB3001_AzE) Like '*" & strSucheNeu & "*'));"
Set recSQL = CurrentDb.OpenRecordset(strSQL)
lngSaetze = 0
lngSaetze = recSQL!ANZ
recSQL.Close
Set recSQL = Nothing

If lngSaetze > 0 _
Then
Me.Filter = "(((tblPB3001.tblPB3001_AzE) Like '*" & strSucheNeu & "*'))"
Me.FilterOn = True
Me.RecordsetClone.Requery
Me.cmdFilterAus.Visible = True
Me.rekBlink.Visible = True
Else
MsgBox "Zu Ihrer Eingabe konnte kein Eintrag gefunden werden.", , "Hinweis"
lngUebergabeJahr = 0
lngUebergabeID = 0
bytUebergabeID2 = 0
End If


Du mußt die SQL-Abfrage entsprechend Deiner Datenquelle anpassen.

Die andere Variante: hier müssen die Anweisungen in das OnLoad-Ereignis des Formulars eingetragen werden, es sollte aber auch nach der Aktualisierung des Formulars funktionieren.

Wenn es nicht funktioniert, kannst Du ja mal den Codeausschnitt mit anhängen.

Gruß Rainer

sergio$HH
29.09.2003, 12:29
Hi Rainer,
ich habe es mit beiden Varianten probiert - leider habe ich noch keine zum Laufen bekommen. Bei der 1. Variante bekomme ich die Fehlermeldung: "Objekt erforderlich"!
Ich habe mal den code und die Fehlermeldung in einem Word-dokument zusammengefasst.

Bis denne
Alex

Rainer Simon
29.09.2003, 12:36
Hallo Sergio,

Deklaration für recSQL muß lauten:
Dim recSQL as DAO.Recordset

Gruß Rainer

sergio$HH
29.09.2003, 13:33
Hi Rainer,
habe dei Deklaration geändert und die MS DAO 3.6 Objekt Library eingebunden. Jedoch bekomme ich einen Laufzeitfehler mit der Nr. 3131 - Syntaxfehler in der From clause.
Kann dies mit der Formatierung des Feldes Firma zusammenhängen?
Der code sieht im Moment wie folgt aus:
____________________________________________________________

Private Sub Filtersetzen_Click()
'Suchfilter = "[Firma] Like '" & suchen & "*'" '<-- Das ist mein alter code
'Me.Filter = Suchfilter
'Me.FilterOn = True

Dim strSQL As String, lngSaetze As String
Dim recSQL As DAO.Recordset
strSQL = "SELECT Count(*) AS ANZ "
strSQL = strSQL & "FROM T_Lieferanten"
strSQL = strSQL & "WHERE ((T_Lieferanten.[Firma]) Like '" & suchen & "*');"
Set recSQL = CurrentDb.OpenRecordset(strSQL)
lngSaetze = 0
lngSaetze = recSQL!ANZ
recSQL.Close
Set recSQL = Nothing

If lngSaetze > 0 _
Then
Me.Filter = "((T_Lieferanten.[Firma]) Like '" & suchen & "*')"
Me.FilterOn = True
Me.RecordsetClone.Requery
'Me.cmdFilterAus.Visible = True
'Me.rekBlink.Visible = True
Else
Debug.Print MsgBox("Es wurde kein passender Datensatz gefunden", vbInformation, "Datenbanksystem C&P")
'lngUebergabeJahr = 0
'lngUebergabeID = 0
'bytUebergabeID2 = 0
End If




End Sub

Rainer Simon
29.09.2003, 14:04
Hallo Sergio,

es fehlt ein Leerzeichen hinter dem Tabellenamen in der Zeile mit dem FROM.

Gruß Rainer

sergio$HH
29.09.2003, 14:11
Hallo Rainer,

es funktioniert! :happy:
ich danke dir nochmal rechtherzlich für deine Hilfe und wünsche dir noch einen schönen Tag.

MfG
Sergio