Показать сообщение отдельно
Старый 10.08.2011, 11:43   #1  
WISEMAN is offline
WISEMAN
Участник
 
2 / 10 (1) +
Регистрация: 10.08.2011
CRM 4.0 использование regardingobjecttypecode в plugin
Добрый день. Есть следующая ситуация: при добавлении\сохранении сущности "действие сервиса" (serviceappointment) должен срабатывать плагин который смотрит какое действие добавлено => если оно является "сервисным контрактом" (contract), то поменять уже существующую "дату акта" (new_actdate) у контракта на ту, что выставили в "действии сервиса" (new_dateofact).

Что я делаю:

Вытаскиваю данные из serviceappointment
Код:
string saId = string.Empty; //service appointment id
CrmDateTime saDate = CrmDateTime.Null; //service appointment date of act
string cId = string.Empty; //contract id
CrmDateTime cDate = CrmDateTime.Null; //contract date of act

DynamicEntity entity = (DynamicEntity) context.InputParameters.Properties[ParameterName.Target];
saId = ((Key) entity.Properties["activityid"]).Value.ToString();

DynamicEntity saEntity = GetEntity("serviceappointment", saId, "new_dateofact", "regardingobjectid");
saDate = ((CrmDateTime) saEntity.Properties["new_dateofact"]);
cId = ((Lookup)saEntity.Properties["regardingobjectid"]).Value.ToString();
Да и GetEntity - мой метод:
Код:
private DynamicEntity GetEntity(string entityName, string entityId, params string[] attributes)
{
	try
	{
		Microsoft.Crm.Sdk.Query.ColumnSet columnSet = new Microsoft.Crm.Sdk.Query.ColumnSet();
		if (attributes.Length == 0)
		{
			throw new ArgumentNullException("You should send at least one attribute");
		}
		foreach (string el in attributes)
		{
			columnSet.Attributes.Add(el);
		}
		TargetRetrieveDynamic targetRetrieve = new TargetRetrieveDynamic { EntityId = new Guid(entityId), EntityName = entityName };
		RetrieveRequest retrieveRequest = new RetrieveRequest {Target = targetRetrieve, ColumnSet = columnSet, ReturnDynamicEntities = true};
		RetrieveResponse retrieveResponse = (RetrieveResponse)crmService.Execute(retrieveRequest);

		return (DynamicEntity)retrieveResponse.BusinessEntity;
	}
	catch
	{
		return null;
	}
}
Следующим шагом мне нужно узнать что этот RegardingObjectId относится к contract, а не к другим 12 типам с которыми serviceappointment в отношении. Я пытался взять RegardingObjectTypeCode так же среди атрибутов ч\з свой метод, но проблема в том что у сущности в crm среди атрибутов нету RegardingObjectTypeCode, а в базе данных такое поле есть.
Собственно вопрос - как узнать значение этого поля стандартными средствами, не прибегая к обращению напрямую запросом к базе, ибо клепать в одном простом плагине несколько способов обращения - есть изврат.
---------------------------------------------------------------------
Так же вопрос № 2:
Как можно переписать метод GetEntity так, чтобы он сообщал о том, что не найдена сущность с таким id (к примеру, взяли id которого не существует: Guid.NewGuid()). В настоящее время он просто падает с эксепшеном. Проверку на null retrieveResponse делал - не успевает срабатывать, нужно что-то другое.