Home > Artikel > Ausgabe 7/2013 > Platzhalter in Texten ersetzen

Platzhalter in Texten ersetzen

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

In Datenbanken kommt es sehr oft vor, dass an bestimmten Stellen Texte einzufügen sind. Meist bildet man dies durch den Einsatz von Textfeldern ab, welche die Daten der entsprechenden Datensätze aufnehmen. Oft sollen jedoch auch Fließtexte flexibel mit Texten gefüllt werden – beispielsweise Texte von E-Mails oder Word-Dokumente. Wir kümmern uns in diesem Artikel um den weniger komplexen Fall der reinen Textdatei, wie er auch in E-Mails zum Einsatz kommt. Eine E-Mail soll mit einem Text gefüllt werden, der zunächst noch Platzhalter enthält, die aber durch entsprechende Einträge einer Tabelle oder Abfrage ersetzt werden sollen.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Datenbank 1307_PlatzhalterInTextenErsetzen.mdb.

Beispielbeschreibung

Im Beispiel sollen ein Text nur einmal getippt, aber mehrfach genutzt werden können – quasi als eine Art Textvorlage. Diese Vorlage soll Platzhalter in einem bestimmten Format enthalten, die später durch Einträge in einer Tabelle der Datenbank ersetzt werden sollen.

Ziel ist es, ein Formular wie das aus Bild 1 zu erstellen. Das Formular speichert die auf der linken Seite dargestellten Daten in einer Tabelle, um Textvorlagen und Quelltabellen wiederverwendbar zu machen. Oben wählen Sie die Textvorlage anhand der Bezeichnung aus.

Beispielformular für das Ersetzen von Platzhaltern

Bild 1: Beispielformular für das Ersetzen von Platzhaltern

Dann legen Sie die Datenquelle fest, aus der die für die Platzhalter einzusetzenden Daten stammen. Das Textfeld Textvorlage schließlich nimmt den Text mit den Platzhaltern auf. Ein Klick auf die Schaltfläche Platzhalter ersetzen soll den Text von links mit konkreten Werten aus der angegebenen Tabelle füllen und den Inhalt rechts abbilden.

Zu Beispielzwecken geschieht das Ersetzen zunächst nur mit dem ersten Datensatz der angegebenen Datenquelle.

Tabelle zum Speichern der Textvorlagen

Die Textvorlagen speichern wir in einer Tabelle namens tblTextvorlagen. Diese enthält neben dem Primärschlüsselfeld TextvorlageID noch ein Textfeld namens Bezeichnung sowie ein Memofeld namens Textvorlage, welche den eigentlichen Text aufnimmt. Außerdem bereiten wir ein Feld namens Datenquelle vor, dass die Tabelle oder Abfrage aufnimmt, deren Daten für die Platzhalter eingesetzt werden soll. Den Entwurf der Tabelle finden Sie in Bild 2.

Entwurfsansicht der Tabelle tblTextvorlagen

Bild 2: Entwurfsansicht der Tabelle tblTextvorlagen

Die im Feld Textvorlage gespeicherten Texte sollen Platzhalter in der Form [Platzhalter] aufnehmen. Diese sollen dann für einen bestimmten Datensatz der dafür vorgesehenen Tabelle oder Abfrage mit den entsprechenden Werten ersetzt werden.

Formulare zum Ersetzen der Platzhalter

Erstellen Sie ein neues Formular und speichern Sie es unter dem Namen frmPlatzhalter. Stellen Sie dann die Datenherkunft des Formulars auf die Tabelle tblTextvorlagen ein. Ziehen Sie die Felder Bezeichnung, Datenquelle und Textvorlage in den Entwurf des Formulars und platzieren Sie diese etwa so wie in Bild 3.

Entwurfsansicht des Formulars frmPlatzhalter

Bild 3: Entwurfsansicht des Formulars frmPlatzhalter

Ganz oben legen wir ein Kombinationsfeld an, mit dem Sie schnell eine der Textvorlagen auswählen können. Dieses heißt cboSchnellauswahl und erhält die folgende Abfrage als Datensatzherkunft:

SELECT TextvorlageID, Bezeichnung

FROM tblTextvorlagen;

Stellen Sie die Eigenschaften Spaltenanzahl und Spaltenbreiten auf die Werte 2 und 0cm ein, damit nur die Bezeichnungen der Textvorlagen im Kombinationsfeld angezeigt werden.

Damit das Formular nach der Auswahl eines der Einträge gleich den entsprechenden Datensatz anzeigt, hinterlegen Sie für die Ereigniseigenschaft Nach Aktualisierung die Prozedur aus Listing 1.

Private Sub cboSchnellauswahl_AfterUpdate()

     Me.Recordset.FindFirst "TextvorlageID = " & Me!cboSchnellauswahl

End Sub

Listing 1: Aktualisieren der Textvorlage

Das Feld Datenquelle des Formulars wandeln Sie nach dem Hineinziehen aus der Feldliste von einem Textfeld in ein Kombinationsfeld um. Dies erledigen Sie mit dem Eintrag Ändern zu|Kombinationsfeld des Steuerelements in der Entwurfsansicht des Formulars. Damit das Kombinationsfeld alle Tabellen und Abfragen der aktuellen Datenbank anzeigt, stellen sie die Eigenschaft Datensatzherkunft des Kombinationfelds auf den folgenden Ausdruck ein:

SELECT Name FROM MSysObjects

WHERE Type IN (1,5);

Platzhalter ersetzen

Nun fehlt eigentlich nur noch die Ereignisprozedur, die durch das Ereignis Beim Klicken der Schaltfläche Platzhalter ersetzen ausgelöst wird.

Diese finden Sie in Listing 2. Die Prozedur deklariert drei Variablen:

Private Sub cmdPlatzhalterErsetzen_Click()

     Dim db As DAO.Database

     Dim rst As DAO.Recordset

     Dim fld As DAO.Field

     Dim strText As String

     Set db = CurrentDb

     Set rst = db.OpenRecordset("SELECT TOP 1 * FROM " & Me!cboDatenquelle)

     strText = Me!Textvorlage

     For Each fld In rst.Fields

         strText = Replace(strText, "[" & fld.Name & "]", fld.Value)

     Next fld

     Me!txtGefuellterText = strText

End Sub

Listing 2: Ersetzen der Platzhalter durch die Inhalte der Felder des ersten Datensatzes der angegebenen Datenquelle

  • db: Nimmt einen Verweis auf das Database-Objekt für die aktuelle Datenbank auf.
  • rst: Erfasst eine Recordset-Gruppe auf Basis der angegebenen Datenquelle.
  • fld: Referenziert je eines der Felder des Recordset-Objekts.
  • strText: Speichert den Text mit den zu ersetzenden Platzhaltern und die jeweiligen Zwischenstände.

Die Prozedur weist der Variablen db zunächst einen Verweis auf die aktuelle Datenbank zu. Das Recordset rst wird mit dem ersten Datensatz der im Feld Datenquelle angegebenen Tabelle oder Abfrage gefüllt – dafür sorgt die Klausel TOP 1.

Der Inhalte der Textvorlage wird in der Variablen strText zwischengespeichert. Schließlich durchläuft die Prozedur in einer For Each-Schleife alle Field-Elemente des Recordset-Objekts, also alle in der Tabelle oder Abfrage enthaltenen Felder.

Und hier kommt der Clou: In einer einzigen Zeile ersetzt die Prozedur alle im Text vorhandenen Vorkommen des Platzhalters für das aktuelle Feld. Wenn das Feld Vorname heißt, sucht die Replace-Anweisung also nach dem Ausdruck [Vorname]. Dieser Wert wird durch den Wert des entsprechenden Feldes des aktuellen Datensatzes ersetzt. Dieser wird mit fld.Value ermittelt. Sie greifen also in diesem Fall nicht mit einem Ausdruck wie rst!Vorname auf den Wert des Feldes eines Datensatzes zu, sondern über die Value-Eigenschaft der Field-Variablen des Feldes.

Auf diese Weise durchläuft die Prozedur in der Schleife alle Felder der Datenquelle und ersetzt die jeweiligen Platzhalter durch konkrete Werte.

Die in strText gespeicherte und mit Platzhaltern versehene Textvorlage wird also Feld für Feld mit Werten gefüllt. Schließlich zeigt die Prozedur das Ergebnis im Textfeld txtGefuellterText des Formulars an.

Einsatz in der Praxis

Was wir in diesem Artikel anhand eines Beispielformulars bildlich dargestellt haben, können Sie natürlich im größeren Stil fortführen.

Der erste Änderungsschritt wäre das Durchlaufen aller Datensätze, um die Textvorlage nacheinander mit den Daten der kompletten Tabelle oder Abfrage zu füllen.

Dazu teilen wir die Prozedur in eine Prozedur und eine Funktion auf. Beide zusammen enthalten zunächst die gleiche Funktion wie die vorherige, durch die Schaltfläche cmdPlatzhalterErsetzen ausgelöste Prozedur.

Für die neue auslösende Prozedur fügen wir wie in Bild 4 eine neue Schaltfläche zum Formular hinzu.

Neue Schaltfläche mit aufgeteilter Funktionalität

Bild 4: Neue Schaltfläche mit aufgeteilter Funktionalität

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

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