SharePoint 2010: Mejoras en Web Content Management (II)!

Siguiendo con la serie de posts sobre mejoras en Web Content Management (WCM) en SharePoint 2010 (puedes ver el primer post de la serie aquí), en esta ocasión os voy a enumerar otras características nuevas presentes y que mejoran la experiencia de WCM con respecto a SharePoint 2007:

  • Soporte para bibliotecas de páginas grandes ya que se añade el soporte de carpetas en este tipo de bibliotecas algo que en SharePoint 2007 no teníamos.
  • Desde una página en la que estamos trabajando tenemos la posibilidad de mediante un único clic comprobar otros elementos no publicados en nuestro sitio:
    • Al ejecutar la correspondiente opción en la Ribbon se inicia el proceso de comprobación que concluye indicando aquellas secciones dónde tenemos elementos no publicados y además genera un informe en el que se detallan las secciones encontradas.
image image
  • El organizador de contenidos que nos permite configurar rulas para distribuir el nuevo contenido que se vaya generando de forma que se almacene en las ubicaciones especificadas.
  • Otras funcionalidades interesantes disponibles en la Ribbon como:
    • Conocer los enlaces entrantes en la página actual.
    • Visualizar una vista previa de la página actual.

image

Y hasta aquí llega este segundo post sobre mejoras en WCM en SharePoint 2010.

SharePoint 2010: Febrero es el mes de los eventos de SharePoint…y si no mira ;-)!

Como decía hace unos meses: SharePoint está de moda y nadie lo pone en duda Guiño…y si no, fijaros la cantidad de eventos que tenemos previstos para el mes de febrero sobre nuestro servidor favorito…ni que decir tiene que espero veros por alguno:

SharePoint2010_thumb

Office 2010 & SharePoint 2010: Disponible la versión 1.3 de los Parsers de monitorización de red!

Ya tenemos disponible para descarga la versión 1.3 de los Office and SharePoint Products Network Monitor Parsers que permiten examinar y analizar con mayor detalle el tráfico de red generado por SharePoint facilitando la identificación de posibles problemas, monitorizar las comunicaciones de los protocolos de SharePoint o tener un mayor detalle del t´trafico generado. Podéis encontrar más información de los parsers en este enlace.

SharePoint2010_thumb

SharePoint 2010: Actualizar o no actualizar, el eterno debate!

Sin duda, esta es una de las preguntas que más frecuentemente uno se hace cuando se entera que hay una nueva cumulative update (CU) de SharePoint y sobre todo cuando en los entornos de SharePoint con los que se trabaja hay algún problema grave que se espera que dicha CU solucione. Pero claro, la pregunta clave es: ¿instalamos la CU en nuestros entornos justo cuando esté disponible para descarga? La respuesta es que sí y no. Sí en cuanto a que la  podemos instalar en algún entorno de pruebas cuya pérdida no nos ocasione ningún prejuicio y podamos así testear los efectos de la instalación de la CU en cuanto a que solucione problemas y sobre todo que no introduzca otros no esperados. No en cuanto a que no es conveniente instalar la CU en entornos de producción de forma inmediata, al menos hay que esperar a que estemos seguros de que su instalación no nos va a producir ningún problema en dichos entornos gracias a las pruebas realizadas y a que ha pasado un tiempo prudencial que indique que podemos proceder a la instalación y no nos encontremos con sorpresas como está: SharePoint 2010- Importante, no instaléis la CU de octubre de 2010!. En cualquier caso, mi recomendación con respecto a las CUs es la siguiente:

  • Realizar un test exhaustivo de las mismas en varios entornos de pruebas (mejor opción que hacerlo sólo en uno).
  • Esperar a un tiempo prudencial por si Microsoft o terceros encuentran algún issue importante con la CU (que no deja de ser un paquete que contiene un conjunto de parches y hotfixes creados por el equipo de SharePoint).
  • Sólo entonces, pensar si es vital instalar la CU en el entorno de producción o podemos permitirnos esperar a que llegue el correspondiente Service Pack (SP).

En cualquier caso, os dejo un excelente artículo en el que se discute este tema en profundidad:

http://www.chandima.net/Blog/archive/2011/01/21/sharepoint-server-updates-for-sp2010-aka-cumulative-updates%e2%80%93should-i-apply-them.aspx

SharePoint2010_thumb

SharePoint 2010: ¿Es una alternativa de solución de BD?

Como sabéis, SharePoint está completamente basado en SQL Server de ahí que muchas veces surja la pregunta de si es una alternativa de solución de Base de Datos comparado con otras posibilidades que ofrece Microsoft como es el propio SQL Server, SQL Azure o Microsoft Office Access. La respuesta es que depende, y depende de factores más de negocio como pueden ser los requerimientos de la solución a modelar, la facilidad a la hora de modelar soluciones, la agilidad para el uso de las soluciones creadas, … pero también de factores más puramente técnicos como la disponibilidad, la escalabilidad, la seguridad, … Por suerte, de vez en cuando nos encontramos con estupendos WhitePapers que ayudan a tener una perspectiva más clara de cuando interesa usar una tecnología u otra y que nos dan pautas que facilitan la elección de la tecnología de BD a usar. Os dejo la referencia al post del equipo de Microsoft Access en el que localice el WhitePaper Microsoft Database Solutions.

SharePoint2010_thumb

SharePoint 2010: Como crear un informe de SSRS a partir de una lista de SharePoint con parámetros!

Una de las grandes novedades de SQL Server Reporting Services 2008 R2 (SSRS 2008 R2) es que posibilita la creación de informes a partir de listas tanto de SharePoint 2007 como de SharePoint 2010 ya sea utilizando el diseñador de informes o el Business Intelligence (BI) Management Studio. Esto es posible gracias a que se ha añadido un nuevo origen de datos de tipo “Lista de Microsoft SharePoint”, lo que sin duda es un valor añadido sobre todo cuando tenemos escenarios de SSRS 2008 R2 integrado con SharePoint 2010. En este artículo os mostraré como crear un informe con parámetros utilizando un origen de datos definido a partir de una lista de SharePoint 2010:

  • Desde una biblioteca de documentos de SharePoint configurada para usar el tipo de contenido del diseñador de informes, ejecutamos el diseñador.
  • Creamos un origen de datos basado en una lista de Microsoft SharePoint indicando los datos necesarios para la cadena de conexión: Url del sitio y credenciales de acceso.
  • Creamos un conjunto de datos (dataset) basado en el origen de datos definido y lanzamos el diseñador de consultas. En este diseñador seleccionamos la lista con la que vamos a trabajar y los campos que mostraremos en el informe.
  • Para añadir un parámetro, pulsamos el botón con la imagen de filtro que aparece en la sección “Filtros aplicados” del diseñador.
  • Aquí podremos seleccionar el campo en el que basar el parámetro, el operador a aplicar, el valor por defecto y lo más importante, marcar que este filtro será un parámetro a utilizar en la visualización del informe.
image image image
  • Antes de seguir, podemos hacer una ejecución de la consulta generada e incluso visualizarla.
  • Esta consulta, como ya sabemos, es una consulta de tipo CAML que en este caso incorpora un filtro en base al parámetro añadido.
image image image
  • El detalle de la consulta CAML generada en este caso es el siguiente:
   1: <RSSharePointList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

   2:   <ListName>Ventas x Zona</ListName>

   3:   <ViewFields>

   4:     <FieldRef Name="Title" />

   5:     <FieldRef Name="Modelo" />

   6:     <FieldRef Name="A_x00f1_o" />

   7:     <FieldRef Name="Ventas" />

   8:   </ViewFields>

   9:   <Query>

  10:     <Where>

  11:       <Contains>

  12:         <FieldRef Name="Title" />

  13:         <Value Type="Text">

  14:           <Parameter Name="Zona" />

  15:         </Value>

  16:       </Contains>

  17:     </Where>

  18:   </Query>

  19: </RSSharePointList>

  • Una vez que tenemos creado el conjunto de datos, ya podemos crear nuestro informe utilizando alguno de los asistentes del diseñador o bien desde cero. En el caso del asistentes, se facilita mucho la ubicación de los campos de detalle, agrupamiento, etc y el aspecto visual del informe.
  • Concluido el asistente, se muestra el informe diseñado al que podemos aplicarle algún formato adicional.
  • Ejecutamos el informe y como era de esperar, aparece el parámetro definido.
image image image
  • Finalmente, guardamos el informe en el sitio de SharePoint y comprobamos que la ejecución es correcta en el navegador y que el parámetro se comporta como hemos indicado.

image

SharePoint 2010: Como usar Entity Framework al crear un modelo de BDC!

Cómo sabéis y ya he comentado en este blog, en SharePoint 2010 tenemos grandes mejoras a la hora de integrar datos de sistemas externos mediante los Business Connectivity Services (BCS). Para integrar estos datos, tenemos dos entornos posibles:

  • SharePoint Designer 2010 (SPD 2001).
  • Visual Studio 2010 (VS 2010).

