Home > Artikel > Ausgabe 5/2017 > Handyverwaltung III: Provider verwalten

Handyverwaltung III: Provider verwalten

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Im dritten Teil der Artikelreihe zum Thema »Handyverwaltung« setzten wir die Arbeit an den Formularen der Lösung fort. In diesem Fall wollen wir die Provider verwalten. Um innerhalb der Lösung nicht immer die gleichen Techniken zu präsentieren, nutzen wir diesmal ein Listenfeld zur Auswahl der unterschiedlichen Datensätze, das sich allerdings im gleichen Formular wie die Darstellung des aktuell ausgewählten Providers befindet.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1705_Handyverwaltung.accdb.

Vorbereitungen

Im Gegensatz zum vorherigen Teil der Artikelreihe, in dem wir beschrieben haben, wir wir die Personen der Handyverwaltung in entsprechenden Formularen darstellen, gibt es zwei wichtige Unterschiede: Erstens kümmern wir uns hier lediglich nur um eine einzige Tabelle ohne weitere Lookup-Felder, nämlich um tblProvider. Zweitens wollen wir die Daten der Tabelle nicht in zwei Formularen darstellen, wie es bei den Personen der Fall war: Dort haben wir nämlich ein Übersichtsformular genutzt, das ein Unterformular mit allen Datensätzen der Tabelle tblPersonen enthielt sowie ein Detailformular, dass nach der Auswahl eines der Datensätze geöffnet wurde und dann diesen Datensatz anzeigte. Nein, wir wollen diesmal nur ein einziges Formular nutzen: Dieses soll im oberen Bereich ein Listenfeld mit allen Einträgen der Tabelle tblProvider anzeigen. Das gleiche Formular soll an die Tabelle tblProvider gebunden sein und die Daten aus den Feldern der Tabelle in daran gebundenen Steuerelementen anzeigen.

Tabelle tblProvider vorbereiten

Wir wollen die Nutzung der Felder der Tabelle tblProvider in den Tabellen und Steuerelementen möglichst einfach gestalten. Deshalb schauen wir uns zuvor an, wo die Feldnamen nicht mit den Bezeichnungen übereinstimmen, die wir in den Abfragen, Formularen, Berichten und Steuerelementen als Bezeichnungsfelder nutzen wollen und passen diese über die Feldeigenschaft Beschriftung entsprechend an. In dieser Tabelle passen die Feldbeschriftungen Bezeichnung, Webadresse, Hotline und Rechnungsinformationen bereits, sodass wir nur für das Primärschlüsselfeld ProviderID die Feldeigenschaft Beschriftung in den Wert Provider-ID ändern müssen (siehe Bild 1).

Anpassen der Beschriftung des Feldes Provider-ID für das Bezeichnungsfelder

Bild 1: Anpassen der Beschriftung des Feldes Provider-ID für das Bezeichnungsfelder

Formular erstellen

Das Formular soll tblProvider heißen. Im Gegensatz zum vorherigen Teil der Artikelreihe, wo wir die beiden Formulare frmPersonenuebersicht und frmPersonendetails verwendet haben, zeigen wir ja hier die Übersicht und die Details in einem Formular an. Also brauchen wir auch keine Erweiterung mehr wir ...uebersicht oder ...details, sondern können das Formular schlicht nach dem bennen, was es auch anzeigt – nämlich Provider.

Datenherkunft zuweisen

Das Formular frmProvider soll die Daten der Tabelle tblProvider anzeigen, allerdings nicht unbedingt in der dort per Primärschlüssel vorgegebenen Reihenfolge, sondern alphabetisch nach der Bezeichnung des Providers sortiert. Dazu erstellen Sie mit dem Ribbon-Befehl eine neue Abfrage namens qryProviderNachBezeichnung, der Sie alle Felder der Tabelle hinzufügen und außerdem für das Feld Bezeichnung in der Zeile Sortierung den Wert Aufsteigend auswählen (siehe Bild 2).

Abfrage, welche die Provider nach der Bezeichnung sortier

Bild 2: Abfrage, welche die Provider nach der Bezeichnung sortier

Diese Abfrage weisen Sie dem Formular nun für die Eigenschaft Datenherkunft zu. Danach wechseln Sie über den Ribbon-Eintrag Entwurf|Tools|Vorhandene Felder hinzufügen zur Feldliste und ziehen von dort aus alle Einträge direkt in den Detailbereich des Formularentwurfs (siehe Bild 3).

Hinzufügen der gebundenen Felder zum Formular frmProvider

