Usuario
¿me ayudas con este codigo, para cierre de tareas en oportunidades?

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 siguientecambio 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 porCount 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 utilizandousing
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++;
}
}
}
}