PDA

Vollständige Version anzeigen : Suche mit Sternchen bringt beim zweiten zugriff probleme


WDKA-Jürgen
17.10.2007, 14:28
Hallo zusammen,
ich habe mir ein Suchformular gebastelt, das auf ungebundenen Texrfeldern und Kombinationsfeldern besteht.

wenn ich jetzt über einen Button die suche starte, wird den Suchfeldern, die keine Eingabe erhalten haben, über die Bedingung IF isnull (kombifeld) then me.kombifeld = "*" ein "*" übergeben.

Die Suche klappt so einwandfrei.
nur wenn ich jetzt ein zweites mal die Suche benutzen will, stehen noch in den ungebundenen Kombifelder die Sternchen drin. Dadurch erhalte ich dann die Fehlermeldung, das entweder Text in ein numeriches Fed eingegeben worden ist usw.

Ich kann die Felder aber nach dem Start der Suche nicht wieder leeren, da ja dann ein evtl. ausdruck keine Abfragekriterien mehr hat. Weiß jemand wo ich die Standardfehlermeldung von ausschalten kann.

habe selber schon "bei nicht in liste", "beim Hingehen" , "beim fokuserhalt" usw ausprobiert aber leider keine Lösung gefunden

mfg

Jürgen

WDKA-Jürgen
17.10.2007, 14:45
ich habe jetzt selber ne Lösung gefunden. Ist zwar nicht das optimal aber es klappt.
Wenn ich jetzt den Bericht schließe frage ich ab ob das Formular geöffnet ist. Wenn ja werden dann von da aus die Suchkriterien wieder geleert

mfg

Jürgen

Josef P.
17.10.2007, 14:47
Kannst du nicht bei Zusammensetzen der Kriterien für die Suche auf leere Felder reagieren?
Das hätte dann sogar den Vorteil, dass du dann diese Feld nicht an den Filter weitergibst und daher sogar Felder mit NULL gefunden werden.
... außerdem: was machst du wenn kein Text sondern eine Zahl aus dem Kombinationsfeld verwendet werden soll?

Wie und wo verwendest du dein Suchformular?

WDKA-Jürgen
17.10.2007, 14:57
Hallo Josef,
ich reagiere ja beim klicken auf den Button "Suche Starten" auf die leeren Suchfelder.
Da frage ich ja ab ob da ein Wert eingegeben wurde. Wenn nein, bekommt er ein "*"

in einer grafischen Abfrage beziehe ich mich dann über wie Formulare![Formularname]![Suchfeld]
Das können in der Abfrage bis zu 15 Felder werden nach denen gesucht werden soll.
Der Bericht dürfte auch nur von diesem Suchformular geöffnet werden. Dann kann ich es ja wie in #2 beschrieben machen.
Notfalls kann ich ja immer noch die Kriterien Public Variablen übergeben und habe, ja dann die Möglichkeit die eingegebenen Kriterien sofort zu löschen.

mfg

Jürgen

Josef P.
17.10.2007, 15:07
Hallo Josef,
ich reagiere ja beim klicken auf den Button "Suche Starten" auf die leeren Suchfelder.
Da frage ich ja ab ob da ein Wert eingegeben wurde. Wenn nein, bekommt er ein "*"
und ich frage mich eben: wozu? ;)
Du könntest doch bei "Suche Starten" den Where-Ausdruck zusammensetzen und diesen weiterverwenden.
z.B. an den Bericht weitergeben oder Parameter an das Querydef weitergeben usw.

