如何以正确的顺序重新创建定期约会的例外?

时间:2016-02-08 10:18:06

标签: delphi soap exchangewebservices

我有以下问题:

  • 假设在15日,19日,23日,27日...... 2月重复活动
  • 在交换中,“19”事件被移至21
  • 接下来,“15”事件被移动到20.因此它移动超过第二次出现的原始开始日期(19)

现在,如果我想在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没有说什么,例外可能会反复修改。
  • OriginalStartRecurrenceId(日期等于OriginalStart)不起作用,因为此过程是双向的(异常也可以返回及时)。
  • 我发现CalenderItem documentation中没有其他似乎可用的属性。

我试图通过在ModifiedOccurrences调用中插入相同的CreateItem块,在一步中创建带有主要的主,但这会产生架构验证错误,因为我必须提供ItemID(但Exchange会创建它们。)

那么如何确定我必须重新创建这些异常的顺序(或者我是否忽略了某些内容而 可以在一步中创建具有异常的主事件)?

1 个答案:

答案 0 :(得分:1)

找到答案。我的问题中的关键词是:

OriginalStart或RecurrenceId(等于OriginalStart的日期)不起作用,因为此过程在两个方向上进行(例外也可以回溯到时间)。

如果拆分向前和向后发生移动并在两个块中处理它们,它就可以工作。实际上,有三个街区:

  1. 删除已删除的事件

  2. 创建事件向前移动(开始&gt; OriginalStart)从上次日期到第一次日期

  3. 创建从第一个日期到最后一个日期向后移动的事件(Start&lt; OriginalStart)

  4. 使用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;