Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Aus Outlook Protokollierung Datensatz nach Access

Begonnen von Umbauwfb, Februar 12, 2022, 12:44:11

⏪ vorheriges - nächstes ⏩

Umbauwfb

Hallo,
ich arbeite momentan an folgender Situation:

1. Aus Access wurde eine Email verschickt mit einer bestimmten Kennung "(TeilnehmerID/AdressdatenID)" im Betreff (Subject)

2. Wenn auf diese Email geantwortet wird, soll Outlook beim Eingang automatisch einen Protokolldatensatz in meine Protokoll-Tabelle in Access schreiben (ProtokollT) (nähere Beschreibung im Code)

3. Dafür werden 2 Codes in Outlook geschrieben. Der erste Code initialisiert das Ganze und läuft schon

4. Beim 2. Code komme ich an der Stelle, an der ich meine Access-Datenbank ansprechen muss, um rs2 zu laden, nicht weiter...wie codiere ich das an der Stelle set dB....

Kann da mal jemand draufschauen?
Vielen Dank
Harry

Private WithEvents olItems As Outlook.Items

'Vorab in Outlook Macro-Benutzung in Outlook Trustcenter aktivieren
'wird im Video ID1337 direkt am Anfang erklärt
'Verweis auf Access legen...im Video ab 14:00...(statt Excel > Access)

Private Sub Application_Startup()

'Variablen dimensionieren
Dim olApp As Outlook.Application
Dim olNS As Outlook.NameSpace

Dim dB As DAO.Database
Dim rs2 As DAO.Recordset

'Variablen initialisieren
Set olApp = Outlook.Application
Set olNS = olApp.GetNamespace("MAPI")
Set olItems = olNS.GetDefaultFolder(olFolderInbox).Items

'Test
Debug.Print "Application_Startup wird ausgeführt"


End Sub

Private Sub olItems_ItemAdd(ByVal item As Object)

'Variablen dimensionieren
Dim olMail As Outlook.MailItem
Dim olAtt As Outlook.Attachment
Dim Dateipfad As String

Dim dB As DAO.Database
Dim rs As DAO.Recordset
Dim rs2 As DAO.Recordset

Dim vAdressdatenID As Integer       'wird momentan noch nicht genutzt
Dim vTeilnehmerID As Integer        'wird momentan noch nicht genutzt
Dim vKey As String                  'wird aus Subject ausgelesen (wie???) Schlüssel: "(" & "*" & "/" & "*" & ")")
                                    'im fixen Testbeispiel "(900/402)"
                                    'später variabel "(vTeilnehmerID/vAdressdatenID)"


set dB = !!!! hier muss ich meine Access-Datenbank ansprechen !!!!


            '"D:\Workbooks\Workbook Bewerbung Datenbank\Bewerbungen\Unternehmen.accdb"
            'Tabelle ProtokollT
            'und rs2 laden
            'rs2 wie nachfolgend füllen
            'rs2 am Ende abspeichern
   

            'Prüfen, ob Item eine Mail ist
If TypeName(item) = "MailItem" Then

    Set olMail = item
   
            'Prüfen, ob Mail verwendet werden soll
            '    If InStr(olMail.Subject, "Test") <> 0 And _
            '    olMail.SenderEmailAddress = "kaiweissmann@outlook.de" Then
               
            '    If InStr(olMail.Subject, "(" & "*" & "/" & "*" & ")") <> 0 Then
    'If InStr(olMail.Subject, "(900/402)") <> 0 Then
   
                Set rs2 = dB.OpenRecordset("SELECT * FROM ProtokollT WHERE False", dbOpenDynaset)
                                'rs2 füllt die Protokolldatei. Ein leerer Datensatz wird geladen
                           
                            With rs2
                                .AddNew
                                !ProtokollTypID = 1
                                !AdressdatenID = 402        'später vAdressdatenID
                                !To = olMail.Subject
                                !Subject = olMail.Subject
                                !Body = olMail.Body
                                !TeilnehmerID = 900         'später vTeilnehmerID
                                !DateTime = Now             ' Feldname DateTime kann kritisch sein, weil reserviertes Wort
                               
                                .Update
                                .Close
                            End With
                 MsgBox "Datensatz wurde protokolliert"
                         
       
    'End If
       
                            'Test
                            Debug.Print olMail.Subject
                            Debug.Print olMail.SenderEmailAddress
                            Debug.Print olMail.Attachments.Count

