Neuigkeiten:

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

Mobiles Hauptmenü

Den richtigen Datensatz in Outlook finden

Begonnen von Andreas Irmer, Dezember 24, 2022, 21:19:30

⏪ vorheriges - nächstes ⏩

Andreas Irmer

Hallo und frohe Weihnachten,

ich suche hier eine Möglichkeit den richtigen Datensatz in Outlook zu finden. Es geht mir um Termine, die bereits in einem Kalender existieren. Ich kann auf den Kalender zugreifen und ich kann Termine in den Kalnder schreiben. Wenn ich die Termine schreibe, speichere ich im Datensatz OL_TerminID die EntryID des Termins.

Seit Tagen lese ich Microsoft learn, Foren usw. aber komme nicht auf den richtigen Dreh.

Wie kann ich mit Outlook.Appointment die EntryID auslesen? Bzw. wie kann ich über Outlook.Appointment auf den richtigen Datensatz zugreifen?

Benötige ich dazu ein Schleife? Oder geht das direkt?

Vielen Dank für Eure Hinweise.
Andreas Irmer
für jede Hilfe dankbar und für Tipps zum Thema Wohnmobil, Wohnwagen auch für jeden erreichbar

ebs17

#1
Es gibt Methoden GetFolderFromID (für Ordner) und GetItemFromID (für Ordner-Elemente) für eine relativ schnelle Suche  von bestimmten Elementen.

 Bei Verwendung der EntryID muss man aber beachten, dass diese automatisch erzeugt wird und sich bei Verschieben des Elements ändert.

Auslesen: EntryID ist eine Eigenschaft.
Debug.Print oFolder.EntryID
Debug.Print oItem.EntryID

Als Hilfe solltest Du auf den Objektkatalog (Öffnen mit F2 aus dem VBA-Editor heraus) zurückgreifen, entweder direkt in Outlook oder in Access mit gesetztem Verweis auf Outlook.
Outlook-VBA-Foren sind etwas dünn gesät. Hier solltest Du also englischsprachige Foren unbedingt in eine Recherche einbeziehen.
Mit freundlichem Glück Auf!

Eberhard

PhilS

Zitat von: ebs17 am Dezember 25, 2022, 14:14:20Bei Verwendung der EntryID muss man aber beachten, dass diese automatisch erzeugt wird und sich bei Verschieben des Elements ändert.
Wichtige Ergänzung: Die EntryId ändert sich nur beim Verschieben eines Elementes in einen anderen Store. Der Store ist die PST-Datei oder das Exchange-Postfach, in dem sich das Item befindet. Das ist also in den meisten Szenarien ein eher ungewöhnlicher Sonderfall.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

markusxy

Zitat von: PhilS am Dezember 26, 2022, 13:25:40Die EntryId ändert sich nur beim Verschieben eines Elementes in einen anderen Store.

pst und ost Datendateien haben in dem Punkt kein einheitliches Verhalten.









PhilS

Zitat von: markusxy am Dezember 26, 2022, 20:27:16pst und ost Datendateien haben in dem Punkt kein einheitliches Verhalten.

Meine Aussage spiegelt die Dokumentation der EntryId wieder: "The Entry ID changes when an item is moved into another store, [...]"
Ich meine mich zu erinnern, dass ich auch schon beobachtet habe, dass das nicht immer stimmt. Vielleicht wäre es besser, die Aussage umzukehren zu: Solange ein Item nicht in einen anderen Store verschoben wird, bleibt die EntryId unverändert.

OST-Dateien muss man hier evtl. gesondert betrachten. Sie sind der Offline-Speicher eines Exchange-Postfachs. Der maßgebliche Store in diesem Kontext ist nicht die OST-Datei, sondern das Exchange-Postfach. Ob es Unterschiede im Verhalten gibt, wenn man ein Item im Offline-Modus in ein Exchange-Postfach verschiebt, und somit das Item in der OST gespeichert wird, bevor es im Exchange-Postfach gespeichert wird, habe ich nie untersucht.

