SSD: el síndrome de la Sharepoint dependencia

Sharepoint me proporciona seguridad y me hace sentir más fuerte. Las 10 cosas que más me gustan de Sharepoint.

10 puntos para entender a Project Server 2010

Microsoft Project es quizá la herramienta de gestión de proyectos más conocida y utilizada por los líderes de proyectos...

Diseño Gráfico en SharePoint

Serie de artìculos que nos ayudan a incorporar diseño gráfico en las implementaciones de SharePoint...

Revista CompartiMOSS

Artículos publicados en la revista especializada en SharePoint: CompartiMOSS.

Contacto

Enviame un correo :-)

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

domingo, 9 de febrero de 2014

Ejemplos de CAML en Client Object Model (JavaScript)

Introducción

El modelo de objetos de cliente de SharePoint ha sido una gran incorporación en SharePoint 2010. Nos permite consultar información de listas, utilizando sólo un poco de código JavaScript. No se requiere desarrollo a nivel de servidor, ni permisos especiales en la granja de SharePoint.

Uno de los usos más comunes, que al menos yo le he dado, es consultar información de listas, para luego desplegarla  utilizando diferentes formas de presentación gráfica. Para ello, suelo utilizar consultas en lenguaje CAML. CAML tiene sus particularidades. En este breve artículo voy a presentar algunos ejemplos que me han resultado útiles.

En caso que nunca hayan utilizado Client Objetc Model, quizá sea conveniente que lean una introducción: http://surpoint.blogspot.com/2011/10/introduccion-al-modelo-de-objetos-de.html

 

Caso 1: empezando…

En el primer ejemplo, vamos a mostrar un caso completo. En los siguientes mostraremos sólo las variaciones. Imaginemos que necesitamos hacer una consulta simple, en donde veremos:

·         Cómo ordenar elementos

·         Cómo indicar qué columnas mostrar

·         Cómo indicar que queremos traer sólo una fila

 

function cargar_noticia_destacada() {

 contexto = new SP.ClientContext.get_current();

 var lista = contexto.get_site().get_rootWeb().get_lists().getByTitle('Noticias');

 var query = new SP.CamlQuery();

 var consulta =

  '<View>' +

  // Ordenada por fecha de cración (ID) descendente

  '<Query><OrderBy><FieldRef Name ="ID" Ascending="FALSE"/></OrderBy></Query>' +

  // Una sóla noticia

  '<RowLimit>1</RowLimit>' +

  '<ViewFields>' + 

  '<FieldRef Name="ID"/><FieldRef Name="Title"/><FieldRef Name="Resumen"/><FieldRef Name="Imagen_x0020_destacada"/>' +

  '</ViewFields>' +

  '</View>';

 query.set_viewXml(consulta);

 this.items = lista.getItems(query);

 contexto.load(items);

 contexto.executeQueryAsync(Function.createDelegate(this, this.cargaok_noticia_destacada), Function.createDelegate(this, this.cargamal));

}

 

En la siguiente función vemos  cómo procesar los ítems leídos. Esto por supuesto depende de nuestra página, pero lo muestro para que tengan un ejemplo de cómo se haría.

 

function cargaok_noticia_destacada(sender, args) {

var itemslista = this.items.getEnumerator();

while (itemslista.moveNext()) {

 var elitem = itemslista.get_current();

 var strHtmlImg  = elitem.get_item('Imagen_x0020_destacada').get_url();  

 var strHtmlTxt  ='<span class="h1">&gt; ' + elitem.get_item('Title') + '</span><br /><br />' + elitem.get_item('Resumen');

 var strHtmlBtn2 ='<a target="_self" href="javascript: AbrirVentanaModal(\'' + window.location.href.replace("/default.aspx","") + '/lists/Noticias/DispForm.aspx?ID=' + elitem.get_item('ID') + '&source=' + window.location.href + '\');"/>';  

 var strHtmlBtn1 ="<a href='" + window.location.href.replace("/default.aspx","") + '/lists/Noticias/' + "'/>";  

 }

// Imagen

$("#general_modulo1_img img").attr("src",strHtmlImg);

// Título y resumen

document.getElementById("general_modulo1_txt").innerHTML = strHtmlTxt  ;

// Noticia completa

$('#general_modulo1_btn td:nth-child(2) img').each(function() {

$(this).wrap(strHtmlBtn2);

       });

// Más noticias

$('#general_modulo1_btn td:nth-child(1) img').each(function() {

    $(this).wrap(strHtmlBtn1 );

});

$('#general_modulo1_btn td:nth-child(1) img').css("border","none");

}

 

