4

我需要确保与 CRM 2011 中的案例(事件)实体相关的所有活动的状态都设置为已完成,然后才能将案例本身的状态设置为已解决。

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

这是否意味着我可以一次检索与我的案例相关的所有 ActivityPointer 记录并设置它们的状态以实现跨类型的活动状态设置?我想我不明白 ActivityPointer 的目的是什么,如果它不允许我进行通用的活动操作。如果是这样,那是重点吗?此外,ActivityPointer 实体没有 SetStateRequest 消息,所以有人可以解释我如何在 ActivityPointer 记录上设置状态码/状态吗?理想情况下,我想要一个已完成的状态和一个已取消的状态。

更新:尽管SetStateRequest 上的官方文档似乎表明它不支持 ActivityPointer 实体,但该博客似乎准确地显示了我想要的内容。明天我会试试这个,但如果有人对最好的方法提出建议,我将不胜感激。

Update2:在进一步阅读中,我认为情况是 ActivityPointer 实体只能设置​​它的状态。所以我应该能够根据这个设置将所有活动指针记录设置为取消状态。我认为我不能笼统地设置“状态原因”是有道理的,因为它在活动类型之间有所不同。我对上一个链接仍然有些困惑,因为它似乎表明我可以设置活动指针的状态状态,但目前尚不清楚这是否属实,允许哪些值组合以及它们的含义......

4

2 回答 2

5

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

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

因此,Activity Pointer 包含所有活动的 State 和 Status 值是有道理的,但不能从 SetStateRequest 访问它也是有道理的。

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

例如。任务可以打开,但其状态原因也可能是打开的,而电子邮件也可以打开,但其状态原因是“等待发送”

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

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

您可以按照自己的意愿一次完成所有操作,但会涉及一些“不受支持”,因为您可能必须直接在数据库上进行操作。但是,当将状态设置为 Complete 时,状态原因还必须反映属于该状态的状态。否则我相信活动会出错。

所以不幸的是,我无法以一种优雅的方式解决它,但如果你找到了,请及时更新!

于 2011-12-15T09:29:24.530 回答
5

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

// 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);


                }
            }
于 2011-12-25T01:50:23.110 回答