Ich gehe davon aus, dass diese Feinheiten im Kontext dieses Threads eher von untergeordneter Bedeutung sind.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Andreas Irmer

Hallo an alle für die Kommentare hier.

In den letzten Tagen habe ich viel über die Datenstruktur gelernt aber kann das Thema GetItemfromID leider immer noch nicht umsetzen. Damit ich jetzt aber in meinem Projekt ein Stück weiter komme habe ich mir mit einer "Umleitung".

Ich durchlaufe mit einer For Each Schleife alle Elemente und vergleiche die EntryID mit der in meiner Tabelle gespeicherten EntryID. Bei einem Treffer kann ich die Werte schreiben.

Nicht Elegant und sicher langsam aber es funktioniert wenigstens.

Verbessern könnte man das noch, indem man in der Abfrage der Daten auch erfasst, ob sich ein Wert im Datensatz geändert hat und dann nur die betroffenen Datensätze bearbeiten muss.

Ich sende hier mal die bestehenden Codes:

Option Compare Database
Option Explicit

Private mOutlook As Outlook.Application
Private mNamespace As Outlook.NameSpace
Private mAppointmentFolder As Outlook.MAPIFolder
Private objRecipient As Outlook.Recipient
Private objName As Outlook.Recipient



Public Property Get GetOutlook() As Outlook.Application
    If mOutlook Is Nothing Then
        On Error Resume Next
        Set mOutlook = GetObject(, "Outlook.Application")
        If Err.Number = 429 Then
            Err.Clear
            Set mOutlook = CreateObject("Outlook.Application")
            If Err.Number = 429 Then
                MsgBox "Outlook ist nicht installiert."
                Exit Function
            End If
        End If
    End If
    Set GetOutlook = mOutlook
End Property

Public Property Get GetMAPINamespace() As Outlook.NameSpace
    If mNamespace Is Nothing Then
        Set mNamespace = GetOutlook.GetNamespace("MAPI")
    End If
    Set GetMAPINamespace = mNamespace
End Property

Public Property Get GetAppointmentFolder() As Outlook.MAPIFolder
    Set objRecipient = GetMAPINamespace.CreateRecipient("Test1")
    If mAppointmentFolder Is Nothing Then
        Set mAppointmentFolder = GetMAPINamespace.GetSharedDefaultFolder(objRecipient, olFolderCalendar)
    End If
    Set GetAppointmentFolder = mAppointmentFolder
End Property

Und die Routine zum speichern der Daten:
Public Sub TermineExportieren()
    Dim objAppointment As Outlook.AppointmentItem
    Dim LstAppointment As Object
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim Tab_Termine As DAO.Recordset
    Dim objUserProperty As Outlook.UserProperty
    Dim lngTerminID As Long
    Dim Anzahl As Integer
    Dim i As Integer
    Dim Filter As String
    Dim ObjTerminvorhanden As Object
       
    Set db = CurrentDb
   
    ' Abfrage Outlook filtert mir nur zukünftige Daten aus der Tabelle Termine
   
    Set rst = db.OpenRecordset("Abfrage_Outlook", dbOpenDynaset)
   
    ' Neben der Abfrage auch noch die Tabell Tab_Termine öffnen, um Daten schreiben zu können. Einträge in Abfrage funktionieren nicht.
   
    Set Tab_Termine = db.OpenRecordset("Termine", dbOpenDynaset)
    Set LstAppointment = GetAppointmentFolder.Items
   
    Do While Not rst.EOF
       
        ' Wenn Ol_TerminID ist nicht leer, also besteht der Termin schon
       
        If Not rst!OL_TerminID Is Nothing Then
           
            For Each LstAppointment In GetAppointmentFolder.Items
                If rst!OL_TerminID = LstAppointment.EntryID Then
                    With LstAppointment