ebs17
17.10.2007, 16:03
Wie schon öfter zu diesem Thema würde ich die Beispieldatenbank SEM-Suchformular (http://s-e-m.ch/temp/SEM_Suchformular.zip) von jmc empfehlen (hat mir sehr geholfen).
Hier wird genau das gemacht, was Josef in #5 anspricht.

WDKA-Jürgen
17.10.2007, 18:28
Hallo Josef, hallo Ebergatd,
ihr habt mich mit dem Beispiel von Eberhard überzeugt.
Ich habe bisher immer nach der "klassischen" Variante gearbeitet, ne grafische Abfrage für einen Bericht in der ich dann immer mit
wie Formulare![Formularname]![Suchfeld] zugriff.
Habe nur ab und zu, das heißt wenn nur 2-3 Suchbegriffe vorhanden waren mit eurem schema gearbeitet. Auf diese Art und weise wird auch der Wust an Abfragen aufhören.

Dann werde ich mal in Zukunft versuchen eure Methode umzusetzen.

mfg

Jürgen

WDKA-Jürgen
22.10.2007, 10:17
Hallo zusammen,
ich habe eure Tips angenommen und stoße leider beim ausführen auf Probleme. Diese zwei Felder sind Textfelder.
'Werte für Suchkriterien
If IsNull(Suche_Flurstück) Then Me.Suche_Flurstück = "*"
If IsNull(Suche_Flur) Then Me.Suche_Flur = "*"
If IsNull(Suche_Gemarkung) Then Me.Suche_Gemarkung = "*"
If IsNull(Suche_Gemeinde) Then Me.Suche_Gemeinde = "*"


Dim StrFilter As String
StrFilter = ("[Flurstück] like '" & Suche_Flurstück & "'")
StrFilter = StrFilter & ("[Flur] like '" & Suche_Flur & "'")


DoCmd.ApplyFilter , StrFilter


'Variablen werte zuweisen
AA = Forms![3000 Datenauswertung].SchaltflächeA.Tag
BB = Forms![3000 Datenauswertung].SchaltflächeB.Tag
CC = Forms![3000 Datenauswertung].SchaltflächeC.Tag
DD = Forms![3000 Datenauswertung].SchaltflächeD.Tag
EE = Forms![3000 Datenauswertung].SchaltflächeE.Tag
FF = Forms![3000 Datenauswertung].SchaltflächeF.Tag
GG = Forms![3000 Datenauswertung].SchaltflächeG.Tag
HH = Forms![3000 Datenauswertung].SchaltflächeH.Tag
II = Forms![3000 Datenauswertung].SchaltflächeI.Tag
JJ = Forms![3000 Datenauswertung].SchaltflächeJ.Tag
KK = Forms![3000 Datenauswertung].SchaltflächeK.Tag


'Berichtauswahl

'AA Grundstücke
If AA = "ja" Then
DoCmd.OpenReport "3001 Grundstücke", acViewPreview, , StrFilter
End If

mit diesem Code erhalte ich die Fehlermeldung "Reservierter Fehler 3075
bei nur einer Zeile im strFilter klappt die Abfrage.
ich vermute es liegt an dem Sternchen
was mache ich falsch ???

mfg

Jürgen

Josef P.
22.10.2007, 10:31
Es fehlt ein AND:
StrFilter = StrFilter & " AND [Flur] like '" & Suche_Flur & "'"

BTW: mit * werden nicht alle DS angezeigt, sondern nur jene, bei denen auch Werte im jeweiligen Feld vorhanden sind. DS mit NULL-Feldern werden herausgefiltert. Daher würde ich den Filter einfach auslassen, wenn im Suche_xxx-Feld kein Wert steht.

z.B.
If len(Me!Suche_Flurstück)>0 Then
StrFilter = StrFilter & " AND [Flurstück] like '" & Replace(Me!Suche_Flurstück,"'","''") & "'"
end if
If len(Me!Suche_Flur)>0 Then
StrFilter = StrFilter & " AND [Flur] like '" & Replace(Me!Suche_Flur,"'","''") & "'"
end if
'...

IF len(StrFilter)>0 then
'1. "AND" wegschneiden:
StrFilter = mid(StrFilter,5)

'Filter anwenden
me.filter = StrFilter
me.filteron = true
else
me.filteron = false
me.filter = vbnullstring
end if
(nur Luftcode, wird aber hoffentlich einigermaßen passen. ;))

ebs17
22.10.2007, 10:32
Verwende im Kriterium Like statt "=" für das Sternchen.

WDKA-Jürgen
22.10.2007, 10:52
hallo Ebs, hallo Josef,
danke für eure Hilfe. das hat so geklappt.

mfg

Jürgen

WDKA-Jürgen
22.10.2007, 12:25
nochmal eine nachfrage,
muss bei diesem Code für Zahlenformate die Hochkomma weg oder kann der so stehen bleiben ?
bei teste hatte dieser code geklappt. Bin mir aber nicht sicher, da wie gesagt ja normalerweise bei zahlenfelder dier Hochkomma weg kommen

mfg

Jürgen

Josef P.
22.10.2007, 12:50
Bei Zahlen-Feldern keine Hochkommas setzen, da sie sonst als Text interpretiert werden.
Falls du Dezimalzahlen verwendest: immer per STR$(zahl) in Text umwandeln, damit es keine Problem mit dem Dezimaltrennzeichen gibt.

und wieder einmal ein kleiner Tipp nebenbei. ;)
Erstelle dir SQL-Parameter-Umwandlungsfunktionen wie:
Public Function getSQLString_Number(vValue As Variant) As String
getSQLString_Number = Trim(str(vValue))
End Function
'oder
Public Function getSQLString_Text(vValue As String) As String
Dim strText As String
strText = Replace(strText, "'", "''")
getSQLString_Text = "'" & strText & "'"
'oder, falls keine Begrenzung per ' zurückgegeben werden soll:
'getSQLString_Text = strText
End Function


damit sieht dann die dynamische SQL-Text-Generierung so aus:
strSQL = "SELECT .... FROM Tabelle " & _
" WHERE Textfeld like " & getSQLString_Text("dein Text der auch ' enthalten darf") & _
" AND Zahlenfeld = " & getSQLString_Number(1.2334)

BTW: auch in Access gibt eine eingebaute Funktion (BuildCriteria), die etwas ähnliches erledigt, ich nutze die nur nicht, da sie oftmals etwas "unberechenbar" ist.

WDKA-Jürgen
05.11.2007, 09:33
Hallo Josef,
bin gerade dabei meine Datenbanken umzubauen.
Eine Nachfrage habe ich aber noch.

Datumsfelder behandel ich wie Zahlenfelder ????

mfg

Jürgen