Y finalmente nuestra rutina de error:

function cargamal(sender, args) {

alert('ERROR: ' + args.get_message() + '\n' + args.get_stackTrace());

}

 

Caso 2: agregando una condición

En este segundo ejemplo, vamos a ver cómo agregar una condición de igual sobre un campo de tipo texto:

'<Query><Where><Eq><FieldRef Name="Mostrar_x0020_en_x0020_p_x00e1_g"/><Value Type="Text">Si</Value></Eq></Where><OrderBy><FieldRef Name ="ID" Ascending="FALSE"/></OrderBy></Query>'

 

Caso 3: filtro por fecha actual

Supongamos ahora que queremos filtrar un campo fecha, comparándolo con la fecha del sistema. Veremos que necesitamos indicar el tipo de campo, e indicarle que no compare usando la hora:

'<Query><Where><Eq><FieldRef Name="Fecha"/><Value Type="DateTime" IncludeTimeValue="FALSE"><Today /></Value></Eq></Where></Query>'

 

Caso 4: filtrando entre fechas

Nuevamente compararemos con la fecha de sistema, pero esta vez, una comparación entre dos fechas:

'<Query><Where><And><Leq><FieldRef Name="Desde"/><Value Type="DateTime" IncludeTimeValue="FALSE"><Today/></Value></Leq><Geq><FieldRef Name="Hasta"/><Value Type="DateTime" IncludeTimeValue="FALSE"><Today/></Value></Geq></And></Where><OrderBy><FieldRef Name ="ID" Ascending="FALSE"/></OrderBy></Query>'

 

Caso 5: filtro por campo calculado

En el siguiente ejemplo, mostraremos cómo filtrar cuando nuestra columna es un campo calculado:

'<Query><Where><Eq><FieldRef Name="Apellido_x0020_y_x0020_nombre" /><Value Type="Computed">' + persona_seleccionada + '</Value></Eq></Where></Query>'

                              

Caso 6: filtro por campo de búsqueda

En este otro caso, vemos como filtrar en campos de búsqueda:

'<Query><Where><Eq><FieldRef Name="Usuario" LookupId="TRUE"/><Value Type="Lookup">' + usuario_conectado + '</Value></Eq></Where></Query>'

 

Caso 7: fecha ingresada por pantalla

Finalmente veremos un caso en donde necesitamos comparar contra una fecha ingresada por pantalla. El truco aquí es el formato de la fecha, el cual debemos formatear así:

var desde = ISODateString(Pdesde);

var hasta = ISODateString(Phasta);

 

La función utilizada es:

function ISODateString(d){

  function pad(n){return n<10 ? '0'+n : n}

  return d.getUTCFullYear()+'-'

      + pad(d.getUTCMonth()+1)+'-'

      + pad(d.getUTCDate())+'T'

      + pad(d.getUTCHours())+':'

      + pad(d.getUTCMinutes())+':'

      + pad(d.getUTCSeconds())+'Z'

}

Por último, el CAML para comparar las fechas ingresadas con las registradas en la lista:

'<Query><Where><And><Leq><FieldRef Name="Fecha"/><Value Type="DateTime" IncludeTimeValue="TRUE">' + hasta + '</Value></Leq><Geq><FieldRef Name="Fecha"/><Value Type="DateTime" IncludeTimeValue="FALSE">' + desde + '</Value></Geq></And></Where></Query>'

 

Conclusión

La utilización de Client Object Model de JavaScript nos brinda una forma muy sencilla de consultar información y mostrarla en una página de diferentes formas. En este breve artículo hemos mostrado algunas variantes del lenguaje de consulta CAML para entender cómo se aplican diferentes condiciones. Espero que les haya resultado útil. Hasta la próxima!

 

 

Juan Pablo Pussacq Laborde

SharePoint MVP

Blog: http://surpoint.blogspot.com/

Facebook: http://facebook.com/surpointblog/

Twitter: http://twitter.com/jpussacq/

 

Artículo publicado originalmente en: http://www.compartimoss.com/revistas/numero-17/ejemplos-caml-client-object-model-javascript

jueves, 26 de enero de 2012

JOIN en CAML en #Sharepoint 2010

Les recomiendo que lean este artículo en donde nos explican como trabajar con joins dentro de CAML en Sharepoint 2010:

http://blogs.msdn.com/b/kaevans/archive/2012/01/20/sharepoint-2010-caml-list-joins.aspx

Hasta la próxima!

miércoles, 26 de enero de 2011

Consultando listas de SharePoint usando CAML

Les dejo el enlace a un viejo artículo que explica con bastante detalle como consultar datos de listas usando CAML. Muy interesante!

El artículo es de SharePoint Magazine y pueden encontrarlo aquí: http://sharepointmagazine.net/articles/writing-caml-queries-for-retrieving-list-items-from-a-sharepoint-list.

imageTranscribo el índice:

  • Introduction
  • Building de CAML
    • Operators
    • Fields
    • Value
  • Retrieving List Items with CAML using the SharePoint Object Model
  • Retrieving List Items with CAML using the SharePoint Web Services
    • Retrieving List Items from the Lists.asmx using Visual Studio 2005
    • Retrieving List Items from the Lists.asmx using Visual Studio 2008
  • Query Options
    • RowLimit
    • IncludeMandatoryColumns
    • DatesInUtc
    • ExpandUserField
  • Special Types of Queries
    • Building queries for working with Folders
    • Building Queries for working with DateTime Values
    • Building Queries for Calendar Lists

Hasta la próxima!

lunes, 11 de octubre de 2010

Sobre LINQ y CAML

Interesante artículo desde SkunkWorks SharePoint Portal en donde Gustavo Velez nos muestra como una consulta de SharePoint 2010 creada con LINQ, internamente se convierte a CAML.

El método .log es el que nos permite extraer porpantalla el CAML tal como se ve en esta imagen:

image

Vean el artículo completo en: http://www.gavd.net/servers/sharepointv4/spsv4_item.aspx?top=1&itm=1104.

miércoles, 30 de junio de 2010

SharePoint lookup filter 2007 y 2010

SharePoint lookup filter es un proyecto de CodePlex que permite filtrar los datos de un campo lookup. Soporta, entre otras, las siguientes funcionalidades:

  • Cross site lookup
  • Filtros en lookups usando vistas
  • Filtros en lookups usando CAML

Enlaces para descargas:

Algunas imágenes del proyecto:

FieldTypeList.jpg
FieldProp_Q2.jpg
FieldProp_V.jpg

En 2010...

Hasta la próxima, que les sea útil!

lunes, 26 de abril de 2010

U2U CAML Query Builder

Todos los que trabajamos en la parte de desarrollo de SharePoint hemos tenido que lidiar con con la construcción de consultas en CAML.

image Para los que aún no lo conocen, existe una herramienta que nos ayuda en esta tarea: U2U CAML Query Builder. Es una buena herramienta, personalmente la he usado infinidad de veces y gracias a ella he podido optimizar el tiempo de desarrollo.

Les dejo algunas imágenes y el enlace para descargarla. Que la disfruten!

Descarga: http://www.u2u.be/res/Tools/CamlQueryBuilder.aspx

image image image

miércoles, 14 de abril de 2010

SharePoint Manager 2007 / 2010

03170127_small.jpgPara los que no la conocen, les presento esta herramienta creada por Carsten Keutmann, que nos permite explorar el modelo de objetos de SharePoint.

