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.
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.
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.
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.
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 (https://learn.microsoft.com/en-us/office/vba/api/outlook.mailitem.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.
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). ;)
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 (https://www.access-o-mania.de/forum/index.php?msg=157634). - 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.
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.
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.
@PhilS, Wahnsinn so eine Geduld wie du hätte ich auch gerne :-[ .
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.
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.
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.
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.