Neuigkeiten:

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

Mobiles Hauptmenü

Optionsgruppe als Filter für ein Listenfeld

Begonnen von mad, November 14, 2019, 20:14:26

⏪ vorheriges - nächstes ⏩

mad

Hallo Zusammen,
ich möchte gerne bei einem neuen Formular das Thema Optionsgruppe auf ein Listenfeld ,,lstKontakte" anwenden. Leider finde ich zu meinem Anliegen nichts passendes im Forum, vielleicht suche ich auch falsch.
Grundsätzlich möchte über vier verschiedene Radiobutton ,,Option120, Option122, Option124 u. Option126" aus der Optionsgruppe ,,optKontakte" das Listenfeld ,,lstKontakte" filtern.
Das Listenfeld ,,lstKontakte" bezieht seine Werte aus der Abfrage ,,abfKontakte".
,,Option120" soll die Abfrage ungefiltert anzeigen und ist Standartwert.
Mit ,,Option122" sollen alle Werte der Spalte ,,statusID_P" aus der Abfrage mit dem Wert/Zahl ,,1 oder 2" gefiltert werden.
Mit ,,Option124" sollen alle Werte der Spalte ,,statusID_P" aus der Abfrage mit dem Wert/Zahl ,,2 oder 6 oder 7" gefiltert werden.
Wenn ,,Option126" angeklickt wird, würde ich gerne einzelne Listenwerte markieren können.
Dies Werte würde ich dann später per Button (Bericht öffnen) an ein Textfeld in einem Bericht übergeben wollen. Aber dazu vielleicht später mehr, wenn ich dort auch Probleme haben sollte.
Wüsste vielleicht jemand einen entsprechenden Forumsbeitrag in dem ich mich aufschlauen könnte?


Gruss
mad

mad

Hallo Zusammen,

hab mal verschiedene Informationen zusammengetragen und mit folgenden Code gebastelt. Habe mich auch erstmal auf die ersten drei Radiobutton beschränkt und auch nur auf eine Zahl.

Private Sub optKontakte_AfterUpdate()
    Select Case optKontakte
      Case 1
        lstKontakte!Filter = "*"
        lstKontakte!FilterOn = False
       Case 2
        lstKontakte!Filter = "[statusID_P] = 1"
        lstKontakte!FilterOn = True
      Case 3
        lstKontakte!Filter = "[statusID_P] = 7"
        lstKontakte!FilterOn = True
    End Select
End Sub


Leider bekomme ich mein Listenfeld so nicht gefiltert.Stattdessen bekomme ich folgende Fehlermeldung:
ZitatLaufzeitfehler 13 Typen unverträglich

Habe versucht das mit dem Vorschlag von Beaker s.a. zu beheben:
ZitatIf Not Me.NewRecord Then
       'Dein bisheriger Code
    End If
klapp aber leider nicht.

Komme derzeit leider nicht weiter.


Gruss
mad

mad

Hall,
nun bin ich schon einen kleinen Schritt weiter.

Habe in der Abfrage "abfKontakte" den Zusammenhang zur Optionsgruppe "optKontakte" hergestellt. Bin mir aber nicht ganz sicher.
Zitat[Formulare]![abfKontakte]![optKontakte]
Abfragecode:
SELECT Personal.PID, Personal.NameP, Personal.Adresse, Personal.HausNr, Personal.PLZ, Ortsteile.Ort, Personal.statusID_P
FROM Ortsteile INNER JOIN Personal ON Ortsteile.OrtID = Personal.OrtID_F
WHERE (((Personal.statusID_P)=[Formulare]![abfKontakte]![optKontakte]))
ORDER BY Personal.NameP;


Nun reagieren zwar die Radiobutton, aber nicht wie gewünscht:
Wenn ich nämlichen einen anklicke dann öffnet ein Parameterfenster, siehe Bild, und verlangt nach einer Eingabe.
Der Code zur Optionsgruppe ist immer noch der selbe.

Gruss
mad

DF6GL

#3
Hallo,


ZitatPrivate Sub ramKontakte_AfterUpdate()  ' ramKontakte ist ein Options-Rahmen, der die Optionsfelder (Optionxxx) enthält
    Select Case optKontakte
      Case 1   ' Wert des Optionfeldes "Option120"
        lstKontakte.Rowsource = "Select Feld1, Feld2 from abfKontakte"
       
       Case 2
        lstKontakte.Rowsource = "Select Feld1, Feld2 from abfKontakte where [statusID_P] in (1,2)"   'falls "statusID_P" den Datentyp,Zahl, Long besitzt

      Case 3
        lstKontakte.Rowsource = "Select Feld1, Feld2 from abfKontakte where [statusID_P] in (2,6,7)"  'falls "statusID_P" dito
   
    End Select
End Sub


ZitatWenn ,,Option126" angeklickt wird, würde ich gerne einzelne Listenwerte markieren können.

Die Einträge in Listenfeld können immer markiert werden, sofern es nicht gesperrt ist. Wenn mehrere Einträge gleichzeitig markiert, bzw. ausgewählt werden sollen, muss die Eigenschaft "Mehrfachauswahl auf" "einzeln" oder "erweitert "stehen.

mad

Hallo,
Danke wieder mal für die Unterstützung.
Mußte den Code noch etwas anpassen, die " vor Feld1 (bei mir PID) entfernt. Und dann habe ich den Code noch wie folgt um das automatische markieren/auswählen erweitert. Nur nicht bei "Case 1". Welche Daten angezeigt werden habe ich auch angepaßt.

Der aktuelle Code sind nun wie folgt aus:

Private Sub optKontakte_AfterUpdate()
        Dim i
     
    Select Case optKontakte
      Case 1   ' Wert des Optionfeldes "Option120"
        lstKontakte.RowSource = "Select PID, NameP, Adresse, HausNr, PLZ, Ort, statusID_P from abfKontakte where [statusID_P] in (1,2,6,7)"

       Case 2   ' Wert des Optionfeldes "Option122"
        lstKontakte.RowSource = "Select PID, NameP, Adresse, HausNr, PLZ, Ort, statusID_P from abfKontakte where [statusID_P] in (1,2)"   'falls "statusID_P" dito
     For i = 0 To Me!lstKontakte.ListCount - 1
         Me!lstKontakte.Selected(i) = (Me!lstKontakte.Column(0, i))
     Next i
      Case 3    ' Wert des Optionfeldes "Option124"
        lstKontakte.RowSource = "Select PID, NameP, Adresse, HausNr, PLZ, Ort, statusID_P from abfKontakte where [statusID_P] in (2,6,7)"
         For i = 0 To Me!lstKontakte.ListCount - 1
         Me!lstKontakte.Selected(i) = (Me!lstKontakte.Column(0, i))
     Next i
    End Select

End Sub


Funktioniert wie gewünscht.

Wie bereits am Beitragsanfang geschrieben, möchte ich jetzt die markierten DS aus lstKontakte an einen Bericht übergeben. Der Bericht soll ähnlich wie ein Serienbrief in Word funktionieren, pro übertragen DS ein Bericht die ich dann ausdrucken kann.

Mein aktuelle Code lautet:
Private Sub btnSerienbrief_Click()
Dim i As Long, Auswahl As String

If Me!lstKontakte.ItemsSelected.Count <> 0 Then
     For i = 0 To Me!lstKontakte.ItemsSelected.Count - 1
         Auswahl = Me!lstKontakte.ItemsSelected(i) & "," & Auswahl
     Next
     Auswahl = "[statusID_P] in (" & Mid(Auswahl, 1, Len(Auswahl) - 1) & ")"
     DoCmd.OpenReport "Bericht_Vorlage_hoch", acViewPreview, , Auswahl
Else
     MsgBox "Bericht wird nicht geöffnet, da keine Datensätze ausgewählt."
End If

End Sub

öffnet zwar den Bericht, aber nicht wie gewünscht.

Frage noch,
sollte ich dazu bei Bedarf einen neuen Beitrag eröffnen?


Danke
mad

DF6GL

Hallo,


Openreport muss innerhalb der For-Schleife stehen, damit pro Listenfeldeintrag ein separater Bericht gedruckt wird.


Neuer Thread erübrigt sich hier und  jetzt.

mad

Hallo,

habe es wie folgt versucht:
Private Sub btnSerienbrief_Click()
Dim i As Long, Auswahl As String

If Me!lstKontakte.ItemsSelected.Count <> 0 Then
     For i = 0 To Me!lstKontakte.ItemsSelected.Count - 1
        Auswahl = Me!lstKontakte.ItemsSelected(i) & "," & Auswahl
        DoCmd.OpenReport "Bericht_Vorlage_hoch", acViewPreview
     Next
     Auswahl = "[statusID_P] in (" & Mid(Auswahl, 1, Len(Auswahl) - 1) & ")"