'                   .Item
                    .Subject = rst!AdrNr_ID_F & ", " & rst!Re_Na2 & ", " & rst!AB_Nr & ", " & rst!Re_Tel & ", " & rst!Re_EMail1
                    .Start = rst!Termin_Datum & " " & rst!Termin_Beginn
                    .End = rst!Termin_Datum & " " & rst!Termin_Ende
                    .UserProperties("KdNr") = rst!AdrNr
                    .UserProperties("KdName") = rst!Re_Na2
                    .UserProperties("Auftragsnummer") = rst!AB_Nr
                    .UserProperties("Auftrbeschr") = rst!Auftragsbeschreibung
                    .UserProperties("angesetzteAW") = rst!AW_kalk
                    .UserProperties("Monteur") = rst!Vorname
                    .AllDayEvent = rst!Ganztag
                    .Categories = rst!Taetigkeit
                    .UserProperties("besNotiz") = rst!Notiz
                    .Save
                End With
            End If
            Next
        Else
        ' Wenn OL_TerminID leer ist, wird der Termin noch nicht in Outlook sein
        ' Termin also hinzufügen
       
            Set objAppointment = GetAppointmentFolder.Items.Add
            With objAppointment
                .Subject = rst!AdrNr_ID_F & ", " & rst!Re_Na2 & ", " & rst!AB_Nr & ", " & rst!Re_Tel & ", " & rst!Re_EMail1
                .Start = rst!Termin_Datum & " " & rst!Termin_Beginn
                .End = rst!Termin_Datum & " " & rst!Termin_Ende
                .UserProperties("KdNr") = rst!AdrNr
                .UserProperties("KdName") = rst!Re_Na2
                .UserProperties("Auftragsnummer") = rst!AB_Nr
                .UserProperties("Auftrbeschr") = rst!Auftragsbeschreibung
                .UserProperties("angesetzteAW") = rst!AW_kalk
                .UserProperties("Monteur") = rst!Vorname
                .AllDayEvent = rst!Ganztag
                .Categories = rst!Taetigkeit
                .UserProperties("besNotiz") = rst!Notiz
                .Save
            End With
           
            'aufrufen des richtigen Elements in der Tabelle Tab_Termine
           
            Tab_Termine.FindFirst "Termine_ID =" & rst!Termine_ID
           
            'Tab_Termine Element Element bearbeiten
           
            Tab_Termine.Edit
                Tab_Termine!OL_TerminID = objAppointment.EntryID                'EntryID und
                Tab_Termine!GeaendertAm = objAppointment.LastModificationTime   'LastModificationDate schreiben
            Tab_Termine.Update
               

        End If
        rst.MoveNext
    Loop
    rst.Close
    Set rst = Nothing
    Set db = Nothing
    Set LstAppointment = Nothing
End Sub

Wenn mir noch jemand helfen kann, dann bitte sehr gerne.

Am liebesten hätte ich eine Routine, mit der ich den im Formular geöffneten Termin in den Kalender des betroffenen Mitarbeiters schreiben kann. Also so etwas wie Termin_schreiben(Datensatz, Mitarbeiter). ;)
Andreas Irmer
für jede Hilfe dankbar und für Tipps zum Thema Wohnmobil, Wohnwagen auch für jeden erreichbar

PhilS

Zitat von: Andreas Irmer am Dezember 27, 2022, 20:20:14Wenn mir noch jemand helfen kann, dann bitte sehr gerne.
Siehe meine Antwort in deinem anderen Thread. - Nebenbei: Zwei Threads, die beide im Kern zum selben Thema sind, parallel zu eröffnen, ist nicht so ideal.

Zitat von: Andreas Irmer am Dezember 27, 2022, 20:20:14Am liebesten hätte ich eine Routine, mit der ich den im Formular geöffneten Termin in den Kalender des betroffenen Mitarbeiters schreiben kann. Also so etwas wie Termin_schreiben(Datensatz, Mitarbeiter).
D.h. du willst aus deiner Access-Anwendung in das Postfach eines anderen Benutzers schreiben?
Ob das überhaupt möglich ist, hängt von der verwendeten Infrastruktur ab. Wenn ihr einen gemeinsamen Exchange-Server verwendet, wäre das theoretisch möglich, andernfalls eher nicht.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Andreas Irmer

