6.2k Aufrufe
Gefragt in Datenbanken von
Hi, Ich hab ein suchformular bei dem ich verschiedene einträge aus dem datensatz auswählen kann und dann eine abfrage mit den formulareinträgen aufrufe. (zum beispiel im kombinationsfeld 'stadt' stehen alle städte von den personen, die in der datenbank erfasst sind und man wählt eine aus.)
kriterium: [Formulare]![Suchformular]![Stadt]
oder in SQL: WHERE Daten.[Stadt]=[Formulare]![Suchformular]![Stadt];
soweit so gut. funktioniert auch.

jetzt möchte ich aber, dass das kombinationsfeld 'stadt' mehrfachauswahl zulässt, ich also zum beispiel 'Barcelona, Prag, Paris' auswählen kann und er dann alle einträge aus einem dieser städte findet... aus irgendeinem grund kann ich das feld nun aber nicht mehr auslesen.
Der plan wäre gewesen es so zu machen:
kriterium: In ([Formulare]![Suchformular]![Stadt])
bzw. in SQL: WHERE Daten.[Stadt] In ([Formulare]![Suchformular]![Stadt]);

wenn ich eine neue Abfrage mache mit
SELECT [Formulare]![Suchformular]![Stadt] schreibt er mir 'Feld nicht gefunden', alle anderen felder aus dem gleichen formular gibt er auf diese art aber aus (incl. kombinationsfelder ohne mehrfachauswahl)

bin für jeden hinweis dankbar,
LG, A

8 Antworten

0 Punkte
Beantwortet von
irgendwer?

ich denk mir mal, das kann nicht so schwer sein... vermutlich irgendeine blöde kleinichkeit auf die man aufpassen muss??

THX, A
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo Alex,

