Access-o-Mania

Access-Forum (Deutsch/German) => Formular => Thema gestartet von: Umbauwfb am Januar 22, 2022, 09:25:14

Titel: Kombination von Serienmail mit Protokollierung
Beitrag von: Umbauwfb am Januar 22, 2022, 09:25:14
Hallo,
Momentaner Stand meines kleinen Projekts:
- Serienmail läuft für sich über einen cmdButton in einem UF (1.Teil in dem nachfolgenden Code)
- Protokollierung läuft für sich über einen cmdButton in einem anderen UF (2.Teil in dem nachfolgenden Code)
Beides funktioniert


Jetzt möchte ich die beiden Dinge zusammenbringen und beim Ablauf der Serienmail automatisiert zusätzlich einen Protokollierungsdatensatz schreiben (2.Teil in dem nachfolgenden Code)

Dafür muss ich auf den Snapshot des rs aus Teil1 ,,SerienMailTeilnehmerAdressdatenCheckT" zugreifen, um den gleichen Loop durchzulaufen.

Das rs2 (geht das überhaupt???) im zweiten Teil nimmt Bezug auf die Protokollierungsdatei ,,ProtokollT" und schreibt den Datensatz dort hin.

Wie kann ich diese beiden Abläufe zusammenbringen?
Der Code sieht im Moment natürlich wild aus...und dient lediglich als erste Strukturbasis...

Über jede Hilfe freue ich mich sehr! Insbesondere über Code-Zeilen :)
Schöne Grüße aus Lüneburg

Private Sub cmdSenden_Click()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
       
    Dim objOutlook As Outlook.Application
    Dim objMailItem As Outlook.MailItem
    Dim l As Long
   
    Set objOutlook = New Outlook.Application
'   Set objMailItem = objOutlook.CreateItem(olMailItem)    !!!!!MUSS AN DEN ANFANG DES LOOPs!!!!!
   
    Set db = CurrentDb
   
    Dim AnzahlEmail As Integer
    AnzahlEmail = 0
   
   
    Dim strSQL As String
    strSQL = "DELETE * FROM SerienMailTeilnehmerAdressdatenCheckT"
    CurrentDb.Execute strSQL, dbFailOnError
   
    DoCmd.SetWarnings False
    DoCmd.OpenQuery "SerienMailTeilnehmerAdressdatenCheckQ"     'Mit diesem Query erstelle ich die nachfolgende Tabelle
    DoCmd.SetWarnings True                                      'Um dem Problem mit einer ComboBox aus dem Weg zu gehen
                                             
    Set rs = db.OpenRecordset("SerienMailTeilnehmerAdressdatenCheckT", dbOpenSnapshot)
        Do Until rs.EOF
     
            Set objMailItem = objOutlook.CreateItem(olMailItem)    '!!!!!MUSS AN DEN ANFANG DES LOOPs!!!!
            With objMailItem
                .To = rs!Email
                .Subject = Me!txtBetreff
                .Body = Me!txtInhalt
                    For l = 0 To Me!lstAnlagen.ListCount - 1
                        .Attachments.Add Me!lstAnlagen.ItemData(l)
                    Next l
'               .Display
                .Send
            End With
        rs.MoveNext
    AnzahlEmail = AnzahlEmail + 1
    Loop
   
    MsgBox " " & AnzahlEmail & " " & "Email(s) wurden versendet"
   
'    rs.Close
'    Set rs = Nothing
'    Set db = Nothing

'    Versenden der Serienmail läuft! Jetzt soll für jede versendete mail
'    (rs = db.OpenRecordset("SerienMailTeilnehmerAdressdatenCheckT", dbOpenSnapshot))
       
   '--------------------------------------------------------------------------------------------------------
    'Schreiben der Datensätze in die Protokolldatei "ProtokollT"
    'Hier müssten zusätzlich dieselben Datensätze als Loop durchlaufen werden wie oben im rs (snapshot)
    'wie kann man das kombinieren? Kann man überhaupt mit zwei Recordsets arbeiten?

   
   
   
    'Dim rs2 As DAO.Recordset ?????

    Set rs2 = db.OpenRecordset("SELECT * FROM ProtokollT WHERE False", dbOpenDynaset)
    ' Für ein schlichtes Anfügen kann das Recordset leer geladen werden, geht schneller
    With rs2
        .AddNew
        !ProtokollTypID = Me.txtProtokollTyp
        !Subject = Me.txtSubject
        !Body = Me.txtBody
        !TeilnehmerID = Me.Parent.ID
        !DateTime = Now                               ' Feldname DateTime kann kritisch sein, weil reserviertes Wort
        .Update
        .Close
    End With
   
    rs close
    rs2 close
    Set rs = Nothing
    Set rs2 = Nothing
    Set db = Nothing
   
End Sub
Titel: Re: Kombination von Serienmail mit Protokollierung
Beitrag von: DF6GL am Januar 22, 2022, 09:38:14
Hallo,

Was hindert dich daran, bei jedem Durchgang der Schleife des 1. Recordsets (rs) die Daten mit rs2 in die Protokoll-Tabelle zu schreiben ?


