PDA

Vollständige Version anzeigen : Formularfeld in Abfrage Kriterium


Franz00
18.10.2011, 11:44
Hallo zusammen,

ich habe in einem Formular ein ungebuntetes Textfeld, welches über die Funktion "DLookup" fülle. Dieses Textfeld habe in einer Abfrage als Kriterium eingebunden [Formulare]![frm_Haupt]![txtOrt].
Wenn jetzt in das Textfeld "Hamburg" eingetragen wird, werden alle Datensätze in der Abfrage von Hamburg angezeigt. Wenn aber z.b. "*" oder "H*" über die Funktion "DLookup" in das Textfeld eingetragen
wird kein Datensatz beim Aufruf der Abfrage angezeigt. Woran liegt das?

Gruß Franz

Atrus2711
18.10.2011, 11:52
Hi,

eine Gleichheitssuche mit Platzhalter ist sinnlos, da der Platzhalter nicht als solcher erkannt wird. Platzhalter haben nur mit LIKE Sinn. Bau also deine Bedingun entsprechend um, so dass etwas in der Art herauskommt: Ort LIKE H*

Franz00
18.10.2011, 12:39
Hallo,
ok dann macht es keine Sinn über ein Formularfeld die Abfrage auszuführen. Beim öffnen des Berichts könnte man je nach User eine andere Datensatzherkunft wählen und dann als VBA direkt das Kriterium hinterlegen. Würde das gehen?
Gruß Franz

Atrus2711
18.10.2011, 12:47
Das hat genausoviel Sinn wie bisher die Suche nach Gleichheit. Es ist nur ein anderer Vergleichsoperator.

Beim öffnen des Berichts könnte man je nach User eine andere Datensatzherkunft wählen und dann als VBA direkt das Kriterium hinterlegen. Würde das gehen?
Von Userbezug war bisher keine Rede, daher weiß ich nicht, was du da tust oder vorhast. Beschreib mal genauer. Grundsätzlich gehen kann alles, was programmiert ist ;)

Franz00
18.10.2011, 14:40
Könntest Du mir ein Beispiel geben wie ich per VBA die Datensatzherkunft per SQL-String ändern kann? Danke

Gruß Franz

Atrus2711
18.10.2011, 15:06
Z.B. beim Klick auf einen Button im Formular:

Me.Recordsource = "SELECT * FROM DeineTabelle WHERE Ort LIKE '" & Me!txtSuchOrt & "'"
Dabei sollten die Platzhalter dann im Textfeld txtSuchOrt mit drin sein. Du kannst sie aber auch "annehmen":
Me.Recordsource = "SELECT * FROM DeineTabelle WHERE Ort LIKE '*" & Me!txtSuchOrt & "*'"

Franz00
20.10.2011, 09:44
Hallo Martin,
Danke für Deine Antwort.
Bei meinem Bericht ist eine gespeicherte Abfrage hinterlegt. Ich denke das es dann einfacher ist nur ein Kriterium in der Abfrage zu ändern. Ich habe jetzt noch ein anderes Beispiel gefunden. Kannst Du mir einen Tipp geben, wie ich die zusätzlichen Parameter hinterlege. Danke
Gruß Franz

Dim sSQL As String

sSQL = CurrentDb.QueryDefs("NameAbfrage").SQL
' zusätzliche Integration zusätzlicher Parameter
CurrentDb.QueryDefs("NameAbfrage").SQL = sSQL
DoCmd.OpenReport "rptMahnung1", acViewPreview

Atrus2711
20.10.2011, 10:09
Hi,

beide Wege sind gleichwetrtig:

dem Bericht eine neue Datenquelle eintragen (mein Weg)
die Abfrage, deren Namen im Bericht hinterlegt ist, mit einer neuen SQl belegen (der Weg deines Web-Fundstücks).


Es kommt auf das Gleiche heraus. Nicht nur vom Ergebnis, sondern auch von der Arbeit und von der Einfachheit.

Verstandenes ist immer einfach. Wenn du was nicht verstehst, frag doch eifnach nach.

Franz00
20.10.2011, 15:08
Hallo Martin,
da ich eine komplexe Abfrage mit Berechnung habe wäre, wäre für mich einfacher nur das Kriterium der Abfrage zuändern, statt den ganzen SQL-Sting zu hinterlegen. Wie kann ich das Kriterium richtig in dem nachfolgenden Code hinterlegen? Danke. Gruß Franz


Dim sSQL As String
sSQL = CurrentDb.QueryDefs("NameAbfrage").SQL
WHERE MeineTabelle.Ort LIKE '" & Me!txtSuchOrt & "'"
CurrentDb.QueryDefs("NameAbfrage").SQL = sSQL
DoCmd.OpenReport "rptMahnung1", acViewPreview

Atrus2711
20.10.2011, 15:16
Hi,

