none
¿me ayudas con este codigo, para cierre de tareas en oportunidades? RRS feed

  • Pregunta

  • Tengo un problema con respecto a poder cerrar las tareas (Task) en una oportunidad ademas de que si esta va a ser cerrada como ganada (won), indicarle al Usuario que tiene que completar el proceso hasta el 100 % y no dejando cerrar la oportunidad, pero si esta va a ser cerrada como perdida (Lost) dejar cerrar la oportunidad.
     
    Existe una pagina en donde esta el codigo para al menos cerrar las tareas abiertas al cerrar la oportunidad, pero al ingresarlo en Visual 2008 el codigo me marca errores y no puedo hacer ese proceso, la pagina es la siguiente
     
     
     
    cambio en el codigo la linea

    using crmsdk por  using

     

    microsoft.crm.sdk;

     

    tambien  cambio

    // Crear un conjunto de columnas que tendra las columnas a ser traidas del CRM

     

    ColumnSet colstarea = new ColumnSet();

     

    ColumnSet colstarea = new ColumnSet(new string[] { "subject", "activityid", "createdby", "actualend", "scheduledend", "statecode" });

     

    por la siguiente linea

     

     

    // Crear un conjunto de columnas que tendra las columnas a ser traidas del CRM

     

    ColumnSet colstarea = new ColumnSet(new string[] { "subject", "activityid", "createdby", "actualend", "scheduledend", "statecode" });

     

    ademas en GetLength tambien me marca error y en el arreglo, sustitui GetLength por

    Count por que alguien me ayudo aqui ne el trabajo, pero no queda y ya me desespere, puedes indicarme cual es mi falla en esto, te anexo mi codigo el cual me sigue marcando errores en el arreglo.


    Agradezco de antemano su ayuda ya que apenas estoy comenzando a programar y sigo los ejemplos, pero este me sirve para mi CRM 4.0 el cual estoy utilizando 

     

    using

     

    System;

    using

     

    System.Data;

    using

     

    System.Configuration;

    using

     

    System.Web;

    using

     

    System.Web.Security;

    using

     

    System.Web.UI;

    using

     

    System.Web.UI.WebControls;

    using

     

    System.Web.UI.WebControls.WebParts;

    using

     

    System.Web.UI.HtmlControls;

    using

     

    System.Timers;

    // Microsoft Dynamics CRM namespaces

    using

     

    Microsoft.Crm.Sdk;

    using

     

    Microsoft.Crm.SdkTypeProxy;

    using

     

    Microsoft.Crm.Workflow;

    using

     

    Microsoft.Crm.Workflow.Activities;

    using

     

    Microsoft.Crm.Sdk.Query;

     

    public

     

    partial class _Default : System.Web.UI.Page

    {

     

    protected void Page_Load(object sender, EventArgs e)

    {

     

    // Set up the CRM Service.

     

    CrmAuthenticationToken token = new CrmAuthenticationToken();

    token.AuthenticationType = 0;

    token.OrganizationName =

    "MicrosoftCRM";

     

    CrmService service = new CrmService();

    service.Url =

    "http://moss:5555/mscrmservices/2007/crmservice.asmx";

    service.CrmAuthenticationTokenValue = token;

    service.Credentials = System.Net.

    CredentialCache.DefaultCredentials;

     

    opportunity opp = new opportunity();

     

    //Aqui se deberia recibir el ID de la oportunidad ya sea via workflow o plug-in.

     

    //Para efectos de la muestra estoy pasando un ID directamente

     

    Guid id = new Guid("C16508FC-3014-DE11-8CA9-0003FF2F18F6");

     

     

    // Crear un conjunto de columnas que tendra las columnas a ser traidas del CRM

     

    ColumnSet colstarea = new ColumnSet();

     

    ColumnSet colstarea = new ColumnSet(new string[] { "subject", "activityid", "createdby", "actualend", "scheduledend", "statecode" });

     

    // Crear la expresion condicional.

     

    ConditionExpression conditionTareasOportunidad = new ConditionExpression();

     

    // Configurar las propiedades de la expresion condicional para que traiga

     

    // todas las actividades relacionadas con la oportunidad escogida

    conditionTareasOportunidad.AttributeName =

    "regardingobjectid";

    conditionTareasOportunidad.Operator =

    ConditionOperator.Equal;

    conditionTareasOportunidad.Values =

    new object[1];

    conditionTareasOportunidad.Values[0] = id;

     

    // Crear el filtro

     

    FilterExpression filterTareasOportunidad = new FilterExpression();

     

    // Configurar las propiedades del filtro.

    filterTareasOportunidad.FilterOperator =

    LogicalOperator.And;

    filterTareasOportunidad.Conditions =

    new ConditionExpression[] { conditionTareasOportunidad };

     

    // Crear la expresion

     

    QueryExpression queryTareasOportunidad = new QueryExpression();

     

    // Configurar la busqueda.

    queryTareasOportunidad.EntityName =

    EntityName.task.ToString();

    queryTareasOportunidad.ColumnSet = colstarea;

    queryTareasOportunidad.Criteria = filterTareasOportunidad;

     

    // Crear el objeto de la consulta

     

    RetrieveMultipleRequest retrieveTareasOportunidad = new RetrieveMultipleRequest();

     

    // Configurar las propiedades de la consulta

    retrieveTareasOportunidad.Query = queryTareasOportunidad;

     

    // Ejecutar la consulta: La consulta traera todas las actividades de la oportunidad. Tanto las que esten en la Histoty como en Activities

     

    RetrieveMultipleResponse retrievedtareas = (RetrieveMultipleResponse)service.Execute(retrieveTareasOportunidad);

     

    if (retrievedtareas.BusinessEntityCollection.BusinessEntities.GetLength(0) > 0)

    {

     

    int i = 0;

     

    int j = retrievedtareas.BusinessEntityCollection.BusinessEntities.GetLength(0);

     

    /* Este ciclo identifica las actividades que estan en la Historia a traves del status.

    Asi mismo, dejo comentada la condicion para verificar si esta tarea pertence al workflow de ventas

    Para identificar las tareas que pertencen al workflow debemos hacer dos cosas:

    1. Crear un campo en la actividad que se llame new_identificador

    2. Al configurar el workflow, debo asignar un valor al atributo new_identificador. Por ejemplo, el valor de 1.

    */

     

    while (i < j)

    {

     

    task tarea = new task();

    tarea = (

    task)retrievedtareas.BusinessEntityCollection.BusinessEntities[i];

     

    while (tarea.statecode.Value.ToString() == "Completed")

    {

    i = i + 1;

    tarea = (

    task)retrievedtareas.BusinessEntityCollection.BusinessEntities[i];

    }

     

    //Luego de este while se pondria un while con el cuerpo exactamente igual pero con la condicion para evaluar si la tarea es o no del workflow, adicionandola de esta manera: " while (tarea.new_identificador <> 1) ".

     

    // Lo dejé comentando en el código para que vean como funciona cerrando todas las actividades de la oportunidad y pasandolas al historial. Recuerden que para distinguir entre las actividades del workflow y las demás actividades, deben crear el campo new_identificador en la tarea y ponerle el valor de 1 en el respectivo workflow

     

    // Sería algo como lo que viene a continuación:

     

    // while (tarea.new_identificador <> 1)

     

    // {

     

    // i = i + 1;

     

    // tarea = (task)retrievedtareas.BusinessEntityCollection.BusinessEntities[i];

     

    // }

     

     

     

    // Fecha final de la tarea

    tarea.actualend =

    new CrmDateTime();

     

    // Tomar la fecha de hoy para usarla como fecha de cierre de la tarea

     

    DateTime endDate = DateTime.Now;

    tarea.actualend.date = endDate.Date.ToString();

     

    //Aqui se cambia el estado de la tarea a completada

     

    SetStateTaskRequest SetTaskState = new SetStateTaskRequest();

    SetTaskState.EntityId = tarea.activityid.Value;

    SetTaskState.TaskState =

    TaskState.Completed;

    SetTaskState.TaskStatus = -1;

     

    SetStateTaskResponse stateSet = (SetStateTaskResponse)service.Execute(SetTaskState);

    i++;

    }

    }

    }

    }

    martes, 24 de noviembre de 2009 18:51