Bild 3: Hinzufügen der gebundenen Felder zum Formular frmProvider

Wir wollen jeweils nur einen Datensatz in diesem Formular anzeigen und nur über das Listenfeld einen anderen Datensatz auswählen können, dessen Details in den gebundenen Steuerelementen des Formulars angezeigt werden. Also benötigen wir standardmäßig im Formular aktivierten Elemente wie Navigationsschaltflächen, Datensatzmarkierer, Trennlinien und Bildlaufleisten nicht und können diese durch Einstellen der gleichnamigen Eigenschaften auf den Wert Nein deaktivieren. Wenn das Formular geöffnet wird, soll es jedoch in der Mitte des Access-Fensters erscheinen, weshalb wir die Eigenschaft Automatisch zentrieren auf den Wert Ja einstellen.

Listenfeld als Übersicht hinzufügen

Nun fehlt noch das Listenfeld, welches die Übersicht der Einträge anzeigt und die Auswahl eines der Einträge zur Anzeige der Details im Formular erlaubt. Dazu verschieben Sie zunächst die gebundenen Felder um einige Zentimeter nach unten, sodass Sie das Listenfeld darüber platzieren können. Dazu markieren Sie einfach alle Elemente mit der Tastenkombination Strg + A und verschieben diese dann beispielsweise mit der Nach unten-Taste nach unten.

Haben Sie genügend Platz geschaffen, fügen Sie über das Ribbon ein neues Listenfeld zum Formular hinzu. Dies sieht dann beispielsweise wie in Bild 4 aus. Hier haben wir das Listenfeld noch etwas angepasst. Dazu haben wir es zunächst unterhalb des dazugehörigen Bezeichnungsfeldes positioniert. Dazu markieren Sie das Listenfeld und ziehen es an dem viereckigen Kästchen oben links an die gewünschte Stelle. Legen Sie nun auch gleich den Namen des Listenfeldes fest, und zwar mit dem Wert lstProviderauswahl für die Eigenschaft Name.

Hinzufügen des Listenfeldes zur Auswahl des anzuzeigenden Providers

Bild 4: Hinzufügen des Listenfeldes zur Auswahl des anzuzeigenden Providers

Zuweisen einer Datensatzherkunft zum Listenfeld

Das Listenfeld zeigt bisher noch keine Daten an, was wir ändern, indem wir die Eigenschaft Datensatzherkunft auf den Namen der bereits für das Formular als Datenherkunft verwendeten Abfrage qryProviderNachBezeichnung einstellen. Nun müssen wir uns überlegen, welche Felder der Datensatzherkunft das Listenfeld anzeigen soll. Grundsätzlich reicht es aus, wenn es nur den Namen des Providers anzeigt – die Webadresse, die Hotline und die Rechnungsinformationen benötigen wir ja nie alle gleichzeitig.

Die Datensatzherkunft liefert aber nun gleich alle fünf Felder der Tabelle. Damit das Listenfeld nur das Feld Bezeichnung anzeigt und das Feld ProviderID als gebundene Spalte verwendet, sind Einstellungen in zwei Eigenschaften nötig. Der Wert 2 für die Eigenschaft Spaltenanzahl des Listenfeldes sorgt dafür, dass diese nur die ersten beiden Felder der Datensatzherkunft, also der Abfrage qryProviderNachBezeichnung anzeigt. Aber wir wollen doch nur ein Feld anzeigen? Ja, allerdings ist standardmäßig das erste Feld der Datensatzherkunft als das Feld für die gebundene Spalte festgelegt (Eigenschaft Gebundene Spalte mit dem Wert 1) und zweitens stellen wir im zweiten Schritt ja noch die Spaltenbreiten für die Anzeige der beiden Spalten ein.

Die dazu verwendete Eigenschaft heißt Spaltenbreiten und erhält den Wert 0. Aber warum 0, wir wollen doch die Breite für zwei Spalten einstellen – und welche Einheit wird denn dann überhaupt verwendet? Ganz einfach: Die Einheit ergänzt Access automatisch mit cm, also Zentimeter, und wenn wir nur die Breite für die erste Spalte angeben, hier also 0cm, dann nimmt die zweite Spalte einfach den verbleibenden Platz im Listenfeld ein. Das Ergebnis sieht dann wie in Bild 5 aus. Das Listenfeld enthält in der ersten Spalte, welche mit der Breite 0cm angezeigt wird, den Primärschlüsselwert der Tabelle tblProvider. Damit kann dann leicht der aktuell ausgewählte Wert ermittelt werden.

