Textvorlagen mit Daten füllen

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).

pic001.png

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).

pic002.png

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.


Ein Beispiel für einen Prozeduraufruf lautet wie folgt:

TextvorlageFüllen "C:\Vorlage.txt",
"C:\Zieldatei.txt", "qryNeueBestellung10702",
"@[", "]"

Die Beispieldatenbank zu diesem Beitrag enthält das Formular frmStart, über das Sie die Prozedur ebenfalls starten können (s. Bild 3). Das Formular enthält zwei Kombinationsfelder zur Eingabe oder zur Auswahl von Laufwerk, Ordner und Dateinamen, wo sich die Textvorlage und die Zieldatei befinden. Um die Wertelisten den Bedürfnissen Ihres Kunden anzupassen, wechseln Sie in die Entwurfsansicht des Formulars. Geben Sie anschließend die Dateinamen in die Datensatzherkunft-Eigenschaft der Kombinationsfelder ein.

pic003.png

Bild 3: Das Startformular der Beispielanwendung

Testen der Übergabeparameter

Die Prozedur TextvorlageFüllen ist nur für die Verarbeitung eines einzelnen Datensatzes ausgelegt. Zu Beginn der Prozedur wird die in der Variablen sSQL übergebene Datenquelle daher zunächst getestet, ob sie wirklich nur einen Datensatz enthält. Die If-Anweisung überprüft zusätzlich, ob die Textvorlagendatei existiert.

Lesen und Verarbeiten der Textvorlagendatei

Das Lesen und Verarbeiten der Textvorlagendatei erfolgt in einer Do While-Schleife. Vor dem Beginn der Schleife werden verschiedene Variablen deklariert. Die Open-Anweisungen öffnen außerdem je einen Kanal für die Textvorlagen- und die Zieldatei. In der Variablen Zeilenr zählt Access die Anzahl der gelesenen Zeilen. Um nachher die Dauer der Verarbeitung feststellen zu können, wird die Startzeit der Verarbeitung in der gleichnamigen Variablen gespeichert.

Der Rumpf der Do While-Schleife wird für jede Zeile einmal durchlaufen. Als Endkriterium gilt das Erreichen des Dateiendes der Textvorlagendatei.

Die Funktion ZeileLesen übernimmt das Lesen einer Textzeile. Als Übergabeparameter erhält sie die Dateinummer der bereits geöffneten Textvorlagendatei. Als Rückgabewert liefert die Funktion den Text einer gelesenen Zeile. Access speichert die Zeile in der Variablen sGeleseneZeile.

Die Verarbeitung der Zeile erfolgt in der Funktion ZeileVerarbeiten. Sie durchsucht die Zeile nach allen Platzhaltern und ersetzt sie durch die Werte aus der Datenquelle. Deshalb werden der Funktion neben dem Text der gelesenen Zeile auch das Recordset der Datenquelle und die Variablen sVarStart und sVarEnde übergeben. Die Prozedur ZeileSchreiben schreibt den Text der neuen Zeile in die Zieldatei.

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

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar