Chúng tôi đang viết một plugin MS Outlook. Để đáp ứng logic kinh doanh của chúng tôi, nó nên kiểm tra tất cả các cuộc hẹn giữa một số ngày. Chúng tôi đang gặp một số sự cố khi truy xuất tất cả các mục từ lịch. Chúng tôi đã thử hai tùy chọn:
API Outlook. Chúng tôi sử dụng logic tiêu chuẩn được mô tả trong MSDN - sắp xếp các mục theo [Bắt đầu], đặt
IncludeRecurrences
thànhTrue
và chạy truy vấn Tìm \ Hạn chế trên các mục lịch như ở đây . Nó hoạt động tốt trong môi trường thử nghiệm của chúng tôi. Tuy nhiên, trong môi trường khách hàng của chúng tôi: Đối với các cuộc hẹn định kỳ, ngày bắt đầu và ngày kết thúc được đặt thành ngày tương ứng của 'cuộc hẹn chính'. Ví dụ: trong lịch của một số phòng, chúng tôi có một cuộc hẹn hàng tuần được tạo vào tháng 1 và nếu chúng tôi cố gắng tìm tất cả các mục trong tháng 8, chúng tôi nhận được trong số những mục khác của cuộc hẹn định kỳ này, nhưng ngày bắt đầu và kết thúc của chúng được đặt thành tháng 1 . Nhưng Outlook hiển thị các ngày chính xác trong cùng một lịch ...Rất tệ, nhưng chúng ta vẫn có WebDAV! Chúng tôi viết một ứng dụng thử nghiệm đơn giản và cố gắng truy vấn tất cả các mục từ lịch bằng cách sử dụng WebDAV. Tất nhiên, chúng tôi không phát minh lại bánh xe và chỉ dán mã từ tài liệu . Vấn đề trước đó đã được giải quyết, nhưng vấn đề tiếp theo lại phát sinh: Nó không trả lại các mục lặp lại đã được tạo hơn khoảng sáu tháng trước. Tôi không phải là một manh mối - không có tham số nào hạn chế các mặt hàng 'cũ'!
Chuyện gì thế? Chúng ta đang thiếu một cái gì đó quan trọng?
Chi tiết kỹ thuật: Exchange 2003, Outlook 2003-2010. Thành thật mà nói, lỗi đầu tiên sẽ biến mất nếu chúng tôi bật Chế độ đệm ẩn Exchange, nhưng chúng tôi không thể làm điều đó.
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();
}
CẬP NHẬT 1:
Nghiên cứu bổ sung bằng cách sử dụng OutlookSpy cho thấy rằng vấn đề không nằm trong mã của chúng tôi - ngày Bắt đầu \ Kết thúc không chính xác bên trong API khi Chế độ đệm ẩn Exchange tắt. Nhưng các nhà phát triển Outlook đã biết về điều đó và bằng cách nào đó họ hiển thị ngày chính xác trong lịch! Có ai biết làm thế nào không?
CẬP NHẬT 2:
Câu trả lời từ Kỹ sư nâng cấp hỗ trợ Outlook:
Dựa trên điều này, tôi có thể xác nhận rằng đây là một vấn đề trong sản phẩm của chúng tôi.