Nos habilita a navegar todos los sitios de nuestra granja y ver todas las propiedades (y editarlas). Es Open Source y podemos alterar desde el Portal hasta un Ítem. Realmente poderosa.

Pueden descargar la herramienta desde http://spm.codeplex.com/.

Gracias a VladPoint por facilitarme esta información.

jueves, 17 de diciembre de 2009

Manejadores de eventos en SharePoint

Los manejadores de eventos constituyen una de las funcionalidades más sencillas de utilizar a la hora de extender nuestras aplicaciones de SharePoint a través del desarrollo. Básicamente permiten agregar comportamiento a nuestra aplicación e implementar reglas de negocio.
Este post pretender describir todos los aspectos de esta técnica, desde la parte conceptual hasta la parte de código con algunos ejemplos en Visual Studio. Está basado en el webcast que dicté el 16/12/2009. Como siempre, espero que les sea útil.

WebCast

Si desean ver el webcast, pueden hacerlo desde:
Si desean ver la presentación que utilicé en el webcast pueden verla aquí:

Introducción

Los manejadores de eventos permiten extender a través de desarrollo una aplicación SharePoint. Agregan comportamiento a listas e ítems entre otros. Un manejador de evento se ejecuta automáticamente como respuesta a un evento como agregar una columna en una lista o modificar un ítem en una lista. Pueden servir para:
  • Validaciones de datos
  • Control de integridad referencial
  • Control de unicidad
  • Ejecución de procesos de negocio
  • Lo que no puede resolver un campo calculado
  • Protección de la parametrización
  • Cambios en la seguridad
  • Controles de seguridad funcional
Si conocen triggers de base de datos, verán que tienen un cierto parecido. Si bien son más potentes, podríamos decir que todo lo que se hace con un trigger, puede hacerse con un evento en SharePoint. Esto puede darles una idea del potencial de esta técnica.

¿Qué eventos maneja SharePoint?

El siguiente gráfico resume los eventos soportados por SP. Pueden observar que existen eventos a nivel de ítems de lista (los que se parecen a los triggers), pero también eventos a nivel de lista, sitio, colección de sitio o característica:
image

Imaginen lo que se puede hacer...

A continuación les daré algunas ideas de lo que se puede hacer con eventos. Son sólo ideas. Es mucho más lo que se puede hacer, pero les servirá de inspiración. Lo importante es que realmente resuelven temas que no existen en SP "out of the box", en forma bastante sencilla:
image

Tipos de eventos ¿antes o después? ¿sincrónicos o a-sincrónicos?

Es importante aclarar que existen dos tipos de eventos, los que se ejecutan antes de que se efectúe el "commit" de la transacción en la base de datos de contenido y los que se disparan luego de que se ejecute el "commit". Los primeros son sincrónicos, los segundos a-sincrónicos (en SP 2007, en 2010 es configurable).
image
El siguiente es el mapa completo de todos los eventos que SP 2007 maneja, incluye sus variantes sincrónicas y a-sincrónicas:
image

Evento o Flujo de Trabajo

Por sugerencia de Angel Acha Lizama luego del webcast, me pareció importante incluir una breve comparación entre Eventos y Flujos de trabajo porque son técnicas que tienen algún punto en común y el lector podría encontrar difícil la decisión de cuál usar en cada caso.
En líneas generales tengan en cuenta que un flujo de trabajo suele tener interacción con los usuarios a través de pantallas, puede perdurar en el tiempo (días, semanas, meses, etc.) y requiere persistir la información.
Un evento responde a una transacción y se ejecuta en el momento, no tiene pantallas asociadas, su duración es breve y no debe ser retomado luego de un tiempo, como sucede con un flujo de trabajo.
Les dejo este enlace que me pasó Angel, si quieren ampliar el tema: http://msdn.microsoft.com/en-us/library/ee413841.aspx

Pasos para crear un evento

La siguiente lámina muestras los pasos que se deben seguir para crear un evento. No estamos usando ninguna herramienta, ni extensión para SharePoint que nos facilite la creación, con el fin de explicar los conceptos básicos.
image

Paso 1: crear el proyecto

Si necesitan ayuda con este paso, les dejo este enlace que lo explica en forma detallada: http://sharepoint-puntodeencuentro.blogspot.com/2008/09/registrar-un-evento-mediante-una.html

Paso 2: definición de una clase

Ejemplo muy sencillo de definición de clase, cuyo objetivo es impedir que un administrador agregue columnas en una lista:
image

Paso 3: binding

Existen dos formas de vincular la definición de una clase de un evento a una entidad (lista, característica, etc): 1) a través de XML dentro de una característica y 2) programáticamente. Estas dos formas apuntan a objetivos distintos. A continuación veremos dos ejemplos:
Binding XML
image

Observaciones
  • Sólo pueden registrarse en características cuyo ámbito sea «site».
  • Sólo se puede registrar el evento para un «tipo de lista», no para una lista en particular.
  • También se puede registrar eventos para tipos de contenidos o features.
  • «SequenceNumber» indica el órden cuándo tengo más de un evento.
Binding en forma programática
A diferencia de la opción vía XML, nos permite vincular un evento a una lista específica, en lugar de a un tipo de lista. Ejemplo:
image





Demostraciones



A continuación dejamos el código fuente de las demostraciones que presentamos en el webcast. Tengan en cuenta que se trata de un prototipo, no una aplicación final, por lo cual nos hemos tomados algunas licencias para escribir código y notarán algunas desprolijidades.







Demo 1: completando una columna en un evento de ítem



Este ejemplo muestra como completar un campo dentro de un evento. En el código pueden ver dos ejemplo, un caso común para el campo "Proyecto" y otro para un campo de tipo URL, el campo "Actividad".





image







Demo 2: validando integridad en un evento de ítem


El siguiente ejemplo muestra cómo validar "unicidad" de una columna y cancelar la operación, emitiendo un mensaje al usuario, en caso que no se cumpla esta restricción.





imageimage 








image










Demo 3: ejecutando un proceso de negocio en un evento de ítem


Este ejemplo muestra cómo a partir de la creación de un ítem, se dispara la creación de ítems en otra lista. Muestra cómo se leen los datos de la lista origen, cómo se recorren esos datos y como se crean los ítems en la lista destino.











imageimage image













Demo 4: ejecutando un evento al instalar una característica


Este último ejemplo nos muestra un ejemplo de evento para una característica. El objetivo es hacer cambios de estilos en SharePoint. Para una explicación más amplia pueden consultar este enlace: http://surpoint.blogspot.com/2009/07/cambios-de-estilos-en-sharepoint.html.











image







Paso 4: instalar


No voy a bajar a detalle con este paso, pero quería dejarles el contenido del ."bat" en dónde se muestra la instalación de la dll en la GAC, el copiado de los archivos XML y la instalación de la característica en SharePoint:










image







SharePoint 2010


El siguiente gráfico resume las novedades en SharePoint 2010 respecto a eventos. Lo más importante es saber que hay algunos eventos nuevos, pero fundamentalmente que los eventos "before" pueden ser sincrónicos o a-sincrónicos. Al final de este artículo les dejo un enlace por si necesitan ampliar este tema.







image


Un tema relacionado que no debemos dejar pasar es que SP 2010 agrega el concepto de validación de campos "Out of the box". Esto es mucho más sencillo de usar que programar un evento para validar de datos. La validación se arma con fórmulas similares a la de los campos calculados y es posible especificar el mensaje de error para el usuario. Estas validaciones se pueden crear a nivel de columnas de sitio, o columnas dentro de una lista.










image






Fin


Aquí termino. Espero que les haya sido útil y lo hayan disfrutado. Hasta la próxima!







Bibliografía y enlaces interesantes


image Libros




  • Inside Microsoft Windows SharePoint Services 3.0 (Chapter 6)
  • By Ted Pattisonand & Daniel Larson (Microsoft Press)


Artículos










jueves, 5 de noviembre de 2009

Trabajando con tipos de contenido en SharePoint

Según Microsoft TechNet un tipo de contenido define los atributos de un elemento de la lista, documento o carpeta. Cada tipo de contenido puede especificar: propiedades, flujos de trabajo, eventos, plantillas de documentos y otras características personalizadas.

Una explicación mía, menos ortodoxa, define a los tipos de contenido como algo muy parecido a los subtipos y supertipos de un modelo de entidad relación. El clásico ejemplo de Empleado Contratado y Empleado en Relación de dependencia puede definirse en forma muy simple en SharePoint, logrando con muy poco esfuerzo pantallas para cada tipo de empleado con sus columnas asociadas.

Este artículo trata sobre la creación de tipos de contenido en forma programática…

Introducción

Los tipos de contenidos trabajan bajo el principio de la herencia. No es posible crear un tipo de contenido desde cero, debe heredar de un tipo de contenido base. Una primera definición al crear un tipo de contenido consiste en definir si será utilizado en listas o librerías de documentos. Los tipos de contenido para librerías de documentos soportan como adicional la posibilidad de especificar plantillas de documentos, por ejemplo en Word.

Como punto final, es importante saber que los tipos de contenido pueden definir también el comportamiento, a través de flujos de trabajo y manejadores de eventos.

Crear un tipo de contenido usando CAML

Para crear un tipo de contenido es necesario haber creado previamente las columnas de sitio. Para cada columna de sitio que incluiremos en nuestro tipo de contenido, debemos incluir un elemento FIELDREF, que defina el GUID y el NAME de la columna, Opcionalmente podemos definir un DISPLAYNAME distinto a NAME.

<Elements xmlns="http://schemas.microsoft.com/sharepoint/">

  <ContentType ID=""

    Name="EmpleadoContratado"

    Description="Crear un nuevo empleado contratado"

    Version="0"

    Group="Tipos de contenido de SurPoint" >

    <FieldRefs>

     <FieldRef ID="{}" Name="Title" DisplayName="Empleado" Sealed="TRUE" />

     <FieldRef ID="{}" Name="Legajo" DisplayName="Legajo" />

    </FieldRefs>

  </ContentType>

</Elements>

El ID especifica el identificador del tipo de contenido y está diseñado para ser recursivo. Cada identificador de tipo de contenido contiene el identificador del tipo de contenido primario, el cual contiene a su vez el identificador del elemento primario de dicho tipo de contenido y así sucesivamente hasta llegar al identificador de tipo de contenido del sistema, inclusive. Mediante el análisis del identificador de tipo de contenido, puede determinar qué tipos de contenido hereda el tipo de contenido y cómo están relacionados dos tipos de contenido [MSDN: Identificadores de tipo de contenido].

La siguiente imagen muestra la jerarquía de tipos de contenido. Más información en: MSDN: Jerarquía de tipos de contenido base.

image

Asociar un tipo de contenido a una lista

Se puede asociar uno o varios tipos de contenido a una lista en el momento de la definición de la misma utilizando el elemento ContentTypes:

<ContentTypes>

  <ContentTypeRef ID = "Text">

    <Folder

     TargetName="Text">

    </Folder>

  </ContentTypeRef>

  ...

</ContentTypes>

ContentTypeRef establece la referencia al tipo de contenido que queremos asociar con la lista.

Control de cambios en tipos de contenido

Pueden establecer un tipo de contenido como sólo lectura, lo cual genera una advertencia para el usuario, pero no impiden que cambie este parámetro.

Otra alternativa es sellar los tipos de contenido (atributo Sealed), lo cual impide los cambios. El usuario debería ser administrador de la colección de sitios para modificar este parámetro.

Más información en: MSDN: Control de cambio de tipos de contenido

Links interesantes

FIN

Como verán, el tema es bastante amplio. Finalizo este artículo aquí para dejarles una primera introducción como base.

Como siempre, espero que les sea útil y que lo disfruten..