End If



'    Aufräumen
   
    Set rs2 = Nothing
    Set dB = Nothing

End Sub



PhilS

Zitat von: Umbauwfb am Februar 12, 2022, 12:44:114. Beim 2. Code komme ich an der Stelle, an der ich meine Access-Datenbank ansprechen muss, um rs2 zu laden, nicht weiter...wie codiere ich das an der Stelle set dB....
Soweit ich in deinem Code sehe, brauchst du keinen Verweis auf Access, sondern nur auf auf die "Microsoft Office xx.x Access database engine Object library".
Eine Database-Instanz bekommst du dann mit: Set db = DBEngine.OpenDatabase("c:\pfad\zur\db.accdb")
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Umbauwfb

Ich bin mit dem Code einen Schritt weitergekommen.
Bleibe aber an einer Fehlermeldung hängen "Nicht erkennbares Datenbankformat"...siehe Code und Anhang...

Kennt sich da jemand aus?
Vielen Dank
Harry


Private Sub olItems_ItemAdd(ByVal item As Object)

'Variablen dimensionieren
Dim olMail As Outlook.MailItem
Dim olAtt As Outlook.Attachment



Dim wrkAcc As Workspace
Dim dB As DAO.Database
Dim rs2 As DAO.Recordset

Set wrkAcc = CreateWorkspace("", "admin", "", dbUseJet)
Set dB = wrkAcc.OpenDatabase("D:\Workbooks\Workbook Bewerbung Datenbank\Bewerbungen\Unternehmen.accdb", , False)
            'Hier Fehlermeldung: Nicht erkennbares Datenbankformat...(siehe Anhang)

       

MsgBox "dB geöffnet"

'Prüfen, ob Item eine Mail ist
If TypeName(item) = "MailItem" Then
    Set olMail = item
   
    'Prüfen, ob Mail verwendet werden soll
            '    If InStr(olMail.Subject, "Test") <> 0 And _
            '    olMail.SenderEmailAddress = "kaiweissmann@outlook.de" Then
               
            '    If InStr(olMail.Subject, "(" & "*" & "/" & "*" & ")") <> 0 Then
    'If InStr(olMail.Subject, "(900/402)") <> 0 Then
   
        Set rs2 = dB.OpenRecordset("SELECT * FROM ProtokollT WHERE False", dbOpenDynaset)
                                            'rs2 füllt die Protokolldatei. Ein leerer Datensatz wird geladen
                           
                            With rs2
                                .AddNew
                                !ProtokollTypID = 1
                                !AdressdatenID = 403
                                !To = olMail.Subject
                                !From = olMail.From
                                !Subject = olMail.Subject
                                !Body = olMail.Body
                                !TeilnehmerID = 900
                                !DateTime = Now                 ' Feldname DateTime kann kritisch sein, weil reserviertes Wort
                               
                                .Update
                                .Close
                            End With
    MsgBox "Datensatz wurde protokolliert"
                         
       
    'End If
       
                            'Test
                            Debug.Print olMail.Subject
                            Debug.Print olMail.SenderEmailAddress
                            Debug.Print olMail.Attachments.Count

End If



'    Aufräumen
   
    Set rs2 = Nothing
    Set dB = Nothing

End Sub

PhilS

Zitat von: Umbauwfb am Februar 12, 2022, 18:03:35Bleibe aber an einer Fehlermeldung hängen "Nicht erkennbares Datenbankformat"...siehe Code und Anhang...

Kennt sich da jemand aus?
Tja, ich frage mich jetzt erstmal, ob du nur die 2. Hälfte meines vorigen Kommentars ignoriert hast, oder gleich alles davon.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Umbauwfb

Hallo PhilS,

das hatte sich leider überschnitten...und ich habe mich die ganze Zeit noch mit anderen peripheren Unklarheiten rumgeschlagen...tut mir leid, dass ich mich erst jetzt zurückmelde...

