{"id":55001081,"date":"2017-04-01T00:00:00","date_gmt":"2020-05-14T13:42:02","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=1081"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Ribbon_fuer_das_Ticketsystem","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Ribbon_fuer_das_Ticketsystem\/","title":{"rendered":"Ribbon f&uuml;r das Ticketsystem"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg09.met.vgwort.de\/na\/e6be22b4bbd84bd3b4b31b4f30fe5afb\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Wir haben in Access im Unternehmen bereits einige Techniken rund um das Ribbon vorgestellt, aber noch sehr wenige unserer L&ouml;sungen tats&auml;chlich mit der Ribbon-Technologie ausgestattet. Das wollen wir am Beispiel des Ticketsystems, das wir in einer eigenen Beitragsreihe behandeln, nachholen. Dort f&uuml;gen wir nicht nur einige Ribbon-Schaltfl&auml;chen zur Steuerung der Anwendung ein, sondern legen auch einen kleinen Backstage-Bereich zur Einstellung von Anwendungsoptionen an.<\/b><\/p>\n<p>Neben den &uuml;blichen Schaltfl&auml;chen, mit denen wir die Formulare und Funktionen der Anwendung aufrufen wollen, soll das Ticketsystem auch einen Backstagebereich erhalten, &uuml;ber den Sie Anwendungseinstellungen einsehen und &auml;ndern k&ouml;nnen. In diesem Fall ist in der Anwendung das Verzeichnis in Outlook festzulegen, in das der Benutzer die E-Mails ziehen soll, die vom Ticketsystem ber&uuml;cksichtigt werden sollen. Diesen Pfad speichern wir in der Datenbank in der Tabelle <b>tblOptionen<\/b>, die daf&uuml;r das Feld <b>Verzeichnis<\/b> vorh&auml;lt.<\/p>\n<p>Der Backstagebereich soll wie in Bild 1 aussehen. Im Gegensatz zur Ribbonleiste selbst ist der Backstagebereich ein wenig komplizierter aufgebaut, aber das soll uns nicht aufhalten. Also schauen wir uns den Code an, der zur Definition unserer Optionen im Backstagebereich notwendig ist.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1081_001.png\" alt=\"Benutzerdefinierter Backstage-Bereich\" width=\"499,6607\" height=\"469,7806\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Benutzerdefinierter Backstage-Bereich<\/span><\/b><\/p>\n<p>Der erste Abschnitt der XML-Definition enth&auml;lt das Element <b>customUI<\/b>, in welchem wir die Callback-Funktionen f&uuml;r das Laden des Ribbons (<b>onLoad<\/b>) und f&uuml;r das Einlesen von Bilddateien (<b>loadImage<\/b>) festgelegt haben (s. Listing 1). Danach folgt die Definition der Ribbon-Leiste (<b>ribbon<\/b>), die wir uns weiter unten genauer ansehen. Schlie&szlig;lich legen wir das <b>backstage<\/b>-Element an, welches die Definition des Backstage-Bereichs enth&auml;lt &#8211; oder in unserem Fall die Erweiterung des BackstageBereichs. Wie Sie der Abbildung entnehmen k&ouml;nnen, sind unter der aktuellen Definition noch alle eingebauten Elemente vorhanden, was zur Entwicklungszeit durchaus noch sinnvoll sein kann. Sp&auml;ter werden wir diese Elemente weitgehend ausblenden.<\/p>\n<pre>&lt;xml version=\"1.0\"&gt;\r\n&lt;customUI xmlns=\"http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui\" onLoad=\"OnLoad_Main\" loadImage=\"loadImage\"&gt;\r\n   &lt;ribbon&gt;\r\n...\r\n   &lt;\/ribbon&gt;\r\n   &lt;backstage&gt;\r\n     &lt;tab id=\"tabEinstellungenBackstage\" label=\"Einstellungen\" title=\"Ticketsystem\" firstColumnMaxWidth=\"600\"&gt;\r\n       &lt;firstColumn&gt;\r\n         &lt;group id=\"grpOutlook\" label=\"Outlook-Einstellungen\" style=\"normal\" helperText=\"Enth&auml;lt Einstellungen \r\n               zur Interaktion mit Microsoft Outlook\"&gt;\r\n           &lt;primaryItem\/&gt;\r\n           &lt;topItems&gt;\r\n             &lt;labelControl id=\"lblVerzeichnisFuerTickets\" label=\"Verzeichnis f&uuml;r Tickets:\"\/&gt;\r\n             &lt;layoutContainer id=\"xxx33091\" align=\"left\"&gt;\r\n               &lt;hyperlink id=\"hypVerzeichnisFuerTickets\" getLabel=\"getLabel\" onAction=\"onAction\"\/&gt;\r\n               &lt;button id=\"btnOrdnerAendern\" onAction=\"onAction\" label=\"Ordner &auml;ndern\"\/&gt;\r\n             &lt;\/layoutContainer&gt;\r\n           &lt;\/topItems&gt;\r\n           &lt;bottomItems\/&gt;\r\n         &lt;\/group&gt;\r\n       &lt;\/firstColumn&gt;\r\n     &lt;\/tab&gt;\r\n   &lt;\/backstage&gt;\r\n&lt;\/customUI&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Definition des Backstage-Bereichs<\/span><\/b><\/p>\n<p>Vorab noch kurz zu den beiden durch die Callbacks <b>onLoad <\/b>und <b>loadImage <\/b>ausgel&ouml;sten Prozeduren. <b>onLoad <\/b>l&ouml;st die folgende Prozedur aus, die wir, wie die meisten anderen mit dem Ribbon in Zusammenhang stehenden Prozeduren, im Modul <b>mdlRibbon <\/b>untergebracht haben:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>onLoad_Main(ribbon<span style=\"color:blue;\"> As <\/span>IRibbonUI)\r\n     <span style=\"color:blue;\">Set<\/span> objRibbon_Main = ribbon\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Die hier verwendete Variable deklarieren wir wie folgt im gleichen Modul:<\/p>\n<pre><span style=\"color:blue;\">Public <\/span>objRibbon_Main<span style=\"color:blue;\"> As <\/span>IRibbonUI<\/pre>\n<p>Diese Variable m&uuml;ssen wir mit einem Verweis auf die geladene Ribbon-Definition f&uuml;llen, damit wir ihre Methoden <b>Invalidate <\/b>und <b>InvalidateControl <\/b>ausl&ouml;sen k&ouml;nnen. Diese sorgen daf&uuml;r, dass die Inhalte, Bilder und weiteren Eigenschaften neu geladen werden, sollten sich die Anforderungen ge&auml;ndert haben. Die Callback-Eigenschaft <b>loadImage <\/b>ruft die Prozedur aus Listing 2 auf. Diese soll zun&auml;chst pr&uuml;fen, ob die Tabelle <b>MSysResources<\/b>, welche die Bilder enth&auml;lt, die im Ribbon angezeigt werden sollen, in der Datenbank vorhanden ist. <\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>loadImage(Control, ByRef image)\r\n     <span style=\"color:blue;\">Dim <\/span>lngID<span style=\"color:blue;\"> As Long<\/span>\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     lngID = Nz(DLookup(\"ID\", \"MSysResources\", \"Name = ''\" & Control & \"''\"), 0)\r\n     <span style=\"color:blue;\">If <\/span>Err.Number = 3078<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Die Tabelle ''MSysResources'' mit den Images f&uuml;r die Anzeige im Ribbon fehlt.\" & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n             & \"F&uuml;gen Sie die Images mit dem Ribbon-Admin hinzu\", vbOKOnly + vbExclamation, _\r\n                 \"Tabelle MSysResources fehlt\"\r\n         <span style=\"color:blue;\">Exit Sub<\/span>\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n     <span style=\"color:blue;\">If <\/span>lngID = 0<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Das Image ''\" & Control & \"'' ist nicht in der Tabelle MSysResources vorhanden. \" & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n             & \"F&uuml;gen Sie dieses &uuml;ber den Kontextmen&uuml;eintrag ''Benutzerdefiniertes Image hinzuf&uuml;gen'' \" & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n             & \"des image-Attributs des entsprechenden Ribbon-Steuerelements hinzu.\"\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> image = PicFromSharedResource_Ribbon(CStr(Control))\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: Prozedur zum Laden der Ribbon-Bilder<\/span><\/b><\/p>\n<p>Die Prozedur <b>loadImage<\/b> wird f&uuml;r jedes Bild, das in ein Steuerelement des Ribbons geladen werden soll, je einmal aufgerufen. Dabei wird mit dem Parameter <b>image <\/b>jeweils der Name des zu verwendenden Bildes &uuml;bergeben. Dieser ist immer in der Definition des jeweiligen Objekts f&uuml;r das Attribut <b>image <\/b>enthalten, also beispielsweise:<\/p>\n<pre>&lt;button id=\"btnOffeneMails\" image=\"mail\" label=\"Offene Mails\" onAction=\"onAction\" size=\"large\"\/&gt;<\/pre>\n<p>Damit wird dann die Funktion <b>PicFromSharedResource_Ribbon <\/b>aufgerufen, die sich, wie einige andere f&uuml;r die Ermittlung von Bildern aus der Tabelle <b>MSysResources<\/b>, im Modul <b>mdlRibbonImages <\/b>befindet (siehe Beispieldatenbank). Doch zur&uuml;ck zur Backstage-Definition. Diese wird durch je ein &ouml;ffnendes und schlie&szlig;endes <b>backstage<\/b>-Element eingeschlossen. Damit unser Eintrag unten unter den &uuml;brigen eingebauten Elementen angezeigt wird, f&uuml;gen wir unterhalb des <b>backstage<\/b>-Elements ein <b>tab<\/b>-Element hinzu. Diesem geben wir eine Beschriftung, einen Titel und eine Breite mit. Der Titel ist gro&szlig; und breit im Bereich rechts neben der vertikalen Tableiste zu erkennen:<\/p>\n<pre>&lt;tab id=\"tabEinstellungenBackstage\" label=\"Einstellungen\" title=\"Ticketsystem\" firstColumnMaxWidth=\"600\"&gt;<\/pre>\n<p>Wir ben&ouml;tigen nur eine der zwei m&ouml;glichen Spalten, also legen wir unter dem <b>tab<\/b>-Element nur ein <b>firstColumn<\/b>-Element an, das die &uuml;brigen Elemente enth&auml;lt. Zum Beispiel das <b>group<\/b>-Element, dem wir ein leeres <b>primaryItem<\/b>-Element, ein mit einigen Elementen gef&uuml;lltes <b>topItems<\/b>-Element und ein wiederum leeres <b>bottomItems<\/b>-Element hinzuf&uuml;gen. Das <b>group<\/b>-Element enth&auml;lt auch einige Attribute zum Beispiel eine Beschriftung (<b>Outlook-Einstellungen<\/b>) und einen <b>helperText<\/b>, der unterhalb der Beschriftung erscheint:<\/p>\n<pre>&lt;group id=\"grpOutlook\" label=\"Outlook-Einstellungen\" style=\"normal\" \r\nhelperText=\"Enth&auml;lt Einstellungen zur Interaktion mit Microsoft Outlook\"&gt;<\/pre>\n<p>Unter <b>topItems <\/b>f&uuml;gen wir einige Elemente hinzu &#8211; als Erstes ein <b>labelControl<\/b>, das eine Beschriftung enth&auml;lt:<\/p>\n<pre>&lt;labelControl id=\"lblVerzeichnisFuerTickets\" label=\"Verzeichnis f&uuml;r Tickets:\"\/&gt;<\/pre>\n<p>Darunter wollen wir dann zwei Elemente nebeneinander anordnen, weshalb wir einen <b>layoutContainer <\/b>mit linkszentrierter Ausrichtung nutzen:<\/p>\n<pre>&lt;layoutContainer id=\"xxx33091\" align=\"left\"&gt;\r\n     ...\r\n&lt;\/layoutContainer&gt;<\/pre>\n<p>Das erste Element ist ein <b>hyperlink<\/b>-Element, das &uuml;ber die Callback-Funktion <b>getLabel <\/b>mit einer Beschriftung gef&uuml;llt wird und deren <b>onAction<\/b>-Callback die VBA-Prozedur <b>onAction <\/b>ausl&ouml;st. Dieses Element ist logischerweise wie ein Hyperlink ausgezeichnet, also in blauer und unterstrichener Schrift:<\/p>\n<pre>&lt;hyperlink id=\"hypVerzeichnisFuerTickets\" getLabel=\"getLabel\" onAction=\"onAction\"\/&gt;<\/pre>\n<p><!--30percent--><\/p>\n<p>Rechts daneben landet ein Button mit der Beschriftung <b>Ordner &auml;ndern<\/b>.<\/p>\n<p>Er ist wie folgt definiert und soll die Auswahl eines neuen Ordners erm&ouml;glichen:<\/p>\n<pre>&lt;button id=\"btnOrdnerAendern\" onAction=\"onAction\" label=\"Ordner &auml;ndern\"\/&gt;<\/pre>\n<h2>Logik hinter dem Backstage-Bereich<\/h2>\n<p>Die Steuerelemente des Backstage-Bereichs enthalten ein paar Callback-Attribute, die wir im VBA-Modul <b>mdlRibbons <\/b>um entsprechende Prozeduren anreichern.<\/p>\n<p>Die erste sorgt daf&uuml;r, dass bei einem Klick auf die Schaltfl&auml;che <b>Ordner &auml;ndern <\/b>der Outlook-Dialog zum Ausw&auml;hlen eines der Outlook-Ordner angezeigt wird (s. Bild 2). Dies l&ouml;st die Prozedur <b>onAction <\/b>aus und &uuml;bergibt dieser per Parameter einen Verweis auf das ausl&ouml;sende Steuerelement. Dessen Name ermitteln wir mit der Eigenschaft <b>ID <\/b>des Parameters <b>Control <\/b>und f&uuml;hren nach Steuerelement einen der Zweige einer <b>Select Case<\/b>-Bedingung aus:<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1081_002.png\" alt=\"Aufruf des Ordner ausw&auml;hlen-Dialogs von Outlook \" width=\"649,559\" height=\"306,8469\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Aufruf des Ordner ausw&auml;hlen-Dialogs von Outlook <\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>onAction(Control<span style=\"color:blue;\"> As <\/span>IRibbonControl)\r\n     <span style=\"color:blue;\">Dim <\/span>objOutlook<span style=\"color:blue;\"> As <\/span>Outlook.Application\r\n     <span style=\"color:blue;\">Dim <\/span>objNamespace<span style=\"color:blue;\"> As <\/span>Outlook.NameSpace\r\n     <span style=\"color:blue;\">Dim <\/span>objFolder<span style=\"color:blue;\"> As <\/span>Outlook.Folder\r\n     <span style=\"color:blue;\">Dim <\/span>strOrdner<span style=\"color:blue;\"> As String<\/span>\r\n     Select Case Control.ID\r\n         <span style=\"color:blue;\">Case <\/span>\"btnOrdnerAendern\"\r\n             <span style=\"color:blue;\">Call<\/span> OutlookOrdnerAuswaehlen\r\n         ...\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>In unserem Fall handelt es sich um den Zweig mit dem Wert <b>btnOrdnerAendern<\/b>, der lediglich den Aufruf einer weiteren Prozedur namens <b>OutlookOrdnerAuswaehlen <\/b>enth&auml;lt.<\/p>\n<h2>Outlook-Ordner ausw&auml;hlen<\/h2>\n<p>Die Prozedur <b>OutlookOrdnerAuswaehlen <\/b>sieht wie in Listing 3 aus. Sie ermittelt zun&auml;chst den Namen des aktuell aktiven Fensters, und zwar mit einer Hilfsfunktion namens <b>GetActiveWindowTitle<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>OutlookOrdnerAuswaehlen()\r\n     <span style=\"color:blue;\">Dim <\/span>strOrdner<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>db<span style=\"color:blue;\"> As <\/span>DAO.Database\r\n     <span style=\"color:blue;\">Dim <\/span>lngCount<span style=\"color:blue;\"> As Long<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strFenster<span style=\"color:blue;\"> As String<\/span>\r\n     strFenster = GetActiveWindowTitle\r\n     strOrdner = GetFolderName\r\n     <span style=\"color:blue;\">Set<\/span> db = CurrentDb\r\n     db.Execute \"UPDATE tblOptionen SET Verzeichnis = ''\" & strOrdner & \"''\", dbFailOnError\r\n     lngCount = db.RecordsAffected\r\n     <span style=\"color:blue;\">If <\/span>lngCount = 0<span style=\"color:blue;\"> Then<\/span>\r\n         db.Execute \"INSERT INTO tblOptionen(Verzeichnis) VALUES(''\" & strOrdner & \"'')\", dbFailOnError\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     objRibbon_Main.InvalidateControl \"hypVerzeichnisFuerTickets\"\r\n     AppActivate strFenster\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Die Prozedur zum Ausw&auml;hlen eines neuen Outlook-Ordners<\/span><\/b><\/p>\n<p>Diese nutzt zwei API-Funktionen, n&auml;mlich <b>GetForegroundWindow <\/b>und <b>GetWindowText<\/b>, die im Kopf des Moduls <b>mdlAPI <\/b>deklariert werden (s. Listing 4). Die Funktion <b>GetActiveWindowTitle <\/b>ermittelt zun&auml;chst mit der Funktion <b>GetForeGroundWindow <\/b>ein Handle auf das aktive Fenster. Dann liest sie mit <b>GetWindowText <\/b>den Titel des Fensters ein und gibt diesen als R&uuml;ckgabewert der Funktion zur&uuml;ck. Nachdem der Fenstertitel des aktiven Fensters so in der Variablen <b>strFenster <\/b>der Prozedur <b>OutlookordnerAuswaehlen <\/b>gelandet ist, ruft diese eine weitere Funktion namens <b>GetFolderName <\/b>auf. Diese ist scheinbar recht einfach gestrickt, denn sie ruft lediglich die Methode <b>PickFolder <\/b>eines Objekts namens <b>GetMAPI <\/b>auf:<\/p>\n<pre><span style=\"color:blue;\">Private <\/span>Declare Function GetForegroundWindow Lib \"user32\" ()<span style=\"color:blue;\"> As Long<\/span>\r\n<span style=\"color:blue;\">Private <\/span>Declare Function GetWindowText Lib \"user32\" Alias \"GetWindowTextA\"  _\r\n     (ByVal hwnd<span style=\"color:blue;\"> As Long<\/span>, ByVal lpString<span style=\"color:blue;\"> As String<\/span>, ByVal cch<span style=\"color:blue;\"> As Long<\/span>)<span style=\"color:blue;\"> As Long<\/span>\r\n   \r\n<span style=\"color:blue;\">Public Function <\/span>GetActiveWindowTitle()<span style=\"color:blue;\"> As String<\/span>\r\n   <span style=\"color:blue;\">Dim <\/span>nHWnd<span style=\"color:blue;\"> As Long<\/span>\r\n   <span style=\"color:blue;\">Dim <\/span>sTitle<span style=\"color:blue;\"> As String<\/span>\r\n   <span style=\"color:blue;\">Dim <\/span>nResult<span style=\"color:blue;\"> As Long<\/span>\r\n   nHWnd = GetForegroundWindow()\r\n   sTitle = Space$(255)\r\n   nResult = GetWindowText(nHWnd, sTitle, <span style=\"color:blue;\">Len<\/span>(sTitle))\r\n   GetActiveWindowTitle = Left$(sTitle, nResult)\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Funktion zum Ermitteln des Titels des aktuellen Windows-Fensters<\/span><\/b><\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>GetFolderName()<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objFolder<span style=\"color:blue;\"> As <\/span>Outlook.Folder\r\n     <span style=\"color:blue;\">Set<\/span> objFolder = GetMAPI.PickFolder\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> objFolder Is Nothing<span style=\"color:blue;\"> Then<\/span>\r\n         GetFolderName = objFolder.FolderPath\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p>Allerdings ist dies kein Objekt, sondern wiederum eine Funktion, die ein <b>MAPI<\/b>&#8211;<b>Folder<\/b>-Objekt zur&uuml;ckliefert. Diese Funktion wollen wir im Rahmen dieses Beitrags jedoch nicht erl&auml;utern &#8211; bei Interesse schauen Sie sich einfach den Quellcode im Modul <b>mdlOutlook <\/b>der Beispieldatenbank an. Der Benutzer w&auml;hlt nun im Dialog <b>Ordner ausw&auml;hlen <\/b>den Ordner aus, der als Quellordner f&uuml;r die im Ticketsystem zu verarbeitenden E-Mails dient, die der Benutzer zu diesem Zweck aus dem Posteingang dort hineinzieht. Nachdem das Verzeichnis, zum Beispiel <b>\\\\Outlook\\Posteingang\\Ticketsystem<\/b>, in der Variablen <b>strOrdner <\/b>gelandet ist, erstellt die Prozedur <b>OutlookOrdnerAuswahlen <\/b>ein neues <b>Database<\/b>-Objekt auf Basis der aktuellen Datenbank und ruft dessen <b>Execute<\/b>-Methode auf.<\/p>\n<p>Als Parameter &uuml;bergibt sie dieser eine <b>UPDATE<\/b>-Abfrage, welche den Wert aus <b>strOrdner <\/b>in das Feld <b>Verzeichnis <\/b>der Tabelle <b>tblOptionen <\/b>eintr&auml;gt. Wenn dies erfolgreich ist, liefert <b>db.RecordsAffected <\/b>einen Wert ungleich <b>0<\/b>. Ist der Wert dennoch <b>0<\/b>, was auf einen Fehler hinweist, geht die Prozedur davon aus, dass noch kein Datensatz in der Tabelle vorhanden ist, um die Option zu speichern. Dann erfolgt der Aufruf einer weiteren Aktionsabfrage, diesmal des Typs <b>INSERT INTO<\/b>. Diese legt dann einen neuen Datensatz in der Tabelle <b>tblOptionen <\/b>an und tr&auml;gt direkt das Verzeichnis aus <b>strOrdner <\/b>dort ein.<\/p>\n<p>Schlie&szlig;lich folgt eine wichtige Anweisung:<\/p>\n<pre>objRibbon_Main.InvalidateControl \"hypVerzeichnisFuerTickets\"<\/pre>\n<p>Dieser Aufruf der <b>InvalidateControl<\/b>-Methode mit dem Namen des Steuerelements <b>hypVerzeichnisFuerTickets <\/b>als Parameter sorgt daf&uuml;r, dass alle Callback-Eigenschaften dieses Elements wie etwa <b>getLabel <\/b>erneut ausgel&ouml;st werden. Dies ist auch der Grund, warum wir einen Verweis auf die Instanz der Ribbon-Definition in der Variablen <b>objRibbon_Main <\/b>gespeichert haben. Die dadurch ausgel&ouml;ste Callback-Prozedur <b>getLabel<\/b> finden Sie in Listing 5. Sie erh&auml;lt mit dem Parameter <b>Control <\/b>wiederum einen Verweis auf das aufrufende Steuerelement, mit dessen Eigenschaft <b>ID <\/b>sie den Namen dieses Steuerelements ermittelt und diesen in einer <b>Select Case<\/b>-Bedingung auswertet.<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>getLabel(Control<span style=\"color:blue;\"> As <\/span>IRibbonControl, ByRef returnedVal)\r\n     <span style=\"color:blue;\">Dim <\/span>strOrdner<span style=\"color:blue;\"> As String<\/span>\r\n     Select Case Control.ID\r\n         <span style=\"color:blue;\">Case <\/span>\"hypVerzeichnisFuerTickets\"\r\n             strOrdner = Nz(DLookup(\"Verzeichnis\", \"tblOptionen\"), \"&lt;Kein Ordner ausgew&auml;hlt&gt;\")\r\n             returnedVal = strOrdner\r\n     <span style=\"color:blue;\">End Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Die Callback-Funktion getLabel liefert das Label f&uuml;r das aufrufende Steuerelement.<\/span><\/b><\/p>\n<p>Im Falle von <b>hypVerzeichnisFuerTickets <\/b>ermittelt sie den Wert des Feldes <b>Verzeichnis <\/b>der Tabelle <b>tblOptionen <\/b>und tr&auml;gt diesen in die Variable <b>strOrdner <\/b>ein. Ist das Feld <b>Verzeichnis <\/b>leer oder findet sich kein passender Datensatz, liefert die <b>Nz<\/b>-Funktion stattdessen den Wert <b><Kein Ordner ausgew&auml;hlt> <\/b>zur&uuml;ck.<\/p>\n<p>Der Wert der Variablen <b>strOrdner <\/b>wird dann mit dem R&uuml;ckgabeparameter <b>returnedVal <\/b>an das aufrufende Steuerelement des Ribbons beziehungsweise Backstages zur&uuml;ckgegeben.<\/p>\n<h2>Access einblenden<\/h2>\n<p>Bei diesem Prozedere kann es jedoch sein, dass die Anzeige des Dialogs zum Ausw&auml;hlen des Outlook-Ordners das bereits ge&ouml;ffnete Outlook-Hauptfenster einblendet, dieses aber nicht wieder ausblendet oder in den Hintergrund des Access-Fensters bringt, sodass das Access-Fenster mit der Anwendung nicht mehr sichtbar ist.<\/p>\n<p>Aus diesem Grund haben wir eingangs den Fenstertitel der aktuellen Access-Anwendung ausgelesen und in der Variablen <b>strFenster <\/b>gespeichert. Diesen Wert nutzen wir nun in einem Aufruf der Anweisung <b>AppActivate <\/b>aus, um das Access-Fenster mit unserer Anwendung wieder in den Vordergrund zu bringen. Im nun ebenfalls wieder sichtbaren Backstage-Bereich sollte nun auch der ausgew&auml;hlte Ordner als Link angezeigt werden. Die Bet&auml;tigung des Links mit dem aktuell als Ticketordner ausgew&auml;hlten Outlook-Verzeichnis soll &uuml;brigens noch Outlook &ouml;ffnen beziehungsweise aktivieren und gleich diesen Ordner anzeigen.<\/p>\n<p>Dazu haben wir f&uuml;r das Element <b>hypVerzeichnisFuerTickets <\/b>ebenfalls das Callback-Attribut <b>onAction <\/b>mit dem gleichnamigen Wert gef&uuml;llt, was beim Anklicken zu einem Aufruf der Prozedur <b>onAction <\/b>aus Listing 6 f&uuml;hrt (hier nur der relevante Ausschnitt).<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>onAction(Control<span style=\"color:blue;\"> As <\/span>IRibbonControl)\r\n     <span style=\"color:blue;\">Dim <\/span>objFolder<span style=\"color:blue;\"> As <\/span>Outlook.Folder\r\n     <span style=\"color:blue;\">Dim <\/span>strOrdner<span style=\"color:blue;\"> As String<\/span>\r\n     Select Case Control.ID\r\n         ...\r\n         <span style=\"color:blue;\">Case <\/span>\"hypVerzeichnisFuerTickets\"\r\n             strOrdner = Nz(DLookup(\"Verzeichnis\", \"tblOptionen\"), \"\")\r\n             <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> <span style=\"color:blue;\">Len<\/span>(strOrdner) = 0<span style=\"color:blue;\"> Then<\/span>\r\n                 <span style=\"color:blue;\">Set<\/span> objFolder = GetFolderByPath(strOrdner)\r\n                 objFolder.Display\r\n             <span style=\"color:blue;\">Else<\/span>\r\n                 <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">MsgBox<\/span>(\"Kein Ordner festgelegt. Nun einen ausw&auml;hlen\", vbYesNo, \"Ordner ausw&auml;hlen\") = vbYes<span style=\"color:blue;\"> Then<\/span>\r\n                     OutlookOrdnerAuswaehlen\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 Select<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Anzeigen des Ticket-Ordners in Outlook per Backstage-Schaltfl&auml;che<\/span><\/b><\/p>\n<p>Wir ermitteln dort zun&auml;chst mit <b>DLookup <\/b>den in der Optionen-Tabelle gespeicherten Wert f&uuml;r das Verzeichnis in Outlook und tragen diesen in die Variable <b>strOrdner <\/b>ein. Hat <b>strOrdner <\/b>danach einen Wert mit einer L&auml;nge gr&ouml;&szlig;er als <b>0<\/b>, rufen wir mit der Funktion <b>GetFolderByPath <\/b>und dem Parameter <b>strOrdner <\/b>ein <b>Folder<\/b>-Objekt auf und speichern dieses in der Variablen <b>objFolder<\/b> (<b>GetFolderByPath <\/b>ist eine der Funktionen aus dem Modul <b>mdlOutlook<\/b>, die wir hier nicht n&auml;her erl&auml;utern).<\/p>\n<p>Diesen Ordner zeigen wir dann mit der <b>Display<\/b>-Methode in Outlook an (s. Bild 3). Beachten Sie, dass dabei auch immer der Bereich <b>Posteingang <\/b>in der Seitenleiste von Outlook aktiviert wird &#8211; nur f&uuml;r den Fall, dass Sie dort eine andere Ansicht verwenden, wie in meinem Fall die Ordneransicht. Sollte <b>strOrdner <\/b>eine leere Zeichenkette enthalten, zeigt dies eine Meldung an mit einem Hinweis, dass aktuell kein Ticket-Verzeichnis ausgew&auml;hlt ist. Der Benutzer kann dann direkt ein solches festlegen, wozu die Prozedur die Routine <b>OutlookOrdnerAuswaehlen <\/b>aufruft, die Sie ja bereits weiter oben kennengelernt haben.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1081_003.png\" alt=\"Anzeigen des Ticket-Verzeichnisses per Hyperlink aus dem Backstage heraus\" width=\"649,559\" height=\"445,6717\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Anzeigen des Ticket-Verzeichnisses per Hyperlink aus dem Backstage heraus<\/span><\/b><\/p>\n<h2>Erweiterungen und Optimierungen<\/h2>\n<p>Damit haben Sie ein erstes Praxisbeispiel f&uuml;r den Einsatz des Backstage-Bereichs unter Access kennengelernt. Nat&uuml;rlich k&ouml;nnen Sie dort noch weitere Optionen hinzuf&uuml;gen, die Sie in diesem Bereich einstellen oder einsehen m&ouml;chten. Eine m&ouml;gliche Optimierung w&auml;re, f&uuml;r den aktuellen Zustand, wo die eingebauten Steuerelemente von Access noch vorhanden sind, eine auffallendere Gestaltung f&uuml;r das <b>Tab<\/b>-Element zu dieser Anwendung zu verwenden.<\/p>\n<p>Sie k&ouml;nnten beispielsweise ausschlie&szlig;lich Gro&szlig;buchstaben verwenden (<b>EINSTELLUNGEN<\/b>) oder auch den Anwendungsnamen dort unterbringen (<b>Ticketsystem<\/b>). Alternativ k&ouml;nnen Sie nat&uuml;rlich auch die eingebauten Elemente ausblenden &#8211; dies soll jedoch nicht Thema des aktuellen Beitrags sein.<\/p>\n<h2>Definition der Ribbon-Schaltfl&auml;chen<\/h2>\n<p>Die Anwendung enth&auml;lt auch noch ein Ribbon mit Schaltfl&auml;chen zum Aufrufen der verschiedenen Formulare. Dieses sieht wie in Bild 4 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2017_02\/pic_1081_004.png\" alt=\"Ribbon zum Aufrufen der Anwendungsfunkktionen\" width=\"424,7115\" height=\"156,6801\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Ribbon zum Aufrufen der Anwendungsfunkktionen<\/span><\/b><\/p>\n<p>Zur Definition dieser Eintr&auml;ge erweitern Sie den Code in der Tabelle <b>USysRibbons <\/b>wie in Listing 7. Hier entstehen ein <b>Tab<\/b>-Element mit der Beschriftung <b>TICKETSYSTEM <\/b>sowie vier <b>Group<\/b>-Elemente mit den entsprechenden Schaltfl&auml;chen. Die f&uuml;r das Attribut <b>loadImage<\/b> des <b>customUI<\/b>-Elements hinterlegte Ereignisprozedur sorgt f&uuml;r das Einblenden der Bilder, die jeweils f&uuml;r das Attribut <b>image <\/b>der Schaltfl&auml;chen angegeben sind.<\/p>\n<pre>&lt;xml version=\"1.0\"&gt;\r\n&lt;customUI xmlns=\"http:\/\/schemas.microsoft.com\/office\/2009\/07\/customui\" onLoad=\"OnLoad_Main\" loadImage=\"loadImage\"&gt;\r\n   &lt;ribbon startFromScratch=\"true\"&gt;\r\n     &lt;tabs&gt;\r\n       &lt;tab id=\"tabMails\" label=\"TICKETSYSTEM\"&gt;\r\n         &lt;group id=\"grpOffen\" label=\"Offene Mails\"&gt;\r\n           &lt;button image=\"mail\" label=\"Offene Mails\" id=\"btnOffeneMails\" onAction=\"onAction\" size=\"large\"\/&gt;\r\n         &lt;\/group&gt;\r\n         &lt;group id=\"grpKunden\" label=\"Kunden\"&gt;\r\n           &lt;button image=\"users4\" label=\"Kunden bearbeiten\" id=\"btnKundenBearbeiten\" onAction=\"onAction\" size=\"large\"\/&gt;\r\n         &lt;\/group&gt;\r\n         &lt;group id=\"grpTickets\" label=\"Tickets\"&gt;\r\n           &lt;button image=\"ticket\" label=\"Ticket&uuml;bersicht\" id=\"btnTicketuebersicht\" onAction=\"onAction\" size=\"large\"\/&gt;\r\n         &lt;\/group&gt;\r\n         &lt;group id=\"grpAktionen\" label=\"Aktionen\"&gt;\r\n           &lt;button image=\"checkbox_selected\" label=\"Aktionstypen bearbeiten\" id=\"btnAktionstypenBearbeiten\" \r\n               onAction=\"onAction\" size=\"large\"\/&gt;\r\n           &lt;button image=\"radio_button_group\" label=\"Aktionsgruppen bearbeiten\" id=\"btnAktionsgruppenBearbeiten\" \r\n               onAction=\"onAction\" size=\"large\"\/&gt;\r\n         &lt;\/group&gt;\r\n       &lt;\/tab&gt;\r\n     &lt;\/tabs&gt;\r\n   &lt;\/ribbon&gt;\r\n   &lt;backstage&gt;...&lt;\/backstage&gt;\r\n&lt;\/customUI&gt;<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 7: Defintion des Ribbons mit den &uuml;brigen Schaltfl&auml;chen<\/span><\/b><\/p>\n<p>Die Prozeduren f&uuml;r die <b>onAction<\/b>-Callback-Attribute der Ribbon-Definition finden Sie ebenfalls im Modul <b>mdlRibbons<\/b>.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Ticketsystem.accdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/85451C8B-8F70-4C03-8738-6F297786885F\/aiu_1081.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wir haben in Access im Unternehmen bereits einige Techniken rund um das Ribbon vorgestellt, aber noch sehr wenige unserer L&ouml;sungen tats&auml;chlich mit der Ribbon-Technologie ausgestattet. Das wollen wir am Beispiel des Ticketsystems, das wir in einer eigenen Beitragsreihe behandeln, nachholen. Dort f&uuml;gen wir nicht nur einige Ribbon-Schaltfl&auml;chen zur Steuerung der Anwendung ein, sondern legen auch einen kleinen Backstage-Bereich zur Einstellung von Anwendungsoptionen an.<\/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":[66022017,662017,44000028],"tags":[],"class_list":["post-55001081","post","type-post","status-publish","format-standard","hentry","category-66022017","category-662017","category-Ergonomie_und_Benutzeroberflaeche"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Ribbon f&uuml;r das Ticketsystem - 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\/Ribbon_fuer_das_Ticketsystem\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ribbon f&uuml;r das Ticketsystem\" \/>\n<meta property=\"og:description\" content=\"Wir haben in Access im Unternehmen bereits einige Techniken rund um das Ribbon vorgestellt, aber noch sehr wenige unserer L&ouml;sungen tats&auml;chlich mit der Ribbon-Technologie ausgestattet. Das wollen wir am Beispiel des Ticketsystems, das wir in einer eigenen Beitragsreihe behandeln, nachholen. Dort f&uuml;gen wir nicht nur einige Ribbon-Schaltfl&auml;chen zur Steuerung der Anwendung ein, sondern legen auch einen kleinen Backstage-Bereich zur Einstellung von Anwendungsoptionen an.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Ribbon_fuer_das_Ticketsystem\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-14T13:42:02+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg09.met.vgwort.de\/na\/e6be22b4bbd84bd3b4b31b4f30fe5afb\" \/>\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=\"14\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbon_fuer_das_Ticketsystem\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbon_fuer_das_Ticketsystem\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Ribbon f&uuml;r das Ticketsystem\",\"datePublished\":\"2020-05-14T13:42:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbon_fuer_das_Ticketsystem\\\/\"},\"wordCount\":2108,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbon_fuer_das_Ticketsystem\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/e6be22b4bbd84bd3b4b31b4f30fe5afb\",\"articleSection\":[\"2\\\/2017\",\"2017\",\"Ergonomie und Benutzeroberfl\u00e4che\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbon_fuer_das_Ticketsystem\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbon_fuer_das_Ticketsystem\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbon_fuer_das_Ticketsystem\\\/\",\"name\":\"Ribbon f&uuml;r das Ticketsystem - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbon_fuer_das_Ticketsystem\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbon_fuer_das_Ticketsystem\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/e6be22b4bbd84bd3b4b31b4f30fe5afb\",\"datePublished\":\"2020-05-14T13:42:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbon_fuer_das_Ticketsystem\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbon_fuer_das_Ticketsystem\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbon_fuer_das_Ticketsystem\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/e6be22b4bbd84bd3b4b31b4f30fe5afb\",\"contentUrl\":\"http:\\\/\\\/vg09.met.vgwort.de\\\/na\\\/e6be22b4bbd84bd3b4b31b4f30fe5afb\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Ribbon_fuer_das_Ticketsystem\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ribbon f&uuml;r das Ticketsystem\"}]},{\"@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":"Ribbon f&uuml;r das Ticketsystem - 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\/Ribbon_fuer_das_Ticketsystem\/","og_locale":"de_DE","og_type":"article","og_title":"Ribbon f&uuml;r das Ticketsystem","og_description":"Wir haben in Access im Unternehmen bereits einige Techniken rund um das Ribbon vorgestellt, aber noch sehr wenige unserer L&ouml;sungen tats&auml;chlich mit der Ribbon-Technologie ausgestattet. Das wollen wir am Beispiel des Ticketsystems, das wir in einer eigenen Beitragsreihe behandeln, nachholen. Dort f&uuml;gen wir nicht nur einige Ribbon-Schaltfl&auml;chen zur Steuerung der Anwendung ein, sondern legen auch einen kleinen Backstage-Bereich zur Einstellung von Anwendungsoptionen an.","og_url":"https:\/\/access-im-unternehmen.de\/Ribbon_fuer_das_Ticketsystem\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-14T13:42:02+00:00","og_image":[{"url":"http:\/\/vg09.met.vgwort.de\/na\/e6be22b4bbd84bd3b4b31b4f30fe5afb","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"14\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Ribbon_fuer_das_Ticketsystem\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Ribbon_fuer_das_Ticketsystem\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Ribbon f&uuml;r das Ticketsystem","datePublished":"2020-05-14T13:42:02+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Ribbon_fuer_das_Ticketsystem\/"},"wordCount":2108,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Ribbon_fuer_das_Ticketsystem\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/e6be22b4bbd84bd3b4b31b4f30fe5afb","articleSection":["2\/2017","2017","Ergonomie und Benutzeroberfl\u00e4che"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Ribbon_fuer_das_Ticketsystem\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Ribbon_fuer_das_Ticketsystem\/","url":"https:\/\/access-im-unternehmen.de\/Ribbon_fuer_das_Ticketsystem\/","name":"Ribbon f&uuml;r das Ticketsystem - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Ribbon_fuer_das_Ticketsystem\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Ribbon_fuer_das_Ticketsystem\/#primaryimage"},"thumbnailUrl":"http:\/\/vg09.met.vgwort.de\/na\/e6be22b4bbd84bd3b4b31b4f30fe5afb","datePublished":"2020-05-14T13:42:02+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Ribbon_fuer_das_Ticketsystem\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Ribbon_fuer_das_Ticketsystem\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Ribbon_fuer_das_Ticketsystem\/#primaryimage","url":"http:\/\/vg09.met.vgwort.de\/na\/e6be22b4bbd84bd3b4b31b4f30fe5afb","contentUrl":"http:\/\/vg09.met.vgwort.de\/na\/e6be22b4bbd84bd3b4b31b4f30fe5afb"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Ribbon_fuer_das_Ticketsystem\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Ribbon f&uuml;r das Ticketsystem"}]},{"@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\/55001081","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=55001081"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55001081\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55001081"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55001081"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55001081"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}