2017-11-08 3 views
0

Ich mache ein Update in crm mit ssis. Ich habe versucht, einige Fälle in crm basierend auf bestimmten Bedingungen zu schließen. Dies ist mein Beispielcode in public override void Input0_ProcessInputRow(Input0Buffer Row) Methode.Wie Sie Fälle in crm 2011 programmgesteuert schließen

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

Row.DEVCaseGUID die GUID der Fall ist. Statuscode ist 5 für geschlossen. statecode ist 2 für gelöst.

Ich versuchte, diese example zu folgen, aber kein Erfolg. Oder gibt es einen einfachen Weg, dies zu erreichen?

Antwort

0

Das Schließen eines Falls in CRM unterscheidet sich von der Einstellung des Status/Statuscodes. Eine Intermediate-Entität mit dem Namen wird erstellt, wenn ein Fall geschlossen wird. Sie können den folgenden Code versuchen, den Fall programmgesteuert zu schließen.

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

Bitte beachten Sie, dass ein Fall nur als Closed/Completed only markiert werden kann, wenn alle activitites diesen Fall in Bezug auf abgeschlossen sind.

Update-09-Nov-2017: Bezug zum Schließen CASE damit verbundene Tätigkeiten Code Hinzufügen

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

In neueren CRMs können Sie das System konfigurieren, um automatisch alle geöffneten abbrechen Aktivität, wenn Sie einen Fall schließen. Gab es das 2011? Ich kann mich nicht erinnern. – Alex

+0

Danke, werde das später versuchen, für alle damit verbundenen Aktivitäten zu diesem Fall, dann wie kann ich es schließen, wenn es nichts ausmacht, können Sie das Snippet teilen. – xChaax

+0

@xChaax Meine Antwort aktualisiert, Code zum Schließen verwandter Aktivitäten hinzugefügt. –

Verwandte Themen