Ich habe den Code gestern Abend noch umgebaut...der Protokollsatz wird jetzt komplett geschrieben!
(Die auskommentierten Stellen (Variabler Aufbau) muss ich als nächstes erledigen...)

Vielen Dank für die Hilfe!
-----------------------------------------------------------
Leider ist es aber so, dass die Zeilensprünge im Text auf der Access-Seite nicht durchgeführt werden...
In der Email und im Direktfenster ist alles ok!

Wie kann ich die Formatierung im Access-Feld (Langer Text) so einstellen, dass die Zeilensprünge übernommen werden???

Vielen Dank für jede Hilfestellung!
Harry

Private Sub olItems_ItemAdd(ByVal item As Object)

'Variablen dimensionieren
Dim olMail As Outlook.MailItem
Dim olAtt As Outlook.Attachment

Dim dB As DAO.Database
Dim rs2 As DAO.Recordset
Set dB = DBEngine.OpenDatabase("D:\Workbooks\Workbook Bewerbung Datenbank\Bewerbungen\Unternehmen.accdb")

'Prüfen, ob Item eine Mail ist
If TypeName(item) = "MailItem" Then
    Set olMail = item
   
    'Prüfen, ob Mail verwendet werden soll
            '    If InStr(olMail.Subject, "Test") <> 0 And _
            '    olMail.SenderEmailAddress = "kaiweissmann@outlook.de" Then
               
            '    If InStr(olMail.Subject, "(" & "*" & "/" & "*" & ")") <> 0 Then
    'If InStr(olMail.Subject, "(900/402)") <> 0 Then
   
        Set rs2 = dB.OpenRecordset("SELECT * FROM ProtokollT WHERE False", dbOpenDynaset)
                                            'rs2 füllt die Protokolldatei. Ein leerer Datensatz wird geladen
                            With rs2
                                .AddNew
                                !Body = olMail.Body
                                    Debug.Print olMail.Body
                                !ProtokollTypID = 1
                                !AdressdatenID = 403
                                !To = olMail.To
                                !From = olMail.Sender
                                !Subject = olMail.Subject
                                !TeilnehmerID = 5
                                !DatumZeit = Now
                               
                                .Update
                                .Close
                            End With
    'End If
End If

'    Aufräumen
    Set rs2 = Nothing
    Set dB = Nothing

End Sub


PhilS

Zitat von: Umbauwfb am Februar 13, 2022, 10:27:59Leider ist es aber so, dass die Zeilensprünge im Text auf der Access-Seite nicht durchgeführt werden...
In der Email und im Direktfenster ist alles ok!
Wahrscheinlich sind die Zeilenumbrüche in der Email nur CR oder nur LF, während eine Access Textbox nur die Windows-üblichen Zeilenumbrüche mit CRLF darstellen kann.

Kreatives Suchen&Ersetzen wäre wohl eine Möglichkeit das Problem zu lösen.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Umbauwfb

Hallo PhilS,

ich komme jetzt endlich wieder dazu, das Thema weiter zu bearbeiten...

In einer Testumgebung lasse ich über eine Schaltfläche den nachfolgenden Code (die auskommentierten Stellen sind weitere Ansätze)laufen und erhalte die im Anhang gezeigte Fehlermeldung.

Was fehlt hier...hast Du eine Idee?

Grüße aus Lüneburg
Harry

Private Sub cmdZeilensprung_Click()

Dim str As String
str = Me.Body
        'Dim BodyText As String
        'Bodytext =

str = Replace(str, Chr(10), Chr(13) & Chr(10))
        'str = Replace(Me.Body.value, vbLf, vbCrLf)
CurrentDb.Execute str, dbFailOnError



        'vbLf ist Chr(10) und bedeutet, daß der Cursor eine Zeile tiefer springt (Schreibmaschine: Walze drehen)
        'vbCr ist Chr(13) bedeutet, daß der Cursor an den Anfang springt (Schreibmaschine: Walze zurückziehen)
        'In DOS ist ein Zeilenumbruch immer VBCrLf oder Chr(13)&Chr(10), in Dateien sowieso, aber z.B. auch bei den Textboxen in VB.
        'In einer Excel- Zelle ist ein Zeilenumbruch dagegen nur VBLf, die 2. Zeile beginnt dann auch ohne vbCr an der 1. Stelle.
        'Mit vbCrLf gehts dann eine Zelle tiefer.
       
       
         
        'sInhalt = Replace(Me.Body, vbLf, vbCrLf)
        'sInhalt = Replace(sInhalt, vbCrLf, vbLf)
        'ArrayData = Split(sInhalt, vbLf)
