MSOutlookプラグインを作成しています。ビジネスロジックを満たすために、いくつかの日付の間のすべての予定をチェックする必要があります。カレンダーからすべてのアイテムを取得する際にいくつかの問題が発生しています。2つのオプションを試しました。
OutlookAPI。MSDNで説明されている標準ロジックを使用します-[開始]でアイテムを並べ替え、設定
IncludeRecurrences
して、ここのようなTrue
カレンダーアイテムに対してFind\Restrictクエリを実行します。テスト環境では正常に動作します。ただし、お客様の環境では、定期的なアポイントメントの場合、開始日と終了日は「マスターアポイントメント」の対応する日付に設定されます。たとえば、一部の部屋のカレンダーには1月に作成された毎週の予定があり、8月にすべてのアイテムを検索しようとすると、この定期的な予定の4つのアイテムが含まれますが、開始日と終了日は1月に設定されます。 。しかし、Outlookは同じカレンダーに正しい日付を表示します...非常に悪いですが、まだWebDAVがあります!簡単なテストアプリケーションを作成し、WebDAVを使用してカレンダーからすべてのアイテムをクエリしようとします。もちろん、車輪の再発明はせず、ドキュメントからコードを貼り付けただけです。前の問題は解決されましたが、次の問題が発生します。約6か月以上前に作成された定期的なアイテムは返されません。手がかりはありません-「古い」アイテムを制限するパラメータはありません!
なにが問題ですか?重要なものが欠けていますか?
技術的な詳細:Exchange 2003、Outlook2003-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を使用した追加の調査では、問題はコードにないことが示されています。キャッシュ交換モードがオフの場合、API内の開始日と終了日が正しくありません。しかし、Outlook開発者はそれを認識しており、どういうわけかカレンダーに正しい日付を表示します。誰かが方法を知っていますか?
更新2:
Outlookサポートエスカレーションエンジニアからの回答:
これにより、当社製品の問題点であることが確認できました。