du kannst nur die gesamte SQL der bestehenden Abfrage neuschreiben. Wenn diese SQL nur im Kriterium variabel sein soll, dann leg die konstanten Teile als Texte im VBA-Programm ab.

Du kanst auch versuchen, die "Rumpfabfrage" ohne Kriterien abzulegen und lediglich das Kriterium anzuhängen. Das geht allerdings nur, wenn das Kriterium der letzte Teil der Abfrage wird, was nicht immer der Fall ist.

Dann wäre der Ansatz etwa:
dim db as dao.database
dim qdf as dao.QueryDef
Set db = currentdb
Set qdf = db.Querydefs("DeineAbfrage")
qdf.SQL = qdf.SQL & " WHERE Feld = 4712" 'Anhängen der Bedingung; Bedingung ggf. vorher in Stringvariable montieren
Set qdf = nothing
Set db = nothing

Franz00
21.10.2011, 10:10
Hallo Martin,
Danke für den Ansatz. Leider klappt das mit dem SQL String noch nicht. Ich bekomme den Laufzeitfehler 3129, unzulässige SQL Anweisung. Wo liegt der Fehler? Danke. Gruß Franz

dim db as dao.database
dim qdf as dao.QueryDef
dim SQLString as String
SQLString = "tab_Ort.Stadt"

Set db = currentdb
Set qdf = db.Querydefs("MeineAbfrage")
qdf.SQL = qdf.SQL & " WHERE SQLString Like "H*"
Set qdf = nothing
Set db = nothing
DoCmd.openReport "MeinBericht", acViewPreview

Atrus2711
21.10.2011, 10:22
Hi,

zum einen kollidieren die Anführungszeichen der VBA-Textverkettung mit denen der SQL-Textkennzeichnung. Die Rettung: Hochkommas.
qdf.SQL = qdf.SQL & " WHERE SQLString Like 'H*'"

Zum anderen klingt SQL-String nicht wie ein Feldname. Die WHERE-Klausel kann nur mit Feldnamen oder Formeln umgehen, die in den benutzten Tabellen der Abfrage vorkommen. Bisher hast du ja das Feld Ort untersucht. Was soll SQLString denn sein?

Franz00
21.10.2011, 10:52
Hallo Martin,
ok, die Namensgebung SQLString war unglücklich. Jetzt bekomme ich den Laufzeitfehler 3142, Zeichen nach Ende der SQL-Anweisung gefunden. Wo liegt jetzt noch der Fehler? Danke. Gruß Franz

dim db as dao.database
dim qdf as dao.QueryDef
dim KriteriumString as String
KriteriumString = "tab_Ort.Stadt"

Set db = currentdb
Set qdf = db.Querydefs("MeineAbfrage")
qdf.SQL = qdf.SQL & " WHERE KriteriumString Like 'H*'"
Set qdf = nothing
Set db = nothing
DoCmd.openReport "MeinBericht", acViewPreview

Atrus2711
21.10.2011, 11:20
Die bestehende Abfrage hat vermutlich ein Semikolon am Ende. Das ist das SQL-Ende-Zeichen. Dahinter darf nix kommen, kommt aber durch das Anfügen der Bedingung. Nimm das Semikolon in der gespeicherten Abfrage raus (es ist eh optional).

Außerdem ist die Stringvariable nicht richtig eingebettet. Richtig sollte das lauten:
qdf.SQL = qdf.SQL & " WHERE " & KriteriumString & " Like 'H*'"

Und: es wird ja wohl nicht immer nach H* gesucht. Sollte da nicht ein Bezug auf das Such-Textfeld rein? *hint hint*

Franz00
21.10.2011, 11:48
Hallo Martin,
bekomme mit deinem Code immer noch die gleiche Fehlermeldung: Zeichen nach Ende der SQL-Anweisung gefunden. Der Bezug auf das Such Textfeld ist ja Feldname "Stadt" in der Tabelle "tab_Ort", welches ich ja im KriteriumString angegeben habe. Hast Du noch eine Idee, wo der Fehler sein könnte. Danke
Gruß Franz

Maxel
21.10.2011, 12:09
Hallo Franz,

hast Du den das eventuelle Semikolon entfernt?
qdf.SQL = REPLACE(qdf.SQL, ";", "") & " WHERE KriteriumString Like 'H*'"

Atrus2711
21.10.2011, 12:09
Hi,

lass an der Stelle qdf.SQL = ... mal anhalten (Haltepunkt, F9), drücke Strg+G und gib im entstehenden Direktfenster ein:
? qdf.SQL & " WHERE " & KriteriumString & " Like 'H*'"
und poste das Ergebnis.

Der Bezug auf das Such Textfeld ist ja Feldname "Stadt" in der Tabelle "tab_Ort",
Ich meinte den Wert, den du suchst. Das H* steht da "fest". Das soll soch sicher aus einem Formulartextfeld kommen. Aber eins nach dem anderen.