End Sub

PhilS

Zitat von: Umbauwfb am Februar 17, 2022, 14:03:50In einer Testumgebung lasse ich über eine Schaltfläche den nachfolgenden Code (die auskommentierten Stellen sind weitere Ansätze)laufen und erhalte die im Anhang gezeigte Fehlermeldung.

Was fehlt hier...hast Du eine Idee?
Ein gültiges SQL Statement! ;-)

Im Moment schickst du einfach nur den kompletten Email-Text an die Datenbank. - Die interessiert sich aber nicht so für deine Email-Korrespondenz, sondern hätte lieber ein SQL Statement, das ihr eine klare Handlungsanweisung gibt.

Entweder verpackst du den Text in ein gültiges SQL-Insert-Statement, oder du öffnest ein Recordset, fügst einen neuen Datensatz an und schreibst den Email-Text in die entsprechende Spalte. - Hier würde ich eher die zweite Variante empfehlen.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Umbauwfb

Hallo PhilS,

vielen Dank für den Hinweis...ich werde versuchen, das einzubauen...

Nur zwischendurch: Ich bekomme keine Email, wenn Du kommentierst...
Bei allen anderen Antworten/Kommentaren werde ich immer per Email benachrichtigt...
Deswegen entgeht mir auch manchmal, dass Du kommentiert hast...

Woran kann das liegen?

Harry

Umbauwfb

Mir fehlt einfach die richtige Technik...

Set rs2 = dB.OpenRecordset("SELECT * FROM ProtokollT WHERE False", dbOpenDynaset)
                                            'rs2 füllt die Protokolldatei.
                                            'Ein leerer Datensatz wird geladen
                            With rs2
                                .AddNew
                               
'                                !Body = olMail.Body
                                !Body = INSERT olMail.Body   ....wie kann ich den Text hier richtig einfügen?? Mit welchem Code???
                               
                                !ProtokollTypID = 1
                                !AdressdatenID = Zahlen3
                                !To = olMail.To!Body = olMail.Body
                                !From = olMail.Sender!Body = olMail.Body
                                !Subject = olMail.Subject
                                !TeilnehmerID = Zahlen1
                                !DatumZeit = Now
                               
                                .Update
                                .Close
                            End With

ebs17

olMail.BodyHier müsste man analysieren, womit man genau arbeitet.

Es gibt Body für Plaintext und HTMLBody für HTML-Darstellungen. Diese muss man dann sicher gezielt und unterschiedlich auswerten. HTML-Codierung in Plaintext übernommen ist dann eine besondere Herausforderung, die über andere Zeilenumbrüche weit hinausgeht (Code-Tags usw.).
Mit freundlichem Glück Auf!

Eberhard

Umbauwfb

Hallo Eberhard,

ich bräuchte - um weiter zu kommen - einfach nur diese eine Zeile Code, die statt dem

!Body = olMail.Body

den olMail.Body EINFÜGT...INSERT...oder etwas ähnliches...wie PhilS vorgeschlagen hat. In der Hoffnung, dass dann die Zeilensprünge richtig enthalten sind:

!Body = "INSERT olMail.Body....   wie kann ich den olMail.Body (den Email-Text) hier richtig einfügen?? Mit welchem Code???

Kannst Du mir diese Zeile bitte mal schreiben?
Unabhängig von Plain-Text oder HTML...

Danke
Harry







Set rs2 = dB.OpenRecordset("SELECT * FROM ProtokollT WHERE False", dbOpenDynaset)
                                            'rs2 füllt die Protokolldatei.
                                            'Ein leerer Datensatz wird geladen
                            With rs2
                                .AddNew
                               
'                                !Body = olMail.Body
                                !Body = INSERT olMail.Body   ....wie kann ich den Text hier richtig einfügen?? Mit welchem Code???
                               
                                !ProtokollTypID = 1
                                !AdressdatenID = Zahlen3
                                !To = olMail.To!Body = olMail.Body
                                !From = olMail.Sender!Body = olMail.Body
                                !Subject = olMail.Subject
                                !TeilnehmerID = Zahlen1
                                !DatumZeit = Now
                               
                                .Update
                                .Close
                            End With

ebs17

#12
Zitatden olMail.Body EINFÜGT...INSERT...oder etwas ähnliches...wie PhilS vorgeschlagen hat
SO hat das Phil nicht vorgeschlagen. In dem zugehörigen Beitrag gab es kein Recordset, sondern schon Verwendung einer Abfrage. Wenn die dann funktionieren soll, dann schon eine RICHTIGE Abfrage, so etwa war die Aussage.

Um EINEN Datensatz in einer Tabelle anzufügen, ist eine Mischung aus SQL-Anweisung und Recordset-AddNew sehr  verwirrt und unstrukturiert. Entweder das eine oder das andere, bleibt sich funktionell und performancetechnisch gleich. Mit der Recordsetvariante hat man aber weniger Gelegenheit, Fehler einzubauen, deren Beseitigung regelmäßig zeit- und nervenraubend ausfallen kann.

!Body = olMail.Body... ist schon richtig. Tabellenfeld bekommt Inhalt zugewiesen, also Textfeld bekommt Text.
Ob man nachfolgend mit DIESEM Text etwas anfangen kann, ist eine andere Frage (wobei mich diese Frage schon vor einem Einfügen sehr bewegen würde - wegen zielführender Arbeit statt Spielen und so).

Pauschale Bemerkung:
ZitatProtokolldatensatz
Wenn ich eine Mail zum Beantworten schicke, weiß ich, was ich geschrieben habe. Für eine Protokollierung einer Antwort brauche ich dann nur den Fakt der Beantwortung an sich (Wer, Zeitpunkt) sowie Fakten aus der Antwort selber, diese aber aufbereitet für meine DB-Tabelle(n), Stichwort atomare Informationen für eine Auswertung wie auch immer.

Wenn man sich nur den Kram ansehen will wie er kommt, kann man sich die Mail einfach als MSG-Datei auf die Festplatte speichern und in seinem Protokolldatensatz den Pfad dazu abspeichern.
Oder aber man speichert die Entry-ID der Mail ab, um sie unmittelbar im Outlook-Ordner wiederfinden zu können. Da darf es aber keine nachträglichen Verschiebungen geben. Man würde vielleicht per Outlook-Regel direkt mit Eingang solche Mails in einen speziellen Ordner des Posteingangs verschieben und hätte damit eine zielführende Vorselektion.

Also auch hier: Erst einmal über Abläufe nachdenken, ehe man Umsetzungen in Code vornimmt => Sinnieren vor dem Aktionieren.
Mit freundlichem Glück Auf!

Eberhard

Umbauwfb

Vielen Dank für die Antwort,

das ganze Konstrukt ist SEHR durchdacht...der Anwender soll in Access alle nötigen Informationen in einer Protokolldatei (natürlich in einem vorselektiert/zugeordnetem Formular) finden, ohne sich mühsam in Outlook alles zusammensammeln zu müssen.

Ablauf:
1. Email wird in Access zusammengestellt und verschickt
2. Antwortmail wird in Outlook per Code abgefangen und ein Datensatz in der Access-Protokoll-Datei wird erzeugt
3. Als Ergebnis hat der User in Access einen Top-Überblick
4. In diese Protokolldatei fließen nicht nur Emails ein, sondern auch händisch geschriebene Protokolle zu anderen Vorgängen (Telefonat, Gespräch etc)
5. Alles ist chronologisch geführt und selektierbar

Der ganze Vorgang läuft auch schon top!
Lediglich der Zeilensprung funktioniert nicht...das bekomme ich aber auch noch hin!

Gruß
Harry


PhilS

Zitat von: Umbauwfb am Februar 21, 2022, 11:35:06Lediglich der Zeilensprung funktioniert nicht...das bekomme ich aber auch noch hin!
Das hatten wir ja zu Beginn des Threads schon diskutiert. - Problem verstanden?
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor