Mostrando entradas con la etiqueta CAML. Mostrar todas las entradas
Mostrando entradas con la etiqueta CAML. Mostrar todas las entradas

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>

17 de febrero de 2010

Sharepoint: Consultas CAML .NET en campos Lookup

CAML ó CAML.NET, que es su nombre correcto, es la tecnología que los desarrollares en .NET pueden utilizar para hacer consultas a las librerías de Sharepoint.

Cuando se crea en Sharepoint un campo de tipo búsqueda (en inglés lookup), Sharepoint almacena la información en dicho campo de la siguiente forma: ID;#Valor Relacionado .

Podría parecernos que una consulta típica sobre este campo debería ser de la siguiente forma:
<Query>
    <Where>
        <Eq>
                <FieldRef Name='Nombre del Campo' />
                <Value Type='Lookup'>Valor a buscar</Value>
        </Eq>
    </Where>
</Query>

El problema de esta consulta, es que tiene unos resultados extraños, ya que si hay más de un registro con el valor a buscar, sólo nos devuelve uno de los registros. O si hemos elegido un campo de búsqueda con multiples opciones, la consulta anterior nos puede dar resultados erroneos.

Para que funcione adecuadamente, lo mejor sería buscar todos los registros que contienen el ID que identifica el valor a buscar. Para poder hacer esto, habrá que indicar en la consulta que estamos buscando por ID y no por Valor, que es la búsqueda que realiza por defecto. Esto se indica con el atributo LookupId, poniéndolo a TRUE, en la etiqueta FieldRef. En ese caso, la consulta quedaría de la siguiente forma:
<Query>
  <Where>
    <Eq>
      <FieldRef Name=”Nombre del Campo” LookupId=”TRUE />
      <Value Type=”Lookup”>ID</Value>
    </Eq>
  </Where>
</Query>

23 de diciembre de 2009

Sharepoint: Consultas en CAML para Páginas de Publicación

En Sharepoint, hay unas páginas que se pueden crear para la publicación de contenidos de forma especial. Se crean con la feature de Publicación de Páginas y funcionan genial!! De forma automática, Sharepoint se encarga de realizar el filtrado de las páginas que se pueden ver según la fecha de inicio programada ("Scheduling Start Date") y fecha fin programada ("Scheduling End Date"). La dificultad surge cuando quieres hacer consulta a la librería de páginas para consultar cuales se encuentran vigentes: en este caso, debes filtrar del listado de páginas las que se encuentren vigentes, para lo cual debes incluir explicitamente los filtros correspondientes, como ocurre cuando realizar una consulta y obtienes los datos vía listadoPaginas.GetItems(consulta).

Para realizar la consulta, sin duda alguna, lo mejor es utilizar CAML.Net, que te permite realizar las consultas que necesites en las listas de Sharepoint (recordad que las páginas, pertenecen a la lista de páginas de un Sitio). Pero hay que tener en cuenta, que estas columnas son de un tipo particular de datos: PublishingScheduleEndDateFieldType y que hay que cuidar los nulos, porque tienen 2 características importantes: Inmediatamente y Nunca. El SDK dice que se utilizan los valores de fecha especial, pero no se comporta, en la realidad, exactamente de esta manera.

<Where>

   <And>
      <Or>
         <Leq><FieldRef Name='PublishingStartDate' /><Value Type='DateTime'><Today /></Value></Leq>
         <IsNull><FieldRef Name='PublishingStartDate' /></IsNull>
      </Or>
      <Or>
         <Geq><FieldRef Name='PublishingExpirationDate' /><Value Type='DateTime'><Today /></Value></Geq>
         <IsNull><FieldRef Name='PublishingExpirationDate' /></IsNull>
      </Or>
   </And>
</Where>

Hay que tener cuidado con el Content Query Web Part, porque no funciona correctamente con este tipo de dato. ¿El motivo? A saber, la cosa es que no funcionan correctamente.