2017-11-08 9 views
0

ssis를 사용하여 crm에서 일부 업데이트를 수행하고 있습니다. 나는 특정 조건에 따라 crm에서 몇 가지 사례를 닫으려고했다. 이것은 public override void Input0_ProcessInputRow(Input0Buffer Row) 메소드의 샘플 코드입니다. 2011 년 crm에서 사례를 프로그래밍 방식으로 닫는 방법

public override void Input0_ProcessInputRow(Input0Buffer Row) 
{ 
    // Create a Entity object of type 'case' 
    Entity caseEnt = new Entity("incident"); 


    Entity incidentResolution= new Entity("incidentresolution"); 
    incidentResolution.Attributes.Add("incidentid", new 
     EntityReference("incident", Row.DEVCaseGUID)); 


    caseEnt["incidentid"] = Row.DEVCaseGUID; 


    //organizationservice.Update(caseEnt); 

    //Changes added here by // 
    EntityCollection collection= GetAssociatedActivities(new EntityReference("incident", Row.DEVCaseGUID)) 

     foreach (Entity activity in collection.Entities) 
    { 
     CancelActivity(activity, organizationservice); 
    } 
    // Changes added here // 

    // Close the incident with the resolution. 
    var closeIncidentRequest = new CloseIncidentRequest 
    { 
     IncidentResolution = incidentResolution, 
     Status = new OptionSetValue(5) 
    }; 

    organizationservice.Execute(closeIncidentRequest); 

} 

private EntityCollection GetAssociatedActivities(EntityReference regarding) 
{ 
    QueryExpression query = new QueryExpression { EntityName = "activitypointer", ColumnSet = new ColumnSet(new string[] { "activitytypecode" }) }; 
    query.Criteria.AddCondition("regardingobjectid", ConditionOperator.Equal, regarding.Id); 
    query.Criteria.AddCondition("statecode", ConditionOperator.NotEqual, 1); //ignore completed 
    EntityCollection collection = organizationservice.RetrieveMultiple(query); 
    return collection 

} 

// Cancel an Activity 
private static void CancelActivity(Entity entity, IOrganizationService service) 
{ 
    EntityReference moniker = new EntityReference(); 
    if (entity.LogicalName == "activitypointer") 
    { 
     if (entity.Attributes.Contains("activityid") & entity.Attributes.Contains("activitytypecode")) 
     { 
      moniker.LogicalName = entity.Attributes["activitytypecode"].ToString(); 
      moniker.Id = (Guid)entity.Attributes["activityid"]; 
      SetStateRequest request = new SetStateRequest(); 
      request.EntityMoniker = moniker; 
      request.State = new OptionSetValue(2); 
      request.Status = new OptionSetValue(-1); 
      SetStateResponse response = (SetStateResponse)service.Execute(request); 
     } 
    } 
} 

케이스의 GUID Row.DEVCaseGUID이다. 상태 코드은 폐쇄에 대해 5입니다. 상태 코드은 해결 된 경우 2입니다.

나는이 example을 시도했지만 성공하지 못했습니다. 아니면 이것을 달성 할 수있는 간단한 방법이 있습니까?

답변

0

CRM에서 사례 닫기는 상태/상태 코드 설정과 다릅니다. 케이스가 닫히면 IncidentResoultion이라는 중간 엔터티가 만들어집니다. 다음 코드를 사용하여 프로그래밍 방식으로 사례를 닫을 수 있습니다.

Entity incidentResolution= new Entity("incidentresolution"); 
incidentResolution.Attributes.Add("incidentid", new 
      EntityReference("incident", Row.DEVCaseGUID)); 

     // Close the incident with the resolution. 
     var closeIncidentRequest = new CloseIncidentRequest 
     { 
      IncidentResolution = incidentResolution, 
      Status = new OptionSetValue(5) 
     }; 

     organizationservice.Execute(closeIncidentRequest); 

는 모든 사례에 관한 activitites이 완료 될 경우 경우에만 Closed/Completed only으로 표시 할 수 있습니다.

업데이트 09 11 월 - 2017 : 새로운 인증 표준 물질에서 CASE에 대한

private List<Entity> GetAssociatedActivities(EntityReference regarding) 
    { 
     QueryExpression query = new QueryExpression { EntityName = "activitypointer", ColumnSet = new ColumnSet(new string[] { "activitytypecode" }) }; 
     query.Criteria.AddCondition("regardingobjectid", ConditionOperator.Equal, regarding.Id); 
     query.Criteria.AddCondition("statecode", ConditionOperator.NotEqual, 1); //ignore completed 
     EntityCollection activities = organizationservice.RetrieveMultiple(query);//change collection to activities 
     foreach (Entity activity in activities.Entities) 
     { 
      CancelActivity(activity, organizationservice); 
     } 
    } 

    // Cancel an Activity 
    private static void CancelActivity(Entity entity, IOrganizationService service) 
    { 
     EntityReference moniker = new EntityReference(); 
     if (entity.LogicalName == "activitypointer") 
     { 
      if (entity.Attributes.Contains("activityid") & entity.Attributes.Contains("activitytypecode")) 
      { 
       moniker.LogicalName = entity.Attributes["activitytypecode"].ToString(); 
       moniker.Id = (Guid)entity.Attributes["activityid"]; 
       SetStateRequest request = new SetStateRequest(); 
       request.EntityMoniker = moniker; 
       request.State = new OptionSetValue(2); 
       request.Status = new OptionSetValue(-1); 
       SetStateResponse response = (SetStateResponse)service.Execute(request); 
      } 
     } 
    } 

https://www.magnetismsolutions.com/blog/roshanmehta/2012/2/16/Dynamics_CRM_2011_Closing_all_Related_Activities_for_a_Record.aspx

https://msdynamicscrmblog.wordpress.com/2013/06/18/there-are-still-open-activities-associated-with-this-case-when-resolving-a-case-in-dynamics-crm-2011/

+0

을 관련 활동을 닫는 코드를 추가하면 자동으로 열려을 취소하도록 시스템을 구성 할 수 있습니다 사례를 닫을 때의 활동 2011 년에도 존재 했습니까? 나는 기억이 안 나. – Alex

+0

감사합니다. 나중에이 작업을 수행해보십시오. 관련 사건에 대한 모든 관련 활동에 대해, 어떻게 닫을 수 있습니까? 괜찮 으면 스 니펫을 공유 할 수 있습니까? – xChaax

+0

@xChaax 관련 답변을 닫기위한 내 답변이 업데이트되었습니다. –