kostenloser Webspace werbefrei: lima-city


Mailfunktion MS Access

lima-cityForumProgrammiersprachenBasic

  1. Autor dieses Themas

    hk1992

    Moderator Kostenloser Webspace von hk1992

    hk1992 hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hallo hk1992,

    hier habe ich ein bisschen Code, den ich verwendet habe um mit Access Mails zu versenden:
    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
    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.
    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:
    SELECT DISTINCT email 
        FROM project_emails 
        WHERE project_nr = " & Me!Projektnr & " AND email IS NOT NULL ;
    Gleich viel angenehmer ;-)



    Beitrag zuletzt geändert: 9.8.2011 23:55:09 von darkpandemic
  4. Autor dieses Themas

    hk1992

    Moderator Kostenloser Webspace von hk1992

    hk1992 hat kostenlosen Webspace.

    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.
  5. Hallo hk1992,

    wegen der Hochkommata kannst Du ja mal folgendes probieren:
    Set 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 ;")
    Den LDAP-Fehler hatte ich noch nie. Wenn der Fehler aber keine Auswirkungen hat, dann kannst Du ihn ignorieren indem Du
    On Error Resume Next
    vor die verantwortliche Anweisung schreibst. Danach dann
    On Error Goto 0
    um die Fehler wieder unbehandelt zu lassen.
    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.
  6. Autor dieses Themas

    hk1992

    Moderator Kostenloser Webspace von hk1992

    hk1992 hat kostenlosen Webspace.

    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
  7. 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:
    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")
    Vorausgesetzt, dass das Formular die Textfelder 'ProjektNr' und 'ProjektStatus' enthält. Das musst Du halt an Deine Situation anpassen.
    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
  8. Autor dieses Themas

    hk1992

    Moderator Kostenloser Webspace von hk1992

    hk1992 hat kostenlosen Webspace.

    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
  9. Hallo hk1992,

    eine schnelle Möglichkeit auf die Daten eines anderen Formulares zuzugreifen ist folgende:
    Forms("frmTest").txtFoobar.Value
    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:

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

    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
  10. Autor dieses Themas

    hk1992

    Moderator Kostenloser Webspace von hk1992

    hk1992 hat kostenlosen Webspace.

    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?
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!