De los dos entornos, sin duda es VS 2010 el que permite modelar escenarios más complejos y nos da cierta flexibilidad a la hora de crear modelos de BDC que nos faciliten la integración de esos sistemas externos. En el caso de que queramos integrar datos de una BD, lo más lógico es intentar usar Entity Framework (EF) para facilitar el modelado de operaciones como listar elementos, visualizar elemento, crear elemento, actualizar elemento o borrar elemento. Si os lanzáis a crear un modelo de EF y lo usáis en el modelo de BDC os encontraréis conque al desplegarlo (al contrario de lo que pasa con un modelo de LINQ To SQL) y probarlo el BCS no se puede conectar a la BD porque no encuentra la cadena de conexión correspondiente…pero como casi siempre, todo problema tiene solución:

  • La primera opción, y para hacer pruebas rápidas, pasa por añadir la cadena de conexión al archivo web.config (acordaros de hacer una copia de seguridad antes) de la aplicación web dónde vais a probar el conector de BDC creado:
   1: <connectionStrings>

   2:   <add name="CRM_BDEntities" connectionString="metadata=res://*/ContactosModel.ContactosModel.csdl|res://*/ContactosModel.ContactosModel.ssdl|res://*/ContactosModel.ContactosModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=.;initial catalog=CRM_BD;integrated security=True;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" />

   3: </connectionStrings>

  • La segunda y mejor opción, aunque hay que tener mucho cuidado, es añadir esta cadena de conexión de forma programática al web.config en el momento de activación de la feature que despliega el modelo. Un ejemplo de esto lo tenéis en este enlace.

SharePoint 2010: + iFilters (pero de pago)!

Hace un tiempo os comentaba desde dónde os podíais descargar una serie de iFilter disponibles para Office 2010. Como sabéis, estos iFilters nos permiten buscar dentro de los documentos con la extensión para la que aplican. Aparte de los iFilter de Office que vienen por defecto en la plataforma, tenemos otros iFilters gratuitos como puede ser el de Adobe para documentos PDF, y otros de pago que nos permiten ir todavía más allá. En este sentido, os quería dejar una página de una empresa especializada en iFilters de pago que seguramente cubran escenarios no tan habituales en cuanto a búsqueda de información como puede ser el caso de documentos CAD: http://www.ifiltershop.com/products.html

image

SharePoint 2010: Nueva release del proyecto CKS para SharePoint!

Ya tenemos para descarga una nueva release del proyecto CKS (Community Kit for SharePoint) disponible para descarga en Codeplex y a través del Extension Manager de Visual Studio. Este proyecto es sin duda un gran ejemplo de como podemos extender Visual Studio 2010 con nuevas funcionalidades aplicadas al desarrollo para SharePoint 2010 en este caso. Las novedades de esta nueva versión, que podéis encontrar en este enlace son las siguientes:

  • WSPBuilder conversion tool (WCT) beta – This ‘beta’ release of the WSPBuilder project importer project template allows a developer to migrate a SharePoint root based project structure to the new SharePoint Tool SPIs based file layout. The WCT is packaged with both Foundation and Server editions of CKSDev.
  • Improved Quick Deploy – Stability improvements to the Quick Deploy features.
  • Keyboard shortcuts – Introduction of Keyboard shortcuts for the menu items provided by the extension.
  • Updated Full Trust Proxy SPI – Improvements to the Full Trust Proxy SPI to include the deployment feature receiver.
  • Restart processes menus – Restart the Timer service, User code process and the VS host process.
  • Attach to processes menus – Attach to the Timer service, User code process and the VS host process.
  • Solution level Package all – Package all SharePoint projects within your solution from the Solution context menu.
  • Improved import Content Types – Improved to now support importing from subsite content types.
  • Branding SPI – New SPI providing branding with masterpage, css and deployment feature receiver.
  • Improved Fluent visual web part SPI – Improved code output to provide a more robust example code base.
  • Basic service application SPI – New SPI for a basic service application.
  • WCF service SPI – New SPI to produce a WCF service hosted within SharePoint.
  • SharePoint PowerShell cmdlet SPI – New basic PowerShell cmdlet SPI.
  • SharePoint PowerShell pipe binding SPI – New basic PowerShell pipe binding SPI.
  • Improved copy assembly name menu – Includes build project call during copy.

image

Fuente: SharePoint CKS Project new Release 1.2

SharePoint 2010: Como añadir validaciones en formularios de lista en el lado del cliente (I)!

A menudo cuando estamos creando soluciones para SharePoint 2010 nos podemos encontrar con la limitación de que tengamos que hacer cierta extensibilidad en el lado del cliente (con JavaScript) ya que por la circunstancias que sean no tengamos posibilidad de subir desarrollos ni el servidor ni en la galería de soluciones Sandbox o simplemente porque queremos que la experiencia de usuario sea lo más flexible posible. Esta situación se puede dar por ejemplo cuando necesitamos introducir validaciones en formularios de lista adicionales a las que nos da por defecto la plataforma. En este artículo y siguientes trataré de cubrir este tema sobre como añadir cierta lógica en cliente mediante JavaScript:

  • Lo primero que vamos a hacer es disponer de una lista en la que hay ciertos campos a validar. Por ejemplo, en este caso no queremos que el campo Title esté vacío y además queremos que el valor del campo Numero3 no sea inferior a la suma de los campos Numero1 y Numero2.
  • A continuación, tenemos que analizar lo que nos devuelve el servidor cuando abrimos el formulario de creación de elemento o de edición para saber como identificar los controles a validar. Como podéis ver, más o menos tenemos un cierto patrón que nos permite identificar estos controles a través de:
    • El tipo de campo, que es “INPUT”.
    • El atributo id, que es un churro de caracteres que termina en un patrón conocido que en este caso es el tipo de campo TextField.
    • El atributo title, que contiene el nombre del campo.

 

image image
  • El detalle del código HTML devuelto  para el campo “Title” es el siguiente:
   1: <tr>

   2: <td nowrap="true" valign="top" width="190px" class="ms-formlabel"><h3 class="ms-standardheader">

   3: <nobr>Numero1</nobr>

   4: ></td>

   5: <td valign="top" class="ms-formbody">

   6: <!-- FieldName="Numero1"

   7:      FieldInternalName="Numero1"

   8:      FieldType="SPFieldNumber"

   9:   -->

  10:     <span dir="none">

  11: <input name="ctl00$m$g_c529ad40_bd17_4408_807b_3871c31df6c1$ctl00$ctl05$ctl01$ctl00$ctl00$ctl04$ctl00$ctl00$TextField" type="text" id="ctl00_m_g_c529ad40_bd17_4408_807b_3871c31df6c1_ctl00_ctl05_ctl01_ctl00_ctl00_ctl04_ctl00_ctl00_TextField" title="Numero1" class="ms-input" size="11" style="ime-mode:inactive;" /><br />

  12: an>

  13:     

  14:     

  15: </td>

  16: >

  • Una vez que tenemos claro como poder acceder a los campos de interés, ya podemos pasar a la fase de desarrollo de nuestro código JavaScript. En este caso, lo que haremos es usar Visual Studio 2010 y crearnos un archivo de tipo JavaScript para aprovechar sobre todo el IntelliSense.

image

  • Y el código a añadir es el que aparece debajo. Como véis, la clave de todo está en la función getTagFromIdentifierAndTitle que nos permite localizar el control buscado a partir del tipo de campo, el patrón para el id y el valor de la propiedad title.
  • Con la salida de esta función, obtenemos el control en cuestión mediante la llamada a document.getElementById.
  • Y a partir de aquí, a implementar la lógica que corresponde.
   1: function PreSaveAction() 

   2: {

   3:     //Empty field

   4:     var lsTitle = document.getElementById(getTagFromIdentifierAndTitle("input","TextField","Title"));         

   5:     if(lsTitle.value == "") 

   6:     { 

   7:         alert("El título no puede estar vacío"); 

   8:         return false; // Cancel the item save process 

   9:     } 

  10:  

  11:     //Checking fields

  12:     var lsNumero3= document.getElementById(getTagFromIdentifierAndTitle("input","TextField","Numero3"));

  13:     var lsNumero1= document.getElementById(getTagFromIdentifierAndTitle("input","TextField","Numero1"));

  14:     var lsNumero2= document.getElementById(getTagFromIdentifierAndTitle("input","TextField","Numero2"));

  15:     if (parseInt(lsNumero3.value) < parseInt(lsNumero1.value) + parseInt(lsNumero2.value) ) {

  16:         alert("Numero3 no puede ser menor que la suma de Numero1 y Numero2");

  17:         return false;

  18:     }

  19:     return true;  // OK to proceed with the save item 

  20: }

  21:  

  22:  

  23: function getTagFromIdentifierAndTitle(tagName, identifier, title) 

  24: {

  25:     var len = identifier.length;

  26:     var tags = document.getElementsByTagName(tagName); 

  27:     for (var i=0;i<tags.length;i++) {    

  28:             var tempString = tags[i].id; 

  29:         if (tags[i].title == title && (identifier == "" || tempString.indexOf(identifier) == tempString.length - len))

  30:         {

  31:             return tempString;

  32:         }

  33:     }

  34: }

  • Para añadirlo a nuestro formulario de lista, una de las opciones disponibles pasa por:
    • Cargar en primer lugar el archivo JavaScript en una biblioteca del sitio.
    • Editar el formulario con la interfaz de usuario.
    • Añadir una WebPart de tipo ContentEditor. Editar el campo de contenido de la WebPart en modo HTML y añadir la referencia a nuestro archivo JavaScript.
  • Guardamos la personalización del formulario y ya estamos listos para probar las validaciones añadidas.
image image image

Referencias sobre este tema: