Unsere Anwendung “Handyverwaltung” haben wir nun mit allen notwendigen Tabellen, Abfragen und Formularen ausgestattet. Es fehlen noch Berichte, um die enthaltenen Daten auszugeben und natürlich das Sahnehäubchen auf die Benutzeroberfläche: ein Ribbon, mit dem sich die verschiedenen Formulare und Funktionen aufrufen lassen. Dieses werden wir im vorliegenden Artikel vorstellen.
Beispieldatenbank
Die Beispiele dieses Artikels finden Sie in der Datenbank 1802_Handyverwaltung.accdb.
Benötigte Ribbon-Befehle
Was genau wollen wir mit dem Ribbon steuern Als Erstes wollen wir dem Benutzer nicht zumuten, dass er die Formulare und (noch zu erstellenden) Berichte der Anwendung per Doppelklick auf die Einträge im Navigationsbereich öffnen muss. Die Anzahl der Elemente ist zwar noch überschaubar (siehe Bild 1), aber dem Benutzer wollen wir doch eine optisch ansprechendere Möglichkeit bieten, die Funktionen der Anwendung anzusteuern. Außerdem sind die meisten Elemente im Navigationsbereich für den Benutzer irrelevant beziehungsweise sollen überhaupt nicht geöffnet werden können – zum Beispiel die Tabellen, Abfragen und Module. Auch die Unterformulare sollte er tunlichst nicht öffnen, außer als Teil des entsprechenden Hauptformulars. Und viele der Formulare erfordern für eine einwandfreie Funktion auch die Angabe von öffnungsparametern, Filtern und anderer Einstellungen, sodass ein öffnen per Doppelklick aus dem Navigationsbereich heraus keinen Sinn macht.
Bild 1: Access-Objekte
Welche Elemente aber wollen wir nun im Ribbon unterbringen und wie ordnen wir diese an Wir haben ja verschiedene Möglichkeiten für die Erstellung einer Hierarchie, die normalerweise über die Ebenen tab-Element, group-Element und untergeordnete Steuer-elemente wie etwa das button-Element organisiert werden.
Um zu ermitteln, welche Formular und Funktionen wir vom Ribbon aus aufrufen wollen, hilft ein Blick in das Datenmodell (siehe Bild 2). Hier können wir zunächst die Verknüpfungstabellen zum Definieren der m:n-Beziehungen herauslassen. Es bleiben dann die folgenden Entitäten:
Bild 2: Datenmodell
- Personen
- Mobilfunkgeräte
- SIM-Karten
- Verträge
- Provider
- Hersteller
- Modelle
Für diese Elemente haben wir jeweils teilweise übersichtsformular, teilweise Detailformulare, aber auch kombinierte Formulare. Normalerweise würde man dies vielleicht konsistenter in immer der gleichen Art von Darstellung für übersichten und Details programmieren, aber wir wollten in dieser Beispiellösung ja auch die verschiedenen Möglichkeiten darstellen.
Im Prinzip gibt es hier keine Stammdaten, die nicht immer wieder mal geändert werden, daher wollen wir alle Entitäten gleich behandeln und diese in einem einzigen tab-Element darstellen. Für jede Gruppe von Elementen erstellen wir jedoch jeweils zwei Einträge, nämlich einen zur Anzeige der übersicht und einen zum Anlegen eines neuen Eintrags. Bei den Entitäten, wo wir die übersicht und die Detailansicht in eigenen Formularen anzeigen, ist das kein Problem.
Bei den Entitäten, die in einem einzigen Formular erscheinen, prinzipiell auch nicht – hier wird das gleiche Formular eben einmal zur Anzeige der übersicht mit dem ersten Datensatz in der Detailansicht angezeigt und einmal mit einem neuen, leeren Datensatz.
Wir haben noch zwei Tabellen ausgelassen: tblAnreden und tblMobilfunkgeraetearten. Während die Anreden mit den Einträgen Herr und Frau vollständig sind und nicht mehr bearbeitet werden müssen, gibt es für die Mobilfunkgerätearten schlicht keine eigene Eingabemaske. Sollten Mobilfunkgerätearten hinzukommen, kann der Benutzer diese direkt über das entsprechende Kombinationsfeld cboMobilfunk-geraete-arten im Formular frmModelldetails eingeben.
Ribbon-Tabelle hinzufügen
Um das Ribbon zu definieren, benötigen wir als Erstes eine geeignete Tabelle, um die Ribbon-Definition zu speichern. Diese nennen wir USysRibbons, damit Access diese Tabelle beim Starten automatisch erkennt und die darin enthaltenen Ribbon-Definitionen verwenden kann. Unter anderem tauchen diese dann in den Access-Optionen auf, wo Sie die beim öffnen der Anwendung anzuzeigende Ribbon-Definition festlegen können. Legen Sie also eine neue Tabelle an und fügen Sie die folgenden Felder hinzu:
- RibbonID: Primärschlüsselfeld der Tabelle
- Ribbonname: Name der Ribbon-Definition
- RibbonXML: XML-Definition des Ribbons
Für das Feld Ribbonname legen wir vorsichtshalber einen eindeutigen Index fest, damit nicht versehentlich zwei Mal der gleiche Name angegeben wird (siehe Bild 3).
Bild 3: Tabelle zum Speichern der Ribbon-Definitionen
Wenn Sie die Tabelle gespeichert und geschlossen haben, wundern Sie sich möglicherweise, dass die Tabelle nicht im Navigationsbereich erscheint. Das ist der Fall, weil die Tabelle durch die Bezeichnung automatisch zur Systemtabelle wird.
Wenn Sie diese Tabelle im Navigationsbereich sehen wollen, müssen Sie mit der rechten Maustaste auf die Titelleiste des Navigationsbereichs klicken und den Eintrag Navigationsoptionen… aus dem Kontextmenü auswählen. Es erscheint der Dialog aus Bild 4, wo Sie die Option Systemobjekte anzeigen aktivieren. Anschließend erscheint neben den anderen Systemtabellen wie MSysObjects und so weiter auch die Tabelle USysRibbons im Navigationsbereich.
Bild 4: Aktivieren der Anzeige der Systemobjekte im Navigationsbereich
Ribbon-Definition erstellen
Damit können wir uns an die Arbeit machen und die Ribbon-Definition erstellen. Wir benötigen zunächst ein umschließendes customUI-Element, dass wir mit dem Attribut loadImage ausstatten und diesem den Wert loadImage zuweisen. Damit legen wir fest, dass wann immer ein image-Attribut für Element angegeben ist, die für loadImage angegebene Callback-Funktion aufgerufen wird, damit es das dem Element image zugewiesene Bild einliest und für das Element im Ribbon anzeigt:
Danach folgt das ribbon-Element, für das wir ein Attribut definieren, nämlich startFromScratch. Wenn wir dieses auf true einstellen, wird das Ribbon beim Starten der Anwendung komplett neu aufgebaut und die eingebauten Elemente werden dabei nicht berücksichtigt:
Darin befindet sich das tabs-Element, welches ein oder mehrere tab-Elemente enthalten kann – je nachdem, wieviele Registerseiten das Ribbon enthalten soll:
Unser einziges tab-Element soll für das Attribut id den Wert tabHandyverwaltung und für label den Wert Handyverwaltung aufnehmen, der dann als Beschriftung angezeigt wird:
Innerhalb des tab-Elements folgen dann die group-Elemente, die dann wiederum die tatsächlichen Steuer-elemente enthalten. Wir schauen uns dies am Beispiel der Gruppe mit der Beschriftung Personen an:
Auch hier reichen und die beiden Attribute id und label aus.
Anders sieht es bei den button-Elementen aus, von denen wir jeder Gruppe zwei hinzufügen. Die erste soll jeweils die übersicht anzeigen, die zweite ein Formular mit einem neuen Datensatz. Für jedes button-Element hinterlegen wir mit dem Attribut image den Namen des Bildes, dass die Schaltfläche im Ribbon anzeigen soll. Diese Bilder speichern wir in der Tabelle MSysResources, die wir weiter unten beschreiben. Das Attribut label nimmt die Beschriftung des button-Elements auf, hier immer übersicht oder Neu. Für id hinterlegen wir eine eindeutige Bezeichnung. Daher kommen wir mit btnUebersicht und btnNeu nicht aus, sondern müssen noch den Entitätstyp hinzunehmen – also etwa btnPersonenUebersicht und btnPersonNeu. Für das Attribut onAction hinterlegen wir den Namen der VBA-Prozedur, die beim Anklicken der Schaltfläche aufgerufen werden soll.
Hier tragen wir immer onAction ein, da wir nur eine solche Prozedur verwenden, die dann das aufrufende Steuer-element auswertet und dementsprechende Anweisungen ausführt. Schließlich gibt das Attribut size mit dem Wert large an, dass die Schaltflächen groß und mit 32×32 Pixel großen Icons angezeigt werden sollen. Hier die beiden Definitionen für die Schaltflächen der Gruppe Personen:
Die Gruppe endet schließlich mit dem schließenden group-Element:
Außerdem folgenden noch die weiteren schließenden Elemente:
Die gesamte XML-Definition des Ribbons sieht schließlich wie in Listing 1 aus. Diesen Code kopieren oder schreiben Sie in das Feld RibbonXML der Tabelle USysRibbons. Tragen Sie außerdem für den gleichen Datensatz der Tabelle den Wert Main in das Feld Ribbonname ein. Die Tabelle sieht danach wie in Bild 5 aus.
Bild 5: Die Tabelle USysRibbons mit der Ribbon-Definition
Listing 1: Code der Ribbon-Definition
Möchten Sie weiterlesen? Dann lösen Sie Ihr Ticket!
Hier geht es zur Bestellung des Jahresabonnements des Magazins Access [basics]:
Zur Bestellung ...
Danach greifen Sie sofort auf alle rund 400 Artikel unseres Angebots zu - auch auf diesen hier!
Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein: