WSS 3.0 & MOSS: Algunos Tips & Tricks (I)

Normalmente cuando trabajamos con una cierta tecnología, sucede que en el aprendizaje de la misma vamos adquiriendo ciertas recetas que nos pueden salvar la vida, dar respuesta a comportamientos no esperados o simplemente arreglar lo que parecía que no fallaba. Lógicamente, WSS 3.0 y MOSS cumplen estas “máximas” y en el tiempo que llevamos trasteando con ellos hemos ido aprendiendo ciertos truquillos útiles que desde el CIIN nos gustaría compartir con el resto de la comunidad de desarrolladores (y especialmente la comunidad de desarrolladores, usuarios, simpatizanters, … de Sharepoint) Con este post pretendemos iniciar una serie de artículos en la que os dejaremos algunos pequeños trucos o consejos para resolver problemas que habitualmente os podéis encontrar en proyectos de WSS 3.0 & MOSS, así como afrontarlos de la mejor manera posible. Empecemos.


Copiado de attachments entre listas de Sharepoint


En uno de los posts publicados sobre Sharepoint, mostramos como copiar datos entre listas utilizando un workflow. Este código, ligeramente modificado y depurado lo utilizamos en uno de nuestros proyectos. Sin embargo, había un escenario en el que no funcionaba como es debido. El código original (sin la parte de recorrido de los elementos de la lista origen) referente a la copia de attachmentes desde un elemento de la lista origen a un elemento de la lista destino era:





//Elementos de WSS 3.0 necesariosSPList splListaOrigen = web.Lists[workflowProperties.ListId];SPList splListaDestino = web.Lists[LISTA_DESTINO];SPField spfCampo;SPFile spfAttachment;SPAttachmentCollection spacAttachments; //Items origen y destino SPListItem spliItemACrear = splListaDestino.Items.Add();SPListItem spliItemActual = workflowProperties.Item;//… spacAttachments = spliItemActual.Attachments; k = 0; for (k = 0; k <= spacAttachments.Count – 1; k++) { spfAttachment = web.GetFile(spliItemActual.Attachments.UrlPrefix + spacAttachments[k]);

spliItemACrear.Attachments.Add(spfAttachment.Name, spfAttachment.OpenBinary());


}


Básicamente, para poder copiar los attachments necesitamos un objeto de tipo SPAttachmentCollection que inicializamos con los attachments asociados al item a copiar. Luego por cada attachment tenemos que realizar un copiado “físico” en el elemento de la lista destino para lo que necesitamos un objeto de tipo SPFile que inicializamos con el attachment en cuestión y que especificamos a partir de construir su path web (mediante la propiedad UrlPrefix de la propiedad Attachment de SPListItem y que contiene la colección de attachments del elemento de la lista) y el attachment correspondiente (para cada iteracción del bucle). Luego utilizando el método Add() de la propiedad Attachment añadimos el attachment en cuestión copiandolo en modo binario. Hasta aquí todo bien y el código funciona perfectamente para copiar elementos con attachemtns vinculados entre listas de un mismo site collection, entre listas de sites collections diferentes dentro de una misma web application, o entre listas pertenecientes a site collections de web applications diferentes. Ahora bien, hay un escenario en el que si se copian todas las propiedades de un elemento de una lista a otra, pero no los attachments asociados…¿sabéis cuál es el escenario que provoca el error?…pues uno muy común en proyectos de WSS 3.0 / MOSS: extender una Web Application (es decir, crear una réplica, con lo que si creamos un site collection en una de las web application se creará uno idéntico en la web application extendida) para implementar una solución basada en Sharepoint en la que tengamos varios modelos de autenticación.


Post_Tips_WSS_MOSS_1


Post_Tips_WSS_MOSS_2


Os preguntaréis cuál es el problema, y este no es otro que el path web que estamos utilizando para especificar el attachment a copiar es absoluto, lo que en un escenario en el que tenemos una aplicación web extendida producirá un error en la parte de la url que identifica la web application y que es diferente de la web application extendida, por lo que al copiar un item de una lista a otra los attachments no serán copiados. ¿Y la solución? Pues, y como ocurre cuando trabajamos con ficheros (buena práctica por toro lado), consiste en trabajar con paths relativos. Para el caso planteado en el post original en el que los items se pasaban de una lista a otra mediante un workflow (en negrita las diferencias):





