Могу ли я использовать сущность ActivityPointer, чтобы установить одно и то же состояние для разных типов активности? CRM 2011

Мне нужно убедиться, что состояние всех действий, связанных с объектом (инцидентом) в CRM 2011, установлено как завершенное, прежде чем я смогу установить состояние самого дела как разрешенное.

Я могу сделать несколько операций извлечения, чтобы получить все возможные типы активности независимо, а затем выполнить соответствующий SetStateRequest (...) для каждого типа. Кажется, в этой статье предполагается, что запись ActivityPointer создается каждый раз, когда создается любая запись типа деятельности, и что обе записи имеют одинаковый идентификатор. Конечно, когда я смотрю на случаи и действия, каждая запись типа деятельности имеет связанную запись ActivityPointer с тем же идентификатором. Все идет нормально.

Означает ли это, что я могу сделать одно извлечение всех записей ActivityPointer, которые относятся к моему делу, и установить для них состояние для достижения настройки состояния активности перекрестного типа? Полагаю, я не понимаю, какова цель ActivityPointer, если она не позволяет мне выполнять общие манипуляции с деятельностью. В этом ли смысл? Кроме того, сущность ActivityPointer не имеет сообщения SetStateRequest, поэтому кто-то может объяснить, как я могу установить код состояния / статус в записи ActivityPointer? В идеале я хочу, чтобы состояние завершено, а состояние отменено.

Обновление: этот блог, кажется, показывает именно то, что я хочу, хотя официальные документы SetStateRequest, кажется, указывают, что он не поддерживает сущность ActivityPointer. Я попробую это завтра, но если у кого-нибудь будет совет о том, как лучше поступить, я буду благодарен.

Обновление 2: при дальнейшем чтении, я думаю, что ситуация заключается в том, что сущность ActivityPointer может иметь только установленное состояние. Так что я должен иметь возможность установить все записи Activitypointer в состояние отменено в соответствии с этой настройкой. Я полагаю, что имеет смысл, что я не могу в общем случае установить "причину статуса", так как она отличается в зависимости от типа деятельности. Я все еще немного сбит с толку по поводу предыдущей ссылки, так как кажется, что я могу установить состояние и статус указателя активности, но не ясно, правда ли это, какие комбинации значений разрешены и что они означают...

2 ответа

Решение

Крис. Я отвечаю на свой вопрос здесь, потому что есть способ использовать запись указателя активности для общего закрытия всех типов активности. Это может быть одной из причин, почему существует такая запись. Он основан на том факте, что запись указателя активности имеет поле, определяющее, какой вид деятельности он представляет. Вот код:

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


                }
            }

Лучший способ объяснить Activity Pointer - это то, что это базовый класс для производных классов, таких как Email и Phone Call.

Указатель активности инкапсулирует базовые атрибуты любого действия, поэтому, если вы создадите пользовательское действие, оно также будет расширяться от указателя активности.

Исходя из этого, имеет смысл, что Activity Pointer содержит значения State и Status всех действий, но также имеет смысл, что к нему нельзя получить доступ из SetStateRequest.

Я полагаю, что фактическое состояние действия "Открыто", "Закрыто", "Запланировано", "Отменено" применимо ко всем действиям, но Статус индивидуален для каждого действия.

Например. задача может быть открыта, но ее причина статуса также может быть открыта, в то время как электронная почта также может быть открыта, но ее причина статуса "Ожидание отправки"

Из-за этого различия SetStateRequest, вероятно, не позволит вам запустить его в ActivityPointer, но он будет работать на каждом отдельном объекте активности.

С точки зрения выполнения того, что вы намеревались сделать, поддерживаемым способом было бы получить все связанные действия по отдельности и затем выполнить запрос установленного состояния.

Вы можете делать все сразу, как хотите, но это может привести к некоторой "неподдержке", поскольку вам, вероятно, придется делать это непосредственно в базе данных. Однако при установке состояния "Завершить" причина состояния также должна отражать статус, принадлежащий этому состоянию. В противном случае я считаю, что деятельность будет ошибкой.

Так что, к сожалению, я не вижу способа обойти это элегантно, но, пожалуйста, сделайте обновление, если вы найдете такой!

Другие вопросы по тегам