2017-11-08 12 views
0

私はssisを使用してcrmでいくつかの更新を行っています。私は、特定の条件に基づいてcrmのいくつかのケースを閉じようとしました。これはpublic override void Input0_ProcessInputRow(Input0Buffer Row)メソッドのサンプルコードです。プログラムでcrm 2011のケースを閉じるには

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年:新しい認証標準物質場合について

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関連する活動を終了するためのコードを追加しました。 –

関連する問題