for (k = 0; k <= spacAttachments.Count – 1; k++) {                                                               //Url tipo: /Lists/Solicitudes de Actuacin/Attachments/8///string sPath = spliItemActual.Attachments.UrlPrefix + spacAttachments[k];                 string sPath = workflowProperties.ListUrl + ATTACHMENTS_EXPRESSION + spliItemActual[ID_LISTA_FIELD] +PATH_SEPARATOR + spacAttachments[k];spfAttachment = web.GetFile(sPath)

spliItemACrear.Attachments.Add(spfAttachment.Name, spfAttachment.OpenBinary());

}

Como vemos, en lugar de utilizar un path web absoluto utilizamos uno relativo utilizando la propiedad ListUrl del objeto workflowProperties (y que contiene las propiedades de inicio del workflow, incluido el propio ítem de la lista que ha motivado el lanzamiento del workflow), le añadimos el identificador del elemento al que pertenece el attachment y finalmente el nombre del attachment concreto.


Listar los documentos check-out de una biblioteca utilizando CAML


Para los profanos en CAML, o Collaborative Application Markup Language, es un lenguaje basado en XML muy usado para construir y customizar sitios de Sharepoint. De hecho, muchas de las web parts de Sharpoint lo utilizan para mostrar datos, siendo el ejemplo quizás más claro la ListViewWebPart. Aparte de su utilidad para construir y customizar sitios de Sharepoint (lo que puede ser bastante infernal como nos comentaba Carlos Segura), podemos utilizar CAML para consultar información de listas de Sharepoint utilizando el objeto SPQuery que nos permite realizar consultas a listas y bibliotecas de Sharepoint aplicando filtros de selección. Por ejemplo, para consultar los documentos checkout de una cierta biblioteca:





            SPSite spSitio = new SPSite(“http://litwaredemo/sites/Desarrollo/”);            SPWeb spwWeb = spSitio.OpenWeb();            SPList splCalendario=spwWeb.Lists[“Calendario”];             string sFechaActual = SPUtility.CreateISO8601DateTimeFromSystemDateTime(DateTime.Today);                        string sConsulta = “<OrderBy><FieldRef Name=’Title’/></OrderBy>” +                                “<Where><Geq><FieldRef Name=’EventDate’/>” +                                “<Value Type=’DateTime’>” + sFechaActual +                                 “</Value></Geq></Where>”;             SPQuery spqConsulta = new SPQuery();            spqConsulta.Query = sConsulta;             SPListItemCollection splicEventosCalendario =

                                 splCalendario.GetItems(spqConsulta);


En este ejemplo estamos consultando todos los eventos de una lista de tipo Calendar en la que el campo EventDate coincide con la fecha actual. La forma de operación de la consulta es similar a lo que conocemos en un acceso tradicional a datos:



  • Definimos la consulta “pegada” en código.
  • Creamos un objeto SPQuery y especificamos a través de la propiedad Query que la consulta sea la indicada.
  • Asignamos a un objeto de tipo SPListItemCollectio el resultado de ejecutar la consulta CAML sobre la lista Calendario a través del método GetItems().

Y hasta aquí llega el primer post de truquillos y recetas a la hora de trabajar con WSS 3.0 & MOSS. Espero que os resulte interesante.

Publicado por

Juan Carlos González

Juan Carlos es Ingeniero de Telecomunicaciones por la Universidad de Valladolid y Diplomado en Ciencias Empresariales por la Universidad Oberta de Catalunya (UOC). Cuenta con más de 12 años de experiencia en tecnologías y plataformas de Microsoft diversas (SQL Server, Visual Studio, .NET Framework, etc.), aunque su trabajo diario gira en torno a SharePoint & Office 365. Juan Carlos es MVP de Office Servers & Services desde 2015 (anteriormente fue reconocido por Microsoft como MVP de Office 365 y MVP de SharePoint Server desde 2008 hasta 2015), coordinador del grupo de usuarios .NET de Cantabria (Nuberos.Net, www.nuberos.es), co-fundador y coordinador del Grupo de Usuarios de SharePoint de España (SUGES, www.suges.es), así como co-director de la revista gratuita en castellano sobre SharePoint CompartiMOSS (www.compartimoss.com). Hasta la fecha, ha publicado 8 libros sobre SharePoint & Office 365 y varios artículos en castellano y en inglés sobre ambas plataformas.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *