2011-12-15 54 views
4

我需要确保CRM 2011中与案例(事件)实体相关的所有活动的状态都已设置为完成,然后才能将案件状态设置为已解决。我可以使用ActivityPointer实体在不同的活动类型上设置相同的状态吗? CRM 2011

我可以进行多次检索以独立获取所有可能的活动类型,然后对每种类型执行相应的SetStateRequest(...)。 This article似乎表明每次创建任何活动类型记录时都会创建一个ActivityPointer记录,并且这两个记录具有相同的ID。当然,当我查看案例和活动时,每个活动类型记录都有一个具有相同ID的关联的活动指针记录。到现在为止还挺好。

这是否意味着我可以执行与我的案例相关的所有ActivityPointer记录的单个检索并设置其状态以实现交叉类型活动状态设置?我想我不明白ActivityPointer的目的是什么,如果它不允许我进行泛型活动操作。这是否是重点?另外,ActivityPointer实体没有SetStateRequest消息,所以有人可以解释我如何设置ActivityPointer记录上的状态码/状态?理想情况下,我希望完成状态和取消状态。

更新:This blog似乎正好显示我想要的,尽管offical docs on SetStateRequest似乎表明它不支持ActivityPointer实体。我明天会试试,但如果任何人有关于继续进行的最佳方法的建议,我会承担责任。

更新2:在进一步阅读,我认为情况是一个ActivityPointer实体只能有它的状态设置。所以我应该能够将所有活动指针记录设置为根据this setup取消的状态。我想这是有道理的,我不能一般性地设置“状态原因”,因为它在活动类型之间有所不同。我仍然对前一个链接感到困惑,似乎表明我可以设置活动指针的状态状态,但不清楚这是否为真,允许哪些值组合以及它们是什么意思是...

回答

5

Chris。我在这里回答我自己的问题,因为有一种方法可以使用活动指针记录来关闭所有活动类型。这可能是有这种记录的原因之一。它依赖于一个活动指针记录具有一个字段,该字段定义了它所代表的活动类型。这里的代码:

// do a search for all activities that have a status of open or scheduled 
// that covers them all 
// here's the filter expression to use 
/* 
FilterExpression filterStateCode = new FilterExpression(); 
      filterStateCode.FilterOperator = LogicalOperator.Or; 
      filterStateCode.AddCondition("statecode", ConditionOperator.Equal, "Open"); 
      filterStateCode.AddCondition("statecode", ConditionOperator.Equal, "Scheduled"); 
*/ 
// the search returns a list of entities called AllOpenRelatedActivities 

foreach (var currentActivityPointer in AllOpenRelatedActivities.Entities) 
      { 
       if (currentActivityPointer.Attributes.Contains("activityid") & currentActivityPointer.Attributes.Contains("activitytypecode")) 
       { 
        currentActivityPointer.LogicalName = currentActivityPointer.Attributes["activitytypecode"].ToString(); 
        currentActivityPointer.Id = (Guid)currentActivityPointer.Attributes["activityid"]; 

        SetStateRequest setState = new SetStateRequest(); 
        setState.EntityMoniker = currentActivityPointer.ToEntityReference(); 
        setState.State = new OptionSetValue(); 
        setState.State.Value = 2; 
        setState.Status = new OptionSetValue(); 
        setState.Status.Value = -1; 



        SetStateResponse setStateResponse = (SetStateResponse)service.Execute(setState); 


       } 
      } 
5

我可以解释活动指针的最佳方式是它是派生类(如电子邮件和电话呼叫)的基类。

活动指针封装了任何活动的基本属性,因此如果您创建自定义活动,它也将从活动指针扩展。

由此可见,活动指针包含所有活动的状态和状态值,但也有道理,它不能从SetStateRequest访问。

我想象的是活动的实际状态,打开,关闭,预定,取消,适用于所有活动,但状态对每个活动都是单独的。

例如,一个任务可以打开,但其状态原因也可以打开 虽然电子邮件也可以打开,但其状态原因是“等待发送”

由于此差异,SetStateRequest可能不会让您运行它在ActivityPointer上,但它会在每个单独的活动实体上。

就您所做的事情而言,支持的方法是单独检索所有关联的活动,然后执行设置状态请求。

您可以一次完成所有操作,但需要一点“不支持”,因为您可能需要直接在数据库上执行此操作。但是,将状态设置为“完成”时,状态原因还必须反映属于该状态的状态。否则,我相信这些活动会出错。

因此,不幸的是,我无法以优雅的方式看到它周围的方式,但请更新,如果你找到一个!

+0

+1不支持是通常最酷的方式来完成任务。太糟糕了,在线模型中没有直接的数据库访问。 – 2011-12-15 17:00:52

+0

@Chris谢谢你的解释,这非常有帮助。我找到了一种方法去做我想知道的事情。看到我对这个问题的回答。 – keerz 2011-12-25 01:52:01

相关问题