25 de marzo de 2010

CAML.net para Sharepoint: Haciendo consultas a campos fecha


CAML.Net nos permite realizar consultas contra las listas de Sharepoint. Pero los campos de fecha siempre son un problema si no sabes manejar las fechas adecuadamente. La clásica consulta de un campo fecha tiene el siguiente formato:
<Query>
   <Where>
      <Eq>
         <FieldRef Name='FechaInicio' />
         <Value Type='DateTime'>2010-03-24T00:00:00Z</Value>
      </Eq>
   </Where>
</Query>

El truco está en las posibilidades que hay para jugar con la fecha. El formato de la fecha, para quienes no lo sepan, está establecido por la norma ISO8601. Así que la forma más sencilla de pasar una fecha cualquiera (como por ejemplo el valor de DateTime.Now) a ese formato, es utilizando una de las funciones de las utilidades de Sharepoint, para lo cual al inicio de nuestra clase declaramos (en C#) using Microsoft.SharePoint.Utilities;

string strFechaHoy = SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Now);


Con esto, podemos tener una toda la query en un string para poder jugar con las fechas, quedándonos la Query  de la siguiente forma (en C#):

string tmpQuery = "";
tmpQuery +="<Query>";
tmpQuery +="<Where>";
tmpQuery +="<Eq>";
tmpQuery +="<FieldRef Name='FechaInicio' />";
tmpQuery +="<Value Type='DateTime'>" + strFechaHoy + "</Value>";
tmpQuery +="</Eq>";
tmpQuery +="</Where>";
tmpQuery +="</Query>";

Otra opción es utilizar las funciones nativas con las que podemos sumar o restar dias, meses o años desde la fecha actual. La más clásica es Today, que con su atributo OffsetDays nos permite sumar (y restar, si sumamos dias negativos) días. En este caso, la consulta quedaría asi:

<Query>
  <Where>
    <Eq>
      <FieldRef Name='FechaInicio' />
        <Value Type='DateTime'><Today OffsetDays='0'/></Value>
    </Eq>
  </Where>
</Query>

No hay comentarios:

Publicar un comentario