ZitatDoCmd.SetWarnings False
    DoCmd.OpenQuery "SerienMailTeilnehmerAdressdatenCheckQ"     'Mit diesem Query erstelle ich die nachfolgende Tabelle
    DoCmd.SetWarnings True 

Wenn es sich um eine Tabellenerstellungsabfrage handelt, wäre

Currentdb.Execute "SerienMailTeilnehmerAdressdatenCheckQ", dbFailOnError
bersser angebracht
Titel: Re: Kombination von Serienmail mit Protokollierung
Beitrag von: Maxel am Januar 22, 2022, 11:09:20
dbDailonError = > dbFailOnError
Titel: Re: Kombination von Serienmail mit Protokollierung
Beitrag von: DF6GL am Januar 22, 2022, 12:10:59
Da hat mich nur die Tsatatur nihtc  vestandn.    ;D
Titel: Re: Kombination von Serienmail mit Protokollierung
Beitrag von: Umbauwfb am Januar 22, 2022, 12:36:14
Herzlichen Dank für die Hilfe :)

Ich bin im Moment ein bisschen geplättet...der Code läuft...
Ich hätte nicht gedacht, dass ich es hinbekomme das alles so zu integrieren...aber... :)

über den Schreibfehler bin ich natürlich auch gestolpert...

Was ich nicht hinbekomme ist: Currentdb.Execute SerienMailTeilnehmerAdressdatenCheckQ, dbDailonError
Fehlermeldung: Variable nicht definiert...muss ich da noch etwas einrichten?



Private Sub cmdSenden_Click()
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim rs2 As DAO.Recordset
       
    Dim objOutlook As Outlook.Application
    Dim objMailItem As Outlook.MailItem
    Dim l As Long
   
    Dim vTeilnehmerID As Integer
    vTeilnehmerID = Forms!frmMailsMitAttachment!cbxTeilnehmerSelect.Value
   
    Set objOutlook = New Outlook.Application
'   Set objMailItem = objOutlook.CreateItem(olMailItem)    !!!!!MUSS AN DEN ANFANG DES LOOPs!!!!!
   
    Set db = CurrentDb
   
    Dim AnzahlEmail As Integer
    AnzahlEmail = 0
   
   
    Dim strSQL As String
    strSQL = "DELETE * FROM SerienMailTeilnehmerAdressdatenCheckT"
    CurrentDb.Execute strSQL, dbFailOnError
   
    DoCmd.SetWarnings False
'    CurrentDb.Execute SerienMailTeilnehmerAdressdatenCheckQ, dbFailOnError
   
    DoCmd.OpenQuery "SerienMailTeilnehmerAdressdatenCheckQ"     'Mit diesem Query erstelle ich die nachfolgende Tabelle
    DoCmd.SetWarnings True                                      'Um dem Problem mit einer ComboBox aus dem Weg zu gehen
                                                                'wird durch CurrentDb.Execute "SerienMailTeilnehmerAdressdatenCheckQ", dbFailOnError ersetzt
                                             
    Set rs = db.OpenRecordset("SerienMailTeilnehmerAdressdatenCheckT", dbOpenSnapshot)
        Do Until rs.EOF
     
            Set objMailItem = objOutlook.CreateItem(olMailItem)    '!!!!!MUSS AN DEN ANFANG DES LOOPs!!!!
            With objMailItem
                .To = rs!Email
                .Subject = Me!txtBetreff
                .Body = Me!txtInhalt
                    For l = 0 To Me!lstAnlagen.ListCount - 1
                        .Attachments.Add Me!lstAnlagen.ItemData(l)
                    Next l
'               .Display
                .Send
            End With
           
            Set rs2 = db.OpenRecordset("SELECT * FROM ProtokollT WHERE False", dbOpenDynaset)
                With rs2
                .AddNew
                !ProtokollTypID = 1
                !Subject = Me!txtBetreff
                !Body = Me!txtInhalt
                !TeilnehmerID = vTeilnehmerID
                !DateTime = Now                               ' Feldname DateTime kann kritisch sein, weil reserviertes Wort
                .Update
                .Close
            End With
           
        rs.MoveNext
        AnzahlEmail = AnzahlEmail + 1
    Loop
   
    MsgBox " " & AnzahlEmail & " " & "Email(s) wurden versendet und protokolliert"

   
   
    Set rs = Nothing
    Set rs2 = Nothing
    Set db = Nothing
   
End Sub
Titel: Re: Kombination von Serienmail mit Protokollierung
Beitrag von: PhilS am Januar 22, 2022, 14:05:31
Zitat von: Umbauwfb am Januar 22, 2022, 12:36:14Was ich nicht hinbekomme ist: Currentdb.Execute SerienMailTeilnehmerAdressdatenCheckQ, dbDailonError
Fehlermeldung: Variable nicht definiert...muss ich da noch etwas einrichten?
SerienMailTeilnehmerAdressdatenCheckQ ist der Name der Abfrage und somit Text. Text-Literale müssen im VBA-Code in Anführungszeichen gesetzt werden.