Kennen Sie dies “xxx.doc ist ein Seriendruck-Hauptdokument. Word konnte die Datenquelle yyy.mdb nicht finden.” Oder das: “Fehler! Feld in Datenquelle nicht gefunden!” Das muss nicht sein. Erledigen Sie Ihren Seriendruck einfach per Code.
Was ist eigentlich Seriendruck
Die meisten Leser wissen, worum es sich beim Seriendruck handelt. Hier aber noch einmal eine kurze Erläuterung:
Beim Seriendruck wird ein Dokument – das so genannte Hauptdokument – unter Zuhilfenahme Felder genannter Platzhalter als Schablone für eine Dokumentenserie mit stets gleichem Aufbau eingerichtet, wobei nur an den Feldplätzen unterschiedliche Inhalte – meist Datensätze aus einer Datenbank – angezeigt werden.
Ein Hauptdokument enthält dabei neben den festen Textinhalten und der Anordnung der Felder auch noch Verbindungsinformationen über die verwendete Datenquelle.
Die Funktion zum Ausführen befindet sich innerhalb der Textverarbeitung und erzeugt auf Basis der Schablone und der Datensätze ein neues Dokument, das die einem Datensatz entsprechenden aufeinander folgenden Textbereiche durch einen Abschnittswechsel (Seitenwechsel oder fortlaufend) trennt.
Das Ergebnis ist eine umfangreiche Datei, die nach dem Ausdruck im Allgemeinen nicht archiviert wird, da sie viel Platz belegt und eigentlich keine relevanten Informationen enthält: Die veränderlichen Daten (Kundenadressen) stehen bereits in der Datenbank, der unveränderliche Text ist immer derselbe.
Wann brauchen Sie Seriendruck
Aus Sicht eines (Datenbank-)Programmierers mit guten Kenntnissen in der Word-Automation eigentlich gar nicht, könnten Sie antworten.
Wenn man Dokumente voll automatisiert ausgeben kann, kann man dasselbe mit einzelnen Dateien, die man genau so verwirft wie die eine große, die der Seriendruck erzeugt, mit einer einfachen Schleife im Code auch erreichen – ganz ohne Seriendruck.
Der häufigste Grund, warum in der Praxis Seriendruck – sogar für einzelne (!) Briefe – verwendet wird, ist in der Regel der Benutzer selbst: Er weiß einfach nicht, wie man die Daten sonst von Access oder Excel nach Word bekommt.
Da die meisten Seriendrucke von Benutzern ohne Programmierkenntnisse eingerichtet werden, ist das auch wenig verwunderlich.
Es gibt allerdings auch für denjenigen, der sich mit der Dokumenterzeugung per Code vertraut gemacht hat, zwei gute Gründe, sich des Seriendrucks anzunehmen.
Erstens: Der Benutzer soll zum Beispiel ein Rundschreiben mit einem frei zu entwerfenden Text verfassen und dazu eine vorhandene, mit Textmarken versehene Briefvorlage benutzen. Zwischen dem programmatischen Ansprechen der Vorlage und dem Ausgeben der Datensätze findet eine Benutzerinteraktion – nämlich das Entwerfen des Rundschreibentextes – statt.
Zweitens: Die gleiche Situation wie zuvor, aber auch der Text kann vollautomatisch eingefügt werden, zum Beispiel durch Textbausteine. Hier brauchten Sie als Programmierer eigentlich keinen Seriendruck. Aber: Es ist herrlich bequem!
Grundlegender Aufbau
Sie werden daher im Folgenden sehen, wie Sie einen kompletten Seriendruck mittels Code durchführen.
Dazu sind kurz zusammengefasst die gleichen Schritte wie von Hand notwendig:
- Datenquelle festlegen
- Seriendruckfelder einfügen
- Dokument als Hauptdokument festlegen
- Freitext, um die Felder einzufügen, gegebenenfalls manuell durch Benutzer
- Ausführung des Seriendrucks, gegebenenfalls manuell durch Benutzer
Es ist grundsätzlich nicht empfehlenswert, fertige Vorlagen mit Seriendruckinformationen anzulegen. Man kann recht problemlos ein Standard-Word-Dokument (also ohne Seriendruckeigenschaft) mittels Code bei Bedarf zu einem Seriendruckhauptdokument machen.
Die Vorteile liegen auf der Hand: Man pflegt zum Beispiel nur eine Vorlage Brief.doc, die ja unter Umständen an ein verändertes Corporate Design anzupassen ist, statt, wie oft im Büroalltag zu beobachten, eine ganze Herde davon, die da heißen Einzelbrief.doc, SerienbriefMitglieder.doc, SerienbriefKunden.doc und so weiter. Redundanz ist nicht nur bei den Nutzdaten von übel.
Der Datenaustausch
Es gibt drei Schnittstellen, über die der Datenaustausch stattfinden kann: DDE, ODBC und OleDB. Welche Schnittstelle angesprochen wird, erkennt Word am Connection-String.
Zur Schnittstellenauswahl sollten Sie Folgendes wissen: In alten Word-Versionen (bis einschließlich 2000) ist DDE Standard und ODBC als Alternative möglich. Ab Word XP ist das neue OleDB verfügbar und dort auch Standard. Ein Seriendruck-Dokument, das mit OleDB erstellt wurde, zum Beispiel manuell mit XP, wird von älteren Word-Versionen überhaupt nicht als gültiges Seriendruckdokument erkannt.
Die DDE-Schnittstelle sollten Sie gar nicht verwenden. DDE ist veraltet, langsam und problembehaftet. DDE öffnet die Datenquelle beim Aufruf erneut, auch wenn sie schon offen ist, was bei Access zu Sperrkonflikten führen kann.
Die ODBC-Schnittstelle ist brauchbar und daher bei Word bis zur Version 2000 das Mittel der Wahl.
Die ab Office XP verfügbare OleDB-Schittstelle ist ebenfalls recht zuverlässig. Sie ist stabil und problemlos, allerdings etwas langsamer als ODBC. Bei sehr umfangreichen Seriendrucken kann Letzteres also noch als Alternative zu OleDB gelten.
Kurz und gut: Wenn der Code auch mit alten Word-Versionen laufen soll oder Performance-Probleme auftreten, sollten Sie ODBC verwenden, sonst OleDB.
Probleme mit Datentypen vermeiden
Beim ODBC-Seriendruck gibt es jedoch bedauerlicherweise einige kleinere ärgernisse. Abhängig vom Datentyp und von den Ländereinstellungen kann in Word vor allem bei Währungen oder Zeitdaten einiger Unfug vorkommen.
Sie umgehen alle derartigen Probleme, wenn Sie als Quelle für einen Seriendruck immer eine temporäre Tabelle benutzen, die ausschließlich Textfelder hat, und Datumsangaben, Beträge und ähnliches dort als formatierten String ablegen. Word ist nun mal eine Textverarbeitung und kommt daher auch am besten mit Texten klar.
Außerdem umgehen Sie damit von vornherein benutzerverwirrende Eingabefenster, die nach irgendwelchen Parametern fragen.
Ein Beispiel für die Verwendung einer temporären Tabelle: Sie wollen drei Felder KundeName (Text), AuftragsDatum (Datum/Uhrzeit), Betrag (Währung) ausgeben. Die Temporärtabelle sollte dafür drei Felder vom Typ Text aufweisen, die Sie aus den Produktivtabellen wie folgt befüllen:
Dim SQL As String SQL = "DELETE FROM ttmpSeriendruck" CurrentDb.Execute SQL SQL = "INSERT INTO ttmpSeriendruck( KundeName, AuftragsDatum, Betrag ) " & _ "SELECT KundeName, " & _ "Format$(AuftragsDatum, ''dd.MM.yyyy')," & _ "Format$(Betrag, ''#,##0.00 €')" CurrentDb.Execute SQL
Das Feld KundeName ist als Text harmlos. Die konfliktträchtigen Felder Auftragsdatum und Betrag enthalten in der Temporärtabelle jetzt einen ebenso harmlosen Text, zum Beispiel die Strings 04.05.2007 und 2.345,69.