Platzhalterauswahl per Kontextmenü

Lies diesen Artikel und viele weitere mit einem kostenlosen, einwöchigen Testzugang.

Manche Lösung scheint auf den ersten Blick kein besonders großes Einsatzgebiet zu haben, aber wenn man erst einmal darüber nachdenkt … Ein Beispiel dafür ist das Einfügen von Platzhaltern in Textfelder, wobei die Platzhalter den Feldnamen der Tabelle entsprechen, aus denen sie stammen. Ursprünglich wurde die Technik für ein eBay-Tool entwickelt, wobei der als Titel anzuzeigende Text aus Tabellenfeldern wie Artikelbezeichnung, Farbe, Größe und so weiter zusammengesetzt wurde.

Beim Einstellen von Artikeln las das Tool dann die benötigten Informationen aus der Tabelle aus und fügte sie zum Artikeltitel zusammen. Das hätte man aber auch über ein Feld einer einfachen Abfrage erledigen können, oder Stimmt: Aber erstens sollte der Titeltext flexibel einstellbar sein, um eine möglichst zugkräftige Beschreibung zu liefern und zweitens sollte das Tool von Mitarbeitern bedient werden, die anderes zu tun haben, als sich mit Access-Abfragen herumzuschlagen.

Nun ist es einfach, eine Routine zu schreiben, die beim Abarbeiten eines Datensatzes einen Ausdruck wie den folgenden mit den Inhalten der entsprechenden Felder eines Datensatzes füllt:

[Artikelnummer] [Bezeichnung] [Farbe] [Hersteller] [Groesse]

Der Clou ist es, dem Benutzer eine einfache Möglichkeit an die Hand zu geben, die in eckigen Klammern stehenden Platzhalter zum gewünschten Ausdruck zusammenzustellen, ohne dass er jeden einzelnen Feldnamen der zugrunde liegenden Tabelle kennen muss.

Beschreibung der Technik

Wir müssen dem Benutzer also irgendwie Zugriff auf die Feldnamen der Tabelle verschaffen und ihm erlauben, diese möglichst einfach in das Zieltextfeld einzutragen. Dazu gibt es mehrere Möglichkeiten: So könnte man etwa eine Liste mit allen verfügbaren Feldern in das Formular integrieren, welches auch das Zielfeld enthält, oder man erstellt ein eigenes Popup-Formular, das nur dem Zuweisen der Platzhalter dient. Am einfachsten ist es jedoch, wenn Sie einfach ein Kontextmenü erstellen, das der Benutzer per Rechtsklick auf das Zielfeld öffnet und aus dem er die gewünschten Platzhalter auswählen kann. Der Platzhalter wird dann genau an der Position der Einfügemarke hinzugefügt. Sollte gerade ein Bereich des Zielfeldes markiert sein, soll dieser einfach durch den Platzhalter überschrieben werden. Auf diese Weise kann der Benutzer Platzhalter für Platzhalter hinzufügen.

Weitere Einsatzmöglichkeiten

Damit auch Leser etwas von dieser Lösung profitieren, die diese nicht gerade zum Zusammensetzen der Titeltexte von eBay-Versteigerungen benötigen, hier noch einige Anregungen für weitere Anwendungsfälle:

  • Textbausteine für Briefe: Möglicherweise erstellen Sie Serienbriefe in Form von Access-Berichten. Damit Sie Betreff, Anrede und Fließtext flexibel gestalten können, tragen Sie die Platzhalter einfach per Kontextmenü in die entsprechenden Felder ein und ersetzen diese zur Laufzeit.
  • Serienmails: Das gleiche Verfahren lässt sich natürlich auch für Serienmails anwenden.
  • Rechnungen: Wenn Sie eine Artikeltabelle mit vielen Detailinformationen zu den jeweiligen Artikeln pflegen, möchten Sie diese Informationen vielleicht mal mehr und mal weniger detailliert in die Rechnungspositionen eintragen.
  • Generell können Sie dem Benutzer so die Möglichkeit geben, Ausdrücke für die Ausgabe in Berichten statt über die Erstellung einer Abfrage mithilfe von Platzhaltern zusammenzustellen.

Beispiel

Zu Beispielzwecken hält wieder einmal die Südsturm-Datenbank her, unsere optimierte Version der Nordwind-Datenbank. Dabei soll der Benutzer beliebige Felder aus der Artikeltabelle zum Positionstext in einer Bestellung zusammensetzen können. Vergessen Sie den Hintergrund nicht: Wir möchten dem Benutzer die Möglichkeit geben, Inhalt etwa von Berichten flexibel aus der Datenherkunft zusammenzusetzen, ohne dass er sich selbst mit Abfragen und weiteren Access-Spezialitäten auseinandersetzen muss.

Das Beispielformular enthält im Wesentlichen ein Textfeld namens txtPositionstext, das der Zusammenstellung der Platzhalter für den Positionstext eines Artikels dient. Für Beispielzwecke ist das Formular an die Abfrage qryArtikelPlatzhalter gebunden und zeigt all seine Felder an – so lässt sich leicht prüfen, ob die Platzhalter wie gewünscht gefüllt werden.

Doch eins nach dem anderen: Zunächst einmal brauchen Sie eine Abfrage, die alle infrage kommenden Felder liefert. Diese heißt in unserem Beispiel qryArtikelPlatzhalter und sieht wie in Bild 1 aus. Diese Beispielabfrage zeigt gleich einen praktischen Nutzen: Wenn der Benutzer selbst eine Abfrage für das Zusammenstellen des Positionstextes erstellen müsste, käme er noch nicht einmal mit einer einfachen Abfrage über eine Tabelle aus, sondern müsste die Bezeichnung der Kategorie und des Lieferanten aus weiteren verknüpften Tabellen hinzufügen – dies erledigen wir an dieser Stelle für den Benutzer.

pic001.png

Bild 1: Diese Abfrage dient als Datenherkunft für die Auswahl der Platzhalter.

Kontextmenü, selbst gebaut

Wenn der Benutzer nun mit der rechten Maustaste auf das Textfeld txtPositionstext klickt, soll ein Kontextmenü erscheinen, das alle Feldnamen der Abfrage qryArtikelPlatzhalter enthält. Zur Verdeutlichung, dass es sich dabei um Platzhalter handelt, klammern wir die Einträge des Kontextmenüs außerdem in eckige Klammern ein, sodass sich etwa das Bild aus Bild 2 ergibt.

pic002.png

Bild 2: So soll das Kontextmenü zum Einfügen der Platzhalter aussehen.

Damit das Kontextmenü erscheint, sind zwei Schritte nötig:

  • Zusammenstellen des Kontextmenüs auf Basis der Felder aus qryArtikelPlatzhalter
  • Anzeigen des Kontextmenüs

Nach der Auswahl des Eintrags, der zum Textfeld hinzugefügt werden soll, muss außerdem noch eine entsprechende Funktion ausgelöst werden.

Schauen wir uns erstmal an, wie das Kontextmenü zusammengestellt und angezeigt wird. Dazu fangen wir die Mausgeste, die normalerweise für die Anzeige von Kontextmenüs verantwortlich ist, ab. Wenn Sie selbst einmal ausprobieren, wann das Kontextmenü erscheint, stellen Sie fest, dass dies beim Loslassen der rechten Maustaste und nicht etwa beim Drücken geschieht.

Also machen wir uns das Ereignis Bei Maustaste auf des Textfelds zunutze und fügen diesem die Ereignisprozedur aus Listing 1 hinzu.

Listing 1: Diese Ereignisprozedur wird durch das Loslassen der Maustaste über dem Textfeld txtPositionstext ausgelöst.

Private Sub txtPositionstext_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim db As DAO.Database
    Dim cbr As Office.CommandBar
    Dim cbc As Office.CommandBarControl
    Dim qdf As DAO.QueryDef
    Dim fld As DAO.Field
    If Button = 2 Then
        Me.ShortcutMenu = False
        Set db = CurrentDb
        On Error Resume Next
        CommandBars("cbrPlatzhalter").Delete
        On Error GoTo 0
        Set cbr = CommandBars.Add("cbrPlatzhalter", msoBarPopup, , True)
        Set qdf = db.QueryDefs("qryArtikelPlatzhalter")
        For Each fld In qdf.Fields
            Set cbc = cbr.Controls.Add(1, , , , True)
            cbc.Caption = "[" & fld.Name & "]"
            cbc.OnAction = "=PlatzhalterHinzufuegen(""[" & fld.Name & "]"")"
        Next fld
        cbr.ShowPopup
    End If
    End Sub

Die Routine verwendet zwei Objekte der Office-Objektbibliothek, weshalb Sie über den Verweise-Dialog (Menüeintrag Extras|Verweise im VBA-Editor) einen Verweis auf die Bibliothek Microsoft Office x.0 Object Library hinzufügen müssen.

Nach der Deklaration der benötigten Variablen prüft die Prozedur den Wert des im Prozedurkopf übergebenen Parameters Button. Wenn der Benutzer die rechte Maustaste gedrückt hat, liefert Button den Wert 2 – nur hier müssen wir tätig werden.

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

Testzugang

eine Woche kostenlosen Zugriff auf diesen und mehr als 1.000 weitere Artikel

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar