Eine häufige Anforderung an eine Datenbank besteht darin, einen Standardtext mit individuellen Daten zu füllen. So entstehen beispielsweise Auftragsbestätigungen, Lieferscheine und Begrüßungsschreiben. Das Team, bestehend aus der Datenbank Access und der Textverarbeitung Word, meistert diese Aufgabe mit Bravour. Wie dies funktioniert, lesen Sie in diesem Beitrag!
Aber was ist, wenn auf einem PC kein Word vorhanden ist Hier bietet sich die Verwendung von Textdateien an. Statt mit den unter Word üblichen Textmarken oder Feldfunktionen, markieren in Textdateien einfache Platzhalter wie beispielsweise @[ und ] die Datenfelder. Ist die Textdatei erst mal als Vorlage in einem Ordner gespeichert, steht sie für den Gebrauch mit Access zur Verfügung. Damit aus der Vorlage eine individuelle Nachricht wird, müssen Sie die Platzhalter nur noch durch die Daten aus der Datenbank ersetzen. Genau diese Aufgabe erledigt die Prozedur TextvorlageFüllen aus diesem Beitrag. Die Prozedur ist so gestaltet, dass sie sich für das Ersetzen von Platzhaltern in allen Textdateien eignet, in den klassischen .txt-Dateien ebenso wie in .rtf– und .html-Dateien.
Die Textvorlage gestalten
Bei der Gestaltung der Textvorlage können Sie Ihrer Fantasie freien Lauf lassen. Es ist lediglich wichtig, dass Sie die Platzhalter einheitlich mit einer Start- und einer Endzeichenfolge markieren. Es sollte sich um eine Zeichenkombination handeln, die ansonsten nicht in der Textdatei vorkommt. Außerdem sollten Sie möglichst sprechende Namen für die Platzhalter verwenden und sich an die Konventionen zur Bildung von Feldnamen in Abfragen halten. Eine kleine Musterdatei befindet sich im Download zu diesem Artikel (AB_Template.txt). Hierbei handelt es sich um eine .txt-Datei, die mit dem Texteditor von Windows erstellt wurde. Die Textdatei enthält einen Mustertext und eine Reihe von Platzhaltern. Die Zeichenfolge @[ markiert den Beginn und die Zeichenfolge ] das Ende eines Platzhalters. Dazwischen befindet sich der Name des Platzhalters (s. Bild 1).
Bild 1: Textvorlage mit Platzhaltern
Die Datenquelle hinterlegen
Damit aus der Vorlage ein individueller Brief wird, muss Access die Platzhalter durch Daten ersetzen. Sie benötigen also eine Datenquelle, welche die zur Vorlage passenden Daten liefert. Die Bezeichnungen der Felder aus der Datenquelle müssen mit den Bezeichnungen der Platzhalter übereinstimmen. Nur so kann die Prozedur TextvorlageFüllen die Felder aus der Vorlage mit denen aus der Datenquelle vergleichen.
Als Datenquelle können Sie eine Tabelle, eine Abfrage oder auch eine SELECT-Anweisung verwenden. Die Routine ist dafür ausgelegt, dass die Datenquelle nur einen einzelnen Datensatz liefert. Falls Sie eine Lösung benötigen, welche die Textvorlage für mehrere Datensätze vervielfältigt, müssen Sie auch einen Weg zur Angabe mehrerer Zieldateien finden. Da dies stark von der spezifischen Anwendungskonzeption abhängt, verzichtet die hier vorgestellte Routine darauf.
Im Beispiel dient die Abfrage qryNeueBestellung10702 als Datenquelle. Sie basiert auf den Tabellen tblKunden und tblBestellungen.
Die Beispielabfrage filtert die Bestellnummer 10702 aus der Datenquelle heraus. Damit ist sichergestellt, dass die Abfrage nur einen Datensatz liefert. Außerdem werden den meisten Feldnamen – durch Doppelpunkte getrennt – neue Feldnamen vorangestellt. Der erste Buchstabe bezeichnet dabei stets die Tabelle, aus der das Feld stammt. Der Präfix B_ kennzeichnet die Felder aus der Tabelle tblBestellungen und der Präfix K_ die Felder aus der Kundentabelle (s. Bild 2).
Bild 2: Diese Abfrage dient als Datenquelle
Aufruf der Prozedur TextvorlageFüllen
Die Prozedur TextvorlageFüllen liest die Textvorlage und ersetzt alle Platzhalter durch die Feldwerte aus der Datenquelle (s. Listing 1). Beim Aufruf der Prozedur sind folgende Parameter erforderlich:
Listing 1: Füllen einer Textvorlage
Sub TextvorlageFüllen(sQuelldatei As String, sZieldatei As String, sSQL As String, _ sVarStart As String, sVarEnde As String) '' Überprüfen, ob das Recordset nur einen Datensatz enthält. Dim rs As Recordset Set rs = CurrentDb.OpenRecordset(sSQL, , dbReadOnly) rs.MoveLast If Len(Nz(Dir(sQuelldatei))) > 0 And rs.RecordCount = 1 Then Dim iQuelldatei As Integer Dim iZieldatei As Integer Dim sNeueZeile As String Dim sGeleseneZeile As String '' Dateinummer für die Quelldatei zuweisen iQuelldatei = FreeFile '' Quelldatei zum binären Lesen öffnen '' Datei gleichzeitig mit Lock für lesenden und schreibenden Zugriff sperren. Open sQuelldatei For Binary Access Read Lock Read Write As #iQuelldatei '' Dateinummer für die Zieldatei zuweisen iZieldatei = FreeFile '' Zieldatei zum binären Schreiben öffnen. '' Datei gleichzeitig mit Lock für lesenden und schreibenden Zugriff sperren. Open sZieldatei For Binary Access Write Lock Read Write As #iZieldatei Dim Zeilenr As Integer Zeilenr = 0 Dim dStartzeit As Double dStartzeit = Time Debug.Print "Starte mit Zeilenr. 1", Format(dStartzeit, "hh:mm:ss") Do While Not EOF(iQuelldatei) '' Schleife bis zum Ende der Textdatei. Zeilenr = Zeilenr + 1 '' Lesen am Anfang der Schleife => Auch letzte Zeile mit EOF verarbeiten. sGeleseneZeile = ZeileLesen(iQuelldatei) '' Textzeile lesen sNeueZeile = ZeileVerarbeiten(sGeleseneZeile, rs, sVarStart, sVarEnde) ZeileSchreiben iZieldatei, sNeueZeile Loop Dim dEndzeit As Double dEndzeit = Time Debug.Print "Ende mit Zeilenr. " & LTrim(str(Zeilenr)), Format(dEndzeit - dStartzeit, _ "hh:mm:ss") Close #iQuelldatei Close #iZieldatei End If Set rs = Nothing End Sub
- sQuelldatei As String: Laufwerk, Pfad und Dateiname der Textvorlage.
- sZieldatei As String: Laufwerk, Pfad und Dateiname für die Zieldatei.
- sSQL As String: Name einer Tabelle, einer Abfrage oder Angabe einer SELELCT-Anweisung mit der Datenquelle.
- sVarStart As String: Zeichenkette, die den Beginn eines Platzhalters markiert.
- sVarEnde As String: Zeichenkette, die das Ende eines Platzhalters markiert.