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

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

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

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

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

Update2: при дальнейшем чтении я думаю, что ситуация такова, что сущность ActivityPointer может иметь только свое состояние. Поэтому я должен быть в состоянии установить все записи указателя активности в состояние отменено для этой установки . Я полагаю, что имеет смысл, что я не могу в общем случае установить «причину статуса», так как она отличается в зависимости от типа деятельности. Я все еще немного озадачен предыдущей ссылкой, так как кажется, что я могу установить State и Status Activitypointer, но не ясно, правда ли это, какие комбинации допустимы и что они значат ...

Ответы [ 2 ]

5 голосов
/ 25 декабря 2011

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

// 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 голосов
/ 15 декабря 2011

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

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

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

Iпредставьте себе, что фактическое состояние действия «Открыто», «Закрыто», «Запланировано», «Отменено» применимо ко всем действиям, но состояние индивидуально для каждого действия.

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

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

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

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

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

...