Hallo Phil,

ich habe jetzt versucht Deinen Hinweis aus dem zweiten Trhead umzusetzen.

Zitat von: PhilS am Dezember 28, 2022, 09:36:561.) Zuweisungen zu Objektvariablen erfordern in VBA immer das Set Schlüsselwort.
2.) Du verwendest die Funktion GetItemFromID, die ja zentraler Punkt der Diskussion hier war, in deinem Code gar nicht.
3.) GetMAPINamespace ist dein eigenes Property, das du in dem anderen Thread in deinem Code zeigst? Dann ist es keine Methode des Outlook.Application-Objektes, das du mit deiner GetOutlook-Property erstellst.

Wenn du die o.a. Punkte berücksichtigst, könnte dein Code so aussehen:
Code [Auswählen] Erweitern
Set LstAppointment = GetMAPINamespace.GetItemFromID("000000002508FC66.....

Deinen 3. Punkt verstehe ich nicht bzw kann ihn nicht einordnen/umsetzen...

Die Zeile:
Set LstAppointment = GetMAPINamespace.GetItemFromID("000000002508FC...")
in meiner Sub TermineExportieren bringt leider die Fehlermeldung:
Laufzeitfehler: '-2147220991(80040201)': Ein Clientvorgang ist fehlgeschlagen.
Andreas Irmer
für jede Hilfe dankbar und für Tipps zum Thema Wohnmobil, Wohnwagen auch für jeden erreichbar

PhilS

Zitat von: Andreas Irmer am Dezember 29, 2022, 20:15:33Die Zeile:
Code [Auswählen] Erweitern
Set LstAppointment = GetMAPINamespace.GetItemFromID("000000002508FC...")in meiner Sub TermineExportieren bringt leider die Fehlermeldung:
Laufzeitfehler: '-2147220991(80040201)': Ein Clientvorgang ist fehlgeschlagen.
Hast du die Zeile genau so in deinem Code?
Das "000000002508FC..." ist die gekürzte EntryId aus deinem eigenen Beispiel. Dort muss du natürlich eine vollständige, gültige EntryId übergeben.
Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

markusxy

@PhilS, Wahnsinn so eine Geduld wie du hätte ich auch gerne  :-[ .

Andreas Irmer

Zitat von: PhilS am Dezember 29, 2022, 20:26:18Hast du die Zeile genau so in deinem Code?
Nein, natürlich nicht, ich habe das hier nur gekürzt, genau wie Du in Deinem Tipp das gemacht hast.

Zitat von: PhilS am Dezember 28, 2022, 09:47:49D.h. du willst aus deiner Access-Anwendung in das Postfach eines anderen Benutzers schreiben?
Ob das überhaupt möglich ist, hängt von der verwendeten Infrastruktur ab. Wenn ihr einen gemeinsamen Exchange-Server verwendet, wäre das theoretisch möglich, andernfalls eher nicht.

Das funktioniert, da ich die Termine ja nicht in meinen Kalender schreibe, sondern in den Kalender, der dem User "Test1" gehört- Es sind alle betroffenen User "Mitarbeiter" meiner Firma und hängen daher im gleichen Exchange-Raum.

Kann es daran liegen, dass ich mit GetItemFromId nicht weiter komme? Ich brauche das Item ja nicht aus meinem Standardkalender sondern aus dem Kalender des "Mitarbeiters" bzw hier Testraums.

Zitat@PhilS, Wahnsinn so eine Geduld wie du hätte ich auch gerne  :-[ .

Markus, ich bin hier allen wahnsinnig dankbar für die Hilfe und vor Allem für die Geduld, wenn das alles nicht so klappt wie es soll.

Vielleicht können ja auch andere durch meine Experimente profitieren. Ich würde, wenn alles läuft, die Codes hier auch zur Verfügung stellen. Ich möchte nur, dass wir richtig arbeiten können und keine Software verkaufen.
Andreas Irmer
für jede Hilfe dankbar und für Tipps zum Thema Wohnmobil, Wohnwagen auch für jeden erreichbar

ebs17

Zitatda ich die Termine ja nicht in meinen Kalender schreibe, sondern in den Kalender, der dem User "Test1" gehört
An erster Stelle muss man über Abläufe nachdenken. Daher stellt sich zuerst die Frage, wer wie in den betreffenden Outlook-Kalender schreibt oder schreiben kann.

Denn: Suchen und Verwalten ist in der DB-Umgebung deutlich einfacher und schneller. Daher würde ich meine Accessanwendung als Steuerzentrale betrachten. Alle Informationen werden (nach Möglichkeit) dort erzeugt und in Tabellen übernommen und erst dann irgendwo nach Outlook geschrieben. Mit dem Schreiben der Information holt man sich die EntryID des Items und besser auch jene des Folders in seine Accessanwendung zurück, um einen späteren Zugriff auf ein konkretes Item einfacher und schneller vornehmen zu können.

Hat man den Fall, dass jemand direkt in den Kalender schreibt, muss man umgedreht dafür sorgen, dass die Accessanwendung dies erfährt und die relevanten Informationen umgehend bekommt. Hier hat man entweder ein Event in Outlook selber, das per Prozedur ein Schreiben aus Outlook in die DB ausführt, oder die Accessanwendung muss in sinnvollen Zeiträumen oder zu gegebenen Anlässen scannen, was im betreffenden Folder (Kalender) passiert ist, um neue Informationen herauszulesen und für sich zu übernehmen.
Mit freundlichem Glück Auf!

Eberhard

PhilS

Zitat von: Andreas Irmer am Dezember 30, 2022, 19:35:36Das funktioniert, da ich die Termine ja nicht in meinen Kalender schreibe, sondern in den Kalender, der dem User "Test1" gehört- Es sind alle betroffenen User "Mitarbeiter" meiner Firma und hängen daher im gleichen Exchange-Raum.

Kann es daran liegen, dass ich mit GetItemFromId nicht weiter komme? Ich brauche das Item ja nicht aus meinem Standardkalender sondern aus dem Kalender des "Mitarbeiters" bzw hier Testraums.
Wenn du den betreffenden Ordner und seinen Inhalt in Outlook sehen kannst, sollte das eher nicht das Problem sein. - Allerdings sind die Möglichkeiten mit verschiedenen Benutzerpostfächern, Gruppen, Shared Mailboxes etc. so vielfältig, dass ich das nicht für jede Konstellation sicher sagen kann.

Zur Diagnose würde ich erstmal versuchen, ob das direkt in Outlook prinzipiell so funktioniert, wie gedacht.

Du könntest in Outlook im VBA Direktfenster mal folgendes ausführen:
? Application.GetNamespace("MAPI").PickFolder().Items(1).EntryIdDie Anweisung gibt nach Auswahl eines Ordner über den Dialog die EntryId des ersten Items in dem gewählten Folder zurück.
Diese EntryId dann in der folgenden Anweisung einfügen und ebenfalls ausführen:
? Application.GetNamespace("MAPI").GetItemFromID("Hier EntryId Einfügen").EntryIdWenn du jetzt ohne Fehler dieselbe EntryId ausgegeben bekommst, kann man Zugriffs-/Berechtigungsprobleme eher ausschließen.

Das gleiche Spiel könntest du dann aus Access mit deinem GetMAPINamespace-Property wiederholen. Wenn es auch dabei keinen Fehler gibt, sollte dein Code in Bezug auf Outlook grundsätzlich funktionieren.

Der nächste Schritt wäre dann, die restliche Funktionalität genauer zu prüfen; d.h. ob du die richtigen EntryIds ausliest, speicherst und dann auch wieder für den Zugriff verwendest.



Neue Videoserie: Windows API in VBA

Klassische CommandBars visuell bearbeiten: Access DevTools CommandBar Editor

Andreas Irmer

Hallo zusammen,

ich habe es jetzt hinbekommen. Ich kann die Termine in unterschiedliche Kalender schreiben und auch bei bestehenden EntryID die Daten dort verändern.

Public Sub AlleTermineAktualisieren()
    Dim objOutlook As Outlook.Application
    Dim objMAPI As Outlook.NameSpace
    Dim objFolder As Outlook.Folder
    Dim objAppointmentItem As Outlook.AppointmentItem
    Dim objRecipient As Outlook.Recipient
    Dim db As DAO.Database
    Dim rst As DAO.Recordset
    Dim Tab_Termine As DAO.Recordset
    Dim Zeile(6) As String
    Dim i As Integer
               
    On Error Resume Next
        Set objOutlook = GetObject(, "Outlook.Application")
        If Err.Number = 429 Then
            Err.Clear
            Set objOutlook = CreateObject("Outlook.Application")
            If Err.Number = 429 Then
                MsgBox "Outlook ist nicht installiert."
            End If
        End If
    Set objMAPI = objOutlook.GetNamespace("MAPI")
    Set db = CurrentDb
    Set rst = db.OpenRecordset("SELECT Termine.*, Auftraege.AdrNr_ID_F, Auftraege.AB_Nr, Auftraege.Auftragsbeschreibung, Auftraege.uebernachtung, Auftraege.warten, Auftraege.Notiz, Auftraege.muss_stehen_bleiben, Kunden_DB.*, Mitarbeiter.Vorname, Taetigkeiten.Taetigkeit FROM Taetigkeiten INNER JOIN (Mitarbeiter INNER JOIN (Kunden_DB INNER JOIN (Auftraege INNER JOIN Termine ON (Auftraege.Auftraege_ID = Termine.Auftraege_ID_F) AND (Auftraege.Auftraege_ID = Termine.Auftraege_ID_F)) ON Kunden_DB.AdrNr = Auftraege.AdrNr_ID_F) ON Mitarbeiter.Mitarbeiter_ID = Termine.Mitarbeiter_ID_F) ON Taetigkeiten.Taetigkeit_ID = Termine.Taetigkeit_ID_F", dbOpenDynaset)
    Set Tab_Termine = db.OpenRecordset("Termine", dbOpenDynaset)
    Do While Not rst.EOF
        Set objRecipient = Nothing
        For i = 1 To 6
            Zeile(i) = ""
        Next
        Select Case rst!Vorname
            Case "Robert"
                Set objRecipient = objMAPI.CreateRecipient("Info")
            Case "Michael"
                Set objRecipient = objMAPI.CreateRecipient("Info")
            Case "Dominik"
                Set objRecipient = objMAPI.CreateRecipient("Dxxx Sxxx")
            Case "Andreas"
                Set objRecipient = objMAPI.CreateRecipient("Andreas Irmer")
        End Select
        Set objFolder = objMAPI.GetSharedDefaultFolder(objRecipient, olFolderCalendar)
        If IsNull(rst!OL_TerminID) Then
           
            Set objAppointmentItem = objFolder.Items.Add(olAppointmentItem)
            With objAppointmentItem
                .Subject = rst!Taetigkeit & ", " & rst!AdrNr_ID_F & ", " & rst!Re_Na2 & ", " & rst!AB_Nr & ", " & rst!Re_Tel & ", " & rst!Re_EMail1
                .Start = rst!Termin_Datum & " " & rst!Termin_Beginn
                .End = rst!Termin_Datum & " " & rst!Termin_Ende
                Zeile(1) = "Mitarbeiter: " & rst!Vorname & vbCr
                Zeile(2) = "Auftragsbeschreibung: " & rst!Auftragsbeschreibung & vbCr & vbCr
                Zeile(3) = "besondere Notizen zum Auftrag: " & rst!Notiz & vbCr & vbCr
                If rst!warten = True Then
                    Zeile(4) = "Kd. wartet auf Fertigstellung!" & vbCr
                Else
                    Zeile(4) = "Kd. wartet nicht auf Fertigstellung!" & vbCr
                End If
                If rst!uebernachtung = True Then
                    Zeile(5) = "Kd. übernachtet im Fz.!" & vbCr
                Else
                    Zeile(5) = vbCr
                End If
                If rst!muss_stehen_bleiben = True Then
                    Zeile(6) = "Fz. muss eine Nacht stehen bleiben!"
                Else
                    Zeile(6) = ""
                End If
                .Body = Zeile(1) & Zeile(2) & Zeile(3) & Zeile(4) & Zeile(5) & Zeile(6)
                .AllDayEvent = rst!Ganztag
                .Categories = rst!Taetigkeit
                .Save
            End With
            Tab_Termine.FindFirst "Termine_ID =" & rst!Termine_ID
            Tab_Termine.Edit
                Tab_Termine!OL_TerminID = objAppointmentItem.EntryID                'EntryID und
                Tab_Termine!GeaendertAm = objAppointmentItem.LastModificationTime   'LastModificationDate schreiben
            Tab_Termine.Update
               
        Else
            Set objAppointmentItem = objMAPI.GetItemFromID(rst!OL_TerminID)
            If rst!GeandertAm <> objAppointmentItem.LastModificationTime Then
                With objAppointmentItem
                    .Subject = rst!Taetigkeit & ", " & rst!AdrNr_ID_F & ", " & rst!Re_Na2 & ", " & rst!AB_Nr & ", " & rst!Re_Tel & ", " & rst!Re_EMail1
                    .Start = rst!Termin_Datum & " " & rst!Termin_Beginn
                    .End = rst!Termin_Datum & " " & rst!Termin_Ende
                    Zeile(1) = "Mitarbeiter: " & rst!Vorname & vbCr
                    Zeile(2) = rst!Auftragsbeschreibung & vbCr & vbCr
                    Zeile(3) = rst!Notiz & vbCr & vbCr
                    If rst!warten = True Then
                        Zeile(4) = "Kd. wartet auf Fertigstellung!" & vbCr
                    Else
                        Zeile(4) = "Kd. wartet nicht!" & vbCr
                    End If
                    If rst!uebernachtung = True Then
                        Zeile(5) = "Kd. übernachtet im Fz.!" & vbCr
                    Else
                        Zeile(5) = vbCr
                    End If
                    If rst!muss_stehen_bleiben = True Then
                        Zeile(6) = "Fz. muss eine Nacht stehen bleiben!"
                    Else
                        Zeile(6) = ""
                    End If
                    .Body = Zeile(1) & Zeile(2) & Zeile(3) & Zeile(4) & Zeile(5) & Zeile(6)
                    .AllDayEvent = rst!Ganztag
                    .Categories = rst!Taetigkeit
                    .Save
                End With
                Tab_Termine.FindFirst "Termine_ID =" & rst!Termine_ID
           
                Tab_Termine.Edit
                    Tab_Termine!GeaendertAm = objAppointmentItem.LastModificationTime   'LastModificationDate schreiben
                Tab_Termine.Update
            End If
        End If
        rst.MoveNext
    Loop
    rst.Close
    Set rst = Nothing
    Set db = Nothing
    Set Tab_Termine = Nothing
    Set objRecipient = Nothing
End Sub

Jetzt habe ich noch zwei Bitten an euch:

1. Ich möchte nur die Daten zum Schreiben aufrufen, für die

a) keine EntryID in OL_TerminID hinterlegt ist oder
b) das Feld Datensatz_geändert aus der Tabelle Termine als True markiert ist.

Damit sollen die Daten für die Sub reduziert werden, damit nicht immer alle Daten durchlaufen werden müssen.

2. Ich möchte in meinem Eingabeformular für die Aufträge bzw. eigentlich im Ufo für die Termine einen Code hinterlegen, dass nach Aktualisierung der Daten das Feld Datensatz_geändert auf wahr gesetzt wird.

Wie bekomme ich das noch hin?  ;)

Vielen Dank an alle.
Andreas Irmer
für jede Hilfe dankbar und für Tipps zum Thema Wohnmobil, Wohnwagen auch für jeden erreichbar