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

Dynamics crm 我可以使用ActivityInter实体在不同的活动类型上设置相同的状态吗?CRM 2011,dynamics-crm,dynamics-crm-2011,crm,dynamics-crm-online,Dynamics Crm,Dynamics Crm 2011,Crm,Dynamics Crm Online,我需要确保CRM 2011中与案例(事件)实体相关的所有活动的状态设置为“已完成”,然后才能将案例本身的状态设置为“已解决” 我可以进行多次检索以独立获取所有可能的活动类型,然后对每种类型执行适当的SetStateRequest(…)。似乎表明每次创建任何活动类型记录时都会创建一个ActivityInter记录,并且两个记录都具有相同的ID。果然,当我查看案例和活动时,每个活动类型记录都有一个具有相同ID的关联ActivityInter记录。到目前为止还不错 这是否意味着我可以对与我的案例相关的

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

我可以进行多次检索以独立获取所有可能的活动类型,然后对每种类型执行适当的SetStateRequest(…)。似乎表明每次创建任何活动类型记录时都会创建一个ActivityInter记录,并且两个记录都具有相同的ID。果然,当我查看案例和活动时,每个活动类型记录都有一个具有相同ID的关联ActivityInter记录。到目前为止还不错

这是否意味着我可以对与我的案例相关的所有ActivityInter记录执行一次检索,并对其设置状态,以实现跨类型活动状态设置?如果ActivityInter不允许我进行一般的活动操作,我想我不明白它的目的是什么。这就是问题所在吗?另外,ActivityInter实体没有SetStateRequest消息,因此有人可以解释我如何在ActivityInter记录上设置statecode/状态吗?理想情况下,我希望状态为“已完成”,状态为“已取消”

更新:似乎正好显示了我想要的内容,尽管似乎表明它不支持ActivityPoint实体。我明天会试试,但如果有人对最好的方法有意见,我将不胜感激


更新2:进一步阅读,我认为情况是ActivityInter实体只能设置其状态。因此,我应该能够将所有ActivityInter记录设置为取消状态。我认为我不能一般地设置“状态原因”是有道理的,因为它在不同的活动类型之间是不同的。我仍然对上一个链接有点困惑,因为它似乎暗示我可以设置ActivityPointInter的状态和状态,但不清楚这是否是真的,允许哪些值组合以及它们的含义…

我可以解释活动指针的最佳方式是,它是派生类(如Email和Phone Call)的基类

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

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

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

任务可以打开,但其状态原因也可以打开 尽管电子邮件也可以打开,但其状态原因是“等待发送”

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

就执行您已经开始执行的操作而言,支持的方法是单独检索所有关联的活动,然后执行set state请求

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


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

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

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


                }
            }

+1不支持往往是完成事情最酷的方式。太糟糕了,在线模型中没有直接的数据库访问。@Chris感谢您的解释,这非常有帮助。我找到了一种方法来做我想做的事。请参阅我对问题的回答。当我尝试类似的方法时,我得到的消息是ActivityInter.LogicalName属性已被读取only@BorisCallens代码不完全正确。从活动指针列表中,您必须检查类型并创建该类型的新活动,然后使用ActivityInter的id(保证与相应活动的id相同),然后对您创建的活动执行setstatus。希望这是有道理的。这只意味着你查询AP,然后通过它们进行迭代,为每个AP创建一种代理,然后你就可以对其进行操作。关键是每个特定的活动都有一个具有相同id的对应AP,并且您可以从AP的type属性中知道类型。