Mailfunktion MS Access
lima-city → Forum → Programmiersprachen → Basic
abfrage
adresse
bauen
benutzer
code
datenbank
datum
email
fehler
fehlermeldung
feld
formular
import
methode
not
null
problem
projekt
set
tabelle
-
Hi,
Ich versuche gerade eine Funktion zu bauen, die die Daten eines Formulars aus Microsoft Access an eine Email Anhängt und an die E-mail-Adresse der Person schickt, die auf dem Formular genannt wird.
Die Funktion möchte ich über einen Button aufrufen. Bisher sind zwei Probleme vorhanden:
1. Ich bekomme die Fehlermeldung 13 (Typen unverträglich) wenn ich versuche, automatisch die richtige Mail-Adresse einzulesen.
2. Wenn ich die Mail-Adresse fest einstelle, dann wird zwar eine Email gesendet, allerdings enthält sie ALLE Daten und nicht nur die Zugehörigen.
In der Tabelle "E-Mail" sind mehrere Spalten, u. a. mit der Projektnr, die dafür sogen soll, dass die zugehörige Email-Adresse genommen wird, und natürlich die Email-Adressen selbst.
Das Formular "Projekt anzeigen" zeigt Details eines Projekts, diese sollen an die betreffende Person gesendet werden. Auf diesem Formular befindet sich auch der Button.
Der Code:
Private Sub btnSendMail_Click() Dim comment As String Dim DB As DAO.Database Dim rs As DAO.Recordset Dim strMail As String Set DB = Application.CurrentDb Set rs = DB.OpenRecordset("SELECT [E-Mail].[Mail] FROM [E-Mail] " And " WHERE [E-Mail].[Projektnr]=" And Me!Projektnr) If rs.RecordCount > 0 Then rs.MoveFirst Do While Not rs.EOF If Not IsNull(rs("Mail")) Then strMail = strMail & rs("Mail") & "; " End If rs.MoveNext Loop End If If Len(strMail) < 2 Then MsgBox "Keine Mailadressen in Abfrage" Else strMail = Left(strMail, Len(strMail) - 2) End If 'MsgBox strMail Set DB = Nothing Set rs = Nothing comment = InputBox("Kommentar eingeben") DoCmd.SendObject acSendForm, "Projekt anzeigen", , strMail, , , "Projektbericht", comment, False End Sub
Vielleicht kann ja jemand helfen, ich lese mich erst gerade in VB(A) ein.
mfg
hk1992 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo hk1992,
hier habe ich ein bisschen Code, den ich verwendet habe um mit Access Mails zu versenden:
Ich habe ihn an Deine Situation angepasst. Um Ihn zu verwenden musst Du aber die Microsoft Outlook Object Library als Verweis hinzufügen (Extras->Verweise im Code-Editor). Falls Projektnr keine Zahl ist, dann musst Du noch Hochkommas einfügen.Dim oApp As Outlook.Application Dim mail As Outlook.MailItem Dim dbs as DAO.Database Dim rst As DAO.Recordset Set oApp = New Outlook.Application Set mail = oApp.CreateItem(olMailItem) Set dbs = CurrentDb Set rst = dbs.OpenRecordset("SELECT DISTINCT [E-Mail].[Mail] " & _ "FROM [E-Mail] " & _ "WHERE [E-Mail].[Projektnr]=" & Me!Projektnr & " AND [E-Mail].[Mail] IS NOT NULL ;") If rst.RecordCount <> 0 Then While Not rst.EOF mail.Recipients.Add rst!Mail rst.MoveNext Wend Else MsgBox "Keine Mailadressen in Abfrage" rst.Close Set rst = Nothing Set mail = Nothing Set oApp = Nothing Exit Sub End If rst.Close Set rst = Nothing mail.Subject = "Projektbericht" mail.Body = InputBox("Kommentar eingeben") mail.Send Set mail = Nothing Set oApp = Nothing
Den E-Mail-Text kannst Du beliebig gestallten. Einfach alles nach mail.Body schreiben.
Und noch ein kleiner Tipp:
Es ist besser, wenn Du bei Tabellen und Feldnamen nur Kleinbuchstaben [a-z] und unterstriche verwendest. Erstens ist es ziemlich lästig ständig eckige Klammern schreiben zu müssen und zweitens kann das in Access erfahrungsgemäß auch manchmal zu Problemen führen.
Z.B. Tabellenname 'project_emails' mit Feldern 'project_nr' und 'email'. Dann lässt sich obige Abfrage folgendermaßen schreiben:
Gleich viel angenehmerSELECT DISTINCT email FROM project_emails WHERE project_nr = " & Me!Projektnr & " AND email IS NOT NULL ;
Beitrag zuletzt geändert: 9.8.2011 23:55:09 von darkpandemic -
Erstmal vielen Dank!
Habe deinen Code getestet, er scheint zu funktionieren,aber nicht ganz mit meiner Datenbank und meinem Outlook klarzukommen.
Das Outlook installiert sein muss ist erstmal kein Problem.
Wenn ich nun die Projektnr mit Hochkommas versehe (Ja, die Projektnr kann Buchstaben enthalten, ist nicht auf meinem Mist gewachsen), dann bekomme ich eine Meldung, dass keine Projektnr gefunden würde. Also habe ich erstmal diesen Teil unter WHERE rausgenommen. Hier bräuchte ich eine Methode, um die richtige Adresse zu benutzen, denn in der Datenbank befinden sich logischerweise mehrere, für jede Projektnr eine andere. Darauf hin scheint Access die Email zu versenden, aber es kommt eine Fehlermeldung 81, dass keine Verbindung zum LDAP möglich wäre. Aber wozu wird hier das LDAP gebraucht? Die Email-Adresse ist ja schon vorhanden und muss nicht erst im Adressbuch gesucht werden.
Wenn ich ohne Access im Outlook Adressbuch rumklicke funktioniert übrigens alles.
Das mit den doofen Spalten- und Tabellennamen ist mir bewusst und kommt dadurch zustande, dass die Daten aus einer Exel-Tabelle importiert und aufbereitet werden.
Und eine letzte Frage wäre, ob nun auch die Formulardaten mitgeschickt werden, die gerade angesehen werden. Dies konnte ich durch einen Test nicht feststellen wegen og. Problemen. -
Hallo hk1992,
wegen der Hochkommata kannst Du ja mal folgendes probieren:
Den LDAP-Fehler hatte ich noch nie. Wenn der Fehler aber keine Auswirkungen hat, dann kannst Du ihn ignorieren indem DuSet rst = dbs.OpenRecordset("SELECT DISTINCT [E-Mail].[Mail] " & _ "FROM [E-Mail] " & _ "WHERE [E-Mail].[Projektnr] LIKE '" & Me!Projektnr & "' AND [E-Mail].[Mail] IS NOT NULL ;")
vor die verantwortliche Anweisung schreibst. Danach dannOn Error Resume Next
um die Fehler wieder unbehandelt zu lassen.On Error Goto 0
Die Formulardaten werden nicht mitgesendet. Wenn Du sie mitsenden willst, dann musst Du sie selber nach mail.Body schreiben. Ist erstmal mehr Arbeit dafür kann man aber schönere Ausgaben (Anrede, Gruß, Signatur, ...) bauen.
Im übrigen sind die Tabellen- und Spaltenname in der Datenbank unabhängig von den Überschriften in einer Excel-Tabelle. Normalerweise reicht es bei einem Import per Assistent, wenn die Spaltenreihenfolge gleich ist.
Evtl. kann ich heute Abend noch ein Import-Skript rauskramen und posten, wenn es hilft. -
Ah Danke! Die Änderung bei WHERE hat auch den Fehler beseitigt. Es scheint alles soweit zu funktionieren. Interessant wäre für mich jetzt noch, wie ich die angezeigten Daten mitsenden kann, die auch mit der Projektnr zusammenhängen.
Ein Import-Script brauche ich nicht, da habe ich schon selbst eins gebastelt. Man könte theoretisch die Spaltennamen ändern, aber das wäre ein (mir zu) großer Aufwand. Einfacher ist es so, auch wenn ein paar eckige Klammern gebraucht werden, bin ich zufrieden, solange es natürlich nicht zu Problemen kommt.
Kann ich über Mail.Attachments.Add das aktuelle Formular auswählen, oder nur Daten von der Festplatte? Wenn ersteres, wie?
Gruß
hk1992
Beitrag zuletzt geändert: 10.8.2011 10:13:00 von hk1992 -
Hallo hk1992,
mit Mail.Attachments.Add kannst Du Dateien als Anhang hinzufügen. Wenn Du das Recordset des Formulares als Excel-Mappe exportierst, dann könntest Du es anschließend mitsenden. Ansonsten musst Du die Werte selber in den Mail-Text einfügen.
Wenn das Formular nur auf einem Datensatz basiert, dann kannst Du dass z.B. folgendermaßen machen:
Vorausgesetzt, dass das Formular die Textfelder 'ProjektNr' und 'ProjektStatus' enthält. Das musst Du halt an Deine Situation anpassen.mail.Body = "Sehr geehrte Damen und Herren," & vbCrLf & vbCrLf mail.Body = mail.Body & "die ist ein Projektberich für Projekt " & ProjektNr.Value & "." & vbCrLf mail.Body = mail.Body & "Status: " & ProjektStatus.Value & vbCrLf mail.Body = mail.Body & "Bemerkung:" & vbCrLf mail.Body = mail.Body & InputBox("Kommentar eingeben")
Falls das Formular auf mehreren Datensätzen basiert, dann kannst Du mit einer While-Schleife darüber iterieren:
Dim rst As DAO.Recordset Set rst = Me.RecordsetClone If rst.RecordCount <> 0 Then rst.MoveFirst While Not rst.EOF mail.Body = mail.Body & "Feld 1: " & rst!Feld1 mail.Body = mail.Body & ", Feld 2: " & rst!Feld2 mail.Body = mail.Body & ", Feld 3: " & rst!Feld3 & vbCrLf rst.MoveNext Wend End If
-
Habe die erste Methode jetzt eingebaut, klappt super. Finde ich sogar schöner als eine Exel Tabelle im Anhang.
Eventuell kann es sein, dass ich noch Daten aus anderen Formularen mitschicken möchte, da muss ich mal schauen, oder gibt's da auch ne einfache Lösung?
Du hast mir wirklich sehr geholfen, Danke!
Gruß,
hk1992 -
Hallo hk1992,
eine schnelle Möglichkeit auf die Daten eines anderen Formulares zuzugreifen ist folgende:
Dabei ist 'frmTest' der Name des Formulares und 'txtFoobar' der Name eines Textfeldes innerhalb dieses Formulares. Diese Methode ist zwar einfach hat aber einige Nachteile:Forms("frmTest").txtFoobar.Value
Daher empfehle ich die anderen Daten per Abfrage direkt aus der Datenbank zu holen. Ist zwar wieder mal mehr Arbeit aber evtl. kann man alle Daten auch mit einer Abfrage abgeifen und dann geht das auch relativ schnell.- Wenn das Formular frmTest nicht geöffnet ist, dann gibt das einen Fehler. - Wenn die Werte in frmTest geändert wurden nachdem das auslesende Formular geöffnet wurde, dann können die Daten evtl. nicht mehr zusammen passen. Z.B frmTest enthält eine Liste von Projektnummern. Der Benutzer wählt eine aus und öffnet damit das zweite Formular. Dann wechselt der Benutzer zum ersten und markiert eine andere Projektnummer, wechselt zurück und sendet die E-Mail. Schon hat man ein durcheinander.
PS: Auflistungen im Forum wären schon praktisch. Leider wird das immer wieder abgelehnt.
Beitrag zuletzt geändert: 10.8.2011 20:29:49 von darkpandemic -
Dann beschreib doch mal genauer was du vor hast! Es wird dir hier keiner ein seitenlangens Tutorial schreiben, was dir alles Stück für Stück beschreibt. Etwas Eigeninitiative ist auch gefragt. In welchem Kontext möchtest du mit MS Access Emails schreiben, wo verstehst du etwas nicht? Was funktioniert nicht? Fehlermeldungen?
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage