Hallo,
Ich möchte gerne ein Formular mit einem Suchfeld erstellen. In einem Unterformular sollen alle Datensätze (Kundendaten) angezeigt werden und anhand des eingegebenen Suchwort (Nachname) gefiltert werden.
Die Filterung soll bereits beginnen wenn ich Buchstabe für Buchstabe eingebe (müsste das Ereignis "OnChange" sein)
Habe mir ein paar Gedanken über die Umsetzung gemacht. Ich gehe davon aus dass man einen String zusammenbasteln soll für die Abfrage. Die Abfrage sieht in etwa so aus:
SELECT K.Name, K.Vorname
FROM Kontakte AS K
WHERE K.Name LIKE '...*'
Hinter dem LIKE würde die eingegebenen Buchstaben mit dem Jokerzeichen (*) kommen.
Was mir bei meinen Überlegungen fehlt ist wie ich diese Filterung (falls korrekt) auf das Unterformular anwenden könnte. Eine Umsetzung anhand diesem Lösungsvorschlag (http://www.donkarl.com/FAQ/FAQ4Formulare.htm#4.4)klappte nicht wie gewünscht.
Danke sehr,
Gruß,
AllenWalker
Hallo,
es soll ja auch gefiltert und nicht gesucht werden...
Sub Suchfeld_Change()
Me!Unterform_Steuerelementname.Form.Recordsource = "SELECT [Name], Vorname FROM Kontakte WHERE [Name] LIKE '" & Me!Suchfeld.Text & "*'"
End Sub
Danke sehr für deine Hilfe.
Die Codezeile habe ich für die 3 Suchfelder eingefügt und angepasst aber glaube habe noch einen kleinen Fehler drin.
Im Anhang befindet sich ein Screenshot des Problems und folgende Codezeilen habe ich bei den Textfeldern hinterlegt.
Private Sub tbNachnameSuche_Change()
Me!SucheKontakteSub.Form.RecordSource = "SELECT [kliName], kliVorname, kliOrt FROM Kontakte WHERE [kliName] LIKE '" & Me!tbNachnameSuche.Text & "*'"
End Sub
Private Sub tbVornameSuche_Change()
Me!SucheKontakteSub.Form.RecordSource = "SELECT kliName, [kliVorname], kliOrt FROM Kontakte WHERE [kliVorname] LIKE '" & Me!tbVornameSuche.Text & "*'"
End Sub
Private Sub tbWohnortSuche_Change()
Me!SucheKontakteSub.Form.RecordSource = "SELECT kliName, kliVorname, [kliOrt] FROM Kontakte WHERE [kliOrt] LIKE '" & Me!tbWohnortSuche.Text & "*'"
End Sub
Danke sehr,
Gruß,
AllenWalker
[Anhang gelöscht durch Administrator]
Hallo
Aus meiner Sicht solltest du das als mehrstufigen Filter aufbauen. Zum Verständnis deiner Aufgabe:
Im ersten Feld Nachname suchst du alle Nahnamen mit "H"
Darauf aufbauen sollten im zweiten Feld nur alle mit "Peter" gefiltert werden
Was im Dritten Feld Wohnort dann in deinem Fall "Frankfurt" übrig bleibt, würde es mehre "H, Peter" in mehren Wohnorten geben so ist hier nochmals eine Auswahl zu treffen.
Hallo,
es ist kein Fehler im Code zu entdecken.. zumindest sehe ich keinen.
Anmerkung zu den Eckklammern: Die Eckklammern sind nur dort nötig, wo ein reserviertes Wort verwendet wird ("Name" im ersten Post) . Damit wird Access bekannt gemacht, dass es sich um einen Objektnamen handelt und nicht eben um ein reserviertes Wort, das eine andere Bedeutung für Access darstellt ( z. B: der Name einer Methode/Funktion oder einer Eigenschaft.
Die Suchfunktion arbeitet mit unabhängigen Textfeldern , so dass immer nur die Spalte gefiltert wird, bei dessen Suchfeld gerade die Eingabe erfolgt. Stapi hat für abhängiges Suchen ja einen Vorschlag gebracht..
Aufbauend auf die Antwort von Stapi habe ich versucht die mehrstufige Filterung um zu setzen aber ohne Erfolg.
Me!SucheKontakteSub.Form.RecordSource = "SELECT kliName, [kliVorname], kliOrt FROM Kontakte WHERE [kliName] LIKE '" & Me!tbNachnameSuche.Text & "*' AND [kliVorname] LIKE '" & Me!tbVornameSuche.Text & "*'"
Bekomme bei dieser Zeile den folgenden Fehler
Zitat
You can't reference a property or method for a control unless the control has the focus.
Die Bedeutung der Eckklammern habe ich nicht ganz verstanden.
Hi
was passiert bei:
Me!SucheKontakteSub.Form.RecordSource = "SELECT kliName, [kliVorname], kliOrt FROM Kontakte WHERE [kliName] LIKE '" & Me!tbNachnameSuche & "*' AND [kliVorname] LIKE '" & Me!tbVornameSuche & "*'"
Harald
Hallo
Ich persönlich würde Kombifelder den Textfeldern vorziehen.
ZitatMe!SucheKontakteSub.Form.RecordSource = "SELECT kliName, [kliVorname], kliOrt FROM Kontakte WHERE [kliName] LIKE '" & Me!tbNachnameSuche.Text & "*' AND [kliVorname] LIKE '" & Me!tbVornameSuche.Text & "*'"
Bei deiner Codezeile müssen alle drei Felder ausgewählt sein, erst dann kann der Filter gesetzt werden. Vorraus gesetzt die gesuchten Namen sind in deiner Tabelle auch vorhanden und so geschrieben wie du sie suchst.
@bahasu
Egal ob das Textfeld Nachname leer ist oder ein Buchstabe eingetippt wurde bewirkt eine Eingabe bei Vorname keine Filterung
@Stapi
Danke für den Hinweis aber würde es auch mit Textfeldern klappen?
Hallo
ZitatDanke für den Hinweis aber würde es auch mit Textfeldern klappen?
Bei Kombifelder kann ich vorgeben "nur Listeneinträge" = ja , das vereinfacht die Suche da nur die Namen oder Wohnorte dir Angezeigt werden die du auch über das Formular in die Tabelle eingegeben hast.
Hallo,
eine abhängige Filterung kann bei Textfeldern sich nur im Form selber auswirken. Die Such-Textfelder habe ja keine einschränkbare "Liste"..
Private Sub tbNachnameSuche_Change()
Me!SucheKontakteSub.Form.RecordSource = "SELECT kliName, kliVorname, kliOrt FROM Kontakte WHERE kliName LIKE '" & Me!tbNachnameSuche.Text & "*' And kliVorname LIKE '" & Me!tbVornameSuche & "*' And kliOrt LIKE '" & Me!tbWohnortSuche & "*'"
End Sub
Private Sub tbVornameSuche_Change()
Me!SucheKontakteSub.Form.RecordSource = "SELECT kliName, kliVorname, kliOrt FROM Kontakte WHERE kliName LIKE '" & Me!tbNachnameSuche& "*' And kliVorname LIKE '" & Me!tbVornameSuche.Text & "*' And kliOrt LIKE '" & Me!tbWohnortSuche & "*'"
End Sub
Private Sub tbWohnortSuche_Change()
Me!SucheKontakteSub.Form.RecordSource = "SELECT kliName, kliVorname, kliOrt FROM Kontakte WHERE kliName LIKE '" & Me!tbNachnameSuche & "*' And kliVorname LIKE '" & Me!tbVornameSuche & "*' And kliOrt LIKE '" & Me!tbWohnortSuche.Text & "*'"
End Sub
Hi,
mein Vorschlag bezog sich auf die Fehlermeldung:
Zitat von: AllenWalker am August 26, 2013, 18:34:03
Bekomme bei dieser Zeile den folgenden Fehler
You can't reference a property or method for a control unless the control has the focus.
Ist der Fehler noch da?
Sind die Namen der Suchfelder und der Tabellenfelder im Formular und in der VBA-Anweisung stimmig?
Harald
@bahasu
Die Fehlermeldung trat nicht mehr auf nachdem ich deine Codezeile eingefügt hatte und die Bezeichnung stimmen überein.
@DF6GL
Danke für deine Hilfe. Es klappt :D
Ich muss diesen alten Thread nochmals ausgraben da ich eine Änderung an dem Suchformular vornehmen möchte.
Anstelle des Textfeldes für den Wohnort, soll eine Auswahl für den Standort anhand einer ComboBox gemacht werden. Die Werte für die ComboBox kommen aus der Tabelle Standorte. Diese Tabelle ist mit der Tabelle Kontakte verknüpft. Wenn ich in das Unterformular bei Standort ein Feld auswähle erscheint auch da eine ComboBox. Das gleiche wenn ich ein Feld in der Tabelle Kontakte bei Standort auswähle. Im Feld Standort in der Tabelle Kontakte ist bei RowSourceType "Table/Query" und bei RowSource "SELECT Standort.ID, Standort.Ort FROM Standort ORDER BY [ID];" eingetragen. Gehe mal davon aus daher kommt auch die ComboBox im Unterformular.
Habe auch für die 3 Felder das Event OnChange angepasst aber bekomme folgende Fehlermeldung:
Zitat
Data type mismatch in criteria expression
Hier ist mein angepasster Quellcode:
Private Sub cbStandortAuswahl_Change()
MsgBox "Auswahl: " & Me!cbStandortAuswahl.ItemData(Me!cbStandortAuswahl.ListIndex)
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte WHERE kliName LIKE '" & Me!tbNachnameSuche & "*' And kliVorname LIKE '" & Me!tbVornameSuche & "*' And KBO = '" & Me!cbStandortAuswahl.ItemData(Me!cbStandortAuswahl.ListIndex) & "*'"
End Sub
Private Sub tbNachnameSuche_Change()
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte WHERE kliName LIKE '" & Me!tbNachnameSuche.Text & "*' And kliVorname LIKE '" & Me!tbVornameSuche & "*' And KBO = '" & Me!cbStandortAuswahl.ItemData(Me!cbStandortAuswahl.ListIndex) & "*'"
End Sub
Private Sub tbVornameSuche_Change()
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte WHERE kliName LIKE '" & Me!tbNachnameSuche & "*' And kliVorname LIKE '" & Me!tbVornameSuche.Text & "*' And KBO = '" & Me!cbStandortAuswahl.ItemData(Me!cbStandortAuswahl.ListIndex) & "*'"
End Sub
Möchte gerne noch vermerken, dass Teile der Datenbank bereits vorgefertigt waren bevor ich die Funktion einbauen möchte.
Danke sehr,
Gruß,
AllenWalker
Hallo,
nach der Schilderung zu urteilen, benutzt Du Nachschlagefelder in der Tabelle... Wirf die raus, die sorgen in den meisten Fällen für Verwirrung und Ärger.
Die Kombifelder im Form bleiben natürlich.
Vermutlich muss es so lauten:
..... Me!tbVornameSuche & "*' And KBO =" & Me!cbStandortAuswahl
Zitat
nach der Schilderung zu urteilen, benutzt Du Nachschlagefelder in der Tabelle... Wirf die raus, die sorgen in den meisten Fällen für Verwirrung und Ärger.
Ich habe in der Tabelle Kontakte die Nachschlagefelder im Feld Standorte entfernt. In den Eigenschaften des besagten Feldes steht bei Lookup - Display Control nun TextBox anstelle von ComboBox. Durch die Relation stehen nun die Fremdschlüssel aus der Tabelle Standorte in den Feldern. Im Unterformular sind diese Nachschlagefelder auch nicht mehr vorhanden und es werden die Fremdschlüssel angezeigt. Wie bekomme ich da wieder die Namen der Standorte hin? Über eine Query?
Zitat
Me!tbVornameSuche & "*' And KBO =" & Me!cbStandortAuswahl
Wenn ich den Quellcode entsprechend anpasse bekomme ich die gleiche Fehlermeldung mit Type mismatch.
Hi
ist Me!cbStandortAuswahl eine Zahl oder ein Text-Feld?
Wenn Text:
... Me!tbVornameSuche & "*' And KBO = '" & Me!cbStandortAuswahl & "'"
Harald
Ich habe in der Tabelle Standort das Feld ID entfernt und die Bezeichnung als Primärschlüssel gesetzt. Die Bezeichnung kommt jeweils nur einmal vor.
Auf dem Suchformular habe ich die Kombobox angepasst und im Quellcode waren die * zuviel wie bahasu es bereits erwähnt hat.
Hi,
Zitat von: AllenWalker am Oktober 13, 2013, 14:24:54
Kann ich das Feld ID nicht löschen und Ort als Primärschlüssel nehmen?
Da wäre eine wunderbare Möglichkeit, Chaos zu produzieren! :(
Stell Dir vor, Du hattest "Duesseldorf" mit "ue" geschrieben und willst es in "Düsseldorf" ändern.
Dann stimmen die Beziehungen nicht mehr.
Harald
Habe die Entfernung des vorherigen Primärschlüssel wieder rückgängig gemacht aber dann kommt wieder die Frage wie ich im Unterformular anstelle des Fremdschlüssels die Bezeichnungen der Standorte gezeigt bekomme?
Hi,
das Kombifeld hat eine Datenquelle, die besteht aus:
- der ID zum Standort und
- der Bezeichnung vom Standort
Im Reiter "Daten" steht bei "gebundene Spalte" = 1
Im Reiter "Format" steht bei:
- Spaltenzahl = 2
- Spaltenbreite: 0; 10 cm ' oder irgendein besser passender Wert
Harald
Es geht nicht um das KombiFeld. Das habe ich bereits richtig dargestellt. Es geht um das Feld Standorte im Unterformular. Da das Unterformular auf die Tabelle Kontakte aufbaut stehen im Feld Standort die Fremdschlüssel durch die Relation mit der Tabelle Standorte. Diese Fremdschlüssel möchte ich durch die Bezeichnung des Standortes ändern.
Hallo,
"Es geht nicht um das KombiFeld."
Es geht (jetzt) um das Kombifeld im Unterformular, das den Standort anzeigen soll...
In welcher Ansicht wird das Unterformular dargestellt? Ist in diesem Formular als Anzeige für den Standort ein Kombifeld eingesetzt?
Wenn so, wie lautet die Datensatzherkunft dieses Kombis?
Lt. den Beschreibungen sollte es so lauten:
SELECT ID, Ort FROM Standort ORDER BY Standort
mit den restlichen Kombi-Einstellungen:
gebundene Spalte: 1
Spaltenanzahl: 2
Spaltenbreiten: 0cm;3cm
Das Ganze funktioniert nur, wenn "KBO" das Fremdschlüsselfeld (das Feld, das den ID-Wert aus "tblStandorte" aufnimmt) ist.
Hatte vergessen anzugeben dass es sich bei dem Feld Standort im Unterformular nach dem Entfernen der Nachschlagefelder in der Tabelle Kontakte um ein Textfeld handelt.
HAllo,
Du beantwortest nicht meine Fragen...
In der Tabelle muss es sich um eine Textfeld handeln, im (Unter)-Formular um ein Kombifeld, wie ich es beschrieben habe...
Es kann sein, dass im Falle der "Datenblattansicht" des Formulars kein Kombifeld angezeigt wird. Ändere dann auf "Endlosform" und erstelle dort wie beschrieben ein Kombifeld für das Standort-ID-Feld (Fremdschlüsselfeld).
Ich habe das wie beschrieben geändert und musste noch die Abfrage etwas anpassen um die Werte aus der Tabelle Kontakte richtig angezeigt zu bekommen.
SELECT ID, Standort
FROM Standorte AS O, Kontakte AS K
WHERE O.ID = K.KBO
ORDER BY Standort;
Die Ansicht des Unterformulars hat sich nach der Beschreibung komplett geändert. Es wird jeweils nur ein Datensatz angezeigt zwischen denen ich wechseln kann. Vorher war dies eine Art Tabellenform mit den 3 Spalten Name, Vorname und Standort. Und wenn ich jetzt eine Eingabe durchführe erhalte ich die Fehlermeldung Type mismatch.
@DF6GL
Ich habe das Feld Standort im Unterformular laut deiner Beschreibung angepasst und habe die SQL Abfrage aus dem vorherigen Post von mir benutzt. Bekomme aber jetzt wieder ein Kombifeld mit Auswahl angezeigt wenn ich in das Feld Standort klicke im Unterformular. Dies ist aber nicht gewollt für die weiteren Aufgaben dieses Formulars.
Hallo,
ZitatDies ist aber nicht gewollt für die weiteren Aufgaben dieses Formulars.
???
habe jetzt keinen Überblick mehr über Deine Sachlage.
Beschreibe nochmal den Istzustand (genau und mit Angaben der jeweiligen SQL-Strings) und was genau erreicht werden soll.
Vielleicht wäre es zielführend, die DB oder eine Demo- DB , die das Verhalten zeigt, hier hochzuladen.
IST-ZustandDas Formular besitzt 5 Suchkriterien nach den sortiert werden kann. Davon sind 2 Kriterien Textfelder (Name, Vorname) und 3 Auswahlfelder (Standort, Aktiv, Kontaktart). Diese Kriterien werden auf das Unterformular angewendet. Im Unterformular wird neben den bereits genannten Feldern noch zusätzlich das Feld für die Mobiltelefonnummer angezeigt.
Für die Suchkriterien gilt beim Event "OnChange" der jeweiligen Elemente der folgende Code:
Private Sub cbAktivArchiv_Change()
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte WHERE kliName LIKE '" & Me!tbNachnameSuche & "*' And kliVorname LIKE '" & Me!tbVornameSuche & "*' AND KBO = " & Me!cbStandortAuswahl & " AND aktivArchiv = " & Me!cbAktivArchiv & " AND KontaktArt = " & Me!cbKontaktart
End Sub
Private Sub cbKontaktart_Change()
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte WHERE kliName LIKE '" & Me!tbNachnameSuche & "*' And kliVorname LIKE '" & Me!tbVornameSuche & "*' AND KBO = " & Me!cbStandortAuswahl & " AND aktivArchiv = " & Me!cbAktivArchiv & " AND KontaktArt = " & Me!cbKontaktart
End Sub
Private Sub cbStandortAuswahl_Change()
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte WHERE kliName LIKE '" & Me!tbNachnameSuche & "*' And kliVorname LIKE '" & Me!tbVornameSuche & "*' AND KBO = " & Me!cbStandortAuswahl & " AND aktivArchiv = " & Me!cbAktivArchiv & " AND KontaktArt = " & Me!cbKontaktart
End Sub
Private Sub tbNachnameSuche_Change()
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte WHERE kliName LIKE '" & Me!tbNachnameSuche & "*' And kliVorname LIKE '" & Me!tbVornameSuche & "*' AND KBO = " & Me!cbStandortAuswahl & " AND aktivArchiv = " & Me!cbAktivArchiv & " AND KontaktArt = " & Me!cbKontaktart
End Sub
Private Sub tbVornameSuche_Change()
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte WHERE kliName LIKE '" & Me!tbNachnameSuche & "*' And kliVorname LIKE '" & Me!tbVornameSuche & "*' AND KBO = " & Me!cbStandortAuswahl & " AND aktivArchiv = " & Me!cbAktivArchiv & " AND KontaktArt = " & Me!cbKontaktart
End Sub
SOLL-Zustand
- Der Inhalt der Auswahlfelder (Standort, Aktiv, Kontaktart) basiert auf der jeweiligen Tabelle (Standort, Aktiv, Kontaktart). Neben diesem Inhalt soll eine Art "Default" Wert genutzt werden, welcher alles aus der Tabelle anzeigt. Beispiel: Wurde bei Aktiv "Ja" gewählt werden alle aktiven angezeigt und wenn "Default" gewählt wird werden alle aktiven und inaktiven angezeigt. Momentan wird eine Fehlermeldung ausgegeben wenn Ein Auswahlfeld leer ist.
- Das Feld "Standort" im Unterformular soll unsichtbar sein.
- Anstelle des Fremdschlüssels bei "Aktiv" und "Kontaktart" soll der entsprechende Inhalt angezeigt werden.
Danke sehr,
Gruß,
AllenWalker
Hallo,
-- wie lauten die Datensatzherkünfte der 3 Auswahlkombis?
-- Kann das Feld "Standort" im UFO nicht "unsichtbar" gesetzt werden (oder, falls vorhanden, nicht aus der Form-Abfrage entfernt werden)?
-- einfach auch für diese UFO-Felder je ein Kombi verwenden...
Zitat
wie lauten die Datensatzherkünfte der 3 Auswahlkombis?
Die Datenherkunft der 3 Auswahlkombis ist eine Tabelle.
Feld - TabelleStandort - Standort
Aktiv - AktivArchiv
Kontaktart - KontaktArt
Zitat
Kann das Feld "Standort" im UFO nicht "unsichtbar" gesetzt werden (oder, falls vorhanden, nicht aus der Form-Abfrage entfernt werden)?
In der Entwurfsansicht kann ich die Eigenschaft "Visible" auf No setze aber wenn ich die Ansicht wechsle bleibt das Feld "Standort" trotzdem sichtbar. Brauche ich das Feld nicht wegen der Suchkriterie Standort?
Zitat
einfach auch für diese UFO-Felder je ein Kombi verwenden...
Für die weitere Anwendung des Formulares wäre so ein Auswahlfeld im Unterformular irritierend, da man denken könnte man könnte den Wert ändern außer wenn ich die Eigenschaft "Enable" auf "No" setze.
Danke sehr,
Gruß,
AllenWalker
Hallo,
die Datensatzherkunft der Kombis sollte so lauten (jeweils angepasst):
Select StandortID, Standort From Standort Order BY Standort
mit
Spaltenanzahl: 2
Spaltenbreiten: 0cm;2cm
In der Tabelle "Standort" kommt ein weiterer Eintrag hinzu:
StandortID Standort
6 _Alle Der Unterstrich hier soll für ein Leerzeichen stehen ! Der ID-Wert ist hier natürlich beispielhaft
Im Code könnte der SQL-String dann so aussehen (besser bei den Kombis das AfterUpdate()-Ereignis benutzen:
Private Sub cbStandortAuswahl_Afterupdate()
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte WHERE kliName LIKE '" & Me!tbNachnameSuche & "*' And kliVorname LIKE '" & Me!tbVornameSuche & "*' AND (KBO = " & Me!cbStandortAuswahl & " Or " & Me!cbStandortAuswahl & " = 6 ) AND aktivArchiv = " & Me!cbAktivArchiv & " AND KontaktArt = " & Me!cbKontaktart
End Sub
Die "rote" Where-Condition muss natürlich auch in den restlichen SQL-Strings so eingesetzt werden...
Bei den Such-Textfeldern sollte bei der Verwendung des Change-Ereignisses die "Text"-Eigenschaft des akt. Textfeldes verwendet werden:
Private Sub tbNachnameSuche_Change()
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte WHERE kliName LIKE '" & Me!tbNachnameSuche.Text & "*' And kliVorname LIKE '" & Me!tbVornameSuche & "*' AND KBO = " & Me!cbStandortAuswahl & " AND aktivArchiv = " & Me!cbAktivArchiv & " AND KontaktArt = " & Me!cbKontaktart
End Sub
Ich sehe nicht ein , warum ein Feld weiterhin sichtbar sein sollte, wenn dessen Eigenschaft auf "unsichtbar" steht. Außer an der DB (am Formular) ist irgendetwas zerschossen.
Wenn kein Kombi im Ufo benutzt werden soll, kann man:
-- eine verknüpfende Abfrage über alle beteiligten Tabellen für die Datenherkunft des UFOs benutzen und ein Textfeld an das Feld "Standort" binden.
oder
-- ein ungebundenes Textfeld im Detailbereich platzieren, das etwa einen solchen Eintrag hat:
= Dlookup("Standort";"Standort";"StandortID= " & [StandortID])
wobei StandortID das entspr. Feld aus der Datenherkunft des Forms ist.
Zitat
In der Tabelle "Standort" kommt ein weiterer Eintrag hinzu:
StandortID Standort
6 _Alle Der Unterstrich hier soll für ein Leerzeichen stehen ! Der ID-Wert ist hier natürlich beispielhaft
Im Code könnte der SQL-String dann so aussehen (besser bei den Kombis das AfterUpdate()-Ereignis benutzen:
Private Sub cbStandortAuswahl_Afterupdate()
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte WHERE kliName LIKE '" & Me!tbNachnameSuche & "*' And kliVorname LIKE '" & Me!tbVornameSuche & "*' AND (KBO = " & Me!cbStandortAuswahl & " Or " & Me!cbStandortAuswahl & " = 6 ) AND aktivArchiv = " & Me!cbAktivArchiv & " AND KontaktArt = " & Me!cbKontaktart
End Sub
Die "rote" Where-Condition muss natürlich auch in den restlichen SQL-Strings so eingesetzt werden...
Danke sehr für deine Mühe aber kann noch nicht so richtig nachvollziehen in wie fern das bei der Auswahl von dem Eintrag "Alle" alle Datensätze gezeigt werden?
Hallo,
http://www.donkarl.com/?FAQ3.14
Beachte aber auch den letzten Satz in diesem Artikel...
Ich komme gerade etwas aus dem Konzept bei der langen Abfrage für die Elemente (Dropdown und Textfelder) bei den Suchkriterien.
Versuche mit der Beschreibung von DF6GL die Änderungen vorzunehmen aber bekomme eine Fehlermeldung von Access.
Zitat
Run-Time error '2185'
You can't reference a property or method for a control unless the control has focus.
Mein Code für die Dropdown Box bei AktivArchiv
Private Sub cbAktivArchiv_AfterUpdate()
'Kontrolle
MsgBox "SELECT kliName, kliVorname, KBO FROM Kontakte WHERE kliName LIKE '" & Me!tbNachnameSuche.Text & "*' And kliVorname LIKE '" & Me!tbVornameSuche.Text & "*' AND (KBO = " & Me!cbStandortAuswahl & " Or " & Me!cbStandortAuswahl & " = 8) AND (aktivArchiv = " & Me!cbAktivArchiv & " Or " & Me!cbAktivArchiv & " = 3) AND (Kontaktart = " & Me!cbKontaktart & " Or " & Me!cbKontaktart & " = 6)"
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte WHERE kliName LIKE '" & Me!tbNachnameSuche.Text & "*' And kliVorname LIKE '" & Me!tbVornameSuche.Text & "*' AND (KBO = " & Me!cbStandortAuswahl & " Or " & Me!cbStandortAuswahl & " = 8) AND (aktivArchiv = " & Me!cbAktivArchiv & " Or " & Me!cbAktivArchiv & " = 3) AND (Kontaktart = " & Me!cbKontaktart & " Or " & Me!cbKontaktart & " = 6)"
End Sub
Kleine Frage am Rande. Wie kann man nochmal im Code Zeilenbrüche einfügen um den Code etwas lesbarer zu machen bei langen Codezeilen?
Für die korrekte Anzeige der Inhalte im Unterformular anstelle der Fremdschlüssel aus der Tabelle Kontakte, habe ich momentan ein ungebundenes Textfeld für Standort im Unterformular hinzugefügt und als Datenherkunft folgende Zeile eingefügt.
=DLookUp("Standortbezeichnung";"Standort";"ID= " & [ID])
Bekomme als Ergebnis im Unterformular "#Name?" angezeigt.
Danke sehr,
Gruß,
AllenWalker
Hallo,
Private Sub cbAktivArchiv_AfterUpdate()
'Kontrolle
MsgBox "SELECT kliName, kliVorname, KBO FROM Kontakte WHERE " & _
" kliName LIKE '" & Me!tbNachnameSuche & "*' And " & _
" kliVorname LIKE '" & Me!tbVornameSuche & "*' AND " & _
" (KBO = " & Me!cbStandortAuswahl & " Or " & Me!cbStandortAuswahl & " = 8) AND " & _
" (aktivArchiv = " & Me!cbAktivArchiv & " Or " & Me!cbAktivArchiv & " = 3) AND " & _
" (Kontaktart = " & Me!cbKontaktart & " Or " & Me!cbKontaktart & " = 6)"
Me!SucheKontakteDetailSub.Form.RecordSource ="SELECT kliName, kliVorname, KBO FROM Kontakte" & _
" WHERE kliName LIKE '" & Me!tbNachnameSuche & "*' " & _
" And kliVorname LIKE '" & Me!tbVornameSuche & "*' " & _
" AND (KBO = " & Me!cbStandortAuswahl & " Or " & Me!cbStandortAuswahl & " = 8)" & _
" AND (aktivArchiv = " & Me!cbAktivArchiv & " Or " & Me!cbAktivArchiv & " = 3)" & _
" AND (Kontaktart = " & Me!cbKontaktart & " Or " & Me!cbKontaktart & " = 6)"
End Sub
=DLookUp("Standortbezeichnung";"Standort";"ID= " & [ID])
Gibt es im UFO und in der Tabelle ein Feld mit Namen "ID") ?
Danke sehr :) Habe meinen Code entsprechend angepasst aber wenn ich bei einem Kombinationsfeld etwas auswähle und die anderen Kombinationsfelder sind leer kommt eine Fehlermeldung die besagt dass in der Abfrage Elemente fehlen. Ich gehe davon aus dass die Kombinationsfelder Standardwerte enthalten sollen. In diesem Fall wäre es das Feld mit dem Wert "_Alle" (Leerzeichen).
Durch eine Suche habe ich folgendes gefunden aber keins von beiden hat den Standardwert im Kombinationsfeld angezeigt.
Zitat
- =DLookup(" Alle";"Kontaktart")
- =[cbKontaktart].[ItemData](6)
Zitat
=DLookUp("Standortbezeichnung";"Standort";"ID= " & [ID])
Gibt es im UFO und in der Tabelle ein Feld mit Namen "ID") ?
Im Unterformular gibt es kein Feld mit dem Namen "ID". Im Unterformular befinden sich die Felder "Name", "Vorname", "Mobil", "KBO" (Standort), "AktivArchiv" und "Kontaktart". Alle Felder kommen aus der Tabelle "Kontakte". Aus den Vorschlägen ein, zwei Post vorher habe ich das mit dem ungebundenen Textfeld benutzt.
Danke sehr,
Gruß,
AllenWalker
Hallo,
nun, meine Vorschläge sollten halt (im Prinzip) GENAU umgesetzt werden..
Beim Ereignis "Change" eines Kombis/Textfeldes kann (muss) dessen .TEXT- Eigenschaft verwendet werden, beim "AfterUpdate"-Ereignis jedoch nicht....
Wenn bei leeren Feldern Elemente fehlen, dann muss dieser Zustand mit der NZ() oder IsNull()-Funktion abgefangen und ein Ersatzwert bereitgestellt werden.
z. B.:
.
.
" aktivArchiv = " & nz(Me!cbAktivArchiv,3) AND " & _
" Kontaktart = " & nz(Me!cbKontaktart,6) "
.
.
Das alleinige Setzen der Standard-Eigenschaft auf den " ALLE"-Wert (besser: den Primärschlüsselwert für " ALLE" ) eliminiert nicht den Fall, dass der angezeigte Wert manuell gelöscht, d. h. das Kombifeld geleert wird.
Bei solchen Felder, die mit Like '....*' verglichen werden, ist das nicht unbedingt nötig.
Hier:
=DLookUp("Standortbezeichnung";"Standort";"ID= " & [ID])
muss für ID der Name des Primärschlüsselfeldes der Tabelle "Standort" und für ID der Name des Formulartextfeldes, das den Primärschlüsselwert anzeigt, eingesetzt werden.
Irgendwie habe ich etwas falsch verstanden oder falsch programmiert. Bin der Beschreibung von DF6GL gefolgt um über den Eintrag " Alle" im Kombinationsfeld alle Datensätze im Unterformular anzeigen zu lassen. Wenn ich etwas bei einem Kominationsfeld was auswähle bleibt das Unterformular leer obwohl in der Tabelle solche Datensätze enthalten sind und wenn ich bei den Textfelder was eingebe bekomme ich folgenden Fehler.
Zitat
Run-Time error '2185'
You can't reference a property or method for a control unless the control has focus.
Mein Quellcode
Private Sub cbAktivArchiv_AfterUpdate()
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte " & _
" WHERE kliName LIKE '" & Me!tbNachnameSuche & "*'" & _
" AND kliVorname LIKE '" & Me!tbVornameSuche & "*'" & _
" AND KBO = " & Nz(Me!cbStandortAuswahl, 8) & _
" AND aktivArchiv = " & Nz(Me!cbAktivArchiv, 3) & _
" AND KontaktArt = " & Nz(Me!cbKontaktart, 6)
End Sub
Private Sub cbKontaktart_AfterUpdate()
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte " & _
" WHERE kliName LIKE '" & Me!tbNachnameSuche & "*'" & _
" AND kliVorname LIKE '" & Me!tbVornameSuche & "*'" & _
" AND KBO = " & Nz(Me!cbStandortAuswahl, 8) & _
" AND aktivArchiv = " & Nz(Me!cbAktivArchiv, 3) & _
" AND KontaktArt = " & Nz(Me!cbKontaktart, 6)
End Sub
Private Sub cbStandortAuswahl_AfterUpdate()
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte " & _
" WHERE kliName LIKE '" & Me!tbNachnameSuche & "*'" & _
" AND kliVorname LIKE '" & Me!tbVornameSuche & "*'" & _
" AND KBO = " & Nz(Me!cbStandortAuswahl, 8) & _
" AND aktivArchiv = " & Nz(Me!cbAktivArchiv, 3) & _
" AND KontaktArt = " & Nz(Me!cbKontaktart, 6)
End Sub
Private Sub tbNachnameSuche_Change()
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte " & _
" WHERE kliName LIKE '" & Me!tbNachnameSuche.Text & "*'" & _
" AND kliVorname LIKE '" & Me!tbVornameSuche.Text & "*'" & _
" AND KBO = " & Nz(Me!cbStandortAuswahl, 8) & _
" AND aktivArchiv = " & Nz(Me!cbAktivArchiv, 3) & _
" AND KontaktArt = " & Nz(Me!cbKontaktart, 6)
End Sub
Private Sub tbVornameSuche_Change()
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte " & _
" WHERE kliName LIKE '" & Me!tbNachnameSuche.Text & "*'" & _
" AND kliVorname LIKE '" & Me!tbVornameSuche.Text & "*'" & _
" AND KBO = " & Nz(Me!cbStandortAuswahl, 8) & _
" AND aktivArchiv = " & Nz(Me!cbAktivArchiv, 3) & _
" AND KontaktArt = " & Nz(Me!cbKontaktart, 6)
End Sub
Zitat
Hier:
=DLookUp("Standortbezeichnung";"Standort";"ID= " & [ID])
muss für ID der Name des Primärschlüsselfeldes der Tabelle "Standort" und für ID der Name des Formulartextfeldes, das den Primärschlüsselwert anzeigt, eingesetzt werden.
Nochmal zum besseren Verständnis, diese Vorgehensweise war gedacht für ein ungebundenes Textfeld im Unterformular. Aber dann kann ich bei ID keinen Wert übergeben da in dem ungebundenen Textfeld vorher kein Wert enthalten ist.
Danke sehr,
Gruß,
AllenWalker
Hallo,
bezgl. "Property" liegt der Fehler darin, dass im Change-Ereignis eines Such-Textfeldes die Referenz auf NUR DESSEN TEXT-Eigenschaft zulässig , bei den anderen aber die Referenz auf deren VALUE-Eigenschaft (die als "Standard" auch weggelassen werden kann) erforderlich ist.
Private Sub tbNachnameSuche_Change()
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte " & _
" WHERE kliName LIKE '" & Me!tbNachnameSuche.Text & "*'" & _
" AND kliVorname LIKE '" & Me!tbVornameSuche.Text & "*'" & _
" AND KBO = " & Nz(Me!cbStandortAuswahl, 8) & _
" AND aktivArchiv = " & Nz(Me!cbAktivArchiv, 3) & _
" AND KontaktArt = " & Nz(Me!cbKontaktart, 6)
End Sub
Private Sub tbVornameSuche_Change()
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte " & _
" WHERE kliName LIKE '" & Me!tbNachnameSuche.Text & "*'" & _
" AND kliVorname LIKE '" & Me!tbVornameSuche.Text & "*'" & _
" AND KBO = " & Nz(Me!cbStandortAuswahl, 8) & _
" AND aktivArchiv = " & Nz(Me!cbAktivArchiv, 3) & _
" AND KontaktArt = " & Nz(Me!cbKontaktart, 6)
End Sub
Bezgl. von " Alle" liegt ein Logik-Fehler vor. Es muss vor dem Zusammenbau des SQL-Strings der akt. Inhalt aller Kombifelder auf diese Situation hin geprüft und entspr. reagiert werden:
Private Sub cbStandortAuswahl_AfterUpdate()
If Nz(Me!cbStandortAuswahl, 8) = 8 Then '"Alle" ist gewählt oder das Kombifeld ist leer
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte " & _
" WHERE kliName LIKE '" & Me!tbNachnameSuche & "*'" & _
" AND kliVorname LIKE '" & Me!tbVornameSuche & "*'" & _
" AND KBO = " & Nz(Me!cbStandortAuswahl, 8 ) & _
" AND aktivArchiv = " & Nz(Me!cbAktivArchiv, 3) & _
" AND KontaktArt = " & Nz(Me!cbKontaktart, 6)
End Sub
wobei hier nur dieses eine Kombifeld berücksichtigt ist, die anderen müssten ebenfalls (in jeder Ereignisprozedur) geprüft werden. In diesem Fall der voneinander unabhängigen Kombifelder und der Tatsache, dass bei Datentyp Zahl, Long nicht mit dem Like-Operator plus "*" gearbeitet werden kann, wäre es angebracht, den Zusammenbau des SQL_Strings in eine Funktion/Sub auszulagern und dort die Überprüfung aller beteiligten Suchfelder durchzuführen. In den Ereignisprozeduren käme dann lediglich der Aufruf dieser Funktion/Sub zu stehen.
Zitat
Bezgl. von " Alle" liegt ein Logik-Fehler vor. Es muss vor dem Zusammenbau des SQL-Strings der akt. Inhalt aller Kombifelder auf diese Situation hin geprüft und entspr. reagiert werden:
Private Sub cbStandortAuswahl_AfterUpdate()
If Nz(Me!cbStandortAuswahl, Cool = 8 Then '"Alle" ist gewählt oder das Kombifeld ist leer
Me!SucheKontakteDetailSub.Form.RecordSource = "SELECT kliName, kliVorname, KBO FROM Kontakte " & _
" WHERE kliName LIKE '" & Me!tbNachnameSuche & "*'" & _
" AND kliVorname LIKE '" & Me!tbVornameSuche & "*'" & _
" AND KBO = " & Nz(Me!cbStandortAuswahl, 8 ) & _
" AND aktivArchiv = " & Nz(Me!cbAktivArchiv, 3) & _
" AND KontaktArt = " & Nz(Me!cbKontaktart, 6)
End Sub
wobei hier nur dieses eine Kombifeld berücksichtigt ist, die anderen müssten ebenfalls (in jeder Ereignisprozedur) geprüft werden. In diesem Fall der voneinander unabhängigen Kombifelder und der Tatsache, dass bei Datentyp Zahl, Long nicht mit dem Like-Operator plus "*" gearbeitet werden kann, wäre es angebracht, den Zusammenbau des SQL_Strings in eine Funktion/Sub auszulagern und dort die Überprüfung aller beteiligten Suchfelder durchzuführen. In den Ereignisprozeduren käme dann lediglich der Aufruf dieser Funktion/Sub zu stehen.
Bezüglich des rot markierten Satzes zerbreche ich mir etwas den Kopf. Mir fallen da zwei Möglichkeiten ein. Entweder über IF... THEN... ELIF... END IF oder die Inahlte aller Kombifelder in der IF-Abfrage mit ODER zu verknüpfen. Aber mir will nicht einfallen wie ich den SQL-String zusammengebastelt bekomme. Würde der auch durch die IF-Abfragen zusammengebastelt werden?
Keiner eine Idee wie er mir helfen könnte ???
Hallo,
wo ist denn das Problem?
unter Logikproblem habe ich gemeint, dass eine "Alle"-Abfrage mit Hilfe einer " xxx= yyy Or xxx is Null" _Konstruktion innerhalb mehrerer anderer Kriterien nicht so funktioniert, wie es erwartet wird.
Es sollten (müssen) alle Kombinationen von möglichen "NULL"-Situtionen der jeweils anderen Suchfelder über If/Endif oder SelectCase entspr. behandelt werden.
Die Suche habe ich hinbekommen. Im weiteren der Quellcode dazu:
Private Sub MakeRecordSource()
Dim strFilter As String
' Kombifelder AktivArchiv, Standort und Kontaktart
If Not IsNull(Me!cbAktivArchiv) Then
If Not Me!cbAktivArchiv = 3 Then _
strFilter = strFilter & " AND aktivArchiv = " & Me!cbAktivArchiv
End If
If Not IsNull(Me!cbKontaktart) Then
If Not Me!cbKontaktart = 6 Then _
strFilter = strFilter & " AND KontaktArt = " & Me!cbKontaktart
End If
If Not IsNull(Me!cbStandortAuswahl) Then
If Not Me!cbStandortAuswahl = 8 Then _
strFilter = strFilter & " AND KBO = " & Me!cbStandortAuswahl
End If
' Textfelder Vor- und Nachname
' mit Unterstützung des Change-Ereignisses
If Screen.ActiveControl.Name = "tbNachnameSuche" Then
strFilter = strFilter & " AND kliName LIKE '" & Me!tbNachnameSuche.Text & "*'"
ElseIf Not IsNull(Me!tbNachnameSuche) Then
strFilter = strFilter & " AND kliName LIKE '" & Me!tbNachnameSuche & "*'"
End If
If Screen.ActiveControl.Name = "tbvornameSuche" Then
strFilter = strFilter & " AND kliVorname LIKE '" & Me!tbVornameSuche.Text & "*'"
ElseIf Not IsNull(Me!tbVornameSuche) Then
strFilter = strFilter & " AND kliVorname LIKE '" & Me!tbVornameSuche & "*'"
End If
' Filterstring auswerten
If Len(strFilter) > 5 Then
strFilter = Mid(strFilter, 6) 'erstes AND abschneiden
MsgBox strFilter
Me!SucheKontakteDetailSub.Form.Filter = strFilter
Me!SucheKontakteDetailSub.Form.FilterOn = True
Else
'mach was anderes
Me!SucheKontakteDetailSub.Form.FilterOn = False
End If
End Sub
Habe nun das Problem wenn ich einen Kunden aus den Suchergebnissen auswähle, die Daten nicht an den Filter eines weiteren Unterformulars weitergeben kann. Dieses Formular enthält die Terminprotokolle aller Kunden und soll anhand des ausgewählten Kunden gefiltert werden.
Dazu habe ich folgenden Quellcode:
Private Sub kliName_Click()
MsgBox "Text für Label: " & Me!kliName & " " & Me!kliVorname
' Von Unterformular "SucheKontakteDetailSub" auf Steuerelement "lblProtokollUebersicht" im Hauptformular
Me.Parent!lblProtokollUebersicht = Me.Parent!lblProtokollUebersicht & " " & Me!kliName & " " & Me!kliVorname
Dim strFilter As String
strFilter = "KliID = " & Me!KliID
MsgBox strFilter
'Forms!ProtokollUebersicht.Form.Filter = strFilter
'Forms!ProtokollUebersicht.Form.FilterOn = True
End Sub
Als Meldung bekomme ich für das Schreiben auf das Label im Hauptformular. Das Label soll nachher den Text "Protokolle von X Y" enthalten. Benötige ja noch die Daten aus dem ersten Formular (Suchergebnisse) für das zweite Unterformular (Protokollübersicht).
Zitat
Laufzeitfehler '438':
Objekt unterstützt diese Eigenschaft oder Methode nicht
Folgende Seite (http://dbwiki.net/wiki/Access_Bedienungsanleitung:_Bezug_auf_Formular/Unterformular) habe ich zur Rate geholt aber hat nichts gebracht.
Danke sehr,
Gruß,
AllenWalker
Hallo,
http://www.ms-office-forum.de/forum/showthread.php?t=304293
I'm not amused..
<gelöscht>