Wenn Sie ein Abonnement des Magazins 'Access im Unternehmen' besitzen, können Sie sich anmelden und den kompletten Artikel lesen.
Anderenfalls können Sie das Abonnement hier im Shop erwerben.
Mails mit Vorlage
Ein großer Teil der Kommunikation mit Kunden läuft per E-Mail. Das ist vor allem dann der Fall, wenn der Kunde ein Anliegen per E-Mail vorbringt. Manchmal muss man den Kunden aber auch aus anderen Gründen kontaktieren – beispielsweise weil eine Lieferung per Post zurückgekommen ist. Wollen Sie dann die Kundenverwaltung öffnen, die E-Mail-Adresse des Kunden ermitteln, nach Outlook wechseln, dort eine neue E-Mail an den Kunden anlegen und Ihre Nachricht samt Betreff von Hand eingeben? Nein, denn die meisten Anfragen lassen sich leicht mit einer geeigneten Vorlage erledigen.
Als Ausgangspunkt für die Lösung aus diesem Beitrag nehmen wir eine zurückgesendete Lieferung an einen Kunden (das war der konkrete Anlass für diesen Beitrag). In diesem Fall wollen wir dem Kunden eine Mitteilung schicken, dass eine Sendung zurückgeschickt wurde und ihn bitten, die beim Versand verwendete Adresse zu prüfen und gegebenenfalls zu korrigieren.
Bisher habe ich dazu die Kundenverwaltung gestartet, dort das Kundenformular geöffnet und über das Suchfeld den Datensatz zu diesem Kunden ermittelt. Dann habe ich eine neue E-Mail in Outlook angelegt, die E-Mail-Adresse in das An-Feld eingetragen, eine Betreff zur E-Mail hinzugefügt und einen entsprechenden Text geschrieben.
Dieser enthielt dann die beim Versand genutzte Adresse, die ich praktischerweise per Mausklick generieren kann und nur noch als Adressblock in die E-Mail zu kopieren brauche.
Alles in allem eine Menge Schritte, die ich etwa bei einem Versand eines Magazins zwischen fünf und zehn Mal wiederholen muss. Für jemanden, der gern automatisierte Wege für Standardaufgaben entwickelt und nutzt, ist das eine wenig erfreuliche Aufgabe. Allerdings hat bisher auch die Motivation nicht gereicht, um hierfür eine Lösung zu programmieren – immerhin würde das doch noch etwas länger dauern als die manuelle Erstellung von fünf bis zehn individuellen Mails. Wenn es aber der Zufall so will, dass ich gerade Beiträge für Access im Unternehmen schreibe, lässt sich das prima kombinieren – ich habe eine praktische Lösung und kann diese auch noch an meine Leser weitergeben. Also: Ran ans Werk!
Daten der Anwendung
Als Daten für die Anwendung nutzen wir eine Tabelle namens tblKunden, die in der Datenblattansicht wie in Bild 1 aussieht und deren Anreden über ein Fremdschlüsselfeld namens AnredeID aus der per 1:n-Beziehung verknüpften Tabelle tblAnreden festgelegt werden.
Bild 1: Datenherkunft für die LösungAusgangspunkt
Wir gehen an dieser Stelle davon aus, dass Sie ein Kundenformular verwenden, in dem Sie die Kundendaten eines bestimmten Kunden zügig über eine entsprechende Suchfunktion anzeigen können. Wir nutzen dazu die Suchfunktion aus dem Beitrag Flexible Suche in Formularen (http://www.access-im-unternehmen.de/965) beziehungsweise Suchen mit der clsFlexSearch-Klasse (http://www.access-im-unternehmen.de/964).
Kundenformular erstellen
Falls Sie kein solches Formular verwenden, erstellen wir auf die Schnelle eines. Dazu legen Sie ein neues Formular namens frmKunde an.
Diesem weisen Sie als Datenherkunft die Tabelle tblKunden zu. Ziehen Sie alle Felder aus der Feldliste in den Detailbereich der Entwurfsansicht (s. Bild 2).
Bild 2: Entwurf des KundenformularsAußerdem fügen Sie die Klasse clsFlexSearch aus der Beispieldatenbank zu obigem Beitrag (oder aus der Datenbank zu diesem Beitrag) in das VBA-Projekt Ihrer Lösung.
Daneben benötigen wir noch eine Abfrage namens qryKundensuche, welche die Felder der beiden Tabellen tblKunden und tblAnreden so zusammenführt, dass alle Felder der Tabelle tblKunden (außer AnredeID) und nur das Feld Anrede der Tabelle tblAnreden zurückgegeben werden (s. Bild 3).
Bild 3: Abfrage als Datenherkunft für die SuchfunktionSuchfeld hinzufügen
Nun fügen Sie dem Kundenformular ganz oben ein Textfeld namens txtSuche hinzu. Schließlich legen Sie für die Ereignisprozedur Beim Laden des Formulars den Wert [Ereignisprozedur] an und klicken auf die Schaltfläche rechts daneben, um die entsprechende Prozedur zu erstellen. Diese füllen Sie dann wie folgt:
Private Sub Form_Load()
Set objFlexSearch = New clsFlexSearch
With objFlexSearch
.Suchabfrage = "qryKundensuche"
.PKFeld = "KundeID"
.PKFeldEinschliessen = False
Set .Suchfeld = Me!txtSuche
End With
End Sub
Dies erstellt ein Objekt auf Basis der Klasse clsFlexSearch und teilt dieser mit, dass es qryKundensuche als Grundlage für die Suche nutzen soll, dass KundeID das Primärschlüsselfeld ist und dass dieses nicht in die Suche eingeschlossen werden soll.
Außerdem wird das Textfeld txtSuche als Suchfeld festgelegt. objFlexSearch müssen Sie natürlich im gleichen Formular deklarieren, und zwar wie folgt im Kopf des Moduls:
Dim WithEvents objFlexSearch As clsFlexSearch
Danach legen Sie noch eine Ereignisprozedur für das Ereignis Beim Entladen an, die nur die Objektvariable objFlexSearch leert:
Private Sub Form_Unload(Cancel As Integer)
Set objFlexSearch = Nothing
End Sub
Schließlich definieren Sie, was geschehen soll, wenn der Benutzer einen Suchausdruck in das Textfeld txtSuche eingegeben hat und dann die Eingabetaste betätigt. Dazu wählen Sie aus dem linken Kombinationsfeld oben im VBA-Fenster des Klassenmoduls Form_frmKunde den Eintrag objFlexSearch aus, was automatisch die leere Ereignisprozedur objFlexSearch_Suchen anlegt. Diese füllen Sie dann wie folgt:
Private Sub objFlexSearch_Suchen(strWhere As String)
Me.Filter = strWhere
Me.FilterOn = True
End Sub
Dadurch wird der Filter des Formulars auf einen Ausdruck eingestellt, der mit dem Wert des Parameters strWhere der Prozedur geliefert wird.
Wenn Sie das Kundenformular nun öffnen, können Sie die Feldnamen eingeben, die direkt entsprechend ergänzt werden. Ein Klick auf Tab vervollständigt das Suchfeld und trägt einen Doppelpunkt ein, hinter dem Sie den Vergleichswert eintragen. Mehrere Ausdrücke können Sie mit And voneinander trennen. Sie können aber auch einfach einen Wert wie andre@minhorst.com eingeben, dann werden alle Felder aller Datensätze nach diesem Wert untersucht (s. Bild 4).
Bild 4: Suchfunktion im EinsatzVorlagen verwalten
Nun benötigen wir eine Tabelle, mit der wir die Vorlagen für die E-Mails verwalten können. Diese Tabelle soll schlicht tblMailvorlagen heißen und sieht im Entwurf wie in Bild 5 aus. Das Feld Bezeichnung haben wir mit einem eindeutigen Index versehen. Die Felder Betreff, Inhalt und EMail nehmen die Vorlagen für die entsprechenden Texte auf. Hier können Sie Gebrauch von Platzhaltern machen, die später aus den Daten der Kundentabelle gefüllt werden – mehr dazu weiter unten in der Beschreibung der Nutzung des Formulars, das diese Daten anzeigt.
Bild 5: Die Tabelle tblMailvorlagenWichtig sind noch die beiden Felder TabelleAbfrage und PKFeld. TabelleAbfrage nimmt den Namen der Tabelle oder Abfrage auf, welche die Daten für den Kunden liefern soll, PKFeld den Namen des in dieser Tabelle oder Abfrage zur Identifizierung des Kunden notwendigen Primärschlüsselfeldes.
Formular zum Bearbeiten der Mailvorlagen
Die Daten dieser Tabellen wollen wir in einem separaten Formular bearbeiten. Dieses heißt frmMailvorlagen und sieht in der Entwurfsansicht wie in Bild 6 aus. Damit es die Daten der Tabelle tblMailvorlagen in alphabetischer Reihenfolge liefert, verwenden wir den folgenden SQL-Ausdruck als Datenherkunft für das Formular:
Bild 6: Das Formular frmMailvorlagen in der EntwurfsansichtSELECT tblMailvorlagen.MailvorlageID, tblMailvorlagen.Bezeichnung, tblMailvorlagen.Betreff,
tblMailvorlagen.Inhalt, tblMailvorlagen.EMail, tblMailvorlagen.TabelleAbfrage, tblMailvorlagen.PKFeld
FROM tblMailvorlagen
ORDER BY tblMailvorlagen.Bezeichnung;
Allerdings soll das Formular ja ohnehin nur die Details eines Datensatzes anzeigen, daher stellen wir die Eigenschaften Bildlaufleisten, Datensatzmarkierer und Navigationsschaltflächen auf den Wert Nein und Automatisch zentrieren auf Ja ein. Wieso dann die Datensätze nach dem Alphabet sortieren? Ganz einfach: Weil auch das Kombinationsfeld cboAuswahl seine Daten aus der Tabelle tblMailvorlagen bezieht und beide den gleichen Datensatz anzeigen sollen. Hier bietet es sich einfach an, die Mailvorlage zu liefern, deren Bezeichnung in der alphabetischen Sortierung als erste erscheint.
Das Kombinationsfeld benötigt nur die beiden Felder MailvorlageID und Bezeichnung, daher verwenden wir eine verkürzte Version der Abfrage, die wir als Datenherkunft für das Formular genutzt haben, als Datensatzherkunft:
SELECT tblMailvorlagen.MailvorlageID, tblMailvorlagen.Bezeichnung FROM tblMailvorlagen ORDER BY tblMailvorlagen.Bezeichnung;
Das Formular zeigt ja nun bereits automatisch den ersten Datensatz nach alphabetischer Reihenfolge an. Damit das Kombinationsfeld den gleichen Datensatz anzeigt, fügen wir dem Formular für das Ereignis Beim Laden die folgende Ereignisprozedur hinzu:
Private Sub Form_Load()
Me!cboAuswahl = Me!MailvorlageID
End Sub
Diese wählt den gleichen Eintrag aus, der auch im Formular angezeigt wird.
Damit nach der Auswahl eines der Einträge des Kombinationsfeldes die gewählte Mailvorlage im Formular angezeigt wird, legen Sie für das Ereignis Nach Aktualisierung des Kombinationsfeldes die folgende Ereignisprozedur an:
Private Sub cboAuswahl_AfterUpdate()
Me.Filter = "MailvorlageID = " & Me!cboAuswahl
Me.FilterOn = True
End Sub
Dies filtert das Formular nach dem im Kombinationsfeld ausgewählten Eintrag.
Damit beim Klick auf die Schaltfläche cmdNeu ein neuer, leerer Datensatz im Formular erscheint, hinterlegen wir für das Beim Klicken-Ereignis der Schaltfläche diese Prozedur:
Private Sub cmdNeu_Click()
DoCmd.GoToRecord Record:=acNewRec
End Sub
Damit erscheint ein neuer, leerer Datensatz. Dieser ist natürlich noch nicht in der Datensatzherkunft des Kombinationsfeldes enthalten.
Daher legen wir die folgende Prozedur an, die in diesem Fall den Wert des Kombinationsfeldes auf den Wert Null einstellt (im Falle eines Wechsels zu einem anderen Datensatz wird dieser auch im Kombinationsfeld angezeigt):
Private Sub Form_Current()
Me!cboAuswahl.Requery
Me!cboAuswahl = Me!MailvorlageID
End Sub
Das Aktualisieren der Datensatzherkunft des Kombinationsfeldes dient dazu, den neu angelegten Datensatz direkt nach dem Wechsel zu einem anderen Datensatz in das Kombinationsfeld aufzunehmen.
Fehlt noch die Schaltfläche zum Schließen des Formulars:
Private Sub cmdOK_Click()
DoCmd.Close acForm, Me.Name
Dies war die Leseprobe dieses Artikels.
Melden Sie sich an, um auf den vollständigen Artikel zuzugreifen.