Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Auswahl via Listenfeld in VBA verarbeiten

Begonnen von JOG, Mai 02, 2013, 09:40:41

⏪ vorheriges - nächstes ⏩

JOG

Hallo

Ich habe ein Problem, bei dem ich aktuell nicht mehr weiter komme.
Ich habe also ein Listenfeld "lstWahlGeraet" (Mehrfachauswahl). Die entsprechenden gewählten Datensätze aus diesem  lst-Feld möchte ich in meinem VBA-Code so weiterverarbeiten, dass diese meine Abfragekriterium "InterneIDAnlage" aus der Abfrage "qryWartungsPlanRPTGeraet" immer wieder aktualisiert.

Folgenden Code habe ich bis jetzt erstellt:

Private Sub cmdWartungsPlanDrucken_Click()
Dim varElement As Variant, strSQL As String, strFilter As String

strSQL = "SELECT tblWartungsArbeiten.IDWartungsArbeit, tblAnlagenMaschinen.BezeichungAnlage, tblAnlagenMaschinen.InterneIDAnlage, tblAnlagenMaschinen.HerstellerFirma" & _
" FROM tblWartungsArbeiten INNER JOIN tblAnlagenMaschinen ON tblWartungsArbeiten.GeraetMaschine = tblAnlagenMaschinen.InterneIDAnlage"


  For Each varElement In Me.lstWahlGeraet.ItemsSelected
            strFilter = strFilter & ", " & Me.lstWahlGeraet.ItemData(varElement)

Next

strSQL = strSQL & " WHERE (((tblAnlagenMaschinen.InterneIDAnlage) = strFilter))"

CurrentDb.QueryDefs("qryWartungsPlanRPTGeraet").SQL = strSQL

DoCmd.OpenQuery "qryWartungsPlanRPTGeraet"

End Sub


Lasse ich den Code laufen, so zeigt er mir die Feldermeldung "Parameterwert eingeben "strFilter". Irgendwie kann er den String "strFilter" nicht auflösen.

Weiss jemand Rat.

Vielen Dank.

JOG

database

Hallo,

versuch mal ...

Da es sich um eine Mehrfachauswahl handelt und somit auch mehrere Werte an die WHERE-Klausel aübergeben werden sollen, musst du diese als Liste anführen.

Wobei mir der Aufbau der Liste nicht ganz richtig erscheint.
lass mal mit Debug.Print strFilter den String anzeigen.
Dieser müsste dann eigentlich mit einem Komma beginnen - was aber nicht richtig ist.


For Each varElement In Me.lstWahlGeraet.ItemsSelected
    strFilter = strFilter &  Me.lstWahlGeraet.ItemData(varElement) & ","
    'Dadurch wird NACH jedem Element ein Komma eingefügt
Next
    'Das Komma an der letzten Stelle vernachlässigen
    strFilter = Left(strFilter,Len(strFilter)-1)

strSQL = strSQL & " WHERE tblAnlagenMaschinen.InterneIDAnlage IN (" &  strFilter & ")"


HTH

JOG

Hallo HTH

OK, der String im Debug.Print lautet "2906", wobei 2906 die ID der Anlage wäre. Soweit korrekt. Lasse ich den Code laufen wird jetzt Laufzeitfehler "3021 kein aktueller Datensatz" angezeigt. Öffne ich die Abfrage so steht im Kriterienfeld der IDAnlage "In (2906)" und er zeigt mir dabei den Fehler "Datentypenkonflikt im Kriterienbereich" an...

Woran könnte es noch liegen? Blick da im Moment nicht mehr durch...

Danke und Gruss

Private Sub cmdWartungsPlanDrucken_Click()
Dim varElement As Variant, strSQL As String, strFilter As String

strSQL = "SELECT tblWartungsArbeiten.IDWartungsArbeit, tblAnlagenMaschinen.BezeichungAnlage, tblAnlagenMaschinen.InterneIDAnlage, tblAnlagenMaschinen.HerstellerFirma" & _
" FROM tblWartungsArbeiten INNER JOIN tblAnlagenMaschinen ON tblWartungsArbeiten.GeraetMaschine = tblAnlagenMaschinen.InterneIDAnlage"

For Each varElement In Me.lstWahlGeraet.ItemsSelected
    strFilter = strFilter & Me.lstWahlGeraet.ItemData(varElement) & ","
    'Dadurch wird NACH jedem Element ein Komma eingefügt
Next
    'Das Komma an der letzten Stelle vernachlässigen
    strFilter = Left(strFilter, Len(strFilter) - 1)

strSQL = strSQL & " WHERE tblAnlagenMaschinen.InterneIDAnlage IN (" & strFilter & ")"

CurrentDb.QueryDefs("qryWartungsPlanRPTGeraet").SQL = strSQL

    DoCmd.OpenQuery "qryWartungsPlanRPTGeraet"

End Sub


JOG

database

Hallo,

wenn das Feld interneIDAnlage in der Tabelle als Textfeld deklariert ist kannst du folgendes versuchen:

Private Sub cmdWartungsPlanDrucken_Click()
Dim varElement As Variant, strSQL As String, strFilter As String

strSQL = "SELECT tblWartungsArbeiten.IDWartungsArbeit, tblAnlagenMaschinen.BezeichungAnlage, tblAnlagenMaschinen.InterneIDAnlage, tblAnlagenMaschinen.HerstellerFirma" & _
" FROM tblWartungsArbeiten INNER JOIN tblAnlagenMaschinen ON tblWartungsArbeiten.GeraetMaschine = tblAnlagenMaschinen.InterneIDAnlage"

For Each varElement In Me.lstWahlGeraet.ItemsSelected
    strFilter = strFilter & "'" & Me.lstWahlGeraet.ItemData(varElement) & "',"
    'Dadurch wird NACH jedem Element ein Komma eingefügt und vor und nach jedem Element ein Hockomma zur Textkennung
Next
    'Das Komma und Hochkomma an den letzten 2 Stellen vernachlässigen
    strFilter = Left(strFilter, Len(strFilter) - 2)

strSQL = strSQL & " WHERE tblAnlagenMaschinen.InterneIDAnlage IN (" & strFilter & "')"

CurrentDb.QueryDefs("qryWartungsPlanRPTGeraet").SQL = strSQL

    DoCmd.OpenQuery "qryWartungsPlanRPTGeraet"

End Sub

p.s.  HTH ist nicht mein Name ... bedeutet Hope That Helps (Hoffe das hilft ... )  ;)

JOG

Hallo, ich denke, Peter (das mit den Abkürzungen ist mir in dem Fall noch nicht so geläufig  ;D)

Bingo, nun funktioniert's einwandfrei und ich kann ein oder mehrere Datensätze individuell auswählen. In der Tat, IDAnlage ist als "Text" deklariert. Für welchen Datentyp wäre dein erster Vorschlag gewesen?

Tip top, habe wieder einiges dazu gelernt. Vielen Dank.

Gruss vom Bodensee

JOG

database

Hallo,

(du denkst richtig) ...  ;D  ... schön dass es läuft!

Nachdem das Feld  interneIDAnlage  heißt, hatte ich angenommen, dass damit eine ID gemeint ist.
Diese werden in der Regel als Long Integer ausgeführt - die erste Version hätte damit also Long Integer-Werte als Kriterien angeboten.

LG und schönes WE!