Neuigkeiten:

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

Mobiles Hauptmenü

Dynamische Combobox

Begonnen von HOMGMBH, September 26, 2025, 16:32:10

⏪ vorheriges - nächstes ⏩

HOMGMBH

Hallo zusammen,

ich habe eine klassische Access-Problemstellung mit einem Kombinationsfeld in einem Formular und komme nicht mehr weiter.

Ausgangslage:
   •   Es gibt zwei Tabellen:
   •   tblBenutzer (mit Benutzername, Passwort, RollenID usw.)
   •   tblRollen (mit RollenID, Rollenbezeichnung, Aktiv [Ja/Nein]).
   •   Das Formular ,,Benutzer anlegen" basiert auf tblBenutzer.
   •   Dort gibt es ein Kombinationsfeld, mit dem ich die Rolle auswählen möchte (Verknüpfung über RollenID).

Anforderung:
   •   Beim Durchblättern vorhandener Datensätze soll die gespeicherte Rolle immer korrekt angezeigt werden – auch dann, wenn die Rolle in tblRollen inzwischen auf Aktiv = Nein gesetzt wurde.
   •   Bei der Auswahl einer Rolle (neuer Datensatz oder Änderung) soll das Kombinationsfeld aber nur die aktiven Rollen anzeigen.

Problem:
   •   Mit einem einfachen RowSource-Filter (WHERE Aktiv = ,,Ja") klappt die Einschränkung, aber dann werden bestehende Datensätze mit inzwischen inaktiven Rollen nicht mehr angezeigt (Feld bleibt leer).
   •   Ohne Filter sehe ich zwar die alten Rollen, aber bei neuen Einträgen können auch inaktive Rollen ausgewählt werden – das will ich vermeiden.

Frage:
Wie löst man diese typische Situation am besten in Access?
Also: bestehende Werte weiterhin anzeigen, aber neue Auswahlen nur aus den aktiven Rollen zulassen.
Geht das rein über den Assistenten/SQL-Einstellungen, oder braucht es eine VBA-Lösung (z. B. RowSource dynamisch anpassen)?

Vielen Dank schon mal für jeden Tipp!

MzKlMu

Hallo,
da hilft nur ein kleiner Trick. Das Kombi soweit verkleinern, dass man nur den Pfeil sieht. Direkt daneben, ein normales Feld das die Rolle (aus der Tabelle Rollen) im Klartext anzeigt.
Datenherkunft für das Formular dann Abfrage mit beiden Tabellen.
Mit dem Kombi kann man nach wie vor auswählen.
Gruß Klaus

HOMGMBH

Hallo guten Morgen,
perfekt besten Dank das ist die Lösung bzw. ein perfekter Workaround. Ich habe noch einen kleinen VBA Code hinzufgefügt um die Textbox direkt zu aktualisieren. Ansonsten habe ich mit der Datensatzherkunft in den Eigenschaften gearbeitet.

Private Sub cmbBenutzerrolle_AfterUpdate()
Rem Wert nach Änderung in Combobox in Tabelle schreiben und Textfeld aktualisieren
If Me.Dirty Then DoCmd.RunCommand acCmdSaveRecord
Me.Recalc
End Sub

Ich wünsche euch noch ein schönes Wochenende.

Gruss Andre

Knobbi38

Hallo Andre,

ZitatIf Me.Dirty Then DoCmd.RunCommand acCmdSaveRecord
Das solltest du nicht machen, weil das u.U. zu Problemen führen kann. Angenommen beim Erfassen eines Benutzers gibt es noch nicht erfüllte Bedingungen für die Eingabe, dann hast du ein Problem. Zum anderen kann nach dem Abspeichern kein UNDO mehr gemacht werden. Da das zusätzliche Speichern keinen Vorteil bringt, solltest du es weglassen.

Knobbi38
 

Beaker s.a.

@Ulrich
Zitatbeim Erfassen eines Benutzers gibt es noch nicht erfüllte Bedingungen für die Eingabe, dann hast du ein Problem
Aber nur wenn man es Form_BeforeUpdate nicht abfängt.

@homegmbh
Für das explizite Speichern musst du nicht das DoCmd-Objekt bemühen, - es reicht
If Me.Dirty Then Me.Dirty = FalseWobei auch hier Ulrichs Einwände zum Tragen kommen.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

MzKlMu

Hallo,
zum Zwangsspeichern sollte das doch ausreichend sein:

Me.Dirty = False
Gruß Klaus

Knobbi38

#6
@Ekkehard:

Ich habe lediglich darauf hingewiesen, dass das vorzeitige Speichern eines DS auch zu Problemen führen kann. Ein Beispiel dafür ist ein DS mit Gültigkeitsregeln, deren Verletzung dann mit mehr oder weniger großem Aufwand abgefangen werden müsste. Ein Abbruch im Form_BeforeUpdate oder Form_Error kann dann auch mal sehr aufwendig werden.
Andere Schwierigkeiten können auch in einer Multiuserumgebung auftreten, da mit dem Speichern u.U. ein unvollständiger DS von einem anderen Nutzer bearbeitet werden könnte, usw. Deshalb gilt eigentlich, daß das vorzeitiges Speichern vermieden werden sollte, genauso wie explizite "SAVE" Buttons.  Vorzeitiges Speichern ist sowieso in den meisten Fällen unnötig.

Gruß Ulrich

Knobbi38

Hallo,

hat mich mal interessiert, ob beide Ausdrücke
If Me.Dirty Then Me.Dirty = False
vs.
Me.Dirty = False
gleichwertig sind oder ob beim zweiten Ausdruck unnötigerweise ein Speichern durchgeführt wird.
Nach einem kurzen Test kann ich bestätigen, dass der zweite Ausdruck äquivalent ist und zumindest keine Ereignisse wie "Form_BeforeUpdate" usw. ausgelöst werden, wenn "Dirty" bereits "False" ist.

Dennoch würde ich die erste Variante bevorzugen, weil sie die Lesbarkeit des Codes erhöht.


FWIW
Knobbi38

Beaker s.a.

Hallo Ulrich,

Bin ja bei dir. Obwohl der Satz an dich adressiert war, war er
eigentlich nur als ein Wink mit dem Zaunpfahl an den TS gedacht.

gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Knobbi38

@Ekkehard:

Kein Problem. Ich hoffe nur, daß der Einwand von mir bei TS auch angekommen ist.

Gruß
Ulrich