sei nicht so ungeduldig, wir haben ja auch noch andere Sachen zu tun ;-) So einfach wie du dir das vorstellst, geht das nicht. Ich habe mal eine alte Routine ausgegraben (Access 2003), die dir helfen könnte:
Public Function getExtendedList(ctl As Control, default As Variant, Optional delimiter As String = "") As Variant
Dim c As Variant
Dim res As Variant
For Each c In ctl.ItemsSelected
res = res & IIf(res = "", "", ",") & delimiter & ctl.ItemData(c) & delimiter
Next
If res = "" Then res = default
getExtendedList = res
End Function
Damit kannst du z.B. einem Report ein SQL-Kriterium mitgeben, z.B. so mit PList als Multiselect-Liste):
Private Sub btnReport_Click()
Dim s As String
s = getExtendedList(Me!PList, "", """")
If s <> "" Then
DoCmd.OpenReport "Projekt", acViewPreview, , "Projektname in (" & s & ")"
Else
MsgBox "Bitte zuerst ein oder mehrere Projekte auswählen"
End If

End Sub

Den Parameter "default" benutze ich zwar nicht, könntest du aber noch sinnvoll einbauen, z.B. statt einer MsgBox. Hast du dir so etwas vorgestellt?

Gruß
Ralf
0 Punkte
Beantwortet von
Hi, Erst mal danke für die antwort :) wollte auch niemanden stressen...

nachdem ich den string, den deine funktion produziert auch gern im selben formular zur verfügung hätte hab ich das ganze jetzt so gemacht:
Private Sub mehrfachauswahlkombifeld_Change()
Dim c As Variant
Dim res As Variant
Dim ctl As Control
ctl = Me![mehrfachauswahlkombifeld]
For Each c In ctl.ItemsSelected
res = res & IIf(res = "", "", ",") & ctl.ItemData(c)
Next
' If res = "" Then res = default
Me![mehrfachauswahlkombifeld as String] = res
End Sub

Das problem is nur, das ich den Fehler "Objektvariable oder With-Blockvariable nicht festgelegt"... in zeile
ctl = Me![mehrfachauswahlkombifeld]
.

Woran kann das liegen?

thx, alex
0 Punkte
Beantwortet von
Hab einen Fehler gefungen...
code muss so lauten:

Private Sub mehrfachauswahlkombifeld_Change()
Dim c As Variant
Dim res As Variant
Dim ctl As Control
Set ctl = Me![mehrfachauswahlkombifeld]
For Each c In ctl.ItemsSelected
res = res & IIf(res = "", "", ",") & ctl.ItemData(c)
Next
' If res = "" Then res = default
Me![mehrfachauswahlkombifeld as String] = res
End Sub


jetzt is aber das problem, dass er in die for-schleife nicht reingeht... ich kann mit
test = Me![Probe Type].ItemData(0)

die einzelnen einträge abrufen aber wie gesagt in die for schleife geht er nicht rein... irgendein problem mit dem ItemsSelected vieleicht?

lg, A
0 Punkte
Beantwortet von
Also ich hab mich jetzt noch gespielt und es funktioniert jetzt, dass ich die selektierten einträge in ein textfeld schreibe ABER nur, wenn ich statt einem kombinationsfeld ein listenfeld nehme... warum? is nämlich nicht so schön, weil ich keine möglichkeit habe meine abfrage im _Change() ereignis aufzurufen (gibts nicht bei listenfeld).

außerdem schaff ichs nicht, eine abfrage zu machen, wo mein textfeldinhalt als argument in einem IN-Kriterium vorkommt.

WHERE (AllData.[Stadt]) In ([Formulare]![Search for something]![Textfeld Staedte as String]);

das funktioniert, wenn ich nur eine stadt markier (im textfeld 'Textfeld staedte as string' steht dann z.b. Rom) aber nicht, wenn ich mehrere einträge hab (z.b. Rom, Paris)
hab auch schon 'Rom','Paris', "Rom","Paris", "Rom,Paris" usw. ausprobiert...

Ich hätte auch kein problem, das in vba zu machen und den string (s) direkt weiterzugeben wie ralf das vorgeschlagen hat, nur weiß ich da nicht, wie ich der sql abfrage ein kriterium mitgebe (sasd wäre dann "AllData.[Stadt] In (S)")
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo alex,

Überlege mal, warum ein "on change" Ereignis keinen Sinn bei einer Mehrfachauswahl hat. Richtig, das Programm kann
nicht wissen, wann du alle Felder ausgewält hast. Kannst du bei einer Combobox überhaupt eine Mehrfachauswahl
einstellen? Beschreibe mal deine Folgeaktion und poste was du mit dem sql anstellen willst.

Gruß Ralf
0 Punkte
Beantwortet von
mit der combobox und mehrfachauswahl wäre es ganau so wie ich wollte: du klickst auf den kleinen pfeil, eine auswahl mit kontrollkästchen öffnet sich, du wählst die aus, die du möchtest und wenn du die combobox wieder zumachst, dann tritt das Change() ereignis ein... laut hilfe sollte dein code auch für das funktionieren, tut er aber nicht. is nicht weiter schlimm, jetzt hab ich halt einen button neben dem listenfeld um selbiges auszulesen.

was ich dann machen will is nichts anderes als eine abfrage öffnen, wo ich alle datensätze drin hab mit den städten die aus dem listenfeld ausgelesen wurden (sind also sowohl als string mit beliebigem delimiter -thx to you- als eben auch in einem textfeld vorhanden)
ich dachte mir es wäre einfach(er) in der abfrage mit dem textfeld zu vergleichen (wie oben gepostet)

was weiter geschehen soll:
ich öffne die abfrage zum beispiel um zu zählen wie viele datensätze er gefunden hat.
DoCmd.OpenQuery tb, acViewNormal, acReadOnly
counter = DCount("[ID]", tb)
DoCmd.Close acQuery, tb, acSaveNo

in weiterer folge soll ein zweites formular geöffnet werden das anderst aussieht und nur die datensätze aus der abfrage enthält, aber das krieg ich schon hin... nur das abfragekriterium kann ich nicht übergeben.

also im prinzip den code den du für reports gepostet hast irgendwie auf das öffnen/neu berechnen einer abfrage umgemünzt...

danke fürs mitdenken und helfen,
LG, Alex
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo Alex,

also die Zeilen zählen, kannst du folgendermaßen
Msgbox Dcount("*","Grundtabelle","Stadt in (" & Me![mehrfachauswahlkombifeld as String] & ")")

Dein Zählversuch sollte so nicht funktionieren. Du kannst auch einem Formular die Grundtabelle hinterlegen und alle relevanten Felder ins Formular ziehen. Die Standardansicht setzt du auf "Datenblatt". Danach kannst du meine Variante des Report-Aufrufs für das Formular verwenden. Probiere es aus.

Gruß
Ralf
...