Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: mad am November 14, 2019, 20:14:26

Titel: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: mad am November 14, 2019, 20:14:26
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
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: mad am November 15, 2019, 12:24:18
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
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: mad am November 15, 2019, 14:01:56
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
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: DF6GL am November 15, 2019, 14:10:34
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.
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: mad am November 15, 2019, 17:32:29
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
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: DF6GL am November 15, 2019, 19:12:17
Hallo,


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


Neuer Thread erübrigt sich hier und  jetzt.
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: mad am November 15, 2019, 20:09:05
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
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: DF6GL am November 15, 2019, 21:43:46
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
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: mad am November 15, 2019, 22:37:28
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
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: DF6GL am November 16, 2019, 08:25:31
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...
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: mad am November 16, 2019, 09:41:20
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
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: DF6GL am November 16, 2019, 09:51:41
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.....
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: mad am November 16, 2019, 10:36:44
Hallo,

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


Gruss
mad
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: Josef P. am November 16, 2019, 10:47:25
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
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: DF6GL am November 16, 2019, 11:02:36
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.
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: mad am November 16, 2019, 12:12:58
Hallo,

Zitatmach halt das, was Dir empfohlen wird:
mache ich:
ZitatWenn ich das Bild des Berichtsentwurf ansehe, sollten die Felder im Seitenkopf in den Detailbereich verschoben werden.....
Dabei werden alle Adressen auf einen Bericht gedruckt, und das ganze so oft soviele DS ich ausgewählt hatte. Ist nicht das was ich möchte! Ich denke diese Felder sollten im Seitenkopf bleiben.

Zitatentferne "acViewPreview" und lass die Berichte mal drucken.....
Vermutlich muss die Seitenansicht manuell geschlossen werden.
Auch hier wird irgendwas gedruckt.

Die Anregung von Josef P.,
DoCmd.OpenReport "Bericht_Vorlage_hoch", acViewReport, , "[PID] = " & lngPID, acDialog
hat zumindestens die beiden Berichte wie DS ausgewählt angezeigt. Konnte diese aber nicht drucken.
Und jeden Bericht einzeln zu schliessen ist auch nicht sehr praktikabel.

Gruss
mad
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: DF6GL am November 16, 2019, 13:37:45
Hallo,

Dabei werden alle Adressen auf einen Bericht gedruckt, und das ganze so oft soviele DS ich ausgewählt hatte. Ist nicht das was ich möchte! Ich denke diese Felder sollten im Seitenkopf bleiben.

Nein!!

Der Bericht druckt nur dann mehrere Datensätze, wenn die Filterung nicht stimmt.

ZitatAuch hier wird irgendwas gedruckt.

Ja, und was genau?


Sobald ich die Felder vom Seitenkopf in den Detailbereich verschoben hatte, wurde pro Listenfeldauswahl je ein Bericht mit den entspr. Daten gedruckt....


PS:
Lad Deine akt. Datei nochmal hier hoch...

Anbei die DB mit modifizierem Bericht...


Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: mad am November 16, 2019, 14:02:53
Hallo,

habe nochmals beide Varianten hochgeladen.
1x Variante mit den Vorschlägen von DF6GL, ohne:
ZitatDoCmd.OpenReport "Bericht_Vorlage_hoch", , ,"[statusID_P] = 1"
1x die Variante mit den Vorschlägen von JosefP

Gruss
mad
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: DF6GL am November 16, 2019, 14:11:28
Hallo,

bei "deiner meiner" Version fehlt ein Komma:
DoCmd.OpenReport "Bericht_Vorlage_hoch", , ,  "[PID] = " & lngPID

und bei Josef's Lösung muss die Berichtsansicht (acViewReport) manuell geschlossen werden, was alles schon angemerkt wurde...
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: mad am November 16, 2019, 14:29:29
Hallo,

mit dem "Komma" funktionierts.
Gibt es keine Möglichkeit das der/die Berichte vor dem drucken geöffnet/angezeigt werden, und ich erst dann den druck starte?

Gruss
mad
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: Josef P. am November 16, 2019, 14:39:19
Du kannst alle benötigen Datensätze in einem Bericht ausgeben und dann drucken.
Dazu musst du allerdings die Steuerelemente vom Seitenkopf in den Detailbereich bzw. in einen Gruppenkopf von PID verschieben (wie bereits von Franz zuvor erwähnt).
Die "Seite n von m"-Anzeige muss auch angepasst werden, wenn die Ausgabe je PID jeweils mit Seite 1 beginnen soll.

Code zum Anzeigen aller DS in einem Bericht:
Private Sub btnSerienbrief_Click()

Dim lngPID As Long
Dim SqlFilter As String

If Me!lstKontakte.ItemsSelected.Count > 0 Then
     SqlFilter = GetSelectedListboxItemFilterString(Me.lstKontakte, "[PID]")
     DoCmd.OpenReport "Bericht_Vorlage_hoch", acViewPreview, , SqlFilter
Else
     MsgBox "Bericht wird nicht geöffnet, da keine Datensätze ausgewählt."
End If


End Sub

Private Function GetSelectedListboxItemFilterString(ByVal lb As ListBox, ByVal DataFieldName As String) As String

   Dim itm As Variant
   Dim FilterValueString As String
   Dim FilterString As String

   For Each itm In lb.ItemsSelected
      FilterValueString = FilterValueString & "," & lb.Column(0, itm)
   Next
   
   If Len(FilterValueString) > 0 Then
      FilterValueString = Mid(FilterValueString, 2) ' 1. "," wegschneiden
      FilterString = DataFieldName & " in (" & FilterValueString & ")"
   End If
   
   GetSelectedListboxItemFilterString = FilterString

End Function


mfg
Josef
Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: DF6GL am November 16, 2019, 15:03:54
Hallo,

und nicht vergessen:

Titel: Re: Optionsgruppe als Filter für ein Listenfeld
Beitrag von: mad am November 16, 2019, 15:33:13
Hallo DF6GL u. Josef P.,

muß mich sehr herzlich bei Euch für die tolle und verständnisvolle Unterstützung bedanken.

Vielen Dank
mad

PS.: jetzt muß ich mich noch dransetzen um den Rest in den Bericht zu bringen