我有以下问题:
现在,如果我想在Exchange中重新创建此重复事件,我首先创建主事件,即自动发生所有常规事件,然后我必须修改其中一些以按相同顺序创建例外 。如果我不这样做并且首先创建'15 - > 20',那么这将失败,因为它的修改日期超过了常规的'19'事件。
Exchange会给我修改发生的是相邻发生的交叉或重叠错误。
但我如何确定订单?在一个简单的测试用例中,对master事件的GetItem调用 not 按照创建它们的顺序给我ModifiedOccurrences
:
<t:ModifiedOccurrences>
<t:Occurrence>
<t:ItemId Id="AAMkA[snip]pQAAEA==" ChangeKey="DwA[snip]bix"/>
<t:Start>2016-02-20T09:00:00Z</t:Start>
<t:End>2016-02-20T10:30:00Z</t:End>
<t:OriginalStart>2016-02-15T09:00:00Z</t:OriginalStart>
</t:Occurrence>
<t:Occurrence>
<t:ItemId Id="AAMkA[snip]pQAAEA==" ChangeKey="DwA[snip]bix"/>
<t:Start>2016-02-21T09:00:00Z</t:Start>
<t:End>2016-02-21T10:30:00Z</t:End>
<t:OriginalStart>2016-02-19T09:00:00Z</t:OriginalStart>
</t:Occurrence>
</t:ModifiedOccurrences>
如果我为这两个例外做一个GetItem,我看不到我可以用来确定它们的创建顺序的约会属性:
LastModifiedTime
没有说什么,例外可能会反复修改。OriginalStart
或RecurrenceId
(日期等于OriginalStart
)不起作用,因为此过程是双向的(异常也可以返回及时)。我试图通过在ModifiedOccurrences
调用中插入相同的CreateItem
块,在一步中创建带有主要的主,但这会产生架构验证错误,因为我必须提供ItemID(但Exchange会创建它们。)
那么如何确定我必须重新创建这些异常的顺序(或者我是否忽略了某些内容而 可以在一步中创建具有异常的主事件)?
答案 0 :(得分:1)
找到答案。我的问题中的关键词是:
OriginalStart或RecurrenceId(等于OriginalStart的日期)不起作用,因为此过程在两个方向上进行(例外也可以回溯到时间)。
如果拆分向前和向后发生移动并在两个块中处理它们,它就可以工作。实际上,有三个街区:
删除已删除的事件
创建事件向前移动(开始&gt; OriginalStart)从上次日期到第一次日期
创建从第一个日期到最后一个日期向后移动的事件(Start&lt; OriginalStart)
使用Developer Express组件的(Delphi XE2)代码的基本部分:
type
TIDDate = class
FOrgStart,
FStart : TDateTime;
FIndex : Integer;
Constructor Create(AOrgStart,AStart: TDateTime; AIndex: Integer);
end;
constructor TIDDate.Create(AOrgStart,AStart: TDateTime; AIndex: Integer);
begin
FOrgStart := AOrgStart;
FStart := AStart;
FIndex := AIndex;
end;
function TDataModuleSyncExchange.InsertExchangeMasterEvent(AMasterEvent: TcxSchedulerEvent; var AMasterItemID, AMasterEntryID: String): Boolean;
var
lExchOccurrence: TcxSchedulerEvent;
i : Integer;
lDateList : TObjectList;
lIDDate : TIDDate;
lEventList : TcxSchedulerEventList;
begin { Main InsertExchangeMasterEvent }
[snip]
lEventList := AMasterEvent.GetRecurrenceChain; // DevEx code
// 1. Deleted occurrences
for i := 0 to lEventList.Count-1 do
begin
lExchOccurrence := lEventList.Items[i];
if lExchOccurrence.EventType = etException then
DeleteExchangeItem(lOccurItemID); // Own code elsewhere
end;
// 2. Occurrences moved forward (Start > OriginalStart) from last date to first date
lDateList := TObjectList.Create(true);
for i := 0 to lEventList.Count-1 do
begin
lExchOccurrence := lEventList.Items[i];
if lExchOccurrence.EventType = etCustom then
begin
lIDDate := TIDDate.Create(lExchOccurrence.GetOriginalDate,lExchOccurrence.Start,i);
lDateList.Add(lIDDate);
end;
end;
lDateList.SortList(function (Item1, Item2: Pointer): Integer
var lDT1,lDT2: TDateTime;
begin
lDT1 := TIDDate(Item1).FOrgStart;
lDT2 := TIDDate(Item2).FOrgStart;
if lDT1 > lDT2 then
Result := 1
else
if lDT1 < lDT2 then
Result := -1
else
Result := 0;
end);
for i := lDateList.Count-1 downto 0 do
with TIDDate(lDateList[i]) do
if FStart > FOrgStart then
CreateOccurrence(FIndex,lOccurChangeKey); // Own code elsewhere
// 3. Occurrences moved backward (Start < OriginalStart) from first date to last date
for i := 0 to lDateList.Count-1 do
with TIDDate(lDateList[i]) do
if FStart < FOrgStart then
CreateOccurrence(FIndex,lOccurChangeKey); // Own code elsewhere
lDateList.Free;