我可以使用ActivityPointer实体在不同的活动类型上设置相同的状态吗?CRM 2011

kee*_*erz 4 crm dynamics-crm dynamics-crm-2011 dynamics-crm-online

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

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

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

更新:此博客似乎准确显示了我想要的内容,尽管SetStateRequest上官方文档似乎表明它不支持ActivityPointer实体.我会在明天尝试这个,但如果有人就最佳方式提出建议,我将不得不承担责任.

Update2:在进一步阅读时,我认为情况是ActivityPointer实体只能设置​​它的状态.因此,我应该能够将所有activitypointer记录设置为根据此设置取消的状态.我认为有意义的是,我不能一般地设置"状态原因",因为它在活动类型之间不同.我仍然对前一个链接感到有点困惑,因为它似乎表明我可以设置一个活动指针状态状态,但不清楚这是否属实,允许组合的值是什么以及它们意味着什么......

Chr*_*ris 5

我可以解释活动指针的最好方法是它是派生类(如电子邮件和电话)的基类.

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

从这一点可以看出,Activity Pointer包含所有活动的State和Status值,但也有意义,它无法从SetStateRequest访问.

我想,活动的实际状态,打开,关闭,计划,取消,适用于所有活动,但状态是每个活动的个体.

例如.任务可以打开,但其状态原因也可以打开,而电子邮件也可以打开,但其状态原因是"等待发送"

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

在执行您要执行的操作方面,支持的方法是单独检索所有关联的活动,然后执行设置状态请求.

你可以像你想的那样一次性完成所有工作,但会涉及一些"不支持",因为你可能需要直接在数据库上完成.但是,在将状态设置为"完成"时,状态原因还必须反映属于该状态的状态.否则我相信活动会出错.

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


kee*_*erz 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);


                }
            }
Run Code Online (Sandbox Code Playgroud)