Else
     MsgBox "Bericht wird nicht geöffnet, da keine Datensätze ausgewählt."
End If
End Sub


Funktioniert noch nicht.
Wird das richtige Feld übertragen?
ZitatAuswahl = "[statusID_P] in .....
"PID" funktioniert aber auch nicht.
Habe derzeit beide Textfelder im Bericht, will aber nicht funktionieren.


Gruss
mad

DF6GL

Hallo,

was willst Du mit "In" bei Ausdruck eines einzelnen DS pro DS?

Private Sub btnSerienbrief_Click()
Dim lngPID As Long, itm As Variant

If Me!lstKontakte.ItemsSelected.Count > 0 Then
     For Each itm In Me!lstKontakte.ItemsSelected
        lngPID = Me!lstKontakte.Column(0, itm)  ' wenn die ID in der ersten Spalte (0) steht

       DoCmd.OpenReport "Bericht_Vorlage_hoch", acViewPreview, , "[statusID_P] = " & lngPID
     Next
     
Else
     MsgBox "Bericht wird nicht geöffnet, da keine Datensätze ausgewählt."
End If

End Sub

mad

Wenn ich mehrere Zeilen im Listenfeld auswähle, bekomme ich immer nur einen Bericht mit der ersten Auswahl angezeigt.

Als Info mal mein Grundgerüst meines Berichts, siehe Bild im Anhang und die Abfrage.


Gruss
mad

DF6GL

Hallo,

entferne "acViewPreview" und lass die Berichte mal drucken.....

Vermutlich muss die Seitenansicht manuell geschlossen werden.

Debuggen könnte auch Klarheit bringen....

Haltepunkt an das For-Statement setzen, mit F8 durchtakten und die Variablenwerte prüfen...

mad

Hallo,

das Debuppen habe ich mir mittlerweilen schon angewöhnt. Aber eine Meldung kommt dabei leider auch nicht.
Habe "acViewPreview" mal weggelassen. Dann werden 13 Berichte ausgedruckt, obwohl ich nur zwei DS markiert hatte. Wenn alle markiert gewesen wäre müssten es 109 DS sein. Das komische ist, er druckt die 13 Berichte mehrfach aus. Habe den Druck dann abgebrochen.

Einen Haltepunkt habe ich auch gesetzt, kann aber die Variablenwerte nicht wirklich deuten:
IngPID=0
itm=leer
(mit acViewPreview=2)
IngPID=0

Gruss
mad

DF6GL

Hallo,

kannst Du die Db mal hochladen?  datenreduziert,komprimiert/repariert und gezippt.

Wenn der Code mit F8 einzeln durchgetaktet wird, ändern sich bei jedem Durchlauf die Variablenwerte.....

Probiere Folgendes:

Im Direktfenster:

DoCmd.OpenReport "Bericht_Vorlage_hoch", , ,"[statusID_P] = 1"

falls es 1 als ID gibt



Wenn ich das Bild des Berichtsentwurf ansehe, sollten die Felder im Seitenkopf in den Detailbereich verschoben werden.....

mad

Hallo,

hier mal die abgespeckt Muster-DB.
Deine Anregungen sehe ich mir im Anschluß noch an.


Gruss
mad

Josef P.

Hallo!

DoCmd.OpenReport ... acViewPreview ...
Wenn du den Bericht beim 2. Aufruf nicht schließt, bleibt der zuerst geöffnete angezeigt, wenn du acViewPreview verwendest.
Das ist nicht wie bei Formularen, dass der Datensatz gewechselt wird.

Zum Ausprobieren:
Den Bericht mit AcDialog öffnen. Dann bleibt die for-next-schleife stehen, solange ein Bericht geöffnet ist.
DoCmd.OpenReport "Bericht_Vorlage_hoch", acViewReport, , "[PID] = " & lngPID, acDialog

mfg
Josef

DF6GL

Hallo,

mach halt das, was Dir empfohlen wird:


ZitatWenn ich das Bild des Berichtsentwurf ansehe, sollten die Felder im Seitenkopf in den Detailbereich verschoben werden.....

und

Zitatentferne "acViewPreview" und lass die Berichte mal drucken.....
Vermutlich muss die Seitenansicht manuell geschlossen werden.