Das Listenfeld zeigt nur den Wert des Feldes Bezeichnung der zugrunde liegenden Datensatzherkunft an.

Bild 5: Das Listenfeld zeigt nur den Wert des Feldes Bezeichnung der zugrunde liegenden Datensatzherkunft an.

Listenfeld zur Auswahl nutzen

Nun wollen wir dafür sorgen, dass die Auswahl eines der Einträge im Listenfeld auch den gewünschten Datensatz im Formular anzeigt. Dazu fügen Sie dem Listenfeld eine Ereignisprozedur hinzu, die durch das Ereignis Nach Aktualisierung ausgelöst wird. Dazu tragen Sie für die Eigenschaft Nach Aktualisierung den Wert [Ereignisprozedur] ein und klicken auf die Schaltfläche mit den drei Punkten. Die nun im VBA-Editor erscheinende leere Ereignisprozedur füllen Sie wie folgt:

Private Sub lstProviderauswahl_AfterUpdate()

Dim lngProviderID As Long

Dim strSQL As String

lngProviderID = Me!lstProviderauswahl

strSQL = "ProviderID = " & lngProviderID

Me.Filter = strSQL

Me.FilterOn = True

End Sub

Die erste Anweisung nach den beiden Deklarationszeilen füllt den aktuellen Wert des Listenfeldes in die Variable lngProviderID ein. Die zweite setzt eine SQL-Filterbedingung zusammen und speichert diese in der Variablen strSQL. Der Wert könnte etwa so aussehen:

ProviderID = 1

Dieser Ausdruck wird dann der Eigenschaft Filter des Formulars zugewiesen, danach aktiviert die Prozedur den Filter durch Einstellen der Eigenschaft FilterOn auf den Wert True. Das Ergebnis zeigt Bild 6. Wenn wir etwa den dritten Eintrag auswählen, erscheinen die passenden Detaildaten im Unterformular.

Nach der Auswahl im Listenfeld zeigt das Formular in den übrigen Steuerelementen die Details zu diesem Provider an.

Bild 6: Nach der Auswahl im Listenfeld zeigt das Formular in den übrigen Steuerelementen die Details zu diesem Provider an.

Listenfeld und Datenherkunft beim Öffnen synchronisieren

Nun sollen das Listenfeld und die übrigen Steuer­elemente des Formulars beim Öffnen des Formulars den gleichen Datensatz anzeigen. Das ist nicht automatisch der Fall, denn das Listenfeld weist beim Öffnen des Formulars zunächst den Wert Null auf, da kein Eintrag markiert ist. Also sorgen wir mit einer weiteren Ereignisprozedur dafür, dass das Listenfeld beim Öffnen auf den gleichen Datensatz eingestellt wird, den auch das Formular anzeigt. Die Ereignis­eigenschaft, für die wir eine Prozedur hinterlegen wollen, heißt Beim Laden und gehört zum Formular selbst. Dafür legen Sie die folgende Ereignisprozedur an:

Private Sub Form_Load()

Me!lstProviderauswahl = Me!ProviderID

End Sub

Das Ergebnis liefert Bild 7. Wie gewünscht, ist im Listenfeld der gleichen Eintrag wie im Formular selbst markiert.

Das Listenfeld zeigt nun gleich nach dem Laden den gleichen Datensatz an, den auch das Formular enthält.

Bild 7: Das Listenfeld zeigt nun gleich nach dem Laden den gleichen Datensatz an, den auch das Formular enthält.

Datensatzwechsel nur per Listenfeld

Wenn der Benutzer im aktuellen Zustand des Formulars mehrfach die Tabulator-Taste verwendet, landet er nach dem Verlassen des letzten Steuerelements wieder im ersten Steuer­element und wechselt dabei zum nächsten Datensatz (andersherum gelangt er zum vorherigen Datensatz). So kann er dann auch irgendwann zu einem neuen, leeren Datensatz gelangen, was nicht beabsichtigt ist. Also stellen wir die Eigenschaft Zyklus des Formulars auf Aktueller Datensatz ein. Auf diese Weise kann der Fokus zwar endlos durch die Steuer­elemente laufen (inklusive Listenfeld), aber es ist kein Datensatzwechsel mehr möglich.

Neuen Provider anlegen

Normalerweise geschieht das nicht sehr oft, aber hin und wieder gibt es kleine Änderungen in der Providerlandschaft. Wir sollten also die Möglichkeit zum Ändern, Löschen und Hinzufügen von Einträgen bereithalten. Erstere liegt ja schon vor – der aktuelle Datensatz kann auch bearbeitet und die Änderungen können gespeichert werden.

Zum Löschen und zum Anlegen eines neuen Datensatzes fügen wir zwei Schaltflächen zum Formular hinzu (siehe Bild 8). Die erste Schaltfläche soll dafür sorgen, dass ein neuer, leere Datensatz im Formular angezeigt wird. Außerdem soll das Listenfeld keinen Datensatz mehr hervorheben, da ja keiner der aktuellen Einträge angezeigt wird. Die Schaltfläche mit der Beschriftung Löschen soll also zunächst die Prozedur cmdLoeschen_Click auslösen:

Zwei neue Schaltflächen zum Anlegen neuer und zum Löschen bestehender Datensätze.

Bild 8: Zwei neue Schaltflächen zum Anlegen neuer und zum Löschen bestehender Datensätze.

Private Sub cmdNeu_Click()

Me!lstProviderauswahl = Null

DoCmd.GoToRecord Record:=acNewRec

Me!Bezeichnung.SetFocus

End Sub

Dies stellt das Listenfeld auf den Wert Null ein und hebt die Markierung auf und zeigt im Formular einen neuen, leeren Datensatz an. Außerdem verschieben wir den Fokus auf das erste Eingabefeld für den neuen Datensatz.

Allerdings läuft das noch nicht ganz rund, wenn der Benutzer den Datensatz speichern will. Dies ist aktuell nur möglich, wenn er im Listenfeld einen anderen Eintrag auswählt und damit den aktuellen Datensatz wechselt oder das Formular schließt. Ersteres sorgt dann allerdings dafür, dass zwar ein neuer Datensatz in der Tabelle tblProvider gespeichert wurde, dieser aber nicht im Listenfeld lstProvider angezeigt wird. Somit ist dieser auch nicht direkt wieder auswählbar, sondern erst nach dem Aktualisieren des Listenfeldes. Dies kann der Benutzer durch Betätigen der Schaltfläche F5 erreichen. Es wäre allerdings etwas vermessen, dem Benutzer diese Aufgabe zu übertragen. Auch ist es für den Benutzer natürlich nicht offensichtlich, wie der den Datensatz speichern kann.

Also bieten wir etwas Unterstützung und fügen dem Formular zwei weitere Schaltflächen hinzu, diesmal mit den Beschriftungen Speichern und Abbrechen. Aber wollen wir diese Schaltflächen während der Eingabe eines neuen Datensatzes oder der Änderung an einem bestehenden Datensatz statt der vorhandenen Schaltflächen einblenden oder platzieren wir diese daneben? Wir könnten auch die vorhandenen Schaltflächen oben neben die Beschriftung des Listenfeldes verschieben und die Schaltflächen Speichern und Abbrechen an deren Stelle im unteren Bereich einfügen. Das ist wohl die sinnvollere Variante, die wir wie in Bild 9 vornehmen. Die beiden Schaltflächen cmdSpeichern und cmdVerwerfen sollen allerdings nur aktiviert werden, wenn der Benutzer die Bearbeitung des aktuellen oder eines neuen Datensatzes gestartet hat. Die Ereignisprozeduren für die beiden Schaltflächen sind schnell gefüllt. Die Schaltfläche zum Speichern des geänderten Datensatzes füllen wir wie folgt:

Erweiterung um zwei Schaltflächen zum Speichern und Verwerfen der aktuellen Änderungen

Bild 9: Erweiterung um zwei Schaltflächen zum Speichern und Verwerfen der aktuellen Änderungen

Private Sub cmdSpeichern_Click()

Me.Dirty = False

Me!cmdVerwerfen.Enabled = False

Me!cmdSpeichern.Enabled = False

End Sub

Sie speichert die Änderungen, indem Sie den In Bearbeitung-Status Dirty des aktuellen Datensatzes auf False einstellt. Außerdem deaktiviert sie die beiden Schaltflächen cmdVerwerfen und cmdSpeichern, da ja aktuell keine zu speichernden oder zu verwerfenden Änderungen vorliegen. Die Prozedur, welche die Schaltfläche cmdVerwerfen auslöst, erledigt fast die gleiche Aufgabe – mit dem Unterschied, dass die erste Anweisung die vorgenommenen Änderungen rückgängig macht:

Private Sub cmdVerwerfen_Click()

Me.Undo

Me!cmdVerwerfen.Enabled = False

Me!cmdSpeichern.Enabled = False

End Sub

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!