हम एक एमएस आउटलुक प्लगइन लिख रहे हैं। हमारे व्यापार-तर्क को संतुष्ट करने के लिए, इसे कुछ तिथियों के बीच सभी नियुक्तियों की जांच करनी चाहिए। हम कैलेंडर से सभी आइटम पुनर्प्राप्त करने के साथ कई समस्याओं का सामना कर रहे हैं। हमने दो विकल्प आज़माए:
आउटलुक एपीआई। हम MSDN में वर्णित मानक तर्क का उपयोग करते हैं - जैसे आइटमों को [स्टार्ट] द्वारा सेट करें , यहाँ जैसे कैलेंडर आइटम्स पर Find \ Restrict क्वेरी
IncludeRecurrences
को सेट करेंTrue
और चलाएं । यह हमारे परीक्षण वातावरण में ठीक काम करता है। हालांकि, हमारे ग्राहक के वातावरण में: आवर्ती नियुक्तियों के लिए, प्रारंभ और समाप्ति तिथियां 'मास्टर अपॉइंटमेंट' की संबंधित तिथियों पर निर्धारित होती हैं। उदाहरण के लिए, किसी कमरे के कैलेंडर में हमारी साप्ताहिक नियुक्ति है जो जनवरी में बनाई गई थी, और अगर हम अगस्त में सभी वस्तुओं को खोजने की कोशिश करते हैं, तो हम दूसरों के बीच इस आवर्ती नियुक्ति के चार आइटम प्राप्त करते हैं, लेकिन उनकी शुरुआत और अंतिम तिथियां जनवरी में निर्धारित होती हैं । लेकिन आउटलुक उसी कैलेंडर में सही तिथियां प्रदर्शित करता है ...बहुत बुरा है, लेकिन हम अभी भी WebDAV है! हम एक साधारण परीक्षण एप्लिकेशन लिखते हैं और WebDAV का उपयोग करते हुए कैलेंडर से सभी वस्तुओं को क्वेरी करने का प्रयास करते हैं। बेशक, हमने पहिया को सुदृढ़ नहीं किया और सिर्फ प्रलेखन से कोड चिपकाया । पिछली समस्या हल हो गई है, लेकिन अगला उठता है: यह आवर्ती आइटम वापस नहीं करता है जो लगभग छह महीने पहले बनाए गए थे। मुझे कोई सुराग नहीं है - 'पुराने' आइटम को प्रतिबंधित करने वाले कोई पैरामीटर नहीं हैं!
गलत क्या है? क्या हम कुछ महत्वपूर्ण याद कर रहे हैं?
तकनीकी विवरण: एक्सचेंज 2003, आउटलुक 2003-2010। स्पष्ट रूप से, यदि हम कैश्ड एक्सचेंज मोड को चालू करते हैं, तो पहली त्रुटि गायब हो जाती है, लेकिन हम ऐसा नहीं कर सकते।
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();
}
अद्यतन 1:
OutlookSpy का उपयोग करते हुए अतिरिक्त शोध से पता चलता है कि समस्या हमारे कोड में नहीं है - कैश्ड एक्सचेंज मोड बंद होने पर एपीआई के अंदर स्टार्ट एंड एंड डेट गलत हैं। लेकिन आउटलुक डेवलपर्स को इसके बारे में पता था, और वे किसी भी तरह कैलेंडर में सही तारीखों को प्रदर्शित करते हैं! क्या किसी को पता है कैसे?
अद्यतन 2:
आउटलुक समर्थन वृद्धि इंजीनियर से जवाब:
इसके आधार पर, मैं पुष्टि कर सकता हूं कि यह हमारे उत्पाद में एक समस्या है।