Code: Alles auswählen
Function FreiTermin(Titel, Vertreter: String; Start, Finish: TDateTime): String;
Var
// Variablen im Lokalen Outlook
Outlook,
NameSpace,
CalendarFolder,
CalenderItems,
FilteredCalenderItems,
Item,
// Variablen im Shared Kalender
Recipient, SharedCalendarFolder: OLEVariant;
newAppointment: OLEVariant;
restriction, cpt: String;
r_count, i: Integer;
Begin
(*
* 1. Speichern eines Termins im Urlaubskalender
*
* Anzeige: Frei
* TagesEvent: Ja
* Datum: Date
* Kategorie: Meine Gruppe
* Teilnehmer: Ich und Vorgesetzter
* Betreff: Titel <Nachname>
* Ort: -
*)
result := ''; // Kein Fehler
Outlook := GetOutLook();
NameSpace := Outlook.GetNameSpace('MAPI');
Recipient := NameSpace.CreateRecipient(Urlaubskalender);
Recipient.Resolve;
If Not Recipient.Resolved Then Begin // Konnte den Kalender nicht auflösen -> Abbruch mit Fehler
Outlook := Unassigned;
Recipient := Unassigned;
NameSpace := Unassigned;
result := 'Could not resolve recipient ' + Urlaubskalender;
exit;
End;
SharedCalendarFolder := NameSpace.GetSharedDefaultFolder(Recipient, olFolderCalendar);
newAppointment := SharedCalendarFolder.items.add();
newAppointment.MeetingStatus := olAppointment; // Typ Besprechung
newAppointment.BusyStatus := olFree;
newAppointment.AllDayEvent := True;
newAppointment.Start := olevariant(Start);
If start <> Finish Then Begin
newAppointment.&End := olevariant(Finish);
End;
newAppointment.Categories := olevariant(Eigene_Gruppe);
newAppointment.Location := olevariant('-');
newAppointment.Recipients.Add(olevariant(Eigene_Email));
newAppointment.Recipients.Add(olevariant(Vorgesetzter_EMail));
newAppointment.ReminderSet := false;
cpt := Titel + ' ' + Nachname;
If Finish - Start > 1 Then Begin // Bei einem Termin ab 2 Tagen ist ein Vertreter notwendig
If Vertreter = '' Then Begin
result := 'Missing Vertreter.';
exit;
End;
cpt := cpt + ' (Vertretung: ' + Vertreter + ')';
End;
newAppointment.Subject := olevariant(cpt);
(*
* 2. Versenden
*)
newAppointment.Send;
//newAppointment.Display(true);
r_count := 0;
// Es dauert ein Weilchen bis der Termin im Eigenen Kalender ankommt, wir versuchen 1 Min lang den Termin zu finden.
Repeat
Sleep(5000);
(*
* 3. Den Termin im Eigenen Kalender auf "Abwesend" stellen und Speichern
*)
CalendarFolder := NameSpace.GetDefaultFolder(olFolderCalendar);
CalenderItems := CalendarFolder.items;
// Filtern nach den Terminen die um das Erstelldatum herum gemacht wurden
restriction := '[Start] >= ''' + FormatDateTime('mm/dd/yyyy hh:mm AMPM', Start - 1) + ''' AND [End] <= ''' + FormatDateTime('mm/dd/yyyy hh:mm AMPM', Finish + 1) + '''';
FilteredCalenderItems := CalenderItems.Restrict(OleVariant(Restriction));
For i := 1 To FilteredCalenderItems.Count Do Begin
Item := FilteredCalenderItems.item[i];
// Kleine Heuristik die versucht den gerade erstellten Termin zu finden
If (Item.Start = olevariant(Start)) And
(Item.Subject = olevariant(cpt)) Then Begin
item.BusyStatus := olAbsent;
item.Save;
Outlook := Unassigned;
exit;
End;
End;
r_count := r_count + 1;
Until r_count >= 12;
result := 'Could not find Appointment, timeout: ' + cpt;
Outlook := Unassigned;
End;