Piszemy wtyczkę do MS Outlooka. Aby spełnić naszą logikę biznesową, powinien sprawdzać wszystkie spotkania między niektórymi datami. Mamy kilka problemów z pobieraniem wszystkich pozycji z kalendarzy. Wypróbowaliśmy dwie opcje:
Outlook API. Używamy standardową logikę, która jest opisana w MSDN - pozycje Sortuj według [Start], zestaw
IncludeRecurrences
doTrue
i uruchom Find \ Ograniczanie zapytania nad kalendarzem przedmioty jak tutaj . Działa dobrze w naszym środowisku testowym. Jednak w środowisku naszego klienta: w przypadku spotkań cyklicznych daty rozpoczęcia i zakończenia są ustawione na odpowiadające im daty „spotkania głównego”. Na przykład w kalendarzu jakiegoś pokoju mamy spotkanie tygodniowe, które zostało utworzone w styczniu i jeśli spróbujemy znaleźć wszystkie pozycje w sierpniu to otrzymamy m.in. cztery pozycje tego spotkania cyklicznego, ale ich data rozpoczęcia i zakończenia to styczeń . Ale Outlook wyświetla prawidłowe daty w tym samym kalendarzu ...Bardzo źle, ale wciąż mamy WebDAV! Piszemy prostą aplikację testową i próbujemy przeszukiwać wszystkie pozycje z kalendarza za pomocą WebDAV. Oczywiście nie wymyśliliśmy na nowo koła i po prostu wkleiliśmy kod z dokumentacji . Poprzedni problem został rozwiązany, ale pojawia się następny: Nie zwraca powtarzających się elementów, które zostały utworzone ponad około sześć miesięcy temu. Nie mam pojęcia - nie ma parametrów ograniczających „stare” przedmioty!
Co jest nie tak? Czy brakuje nam czegoś ważnego?
Szczegóły techniczne: Exchange 2003, Outlook 2003-2010. Szczerze mówiąc, pierwszy błąd znika, jeśli włączymy tryb buforowanej wymiany, ale nie możemy tego zrobić.
var nameSpace = application.GetNamespace("MAPI");
var recepient = nameSpace.CreateRecipient(roomEMail);
recepient.Resolve();
var calendar = nameSpace.GetSharedDefaultFolder(recepient, OlDefaultFolders.olFolderCalendar);
var filter = string.Format("[Start]<'{1}' AND [End]>'{0}'",
dateFrom.ToString("dd/MM/yyyy HH:mm", CultureInfo.InvariantCulture), dateTo.ToString("dd/MM/yyyy HH:mm", CultureInfo.InvariantCulture)
);
var allItems = calendar.Items;
allItems.Sort("[Start]");
allItems.IncludeRecurrences = true;
var _item = allItems.Find(filter);
while (_item != null) {
AppointmentItem item = _item as AppointmentItem;
if (item != null) {
if (item.Subject != "some const")
&& (item.ResponseStatus != OlResponseStatus.olResponseDeclined)
&& (item.MeetingStatus != OlMeetingStatus.olMeetingReceivedAndCanceled
&& item.MeetingStatus != OlMeetingStatus.olMeetingCanceled))
{
/* Here we copy item to our internal class.
* We need: Subject, Start, End, Organizer, Recipients, MeetingStatus,
* AllDayEvent, IsRecurring, RecurrentState, ResponseStatus,
* GlobalAppointmentID */
}
}
_item = allItems.FindNext();
}
AKTUALIZACJA 1:
Dodatkowe badania przy użyciu OutlookSpy pokazują, że problem nie występuje w naszym kodzie - daty rozpoczęcia i zakończenia są nieprawidłowe w interfejsie API, gdy tryb buforowanej wymiany jest wyłączony. Ale programiści Outlooka byli tego świadomi i w jakiś sposób wyświetlają prawidłowe daty w kalendarzach! Czy ktoś wie jak?
AKTUALIZACJA 2:
Odpowiedź od inżyniera ds. Eskalacji pomocy technicznej programu Outlook:
Na tej podstawie mogę potwierdzić, że jest to problem w naszym produkcie.