11 agosto 2012

Consulta de Actividades según Scheduled Start


- Cuando consultamos actividades según su fecha de inicio, debemos tener en cuenta el tipo de fecha que enviamos en la consulta

- La base de datos de CRM almacena dos valores diferentes para la fecha de cada actividad, uno es el valor de la fecha ScheduledStart indicada durante la creación del registro en nuestra zona horaria, y el otro valor es la fecha UTC (Coordinated Universal Time)

- El manejo interno de CRM hace que una consulta retrieve según el campo ScheduledStart compruebe el campo ScheduledStartUtc cuando la fecha de consulta no especifica la zona horaria, y ambos valores no siempre coinciden, dependiendo de la zona horaria de nuestro sistema. En nuestro caso (Barcelona) es 1 hora menos en relación a las coordenadas de UTC, lo que es suficiente para que las actividades con ScheduledStart de las 00:00 pasen a informar el campo ScheduledStartUtc a las 23:00 del día anterior

- Podemos comprobar estos campos en la base de datos de nuestra organización



- Ahora comprobemos el número de actividades con ScheduledStart mayor o igual a 7 de enero de 2012



- Tenemos 12 actividades de diverso tipo con fecha mayor o igual a 7 de enero de 2012

- Ahora lancemos un programa que consulte estas actividades

- El código es el siguiente:

   
    protected void btnConsultar_Click(object sender, EventArgs e)
    {
        using (contexto = new CrmOrganizationServiceContext(service))
        {
            DateTime fechaConsulta = new DateTime(2012, 1, 7);

            var actividades = (from acts in contexto.CreateQuery<ActivityPointer>()
                               where acts.ScheduledStart >= fechaConsulta
                               orderby acts.ScheduledStart descending
                               select new
                               {
                                   ActivityTypeCode = acts.ActivityTypeCode,
                                   ScheduledStart = acts.ScheduledStart
                               });

            foreach (var actividad in actividades)
            {
                TableRow fila = new TableRow();
                fila.Cells.AddRange(new TableCell[2] 
                { 
                    new TableCell() { Text = actividad.ActivityTypeCode },
                    new TableCell() { Text = actividad.ScheduledStart.ToString() }
                });
                 
                tblActividades.Rows.Add(fila); 
            }
        }
    }



- Y la respuesta es la siguiente



- Como podemos comprobar, el conjunto de resultados no incluye las 12 actividades que se corresponden con la consulta, debido a que 10 de éstas tienen el campo ScheduledStartUtc informado con el día anterior a las 23 horas

- Este mecanismo de retrieve de CRM 2011 comprueba el tipo de fecha enviado en la consulta, para decidir la comprobación sobre el campo ScheduledStart o ScheduledStartUtc

- Para consultar con precisión las actividades según fecha de inicio, convertiremos la fecha de consulta a Universal Time, el código es el siguiente
  
        DateTime fechaConsulta = new DateTime(2012, 1, 7);
        fechaConsulta = fechaConsulta.ToUniversalTime();



- De este modo el mecanismo de consulta de CRM comprobará el campo ScheduledStart original, al saber que la fecha ya viene informada en tipo UTC

- El conjunto de datos devuelto por la consulta ahora es correcto, 12 actividades



- El ultimo paso será convertir la fecha UTC devuelta por CRM de nuevo a nuestra zona horaria para desplegar los datos de forma coherente

- El código a añadir es el siguiente


        foreach (var actividad in actividades)
        {
            DateTime fechaLocal =
              TimeZoneInfo.ConvertTimeFromUtc(actividad.ScheduledStart.Value, 
              TimeZoneInfo.Local);
            TableRow fila = new TableRow();
            fila.Cells.AddRange(new TableCell[2] 
            { 
                new TableCell() { Text = actividad.ActivityTypeCode },
                new TableCell() { Text = fechaLocal.ToString() }
            });
              
            tblActividades.Rows.Add(fila); 
        }



- El resultado ahora es coherente con los datos originales almacenados por el usuario



- Para más información sobre formatos de fecha hora en Dynamics CRM, consulte el siguiente link

Date/Time Values in Microsoft Dynamics CRM


Desde Innovar Tecnologías esperamos que este documento les sea de ayuda en su desarrollo

Web de la empresa