Ausgabeseiten als PDF-Version erstellen und diese per Mail versenden

Daten einer Datenbank können als PDF-Dokumente per Mail versandt werden. Zur Nutzung dieser Funktionalität ist es notwendig, eine geeignete Ausgabeseite zu erstellen. Diese kann entweder beliebige Daten in beliebiger Darstellung enthalten und verwendet keine Parameter. Oder sie verarbeitet eine Datenzeile und stellt die Werte bsp. als Rechnung dar. Ist der Ausgabeseite ein sd:param -Element zugeordnet, stammen die Daten aus einer Abfrage und nimmt diese den Wert des sd:param -Elements entgegen, so kann eine Ausgabeseite mit einer Liste von IDs aufgerufen werden und stellt damit bsp. Quartalsrechnungen dar. Das generierte PDF-Dokument kann entweder an eine oder an mehrere Mailadressen versandt werden. Enthält die Ausgabeseite ein sd:mail -Element mit dem fixierten Namen 'print_mail_text', so wird der dort festgelegte Mailtext verwendet, um die PDF-Dokumente zu versenden. Ansonsten wird ein simpler Standardtext genutzt. Derzeit gibt es zwei Möglichkeiten für die Verwendung:
  • Aufruf aus dem Menü 10: Ausgabeseiten : Hier können eine ID und eine Empfänger-Adresse festgelegt werden. Die ID wird als 'print_id' beim Aufruf mit übergeben. Falls die Ausgabeseite diesen Parameter nicht kennt, wird der Wert ignoriert und die Ausgabeseite direkt verarbeitet. Fehlt die Mailadresse, so wird das PDF-Dokument dem aktuellen Nutzer zugesandt.
  • Aufruf aus dem Menü 9: Abfragen : Soll eine Ausgabeseite mit mehreren IDs aufgerufen werden und/oder soll ein PDF-Dokument an mehrere Empfänger gesandt werden, so muß zunächst eine passende Abfrage erstellt werden, welche die gewünschten IDs und Mailadressen paarweise als Spalten mit den vordefinierten Spaltennamen print_id und mail bereitstellt. Bei den IDs kann es sich bsp. um die Primärschlüssel einer selbstdefinierten Tabelle 'Kundenrechnungen' handeln, die mit einer Tabelle 'Kunden' verknüpft ist. Diese Tabelle kann Name, Postanschrift und Mailadresse der Empfänger bereitstellen. Mittels geeigneter WHERE-Abschnitte lassen sich die Ausgabezeilen etwa auf den aktuellen Monat oder Tag einschränken. Liefert der direkte Aufruf der Abfrage im Menü die korrekten Daten, so genügt ein Klick auf den Button 'PDF erzeugen', um die gewünschten PDF-Dokumente zu erstellen und sie an die zugeordneten Mailadressen zu versenden.

    Beim Klick auf den Button wird zunächst die Abfrage ausgeführt. Anschließend wird die Ausgabeseite mit jeder 'print_id' aufgerufen und das PDF-Dokument generiert. Dieses wird an die Liste der dieser print_id zugeordneten Mailadressen versandt.

Beispiel für eine Ausgabeseite

Die folgende Listung stellt den Code für die Ausgabeseite kundenrechnungen.html dar. Wird hier kein print_id - Parameter übergeben, so liefert die Abfrage keine Zeilen zurück. Der Aufruf muß deshalb in der Form

https://beispiel.server-daten.de/kundenrechnungen.html?print_id=1

erfolgen.

<!-- Mail, die versendet wird -->
<sd:mail sd:name="print_mail_text" sd:mail-address-column="">
  <sd:choose-lang>
    <sd:span sd:info="Ihre aktuelle Rechnung">Sehr geehrter Kunde,

beiliegend finden Sie Ihre aktuelle Rechnung.

Mit freundlichen Grüßen

server-daten.de
--
Disclaimer</sd:span>
  </sd:choose-lang>
</sd:mail>

<!-- Parameterdeklaration -->
<sd:param sd:name="print_id" />

<!-- Seitenkopf -->
<div style="font-size:smaller;">
  <table width="100%">
    <tr><td rowspan="4"><a
      href="http://www.sql-und-xml.de/server-daten/">
        <img src="/images/server-daten-logo.gif"
          border="0" alt="server-daten: Die Web-Datenbank" /></a>
    </td><td style="text-align:right;">Jürgen Auer</td></tr>
    <tr><td style="text-align:right;">Friedenstr. 37</td></tr>
    <tr><td style="text-align:right;">10 249 Berlin</td></tr>
    <tr><td style="text-align:right;">info@sql-und-xml.de</td></tr>
  </table>
</div>

<div class="sd-text-container"></div>
  <sd:rs sd:name="sample-output" sd:edit="sample-input"
    sd:source-type="query" sd:source-name="qry_kundenrechnungen">

    <sd:with-param sd:sql-param="@i" sd:param-name="print_id" />

    <sd:normal>
      <div>An<p />
        <sd:cell-value sd:col="nachname" />, <sd:cell-value sd:col="vorname" /><br />
        <sd:cell-value sd:col="strasse" /><br />
        <sd:cell-value sd:col="plz" /> <sd:cell-value sd:col="ort" /><p />

      <h3 style="margin-top:36px">Ihre Rechnung vom
        <sd:cell-value sd:col="rechnungsdatum" sd:datetime-format="dd.MM.yyyy" /></h3>
      <h4>Rechnungsnummer: <sd:cell-value sd:col="kundenrechnungenId" /></h4>
        <div style="margin:100px 100px 100px 50px;">
          <table cellpadding="12px">
            <tr>
              <th
              style="width:300px; height:50px; vertical-align:top; text-align:left;margin-bottom:36px;">
                 Beschreibung</th>
              <th style="width:300px; vertical-align:top; text-align:left">Betrag</th></tr>
              <tr><td style="width:300px;">
                <sd:cell-value sd:col="rechnungstext" />
              </td>
              <td style="width:300px;">
                <sd:cell-value sd:col="rechnungsbetrag" sd:number-format="#,##0.00 €" />
              </td>
            </tr>
          </table>
        </div>
        Ihre Mail: <sd:cell-value sd:col="mail" /><p />
        Überweisen Sie bitte den Betrag bis zum ... auf das folgende Konto:
        <div style="margin:30px 100px 30px 50px;">
          <table>
            <tr>
              <th
                style="width:300px; height:30px; vertical-align:top; text-align:left;margin-bottom:36px;">
              </th>
              <th style="width:200px; vertical-align:top; text-align:left"></th>
            </tr>
            <tr>
              <td>Kontonummer</td>
              <td>575 221 107</td>
            </tr>
            <tr><td>Bankleitzahl</td>
              <td>100 100 10</td>
            </tr>
            <tr><td>Institut</td>
              <td>Postbank Business</td>
            </tr>
            <tr><td>Kontoinhaber</td>
              <td>Jürgen Auer</td>
            </tr>
          </table>
        </div>
      </div>
    </sd:normal>
  </sd:rs>
  <p />
  Vielen Dank für Ihren Auftrag!
</div>
Zunächst wird die zu versendende Mail definiert. Anschließend folgt der Parameter. Das sd:rs -Element nutzt diesen im sd:with-param -Element, um seinen Wert an die Abfrage weiterzugeben. Da ohnehin nur eine Zeile verarbeitet wird, fehlt das sd:alternate -Element. Ebenso kann auf die für Eingabemasken notwendigen sd:form - und sd:button -Elemente verzichtet werden.

Beispiel für die zugrundeliegende Abfrage

Die Abfrage 'qry_kundenrechnungen' sammelt einfach die Daten aus einer Rechnungszeile sowie die zugeordneten Grunddaten des Rechnungsempfängers.
Declare @i int
Select A.nachname, A.vorname, A.strasse, A.plz, A.ort, A.mail,
    B.rechnungsdatum, B.rechnungsbetrag, B.rechnungstext, B.kundenrechnungenId
From kundendaten As A Inner Join kundenrechnungen As B
On A.kundendatenId = B.kundendatenId
Where B.kundenrechnungenId = @i
Mit diesen beiden Bausteinen - Abfrage über mehrere Tabellen, die eine Zeile liefert und eine ID nutzt sowie eine Ausgabeseite, welche die Zellen darstellt - lassen sich unter Menü 10: Ausgabeseiten bereits einzelne Rechnungen versenden.

Beispiel für eine Abfrage zur Versendung mehrerer Rechnungen

Falls an sämtliche Kunden eine Rechnung zum aktuellen Monat versandt werden soll, kann eine Abfrage wie folgt genutzt werden:
Select A.kundenrechnungenId As print_id,
    B.mail As print_mail
From kundenrechnungen As A Inner Join kundendaten As B
On A.kundendatenId = B.kundendatenId
Where Year(A.rechnungsdatum) = Year(getDate())
    And Month(A.rechnungsdatum) = Month(getDate())
Diese, anschließend über Menü 9: Abfragen und den Button 'PDF generieren' verwendbaren Abfragen müssen die IDs zurückliefern, welche für den korrekten Aufruf der Ausgabeseiten benötigt werden. Hier liegt es nahe, als Mail die Mails der Kunden aus der Tabelle mit den Kunden-Stammdaten anzugeben. Alternativ könnte auch mit
'info @ sql-und-xml.de' As print_mail
eine eigene Mailadresse angegeben werden, falls die PDF-Dokumente bsp. zusätzlich elektronisch signiert werden sollen. Die Funktionen Year und Month ermitteln aus dem Rechnungsdatum Jahr und Monat und vergleichen dieses mit dem durch GetDate übergebenen aktuellen Datum.

Insgesamt lassen sich mit der obigen Abfrage bei konsistenten Daten alle Monatsrechnungen mit einem Klick generieren und versenden.

Verwendet man als Where-Bedingung

Where Year(A.rechnungsdatum) = Year(getDate())
    And Month(A.rechnungsdatum) = Month(getDate())
    And Day(A.rechnungsdatum) = Day(getDate())
so werden alle Rechnungen mit dem heutigen Datum verarbeitet. Dies ermöglicht eine kontinuierliche Versendung der Rechnungen bsp. bei Betriebsschluß mit einem Mausklick.

Sicherheit

Zum Erzeugen von PDF-Dokumenten sind die folgenden Voraussetzungen zu erfüllen:
  • Der ausführende Nutzer muß Mitglied der auth-user-group sein. Er muß also durch einen Administrator über das Menü Menü 13: Nutzer und Gruppen hinzugefügt worden sein. Nutzer, die sich selbst angemeldet haben, können keine PDF-Dokumente erzeugen.
    Diese einschränkende Designentscheidung wurde getroffen, da das Erzeugen von PDF-Dokumenten und das Versenden per Mail ein gewisses Mißbrauchspotential bietet.
  • Dem Nutzer muß über das Menü 16: Gruppen/Rechte - Zuordnung ein geeigneter Berechtigungssatz zugewiesen sein, der ihm das Erstellen von PDF-Dokumenten für die aktuelle Ausgabeseite oder ein stärkeres Recht zuordnet (Erstellen von PDF-Dokumenten für alle Ausgabeseiten oder StvAdmin/Admin für Ausgabeseiten oder für beliebige Objekte).

    Hat der Nutzer das Recht, eigene Ausgabeseiten zu erstellen und diese vollständig zu verwalten (manage own Object), so kann er keine PDF-Dokumente erstellen. Darf er selbst Gruppen erstellen, dann kann er für seine Gruppen und Objekte Berechtigungssätze erstellen. Diese dürfen jedoch weder createPDF, StvAdmin noch Admin-Rechte beinhalten.

  • Falls der Nutzer das Ergebnis einer Abfrage als PDF-Dokument verarbeiten möchte, muß er das Recht zur Ausführung dieser Abfrage besitzen.
  • Falls die Ausgabeseite Tabellen oder das Ergebnis von Abfragen enthält, werden die Rechte wie gewohnt beim Erzeugen des PDF-Dokumentes überprüft. Darf der Nutzer zwar die Ausgabeseite aufrufen, fehlt ihm jedoch der Zugriff auf die verwendeten Tabellen, so enthalten sowohl die Bildschirmdarstellung der Ausgabeseite als auch das PDF-Dokument entsprechende Fehlermeldungen.
  • Enthält die Ausgabeseite JavaScript, so wird dieser Code nicht ausgeführt. Es wird deshalb empfohlen, das sd:button -Element nicht zu verwenden, da es bei deaktiviertem JavaScript als Button sichtbar wird.
Das Erzeugen der PDF-Dokumente ist vergleichsweise aufwendig. Beim Klick auf den Button PDF generieren wird deshalb nur die Gruppenzugehörigkeit zu auth-user-group sowie die Berechtigung zum Zugriff auf die Ausgabeseite und zur Erstellung von PDF-Dokumenten überprüft. Anschließend werden die Daten einem gesonderten Prozeß übergeben, der die Anforderung im Hintergrund bearbeitet. Nach dem Versenden aller Mails erhält der Nutzer eine Mail mit Statusmeldungen:
The following print-job has been sent:
Url: https://beispiel.server-daten.de/kundenrechnungen.html
  ID: 1
    Mail: info @ sql-und-xml.de
    Mail: sd @ sql-und-xml.de
  ID: 2
    Mail: info @ sql-und-xml.de
    Mail: sd @ sql-und-xml.de
  ID: 3
    Mail: info @ sql-und-xml.de
  ID: 4
    Mail: info @ sql-und-xml.de


----
Disclaimer
Beim obigen Beispiel wurde zu jeder ID ein PDF-Dokument erzeugt. Die beiden ersten wurden doppelt, die beiden anderen einfach versandt.


Kontaktformular:

Schreiben Sie mir und wir bauen gemeinsam Ihre neue Web-Datenbank!

Die Erläuterungen zum Datenschutz habe ich gelesen und stimme diesen zu.

© 2003-2018 Jürgen Auer, Berlin.