peak
Goto Top

Checkbox liste aus relationaler Datenbank

Checkboxliste in einem Unterformular aus einer relationaler Datenbank erstellen, so dass sichtbar ist, welche Werte aktiv sind und welche nicht.

Hallo zusammen.

Folgende Situation:
Eine Accessdatenbank mit drei Tabellen die wie folgt aufgebaut sind.

tblAdresse (Tabelle für alle Adressen)
adr_ID
adr_Name
adr_ Vorname
adr_Strasse
adr_PLZ

tblGruppen (Gruppen, in die die adressen aus tblAdressen aufgeteilt werden können.
grp_ID
grp_Text

tblAdrGrp
FID_adr
FID_grp

Das Ziel der ganzen Übung ist, dass eine Adresse eingegeben kann, welcher dann noch Gruppen (Lieferant, Kunde,... ) zugeteilt werden können.

Als müsste ich eigentlich ein Formular für die Adresse haben. In dem Formular müsste dann ein Unterformular sein, mit den Gruppen. Und genau da komme ich nicht weiter.

Ich möchte, dass alle vorhanden Gruppen aus der tblGruppen als checkbox im Formular der Adresse sichtbar sind. Wenn eine vorhandene Adresse im Formular geöffnet wird, dann soll das Unterformular mit den Gruppen auch alle verfügbaren Gruppen anzeigen. Jedoch aber die Adresse/Gruppen kombinationen welche schon in der tblAdrGrp eingetragen sind, als checked markieren. Nur wie macht man das? Wäre toll, wenn mir da jemand weiter helfen könnte.

Ich hoffe, dass ich mich verständlich ausdrücken konnte und danke euch schon im Voraus,
Steff

Content-Key: 140657

Url: https://administrator.de/contentid/140657

Printed on: April 25, 2024 at 18:04 o'clock

Member: Peak
Peak Apr 15, 2010 at 08:10:01 (UTC)
Goto Top
Hmm. Ich weiss nicht ob es unverständlich war, was ich geschriben habe, oder ob wirklich bis jetzt niemand eine Lösung oder einen Lösungsansatz hat.

Falls etwas unklar sein sollte, werde ich gerne die Fragen beantworten.

Gruss,
Steff
Member: jato11
jato11 Apr 15, 2010 at 11:12:39 (UTC)
Goto Top
Hallo Steff,
ich bin mir nicht sicher, ob ich dich richtig verstanden habe.
Du willst in einer Tabelle Gruppennamen eintragen (grp_Text), das würde bedeuten du hast bei fünf Gruppen
auch fünf Datensätze.
Nun möchtest du für jede Gruppe ein Kontrollkästchen im Formular darstellen. Das geht nicht.

Du kannst für jede Gruppe in der Tabelle ein Feld (Kontrollkästchen) erstellen. Also bei fünf Gruppen auch fünf Felder.
Wenn dann eine weitere Gruppe dazu kommt muss die Tabelle, das Formular und evtl. die Abfrage angepasst werden.

Du kannst es auch mit einem Kobinationsfeld lösen. Damit bist du flexibel und kannst jederzeit im Formular Gruppen zufügen.
Der Nachteil ist wenn jemand in mehrere Gruppen eingtragen werden soll, dann brauchst du in der Gruppentabelle auch
mehrere Felder.

Viele Grüße
Torsten
Member: Peak
Peak Apr 15, 2010 at 11:24:17 (UTC)
Goto Top
Hallo Torsten.

Danke erst mal für deine Antwort. Ich habe mir schon gedacht, dass das nicht ganz einfach werden wird. Meine Idee war folgende.

Ich mache ein Formular um die Adressen eingeben zu können, bzw. dann auch bearbeiten zu können. Das ist so weit ja noch nichts besonderes.
In diesem Adressformular wird dann ein Unterformular eingebunden. In diesem Unterformular werden, per VBA, aus der tblGrp alle Gruppen ausgelesen und, auch per VBA, eine Checkbox gemacht. Bevor diese Checkbox gemacht wird, muss in der tblAdrGrp überprüft werden, ob die Kombination adr_ID/grp_ID vorhanden ist. Wenn diese vorhanden ist, dann soll eine Checkbox gemacht werden, welche bereits selektiert ist. Wenn nicht, dann halt eine Checkbox die noch nicht ausgewählt ist.
In HTML und PHP wüsste ich wie ich das machen könnte. Aber leider nicht in Access. Zudem muss dann wahrscheinlich ja auch noch sicher gestellt werden, dass bei einer Änderung der Checkbox, die Änderung auch in die tblAdrGrp übertragen wird.

Deine Idee mit dem Kombinationsfeld ist sicherlich eine Überlegung wert. Das könnte dann auch per Unterformular eingebunden werden und dann könnte man auch mehrere Gruppen auswählen. Das Problem bei dieser Lösung ist halt, dass das Abwählen einer Gruppe nicht ganz so komfortabel ist wie mit Checkboxen.

Viele Grüsse
Steff
Member: jato11
jato11 Apr 15, 2010 at 19:53:07 (UTC)
Goto Top
Hallo Steff,
wenn es nur ein paar Gruppen wie Kunde, Lieferant, Privat, Geschäftlich o.ä. ist würde ich die Checkbox nehmen und
für jede Gruppe eine in der Tabelle erstellen. So mache ich es in meiner Kundenverwaltung.
Beim Kombinationsfeld kannst du eine Gruppe "Keine" erstellen und schon gehörst du keiner Gruppe an.
Das würde bei mir aber nicht vorkommen, denn in irgendeine Gruppe passen die Adressen immer.

Viele Grüße
Torsten
Member: Peak
Peak Apr 17, 2010 at 08:30:16 (UTC)
Goto Top
Hallo Torsten,
Wie meinst du das mit den Checkboxen genau? Kannst du mir das ein bischen genauer erklären?

Vielen Dank,
Steff
Member: jato11
jato11 Apr 19, 2010 at 10:01:52 (UTC)
Goto Top
Wie meinst du das mit den Checkboxen genau? Kannst du mir das ein bischen genauer erklären?

Hallo Steff
In der Tabelle erstellt du ein ja/nein Feld fürt jede Gruppe (eins für Kunden und eins für Lieferanten usw.)

Wenn dein Formular als Datenquelle eine Abfrage hat musst du auch da die Felder übernehmen und
anschließend im Formular dann für jede Gruppe ein Kontrollkästchen erstellen.

Nun kannst du einer Person oder Firma eine Gruppe zuordnen, indem du einfach auf das Kästchen klickst.
Mehrfachauswahl ist natürlich möglich.

Wenn du eine Telefonliste o.ä. erstellen möchtest, trägst du in deiner Abfrage bei z.B. Kunden im Kriterium "-1" ein
Dann werden alle angezeigt die zur Gruppe Kunden gehören bzw. in dem Kästchen einen Haken haben

Viele Grüße
Torsten
Member: Peak
Peak Apr 21, 2010 at 08:20:30 (UTC)
Goto Top
Gelöst :D

Nach langem überlegen und hin und her was und wie ich das nun machen soll, habe ich jetzt eine, bis jetzt funktionierende Lösung.

Als erstes wird die listbox mit den Daten aus der tblGroups gefüllt. Dann werden per VBA alle Einträge abgewählt. Dann wird für jeden eintrag überprüft ob die Kombination adr_ID / grp_ID in der Tabelle tblAdrGrp vorhanden ist. Wenn ja, dann als selected markieren.

Beim Wechsel auf den nächsten Datensatz werden zuerst alle Einträge in der tblAdrGrp mit der entsprechenden adr_ID gelöscht und anschliessend für jeden ausgewählten Eintrag in der Listbox einen neuen Eintrag in tblAdrGrp gemacht.

Das ganze scheint bis jetzt zu funktionieren.

Wenn jemand interesse am VBA Code haben sollte, werde ich den gerne zu Verfügung stellen.


Eine Frage habe ich dazu aber noch. Wenn ich nun auf den nächsten Datensatz wechsle und es im aktuellen Datensatz Änderungen gegeben hat, wird der Benutzer darauf aufmerksam gemacht, dass er Datensätze in der Tabelle löschen, bzw. hinzufügen möchte. Kann man dies irgend wie umgehen?

Danke viel mal
Gruss, Steff
Member: jato11
jato11 Apr 21, 2010 at 08:32:46 (UTC)
Goto Top
Prima
stell den Code ruhig hier rein, dann können andere das vielleicht auch nutzen.

Unter Optionen kannst du einstellen wann Access meckert.

Viele Grüße
Torsten
Member: Peak
Peak Apr 21, 2010 at 08:42:19 (UTC)
Goto Top
Hier dann also noch den Code

Private Sub Form_AfterUpdate()
    'MsgBox "after update"
    
    'MsgBox "Form After Insert - adrID: " & Me.adr_ID

    Dim rs As Recordset
    Dim strSQL As String
    
    'zuerst alle Einträge in tblAdresseAdrGroup mit der adr_FID löschen
    strSQL = "DELETE * FROM tblAdresseAdrGroup WHERE adrAdrGrp_adr_FID = " & Me.adr_ID
    DoCmd.RunSQL strSQL

    'für jeden eintrag in der lstGrp prüfen, ob selektiert. Wenn ja, dann neuer eintrag in tblAdresseAdrGroup
    For i = 0 To Me.lstGrp.ListCount - 1
        'MsgBox lstGrp.Column(0, i) & " - " & lstGrp.Selected(i) '-1 = selected / 0 = unselected

        If lstGrp.Selected(i) = -1 Then
            'MsgBox "Selected: " & lstGrp.Column(0, i) & " - " & lstGrp.Column(1, i)
            strSQL = "INSERT INTO tblAdresseAdrGroup (adrAdrGrp_adr_FID, adrAdrGrp_adrGrp_FID) VALUES (" & Me.adr_ID & ", " & Me.lstGrp.Column(0, i) & ")"
            DoCmd.RunSQL strSQL
        End If


    Next i
End Sub

Private Sub Form_BeforeUpdate(Cancel As Integer)
    'wenn etwas geändert hat, wird adr_LastChange auf jetzt gesetzt
    Me.adr_LastChange.Value = DateValue(Now) & " " & TimeValue(Now)
End Sub

Private Sub Form_Current()
    'Me.adr_LastChange.Value = DateValue(Now) & " " & TimeValue(Now)
    
    Dim rs As Recordset
    Dim strSQL As String
    
    'Alle Elemente in der Listbox deaktivieren
    For i = 0 To lstGrp.ListCount - 1
        lstGrp.Selected(i) = False
    Next i
    
    'Auslesen der kombis die in Ausgleichstabelle tblAdresseAdrGroup sind
    If adr_ID <> "" Then
        strSQL = "SELECT * FROM tblAdresseAdrGroup WHERE adrAdrGrp_adr_FID = " & Me.adr_ID
        Set rs = CurrentDb.OpenRecordset(strSQL, dbOpenDynaset)
        
        'Vorselektion der bereits ausgewählten Gruppen
        Do While Not rs.EOF
            
            For i = 0 To lstGrp.ListCount - 1
                Dim lstGrpIndex As Integer
                Dim adrGrpFID As Integer
                
                lstGrpIndex = Me.lstGrp.Column(0, i)
                adrGrpFID = rs!adrAdrGrp_adrGrp_FID
                
                If lstGrpIndex = adrGrpFID Then
                    Me.lstGrp.Selected(i) = True
                End If
                
            Next i
            
            rs.MoveNext
        Loop
        
        rs.Close
        Set rs = Nothing
    End If
End Sub

Private Sub lstGrp_Click()
    'wenn in lstGrp etwas geändert wird, dann wird LastChange auf jetzt gesetzt
    Me.adr_LastChange.Value = DateValue(Now) & " " & TimeValue(Now)
End Sub
Member: NetWolf
NetWolf Apr 21, 2010 at 16:25:26 (UTC)
Goto Top
Hallo,

ja kann man, schau dir mal die Grundeinstellungen von Access genau an. Genauere Hinweise leider nicht möglich, da du deine Version nicht mit angegeben hast.

Dein Problem hätte ich z.B. binär gelöst face-smile
Du speicherst den aktuellen Stand der Checkboxen in ein zusätzliches Feld pro Adresse z.B. mit den Werten : 010101
1 = gesetzt
0 = nicht gesetzt
über die MID Funktion ausgelesen, fertig.


Grüße aus Rostock
Wolfgang
(Netwolf)