{"id":55001104,"date":"2017-10-01T00:00:00","date_gmt":"2020-05-13T21:27:13","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1104"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Kundenverwaltung_mit_Ribbon_Teil_II","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Kundenverwaltung_mit_Ribbon_Teil_II\/","title":{"rendered":"Kundenverwaltung mit Ribbon, Teil II"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/0f3bf761c4ea4a1a84e10ff19303ed24\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Im Beitrag &#8222;Ribbonklassen&#8220; (www.access-im-unternehmen.de\/1069) haben wir Klassen f&uuml;r die Anzeige von Ribbons und den enthaltenen Steuer-elementen eingef&uuml;hrt, die wir in &#8222;Kundenverwaltung mit Ribbon, Teil I&#8220; (www.access-im-unternehmen.de\/1091) in eine Anwendung eingebaut haben. Ein Leser fragte nun, ob man damit nicht auch benutzerabh&auml;ngige Ribbons anzeigen kann. Nat&uuml;rlich geht das &#8211; wie es funktioniert, zeigt der vorliegende Beitrag. Dar&uuml;ber hinaus erweitern wir unser Beispiel noch um ein paar neue Elemente.<\/b><\/p>\n<h2>Benutzerdefinierte Ribbon-Eintr&auml;ge<\/h2>\n<p>Im ersten Beispiel wollen wir das Ribbon, das mit dem Formular <b>frmKundenuebersicht <\/b>angezeigt wird, in Abh&auml;ngigkeit vom angemeldeten Benutzer die Schaltfl&auml;che zum L&ouml;schen eines Kunden aktiviert oder deaktiviert.<\/p>\n<p>Zu diesem Zweck wollen wir nun keine Benutzerverwaltung zur Anwendung hinzuf&uuml;gen, sondern zeigen einfach beim &ouml;ffnen der Anwendung ein Meldungsfenster an, das den Benutzer fragt, ob er ein Administrator ist oder nicht.<\/p>\n<p>Nur Administratoren sollen Kunden l&ouml;schen d&uuml;rfen. Das Ergebnis dieser Abfrage speichern wir dann in einer tempor&auml;ren Variablen (<b>TempVar<\/b>).<\/p>\n<p>Dazu &auml;ndern wir die beim &ouml;ffnen durch das <b>AutoExec<\/b>-Makro aufgerufene Prozedur wie in Listing 1. Mit der <b>MsgBox<\/b>-Funktion ermitteln wir den Wert f&uuml;r die lokale <b>Boolean<\/b>-Variable <b>bolAdministrator<\/b>, deren Inhalt wir dann in die neu zu erstellende <b>TempVar<\/b>-Variable mit dem Namen <b>IstAdministrator <\/b>schreiben.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>RibbonLaden()\r\n     <span style=\"color:blue;\">Dim <\/span>bolAdministrator<span style=\"color:blue;\"> As Boolean<\/span>\r\n     bolAdministrator = <span style=\"color:blue;\">MsgBox<\/span>(\"Sind Sie ein Administrator (Ja) oder ein normaler Benutzer (Nein)\", _\r\n         vbYesNo) = vbYes\r\n     TempVars.Add \"IstAdministrator\", bolAdministrator\r\n     Startribbon.CreateRibbon\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Speichern des Benutzer-Status beim &ouml;ffnen der Anwendung<\/span><\/b><\/p>\n<p>In der Code behind-Klasse des Formulars <b>frmKundenuebersicht <\/b>ist eine kleine &auml;nderung am Code notwendig. Sie m&uuml;ssen lediglich die Prozedur <b>Form_Load<\/b>, die beim Laden des Formulars ausgel&ouml;st wird, wie folgt erweitern:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     CreateRibbon\r\n     <span style=\"color:blue;\">If <\/span>TempVars(\"IstAdministrator\") = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         btnKundeLoeschen.Enabled = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         btnKundeLoeschen.Enabled = <span style=\"color:blue;\">False<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die Prozedur pr&uuml;ft nach dem Erstellen des Ribbons durch die Prozedur <b>CreateRibbon<\/b>, ob die <b>TempVars<\/b>-Variable <b>IstAdministrator <\/b>den Wert <b>True <\/b>enth&auml;lt. Falls ja, wird die Eigenschaft <b>Enabled <\/b>des Objekts <b>btnKundeLoeschen <\/b>auf <b>True <\/b>eingestellt, sonst auf den Wert <b>False<\/b>.<\/p>\n<p>Die k&uuml;rzere Variante dieses Konstrukts sieht so aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     CreateRibbon\r\n     btnKundeLoeschen.Enabled = TempVars(\"IstAdministrator\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Wenn Sie beim &ouml;ffnen der Anwendung nun die Meldung mit der Frage nach Administrator oder Benutzer mit <b>Benutzer <\/b>beantworten, sieht das Formular <b>frmKunden&uuml;bersicht <\/b>wie in Bild 1 aus &#8211; mit deaktivierter Schaltfl&auml;che <b>Kunde l&ouml;schen<\/b>.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/pic_1104_001.png\" alt=\"Deaktivierte L&ouml;schen-Schaltfl&auml;che\" width=\"599,593\" height=\"407,1072\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Deaktivierte L&ouml;schen-Schaltfl&auml;che<\/span><\/b><\/p>\n<p>Warum k&ouml;nnen Sie die Eigenschaft <b>Enabled <\/b>nicht gleich beim Definieren auf <b>False <\/b>einstellen In unserem Beispiel geschieht Folgendes: Sie erstellen das Ribbon mit seinen Tabs, Groups und Buttons. F&uuml;r die Buttons wird dabei, soweit nicht anders angegeben, die <b>get&#8230;<\/b>-Version eines Attributs angegeben. Sie k&ouml;nnen also beispielsweise zum Festlegen eines Bildes, das sich nicht &auml;ndern soll, die <b>image<\/b>-Eigenschaft nutzen:<\/p>\n<pre><span style=\"color:blue;\">With<\/span> btnKundeLoeschen\r\n     .Label = \"Kunde l&ouml;schen\"\r\n     .Size = msoRibbonControlSizelarge\r\n     .Image = \"user_delete\"\r\nEnd <span style=\"color:blue;\">With<\/span><\/pre>\n<p>Dies resultiert dann in der folgenden Definition:<\/p>\n<pre>&lt;button label=\"Kunde l&ouml;schen\" id=\"ribKundenuebersicht_btnKundeLoeschen\" size=\"large\" image=\"user_delete\" \r\n     onAction=\"OnAction\" enabled=\"true\" visible=\"true\" \/&gt;<\/pre>\n<p>Oder Sie wollen das Bild zur Laufzeit dynamisch zuweisen. Dann stellen Sie einfach noch keinen festen Wert f&uuml;r die Eigenschaft <b>Image <\/b>ein:<\/p>\n<pre><span style=\"color:blue;\">With<\/span> btnKundeLoeschen\r\n     .Label = \"Kunde l&ouml;schen\"\r\n     .Size = msoRibbonControlSizelarge\r\nEnd <span style=\"color:blue;\">With<\/span><\/pre>\n<p>In diesem Fall erzeugen die Ribbon-Klassen den folgenden XML-Code f&uuml;r das Element:<\/p>\n<pre>&lt;button label=\"Kunde l&ouml;schen\" id=\"ribKundenuebersicht_btnKundeLoeschen\" size=\"large\" getImage=\"GetImage\" \r\n     onAction=\"OnAction\" getEnabled=\"GetEnabled\" getVisible=\"GetVisible\" \/&gt;<\/pre>\n<p>Sie sehen, dass hier nicht mehr die Eigenschaft <b>image <\/b>verwendet wird, sondern die Eigenschaft <b>getImage<\/b>. Damit wird das Bild auch nicht mehr direkt festgelegt, sondern Sie k&ouml;nnen es zu einem sp&auml;teren Zeitpunkt &uuml;ber die Eigenschaft <b>Image <\/b>der Objektvariablen f&uuml;r das Element einstellen.<\/p>\n<p>Wichtig ist also der Zeitpunkt, zu dem Sie die Eigenschaft <b>Image <\/b>f&uuml;llen &#8211; vor dem Erstellen der Ribbon-Definition durch die Methode <b>GetRibbon <\/b>der Klasse <b>Ribbons <\/b>oder erst danach. Vorher wird das Image &uuml;ber das Attribut <b>image <\/b>fest eingebunden, nachher wird es &uuml;ber die Callback-Methode <b>getImage <\/b>ermittelt.<\/p>\n<p>Das Gleiche gilt auch f&uuml;r die beiden Eigenschaft <b>Visible <\/b>und <b>Enabled<\/b>. Deshalb d&uuml;rfen Sie, wenn Sie <b>Visible <\/b>oder <b>Enabled <\/b>sp&auml;ter dynamisch setzen wollen, die entsprechende Eigenschaft nicht vor dem Erstellen der Ribbon-Definition setzen, sondern erst danach.<\/p>\n<p>Was ist der Unterschied Theoretisch k&ouml;nnte man auch einfach immer die <b>get&#8230;<\/b>-Attribute nutzen und die Werte bei jedem neuen Einblenden des Ribbons erneut abrufen. Allerdings kostet auch dies Performance, und warum sollten wir, wenn ein Element feste Attribute wie etwa Bilder hat, Zeit vergeuden &#8211; auch wenn es nur sehr wenig Zeit ist<\/p>\n<p>Wenn Sie sich die <b>Kunde l&ouml;schen<\/b>-Schaltfl&auml;che ansehen und entscheiden wollen, ob diese abh&auml;ngig vom jeweiligen Benutzer entweder per Definition oder dynamisch aktiviert oder deaktiviert werden soll, gibt es beispielsweise nur einen praktischen Ansatz: Sie sollten diese vor der Definition mit <b>btnKundeLoeschen.Enabled <\/b>entsprechend des aktuellen Benutzers einstellen. Wenn Sie sich f&uuml;r die dynamische Variante entschieden, kann die Enabled-Eigenschaft sp&auml;ter jederzeit per Code ge&auml;ndert werden &#8211; Sie m&uuml;ssen dann dort immer nochmals pr&uuml;fen, ob der aktuelle Benutzer diese Schaltfl&auml;che &uuml;berhaupt verwenden darf. <\/p>\n<h2>Schaltfl&auml;chen mit Leben f&uuml;llen<\/h2>\n<p>Damit kommen wir zu den im ersten Teil dieser Beitragsreihe versprochenen Funktionen, denn wir haben dort ja zun&auml;chst einige Schaltfl&auml;chen im Ribbon zum Formular <b>frmKundenuebersicht<\/b> angelegt. Mit diesen wollen wir die folgenden Aktionen durchf&uuml;hren:<\/p>\n<ul>\n<li>einen neuen Kunden anlegen,<\/li>\n<li>den aktuell markierten Kunden bearbeiten und<\/li>\n<li>den aktuell markierten Kunden l&ouml;schen.<\/li>\n<\/ul>\n<p>Die erste Aufgabe erfordert keine Vorarbeiten, denn wir k&ouml;nnen den Dialog zum Anlegen eines neuen Kunden direkt &ouml;ffnen und dem Benutzer die M&ouml;glichkeit geben, den neuen Kunden zu bearbeiten.<\/p>\n<p>Nach dem Klick auf die <b>OK<\/b>-Schaltfl&auml;che soll das Formular geschlossen und das Formular <b>frmKundenuebersicht <\/b>aktualisiert werden.<\/p>\n<p>Die zweite und die dritte Aufgabe erfordern es, dass der Benutzer einen der Kunden im Formular <b>frmKundenuebersicht <\/b>markiert hat. Aber ist das &uuml;berhaupt n&ouml;tig Momentan k&ouml;nnen wir mindestens noch neue Datens&auml;tze &uuml;ber die letzte Zeile der Datenblattansicht hinzuf&uuml;gen (s. Bild 2). Da wir aber ein eigenes Formular f&uuml;r das Anlegen und Bearbeiten von Kunden einsetzen wollen, das auch Aufgaben wie die Validierung der eingegebenen Daten ausf&uuml;hren k&ouml;nnte, sollten wir die M&ouml;glichkeit der Eingabe neuer Datens&auml;tze unterbinden.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/pic_1104_002.png\" alt=\"Aktuell k&ouml;nnen noch neue Eintr&auml;ge zum Formular frmKundenuebersicht hinzugef&uuml;gt werden.\" width=\"499,6607\" height=\"382,0398\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Aktuell k&ouml;nnen noch neue Eintr&auml;ge zum Formular frmKundenuebersicht hinzugef&uuml;gt werden.<\/span><\/b><\/p>\n<p>Dazu stellen Sie in den Eigenschaften des Formulars die Eigenschaft <b>Anf&uuml;gen zulassen <\/b>auf den Wert <b>Nein <\/b>ein. Da wir auch zum Bearbeiten ein entsprechendes Detailformular &ouml;ffnen wollen, k&ouml;nnen Sie auch die Eigenschaft <b>Bearbeitungen zulassen <\/b>auf <b>Nein <\/b>einstellen. Und schlie&szlig;lich soll auch das L&ouml;schen nur &uuml;ber die entsprechende Ribbon-Schaltfl&auml;che geschehen, sodass auch <b>L&ouml;schen zulassen <\/b>den Wert <b>Nein <\/b>erh&auml;lt (s. Bild 3).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/pic_1104_003.png\" alt=\"L&ouml;schen, Bearbeiten und Anlegen von Daten im Formular frmKundenuebersicht verhindern\" width=\"424,7115\" height=\"412,1529\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: L&ouml;schen, Bearbeiten und Anlegen von Daten im Formular frmKundenuebersicht verhindern<\/span><\/b><\/p>\n<p>M&uuml;ssen wir also noch pr&uuml;fen, ob ein Artikel markiert ist, bevor der Benutzer auf eine der Schaltfl&auml;chen <b>Kunde bearbeiten <\/b>oder <b>Kunde l&ouml;schen <\/b>klickt Ja, denn es gibt noch eine einzige M&ouml;glichkeit, bei der kein Datensatz markiert ist &#8211; dann n&auml;mlich, wenn die zugrunde liegende Tabelle <b>tblKunden <\/b>&uuml;berhaupt keinen Datensatz enth&auml;lt.<\/p>\n<h2>Schaltfl&auml;chen abh&auml;ngig von Datens&auml;tzen aktivieren und deaktivieren<\/h2>\n<p><!--30percent--><\/p>\n<p>Wir sollten also daf&uuml;r sorgen, dass eine entsprechende Meldung erscheint, wenn der Benutzer eine der beiden Schaltfl&auml;chen <b>Kunde bearbeiten <\/b>oder <b>Kunde l&ouml;schen <\/b>klickt, w&auml;hrend kein Kunden-Datensatz markiert ist. Wobei dieser Ansatz nicht ganz ergonomisch ist, denn warum sollte der Benutzer &uuml;berhaupt einen der Befehle anklicken k&ouml;nnen, obwohl wir die beiden Schaltfl&auml;chen auch einfach deaktivieren k&ouml;nnten Immerhin haben wir mit unseren Ribbon-Klassen ja f&uuml;r eine einfache Steuerung dieser Elemente per VBA gesorgt.<\/p>\n<p>Welches Ereignis aber nutzen wir, um zu pr&uuml;fen, ob sich aktuell ein Datensatz in der Tabelle befindet oder nicht Der erste Ansatz w&auml;re die Ereigniseigenschaft <b>Beim Anzeigen<\/b>, die bei jedem Wechsel auf einen anderen Datensatz ausgel&ouml;st wird. Wir legen dazu zun&auml;chst eine Ereignisprozedur f&uuml;r die Schaltfl&auml;che <b>btnKundeLoeschen <\/b>des Ribbons an, welche den aktuell markierten Datensatz im Formular <b>frmKundenuebersicht <\/b>l&ouml;schen soll. Diese soll im ersten Ansatz wie in Listing 2 aussehen. Nachdem die Schaltfl&auml;che <b>Kunde l&ouml;schen <\/b>wie im Artikel <b>btnKundeLoeschen<\/b> beschrieben wie folgt angelegt wurde, k&ouml;nnen Sie ihre Ereignisprozeduren implementieren:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>btnKundeLoeschen_OnAction(control<span style=\"color:blue;\"> As <\/span>Office.IRibbonControl)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">MsgBox<\/span>(\"Kunde wirklich l&ouml;schen\", vbYesNo) = vbYes<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n         db.Execute \"DELETE FROM tblKunden WHERE KundeID = \" & Me!KundeID, dbFailOnError\r\n         Me.Requery\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 2: L&ouml;schen eines Kunden per Ribbon-Schaltfl&auml;che<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents btnKundeLoeschen<span style=\"color:blue;\"> As <\/span>clsButton<\/pre>\n<p>Dazu w&auml;hlen Sie im Codefenster des Klassenmoduls des Formulars <b>frmKundenuebersicht <\/b>erst im linken Kombinationsfeld den Eintrag <b>btnKundeLoeschen <\/b>aus und dann im rechten den Eintrag <b>OnAction<\/b> (s. Bild 4). Dies erstellt eine neue, leere Ereignisprozedur namens <b>btnKundeLoeschen_OnAction<\/b>, die Sie dann entsprechend f&uuml;llen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/pic_1104_004.png\" alt=\"Anlegen einer Ereignisprozedur f&uuml;r eine Ribbon-Schaltfl&auml;che\" width=\"649,559\" height=\"337,3967\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Anlegen einer Ereignisprozedur f&uuml;r eine Ribbon-Schaltfl&auml;che<\/span><\/b><\/p>\n<p>Die Prozedur fragt den Benutzer, ob er den Datensatz wirklich l&ouml;schen will und f&uuml;hrt dann gegebenenfalls eine entsprechende SQL-Anweisung aus. Anschlie&szlig;end sorgt sie durch den Aufruf der Methode <b>Requery <\/b>des Formulars selbst (<b>Me<\/b>) f&uuml;r die Aktualisierung der angezeigten Datens&auml;tze. Und nun kommt das Problem: Wir legen zuvor die Ereignisprozedur an, die durch das Ereignis <b>Beim Anzeigen <\/b>ausgel&ouml;st wird, und f&uuml;gen zwei Anweisungen hinzu, welche die beiden Schaltfl&auml;chen <b>btnKundeBearbeiten <\/b>und <b>btnKundeLoeschen <\/b>des Ribbons aktivieren, wenn im Formular ein Datensatz markiert ist und deaktivieren, wenn kein Datensatz markiert ist:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Current()\r\n     btnKundeLoeschen.Enabled = <span style=\"color:blue;\">Not<\/span> IsNull(Me!KundeID)\r\n     btnKundeBearbeiten.Enabled = <span style=\"color:blue;\">Not<\/span> IsNull(Me!KundeID)\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Allerdings wird die Prozedur <b>Form_Current <\/b>genau nur dann ausgel&ouml;st, wenn der Datensatzzeiger auch auf einen Datensatz springt &#8211; aber nicht, wenn kein Datensatz mehr vorhanden ist! Wenn Sie den letzten Datensatz gel&ouml;scht haben, feuert dieses Ereignis also nicht und die Schaltfl&auml;chen <b>btnKundeBearbeiten <\/b>und <b>btnKundeLoeschen <\/b>werden nicht deaktiviert.<\/p>\n<p>Warum nochmal verwenden wir eigentlich eine SQL-Anweisung, um einen Datensatz per Ribbon-Schaltfl&auml;che zu l&ouml;schen, und rufen nicht einfach die Methode <b>RunCommand acCmdDeleteRecord <\/b>auf Weil diese Methode deaktiviert ist, wenn wir die Eigenschaft <b>L&ouml;schen zulassen <\/b>des Formulars auf <b>Nein <\/b>eingestellt haben &#8211; und wir wollten ja erreichen, dass der Benutzer Bearbeitungen der Datens&auml;tze nur &uuml;ber die drei Ribbon-Schaltfl&auml;chen initialisieren kann und nicht &uuml;ber die &uuml;blichen Elemente der Datenblattansicht.<\/p>\n<p>Also gibt es nur eine einfache M&ouml;glichkeit: Wir f&uuml;gen die beiden Anweisungen noch zur Prozedur <b>btnKundeLoeschen_OnAction <\/b>hinzu, und zwar verbunden mit der Bedingung, dass die mit der Eigenschaft <b>RecordCount <\/b>ermittelte Anzahl der Datenstze des Recordsets des Formulars den Wert <b>0 <\/b>enth&auml;lt. Diesmal stellen wir die Werte der Eigenschaft <b>Enabled <\/b>allerdings nicht auf einen noch zu ermittelnden Wert ein, sondern direkt auf <b>False <\/b>&#8211; wir haben ja soeben schon gepr&uuml;ft, dass kein Datensatz mehr vorhanden ist (s. Listing 3). Auf diese Weise stellen wir die <b>Enabled<\/b>-Eigenschaften auch jeweils nicht mehr als einmal ein.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>btnKundeLoeschen_OnAction(control<span style=\"color:blue;\"> As <\/span>Office.IRibbonControl)\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">MsgBox<\/span>(\"Kunde wirklich l&ouml;schen\", vbYesNo) = vbYes<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n         db.Execute \"DELETE FROM tblKunden WHERE KundeID = \" & Me!KundeID, dbFailOnError\r\n         Me.Requery\r\n         <span style=\"color:blue;\">If <\/span>Me.Recordset.RecordCount = 0<span style=\"color:blue;\"> Then<\/span>\r\n             btnKundeLoeschen.Enabled = <span style=\"color:blue;\">False<\/span>\r\n             btnKundeBearbeiten.Enabled = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: L&ouml;schen eines Kunden per Ribbon-Schaltfl&auml;che und Deaktivieren von Schaltfl&auml;chen, falls kein Datensatz mehr vorhanden ist.<\/span><\/b><\/p>\n<p>Das Ergebnis nach dem L&ouml;schen des letzten vorhandenen Datensatzes in der Tabelle <b>tblKunden <\/b>sieht dann wie in Bild 5 aus. Die beiden Schaltfl&auml;chen <b>Kunde bearbeiten <\/b>und <b>Kunde l&ouml;schen <\/b>werden wie gew&uuml;nscht deaktiviert.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/pic_1104_005.png\" alt=\"Deaktivieren der beiden Schaltfl&auml;chen Kunde bearbeiten und Kunde l&ouml;schen, wenn kein Datensatz angezeigt wird\" width=\"499,6607\" height=\"327,2426\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Deaktivieren der beiden Schaltfl&auml;chen Kunde bearbeiten und Kunde l&ouml;schen, wenn kein Datensatz angezeigt wird<\/span><\/b><\/p>\n<h2>Neuen Kunden anlegen<\/h2>\n<p>Die Schaltfl&auml;che <b>Neuer Kunde <\/b>soll ein weiteres Formular namens <b>frmKundendetails <\/b>in der Formularansicht &ouml;ffnen. Die durch diese Schaltfl&auml;che ausgel&ouml;ste Ereignisprozedur <b>btnNeuerKunde_OnAction<\/b>, die Sie wie die Prozedur <b>btnKundeLoeschen_OnAction <\/b>weiter oben &uuml;ber die beiden Kombinationsfelder des Codefensters anlegen, finden Sie in Listing 4. Sie f&uuml;hrt zwei Anweisungen aus. Die erste &ouml;ffnet das Formular <b>frmKundendetails <\/b>und verwendet dabei die beiden Parameter <b>DataMode <\/b>und <b>WindowMode<\/b>. <b>WindowMode <\/b>mit dem Wert <b>acDialog <\/b>sorgt daf&uuml;r, dass das Formular <b>frmKundendetails <\/b>als modaler Dialog ge&ouml;ffnet wird und der aufrufende Code erst weiterl&auml;uft, wenn der Benutzer das Fenster wieder schlie&szlig;t. Erst dann wird auch die zweite Anweisung der Prozedur ausgef&uuml;hrt, die daf&uuml;r sorgt, dass die Datenherkunft des Formulars aktualisiert und somit auch ein eventuell neu hinzugef&uuml;gter Datensatz im Formular <b>frmKundenuebersicht <\/b>angezeigt wird. Der Wert <b>acFormAdd <\/b>f&uuml;r den Parameter <b>DataMode <\/b>sorgt daf&uuml;r, dass das ge&ouml;ffnete Formular direkt einen neuen, leeren Datensatz anzeigt.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>btnNeuerKunde_OnAction(control<span style=\"color:blue;\"> As <\/span>Office.IRibbonControl)\r\n     DoCmd.OpenForm \"frmKundendetails\", DataMode:=acFormAdd, WindowMode:=acDialog\r\n     Me.Requery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: &ouml;ffnen des Formulars frmKundendetails zum Anlegen eines neuen Datensatzes<\/span><\/b><\/p>\n<h2>Formular frmKundendetails anlegen<\/h2>\n<p>Das Formular <b>frmKundendetails<\/b> verwenden wir f&uuml;r zwei Anwendungszwecke: Erstens f&uuml;r das Anlegen neuer Kundendatens&auml;tze und zweitens zum Bearbeiten eines Kundendatensatzes. Um dieses Formular zu erstellen, legen Sie ein neues Formular an und speichern Sie es unter dem Namen <b>frmKundendetails<\/b>.<\/p>\n<p>Stellen Sie &uuml;ber die Eigenschaft <b>Datenherkunft <\/b>die Tabelle <b>tblKunden <\/b>als Datenquelle f&uuml;r das Formular ein. Wenn Sie nun die Feldliste aktivieren, k&ouml;nnen Sie auf einen Rutsch alle ben&ouml;tigten Felder in den Detailbereich des Formulars ziehen (s. Bild 6).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/pic_1104_006.png\" alt=\"Hinzuf&uuml;gen der gew&uuml;nschten Felder zum Formular frmKundendetails\" width=\"649,559\" height=\"554,365\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Hinzuf&uuml;gen der gew&uuml;nschten Felder zum Formular frmKundendetails<\/span><\/b><\/p>\n<p>Danach k&ouml;nnen Sie diese noch nach Ihren eigenen W&uuml;nschen anordnen. Wir haben es bei einer rudiment&auml;ren Sortierung belassen und auch die Bezeichnungsfelder nicht angepasst, sondern uns gleich an die technischen Feinheiten begeben. Ein paar Einstellungen haben wir zuvor noch ge&auml;ndert, da das Formular ja nur jeweils die Details eines einzigen Datensatzes anzeigen soll und somit keine Navigationssteuerelemente n&ouml;tig sind. Die Eigenschaften <b>Navigationsschaltfl&auml;chen<\/b>, <b>Datensatzmarkierer<\/b>, <b>Bildlaufleisten <\/b>und <b>Trennlinien <\/b>haben wir dazu jeweils auf den Wert <b>Nein <\/b>und die Eigenschaft <b>Automatisch zentrieren <\/b>auf den Wert <b>Ja <\/b>eingestellt.<\/p>\n<p>Das hei&szlig;t, dass wir zun&auml;chst zwei Schaltfl&auml;chen namens <b>cmdOK <\/b>und <b>cmdAbbrechen <\/b>hinzugef&uuml;gt und entsprechende Ereignisprozeduren hinterlegt haben.<\/p>\n<p>Die <b>OK<\/b>-Schaltfl&auml;che soll die folgende Ereignisprozedur ausl&ouml;sen:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdOK_Click()\r\n     DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die einzige Anweisung der Prozedur schlie&szlig;t das Formular und gibt somit den Fokus zur&uuml;ck an die aufrufende Routine.<\/p>\n<p>Die zweite Prozedur wird durch die Schaltfl&auml;che <b>cmdAbbrechen <\/b>ausgel&ouml;st und l&ouml;st die folgende Prozedur aus:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdAbbrechen_Click()\r\n     Me.Undo\r\n     DoCmd.Close acForm, Me.Name\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Diese schlie&szlig;t ebenfalls das Formular, setzt aber zuvor noch eventuell bereits durchgef&uuml;hrte &auml;nderungen am Datensatz zur&uuml;ck.<\/p>\n<p>Wenn Sie das Formular <b>frmKundendetails<\/b> zum Anlegen eines neuen Datensatzes &uuml;ber die Schaltfl&auml;che <b>btnNeuerKunde <\/b>&ouml;ffnen, sieht dies wie in Bild 7 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/pic_1104_007.png\" alt=\"Hinzuf&uuml;gen eines neuen Datensatzes\" width=\"609,586\" height=\"466,917\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Hinzuf&uuml;gen eines neuen Datensatzes<\/span><\/b><\/p>\n<h2>Bearbeiten von Datens&auml;tzen<\/h2>\n<p>Ein Klick auf die Schaltfl&auml;che <b>btnKundeBearbeiten <\/b>soll genau wie die Schaltfl&auml;che <b>btnNeuerKunde <\/b>das Formular <b>frmKundendetails <\/b>&ouml;ffnen. Dies soll dann etwa wie in Bild 8 aussehen. Dort erkennen Sie, dass das Formular <b>frmKundendetails <\/b>genau den Datensatz anzeigt, den der Benutzer vor dem Bet&auml;tigen der Schaltfl&auml;che <b>Kunde bearbeiten <\/b>im Ribbon ausgew&auml;hlt hat.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/pic_1104_008.png\" alt=\"Bearbeiten eines vorhandenen Datensatzes\" width=\"609,586\" height=\"538,5505\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Bearbeiten eines vorhandenen Datensatzes<\/span><\/b><\/p>\n<p>Die dazu verwendete Prozedur nutzt allerdings geringf&uuml;gig abgewandelte Parameter dazu. Hier kommt n&auml;mlich nicht der Parameter <b>DataMode <\/b>zum Einsatz, sondern der Parameter <b>WhereCondition<\/b>. Dieser &uuml;bergibt die Bedingung f&uuml;r den anzuzeigenden und zu bearbeitenden Datensatz an das Formular. Dieser wird aus der Zeichenkette <b>KundeID = <\/b>und dem mit <b>Me!KundeID <\/b>ermittelten Prim&auml;rschl&uuml;sselwert des aktuell markierten Datensatzes ermittelt. Die Prozedur finden Sie in Listing 5.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>btnKundeBearbeiten_OnAction(control<span style=\"color:blue;\"> As <\/span>Office.IRibbonControl)\r\n     DoCmd.OpenForm \"frmKundendetails\", WhereCondition:=\"KundeID = \" & Me!KundeID, WindowMode:=acDialog\r\n     Me.Requery\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: &ouml;ffnen des Formulars frmKundendetails zum Bearbeiten eines Datensatzes<\/span><\/b><\/p>\n<p>Auch hier soll nach dem Schlie&szlig;en des modal ge&ouml;ffneten Formulars ein <b>Requery <\/b>der im Formular <b>frmKundenuebersicht <\/b>angezeigten Daten erfolgen, damit der ge&auml;nderte Datensatz direkt in der neuen Version angezeigt wird.<\/p>\n<h2>Feinarbeiten<\/h2>\n<p>Am Formular <b>frmKundendetails <\/b>sind noch ein paar Feinarbeiten n&ouml;tig. Zum Beispiel ist es aktuell noch m&ouml;glich, beim Aufruf zum Anlegen eines neuen Datensatzes gleich noch weitere Datens&auml;tze anzulegen. Das Anlegen neuer Datens&auml;tze ist auch nach dem Aufrufen des Formulars &uuml;ber die Ribbon-Schaltfl&auml;che <b>Kunde bearbeiten <\/b>m&ouml;glich. Zwar weist das Formular keine Navigationsschaltfl&auml;chen mehr auf, &uuml;ber welche der Benutzer einen neuen, leeren Datensatz ansteuern kann, aber wenn er beispielsweise mit der <b>Tab<\/b>-Taste alle Steuer-elemente durchl&auml;uft, landet er fr&uuml;her oder sp&auml;ter bei einem neuen Datensatz. Dies beheben wir, indem wir die Eigenschaft <b>Zyklus <\/b>von <b>Alle Datens&auml;tze <\/b>auf <b>Aktueller Datensatz <\/b>einstellen. Danach ist kein Wechseln zu einem neuen, leeren Datensatz mehr m&ouml;glich.<\/p>\n<p>Eine weitere kleine unsch&ouml;ne Sache ist, dass beim &ouml;ffnen des Formulars <b>frmKundenuebersicht <\/b>immer noch der Ribbon-Tab <b>Datenblatt <\/b>angezeigt wird und aktiviert werden kann (s. Bild 9).<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_05\/pic_1104_009.png\" alt=\"Das Datenblatt-Tab wird in Verbindung mit dem Datenblatt angezeigt.\" width=\"649,559\" height=\"314,332\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Das Datenblatt-Tab wird in Verbindung mit dem Datenblatt angezeigt.<\/span><\/b><\/p>\n<p>Um dies zu beeinflussen, kommen wir mit den bisher im Rahmen der Ribbon-Klassen vorgestellten Elementen nicht weiter. Es handelt sich n&auml;mlich nicht um eine einfache <b>Tab<\/b>-Definition, wenn wir auf das Element <b>Datenblatt <\/b>zugreifen wollen. Sie k&ouml;nnen nicht mit der <b>idMso <\/b>auf dieses Tab-Element zugreifen, wie es bei den &uuml;brigen Tab-Elementen wie <b>TabHomeAccess <\/b>et cetera der Fall ist. Bei dem Element, das wir ausblenden wollen, handelt es sich n&auml;mlich um ein sogenanntes kontextbezogenes <b>Tab<\/b>-Element. Diese finden wir in der Ribbon-Definition in einem eigenen Bereich, der in der Regel vor den eigentlichen <b>Tabs <\/b>definiert wird. Das einschlie&szlig;ende Element eines oder mehrerer dieser kontextsensitiven Tabs hei&szlig;t <b>contextualTabs<\/b>. Darin enthalten ist dann ein <b>tabSet<\/b>-Element. In unserem Fall hat dieses die <b>idMso <\/b>mit dem Wert <b>TabSetFormDatasheet<\/b> und wird in der Ribbon-Definition wie in Listing 6 angelegt. Es kann auch noch sein, dass sich unterhalb des <b>tabSet<\/b>-Elements weitere Elemente befinden. Im Gegensatz zum <b>tabSet<\/b>-Element, dass alle enthaltenen Tabs zusammenfasst, finden Sie dort dann einzelne <b>contextualTab<\/b>-Elemente. Dies wird interessant, wenn Sie ein einzelnes <b>contextualTab<\/b>-Element innerhalb eines <b>tabSet<\/b>-Elements ausblenden wollen. <\/p>\n<pre>&lt;customUI xmlns=\"http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui\" \r\n         onLoad=\"onLoad\" loadImage=\"loadImage\"&gt;\r\n     &lt;ribbon startFromScratch=\"true\"&gt;\r\n         &lt;contextualTabs&gt;\r\n             &lt;tab<span style=\"color:blue;\">Set<\/span> idMso=\"TabSetFormDatasheet\" visible=\"false\"&gt;\r\n             &lt;\/tabSet&gt;\r\n         &lt;\/contextualTabs&gt;\r\n         &lt;tabs&gt;\r\n             &lt;tab id=\"tabKundenuebersicht\" label=\"Kunden&uuml;bersicht\"&gt;\r\n                 ...\r\n             &lt;\/tab&gt;\r\n         &lt;\/tabs&gt;\r\n     &lt;\/ribbon&gt;\r\n&lt;\/customUI&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Definition eines Ribbons, dessen eingebautes Tab-Element TabSetFormDatasheet ausgeblendet werden soll<\/span><\/b><\/p>\n<p>Wir brauchen uns aber nicht um die XML-Definition zu k&uuml;mmern, denn mit der Version der Ribbon-Klassen, die mit der Beispieldatenbank zu diesem Beitrag kommt, finden Sie auch die M&ouml;glichkeit vor, die einzelnen <b>TabSet<\/b>-Gruppen anzusprechen und auszublenden. In diesem Fall wollen wir die &auml;nderung in der Methode <b>CreateRibbon <\/b>vornehmen, die im Klassenmodul des Formulars <b>frmKundenuebersicht <\/b>vorliegt und wie in Listing 7 erg&auml;nzt wird. Hier sehen Sie, dass wir ein neues Objekt des Typs <b>clsTabSet <\/b>definieren und dieses an die <b>ContextualTabs<\/b>-Auflistung des <b>objRibbon<\/b>-Elements anh&auml;ngen. Dazu &uuml;bergeben wir die Konstante <b>TabSetFormDatasheet <\/b>und stellen anschlie&szlig;end die Eigenschaft <b>Visible <\/b>f&uuml;r dieses Element auf <b>False <\/b>ein.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>CreateRibbon()\r\n     <span style=\"color:blue;\">Dim <\/span>objRibbon<span style=\"color:blue;\"> As <\/span>clsRibbon\r\n     <span style=\"color:blue;\">Dim <\/span>objTab<span style=\"color:blue;\"> As <\/span>clsTab\r\n     <span style=\"color:blue;\">Dim <\/span>objTabSet<span style=\"color:blue;\"> As <\/span>clsTab<span style=\"color:blue;\">Set<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objGroup<span style=\"color:blue;\"> As <\/span>clsGroup\r\n     <span style=\"color:blue;\">Set<\/span> objRibbon = Ribbons.Add(\"ribKundenuebersicht\")\r\n     <span style=\"color:blue;\">With<\/span> objRibbon\r\n         .StartFromScratch = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objTab<span style=\"color:blue;\">Set<\/span> = .ContextualTabs.Add(TabSetFormDatasheet)\r\n         objTabSet.Visible = <span style=\"color:blue;\">False<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> objTab = .Tabs.Add(\"tabKundenuebersicht\")\r\n         ...\r\n     End <span style=\"color:blue;\">With<\/span>\r\n     Me.RibbonName = Ribbons.GetRibbon(\"ribKundenuebersicht\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Hinzuf&uuml;gen der Anweisungen zum Ausblenden eines kontextsensitiven eingebauten Ribbon-Tabs<\/span><\/b><\/p>\n<p>Beim n&auml;chsten Start der Anwendung wird das eingebaute Tab f&uuml;r die Datenblattansicht des Formulars <b>frmKundenuebersicht <\/b>automatisch ausgeblendet.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>KundenverwaltungMitRibbon.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/AEF15EB0-0FA1-43ED-B644-99157C912F70\/aiu_1104.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Beitrag &#8222;Ribbonklassen&#8220; (www.access-im-unternehmen.de\/1069) haben wir Klassen f&uuml;r die Anzeige von Ribbons und den enthaltenen Steuer-elementen eingef&uuml;hrt, die wir in &#8222;Kundenverwaltung mit Ribbon, Teil I&#8220; (www.access-im-unternehmen.de\/1091) in eine Anwendung eingebaut haben. Ein Leser fragte nun, ob man damit nicht auch benutzerabh&auml;ngige Ribbons anzeigen kann. Nat&uuml;rlich geht das &#8211; wie es funktioniert, zeigt der vorliegende Beitrag. Dar&uuml;ber hinaus erweitern wir unser Beispiel noch um ein paar neue Elemente.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662017,66052017,44000027],"tags":[],"class_list":["post-55001104","post","type-post","status-publish","format-standard","hentry","category-662017","category-66052017","category-Loesungen"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Kundenverwaltung mit Ribbon, Teil II - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Kundenverwaltung_mit_Ribbon_Teil_II\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kundenverwaltung mit Ribbon, Teil II\" \/>\n<meta property=\"og:description\" content=\"Im Beitrag &quot;Ribbonklassen&quot; (www.access-im-unternehmen.de\/1069) haben wir Klassen f&uuml;r die Anzeige von Ribbons und den enthaltenen Steuer-elementen eingef&uuml;hrt, die wir in &quot;Kundenverwaltung mit Ribbon, Teil I&quot; (www.access-im-unternehmen.de\/1091) in eine Anwendung eingebaut haben. Ein Leser fragte nun, ob man damit nicht auch benutzerabh&auml;ngige Ribbons anzeigen kann. Nat&uuml;rlich geht das - wie es funktioniert, zeigt der vorliegende Beitrag. Dar&uuml;ber hinaus erweitern wir unser Beispiel noch um ein paar neue Elemente.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Kundenverwaltung_mit_Ribbon_Teil_II\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-13T21:27:13+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/0f3bf761c4ea4a1a84e10ff19303ed24\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"17\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenverwaltung_mit_Ribbon_Teil_II\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenverwaltung_mit_Ribbon_Teil_II\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Kundenverwaltung mit Ribbon, Teil II\",\"datePublished\":\"2020-05-13T21:27:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenverwaltung_mit_Ribbon_Teil_II\\\/\"},\"wordCount\":3082,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenverwaltung_mit_Ribbon_Teil_II\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/0f3bf761c4ea4a1a84e10ff19303ed24\",\"articleSection\":[\"2017\",\"5\\\/2017\",\"L\u00f6sungen\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenverwaltung_mit_Ribbon_Teil_II\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenverwaltung_mit_Ribbon_Teil_II\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenverwaltung_mit_Ribbon_Teil_II\\\/\",\"name\":\"Kundenverwaltung mit Ribbon, Teil II - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenverwaltung_mit_Ribbon_Teil_II\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenverwaltung_mit_Ribbon_Teil_II\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/0f3bf761c4ea4a1a84e10ff19303ed24\",\"datePublished\":\"2020-05-13T21:27:13+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenverwaltung_mit_Ribbon_Teil_II\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenverwaltung_mit_Ribbon_Teil_II\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenverwaltung_mit_Ribbon_Teil_II\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/0f3bf761c4ea4a1a84e10ff19303ed24\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/0f3bf761c4ea4a1a84e10ff19303ed24\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Kundenverwaltung_mit_Ribbon_Teil_II\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kundenverwaltung mit Ribbon, Teil II\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Kundenverwaltung mit Ribbon, Teil II - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Kundenverwaltung_mit_Ribbon_Teil_II\/","og_locale":"de_DE","og_type":"article","og_title":"Kundenverwaltung mit Ribbon, Teil II","og_description":"Im Beitrag \"Ribbonklassen\" (www.access-im-unternehmen.de\/1069) haben wir Klassen f&uuml;r die Anzeige von Ribbons und den enthaltenen Steuer-elementen eingef&uuml;hrt, die wir in \"Kundenverwaltung mit Ribbon, Teil I\" (www.access-im-unternehmen.de\/1091) in eine Anwendung eingebaut haben. Ein Leser fragte nun, ob man damit nicht auch benutzerabh&auml;ngige Ribbons anzeigen kann. Nat&uuml;rlich geht das - wie es funktioniert, zeigt der vorliegende Beitrag. Dar&uuml;ber hinaus erweitern wir unser Beispiel noch um ein paar neue Elemente.","og_url":"https:\/\/access-im-unternehmen.de\/Kundenverwaltung_mit_Ribbon_Teil_II\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-13T21:27:13+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/0f3bf761c4ea4a1a84e10ff19303ed24","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"17\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Kundenverwaltung_mit_Ribbon_Teil_II\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Kundenverwaltung_mit_Ribbon_Teil_II\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Kundenverwaltung mit Ribbon, Teil II","datePublished":"2020-05-13T21:27:13+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Kundenverwaltung_mit_Ribbon_Teil_II\/"},"wordCount":3082,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Kundenverwaltung_mit_Ribbon_Teil_II\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/0f3bf761c4ea4a1a84e10ff19303ed24","articleSection":["2017","5\/2017","L\u00f6sungen"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Kundenverwaltung_mit_Ribbon_Teil_II\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Kundenverwaltung_mit_Ribbon_Teil_II\/","url":"https:\/\/access-im-unternehmen.de\/Kundenverwaltung_mit_Ribbon_Teil_II\/","name":"Kundenverwaltung mit Ribbon, Teil II - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Kundenverwaltung_mit_Ribbon_Teil_II\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Kundenverwaltung_mit_Ribbon_Teil_II\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/0f3bf761c4ea4a1a84e10ff19303ed24","datePublished":"2020-05-13T21:27:13+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Kundenverwaltung_mit_Ribbon_Teil_II\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Kundenverwaltung_mit_Ribbon_Teil_II\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Kundenverwaltung_mit_Ribbon_Teil_II\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/0f3bf761c4ea4a1a84e10ff19303ed24","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/0f3bf761c4ea4a1a84e10ff19303ed24"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Kundenverwaltung_mit_Ribbon_Teil_II\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Kundenverwaltung mit Ribbon, Teil II"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001104","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55001104"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001104\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001104"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001104"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001104"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}