MOSS: Características no soportadas en Excel Services!

Como sabéis, uno de los componentes destacados de MOSS (versión Enterprise) es Excel Services. Se trata de un servicio compartido (Shared Service Provider) que nos permite, entre otras características, visualizar en modo lectura hojas Excel (versión 2007) renderizadas en el navegador. Ahora bien, aunque Excel Services es muy potente, es importante tener claras cuales son sus limitaciones y características no soportadas a la hora de implantar este componente en nuestros clientes:

  • Hojas de cálculo con código (se incluyen hojas de cálculo con macros VBA, controles de formulario, controles de barra de herramientas, diálogos, y hojas XML).
  • Hojas de cálculo protegidas con IRM.
  • SmartTags Embebidas.
  • PivotTables basadas en rangos de consolidación múltiple.
  • Referencias externas (enlaces a otras hojas de cálculo).
  • Hojas de cálculo guardadas en modo vista fórmula.
  • Paquetes XML de expansión.
  • Mapas XML.
  • Validación de datos.
  • Tablas de consulta, listas de SharePoint, consultas web y consultas de texto.
  • Hojas de cálculo que referencias Add-Ins.
  • Hojas de cálculo que usan la función RTD().
  • Hojas de cálculo que usan protección de hoja.
  • Fotografías o clips embebidos.
  • Celdas y hojas con fotografías en background.
  • Autoformas y WordArt.
  • Anotaciones de tinta.
  • Gráficos organizacionales y diagramas.
  • Enlaces DDE.

Liberado el Visual Studio Snippet Editor v 2.0!

Ya tenemos disponible en Codeplex una nueva versión del editor de code snippets para Visual Studio. Podéis descargaros la utilidad de este enlace. Entre las características del editor tenemos:

  • Gestión de archivos de snippets.
  • Coloreado de sintaxis básica.
  • Subrayado de reemplazos.
  • Organización de archivos drag & drop.

snippet_editor[3]

 

Finalmente, comentaros que este editor se puede utilizar para todas las versiones de Visual Studio 2005 y 2008 (incluyendo las versiones express).

Modificar el comportamiento de redirección de los formularios NewForm.aspx y EditForm.aspx (I)

Este artículo forma parte de una serie de tres, donde indicaremos cual es el comportamiento de redirección de NewForm.aspx y EditForm.aspx, como modificar su comportamiento, como empaquetarlo en una feature y en una solución, y por último como registrarlo para que únicamente funcione con una lista en concreto.

En el artículo de hoy vamos a estudiar la lógica de redirección que tienen establecidos los formularios de inserción y modificación de datos por defecto: NewForm.aspx y EditForm.asp.

La situación actual es la siguiente:


  • NewForm.aspx  => Al guardar los datos => Va a la vista por defecto, en la mayoría de los casos, la página de AllItems.aspx
  • EditForm.aspx => Al guardar los datos => Va a la vista por defecto, en la mayoría de los casos, la página de AllItems.aspx

Análisis del comportamiento:

Cuando trabajamos con un formulario, la lógica que sigue para saber a qué página redirigir al usuario cuando se pulsa el botón de guardar (dependiendo del caso) es la siguiente:


  1. SPList.DefaultViewURL: Al pulsar el botón de guardar de un formulario de tipo NewForm.aspx o EditForm.aspx, si no especificamos nada más (ningún parámetro), nos redirige a la vista predeterminada, cuyo valor podríamos encontrar en el modelo de objetos a través de la propiedad SPList.DefaultViewUrl
  2. Parámetro SOURCE: En el caso de que en la URL que llama al formulario NewForm.aspx o EditForm.aspx, le especifiquemos el parámetro SOURCE, al cerrar la página, seremos redirigidos a la dirección indicada en ese parámetro.


Por ejemplo la URL: http://miempresa.es/Lists/Tareas/NewForm.aspx?RootFolder=%2FLists%2FTareas&Source=http%3A%2F%2Fmiempresa%2Ees%2FLists%2FTareas%2FAllItems%2Easpx nos llevará a la página de AllItems.aspx,


mientras qué la siguiente URL: http://miempresa.es/Lists/Tareas/NewForm.aspx?RootFolder=%2FLists%2FTareas&Source=http%3A%2F%2Fmiempresa%2Ees%2FLists%2FTareas%2FDispForm%2Easpx nos llevará a la página indicada en el parámetro Source, en este caso DispForm.aspx.


Una prueba que podéis realizar es llamar al formulario metiendo en la barra de dirección del navegador una URL, con distintos valores para el parámetro Source, y observaréis como os redirige a la dirección proporcionada por el parámetro.

Un ejemplo sería: http://miempresa.es/Lists/Tareas/EditForm.aspx?RootFolder=%2FLists%2FTareas&Source=http%3A%2F%2Fmiempresa%2Ees%2FLists%2FDispForm%2Easpx (que nos mostraría el formulario de DispForm.aspx, pero no nos mostraría ningún ítem en concreto ya que no le hemos proporcionado el parámetro ID)

Planteamiento del problema

En el caso de que nos plantearan el siguiente objetivo, lograr que:


  • NewForm.aspx  => Al guardar los datos queremos que vaya al => DispForm.aspx?ID=xx del elemento que se acaba de crear
  • EditForm.aspx?ID=xx => Al guardar los datos queremos que vaya al =>DispForm.aspx? ID=xx del elemento que se acaba de editar

Alternativas de implementación


Nos podríamos plantear las siguientes aproximaciones para resolver el problema:


Primera aproximación: Utilizando el parámetro Source:


Podríamos intentar obtener este comportamiento, utilizando el parámetro SOURCE. Sin embargo, los problemas que existen con esta aproximación son los siguientes:


  • Habría que modificar la URL llamante, que está definida en el menú desplegable “Nuevo elemento” o “Editar elemento”, para que incorporara el parametro SOURCE deseado, y no es tarea fácil.  

          Nuevo Elemento


         Editar Elemento


 



  • Para pasar de las páginas NewForm.aspx/EditForm.aspx a la página DisplayForm.aspx necesitamos conocer el ID, del elemento que queremos mostrar. En el caso de que la página origen fuera EditForm.aspx?ID=xx, se podría obtener el valor del ID de la propia URL y llegar a ponerlo en el parámetro SOURCE, pero en el caso de que la página origen fuera NewForm.aspx, el ID no se genera, ni se conoce hasta que no se crea el elemento, por lo que no sería posible ponerlo en le parámetro SOURCE de la URL llamante.

Segunda aproximación: Modificando el valor de la propiedad SPList.DefaultViewUrl:

Otra aproximación sería intentar modificar por código el valor de la propiedad SPList.DefaultViewUrl. En este caso sería necesario modificar la página para que incluyera el código necesario para cambiar el valor de esta propiedad.

Un ejemplo del código a utilizar podría ser:





        //Primero obtenemos la lista con la que vamos a trabajar
        SPSite miSiteCol = new SPSite(http://miempresa);
        SPWeb miWeb = miSiteCol.OpenWeb();
        SPList miLista = miWeb.Lists[new Guid(“Introducir aqui Guid de la lista”)];

        // A continuacion obtenemos la coleccion con las  vistas de esa lista
        SPViewCollection miViews = miLista.Views;

        // Seleccionamos la vista de tipo AllItems.aspx
        SPView AllItemsView = miViews[“All Items”];

        // Creamos una nueva vista denominada MiNuevaVista basada en la vista AllItems.aspx 
        // y especificamos que sea la vista por defecto
        // SPView.Clone(string strNewViewName, uint iRowLimit, bool bPaged, bool bMakeViewDefault)
        SPView nuevaView = AllItemsView.Clone(“MiNuevaVista”,10,true,true);

Este código es válido si queremos cambiar la vista por defecto a la que van los formularios cuando les damos a guardar, pero seguimos teniendo dos problemas.


El primero, consiste en que las vistas que podemos crear y añadir a la coleccion de vistas mediante SPView.Clone() o SPViewCollection.Add(), en principio parece que deben de ser del tipo SPView (definidas mediante CAML y interpretadas por la ListViewWebPart), por lo que parece dificil incluir mediante esos métodos páginas como DispForm.aspx.


Aunque fuera posible solventar el problema anterior, sin embargo el mayor problema estriba al igual que en la primera aproximación (el del parámetro SOURCE), en que para poder redirigir a la página con la información del ítem DispForm.aspx?ID=xx, es necesario conocer su ID y proporcionárselo. En el caso de la transición desde NewForm.aspx a DispForm.aspx, la página NewForm.aspx, desconoce que ID, le va a asignar el sistema al ítem, hasta que éste no es guardado.


Tercera aproximación: Mediante código JavaScript

Otra posible solución sería intentar realizar la redirección mediante código JavaScript, pero seguimos teniendo el mismo problema que en el caso anterior ya que en el caso de la página NewForm.aspx, desconocemos el ID que el sistema va asignar al ítem hasta que este no es guardado.

Cuarta aproximación: Mediante un manejador de eventos

Por último, la solución que encontramos más recomendable para este problema consiste en implementar un manejador de eventos, que capture el evento síncrono de ItemAdding (cuando se quiere añadir un ítem a la lista), realice la adición de este ítem a la lista y por último realice la redirección a una determinada dirección, pero conociendo ya el ID que se le ha asignado a este ítem.

Para ello será necesario:


  1. Crear una clase que herede de la clase SPItemEventReceiver
  2. Sobreescribir los métodos ItemAdding y ItemUpdating de dicha clase.

    • Obtener la referencia a la lista y al SPListItem con el que se va a trabajar
    • Deshabilitar el disparo de nuevos eventos
    • Añadir/actualizar el item en la lista
    • Volver a habilitar el disparo de eventos
    • Realizar la redirección
    • Tratar las excepciones.

En el siguiente artículo de esta serie mostraremos y explicaremos con un ejemplo de código, como implementar esta funcionalidad.

Búsquedas en MOSS: Query Reporting Tool!

Una de las características incluida en las funcionalidades de búsqueda de MOSS es el Query Reporting Tool. Se trata de una herramienta que nos permite obtener un vistazo global de los resultados de búsqueda a lo largo de todo el Shared Service Provider (SSP), así como evaluar que ámbitos de búsqueda son utilizados de forma frecuente por los usuarios.

Hay dos tipos de informes en el Query Reporting Tool. El primero es el Search Queries Report, que incluye gráficos de barras básicos y contiene información sobre:

  • Consultas en los últimos 30 días.
  • Consultas en los últimos 12 meses.
  • Consultas top originadas en los diferentes site collections en los últimos 30 días.
  • Consultas por ámbito (Scope) en los últimos 30 días.
  • Consultas top en los últimos 30 días.
image image image

image

Por supuesto, estos informes son exportables (formatos Excel y PDF). El segundo tipo de informes tiene que ver con los resultados de búsqueda en cuanto a:

  • Páginas de destino más relevantes (top) aparecidas en los resultados de las búsquedas.
  • Consultas que no han devuelto resultados.
image image image

Y hasta aquí llega lo que os quería contar sobre la Query Reporting Tool de MOSS.

Windows 7 Beta: Una revisión a fondo!

Hace unos días os comenté que uno de los mejores blogs para estar al día de Windows 7, entre otras muchas cosas, es el blog de Paul Thurrott. Pues bien, merece la pena que os deis una vuelta por sus dos últimos posts en torno a la revisión que ha realizado sobre la beta de Windows 7, a la que podremos hincar el diente el mes que viene (casi como regalo de reyes). Paul ha realizado un análisis en detalle en dos posts realmente descriptivos:

Como veréis en el análisis de Paul, por fin en esta beta aparecen todas las grandes novedades que se han comentado en torno a Windows 7…ya tengo ganas de meterle mano a la beta.

 

win7_beta_review_02

Lo nuevo en el BCL en .NET Framework 4.0!

Hacía tiempo que tenía en el tintero escribir este post en torno a algunas de las novedades que aparecen en la BCL (Base Class Library) de la primera CTP de .NET Framework 4.0…por cierto, parece que en breve tendremos una nueva CTP tanto de .NET Framework 4.0 como de Visual Studio 2010. Comencemos con algunas de las novedades de la actual CTP de .NET Framework 4.0:




  • Code Contracts, disponibles a través de System.Diagnostics.Conctracts, proporciona una manera agnóstica al lenguaje de expresar asunciones de código en programas .NET. Los contratos pueden tomar la forma de pre-condiciones, post-condiciones y objetos invariants actuando como documentación verificada de nuestras APIs internas y externas. Estos contratos se usan para mejorar el testeo a través de verificación del runtime, habilitar la verificación de contratos estáticos, y la generación de documentación. Más información sobre esta novedad en este enlace de Microsoft Research.


  • Parallel Extensions, se ha añadido el soporte de PLINQ (Parallel LINQ) a la BCL de .NET Framework 4.o, estructuras de coordinación de datos, y la Task Parallel Library (TPL). Se ha incluido una optimización del algoritmo de planificación de tareas ThreadPool, la clase estática Parallel, estructuras de datos como LazyInit<T>, CountdownEvent, Barrier, SemaphoreSlim, SpinLock, SpinWait, …Más información en Parallel Programming for Managed Developers with the Next Version of Microsoft Visual Studio.


  • BigInteger, disponible a través de System.Numerics.BigInteger, se trata de un nuevo tipo de datos entero con precisión arbitraria y alto rendimiento. Soporta todas las operaciones estándar para tipos enteros, incluyendo manipulación de bits. Se puede usar desde cualquier lenguaje .NET, así como algunos de los nuevos como F# y IronPython para .NET.


  • Memory Mapped Files, disponible a través de System.IO.MemoryFiles, expone la funcionalidad de mapeado de memoria disponible en Windows como una API manejada de primer clase. Los archivos mapeados en memoria se pueden usar para editar de manera eficiente grandes archivos, así como crear memoria compartida para comunicación entre procesos. Además, se ha creado System.IO.UnmanagedMemoryAccesor para habilitar acceso aleatorio a memoria no manejada.


  • ResourceManager Improvements, disponible en System.Resources, se ha mejorado el gestor de recursos para facilitar la búsqueda de archivos de recursos independientemente de la cultura actual de la interfaz de usuario.


  • Compression Improvements, se han mejorado los algoritmos de comprensión disponibles en System.IO.Compression a través de unos mejores ratios de comprensión y posibilitando comprimir streams de más de 4 GB.


  • String Security Changes, las sobrecargas por defecto de algunos métodos  de System.String (StartsWith, EndsWith, IndexOf y LastIndexOf) se han cambiado para que sean agnósticos a la cultura por defecto. Además, se ha modificado ToUpper y ToLower para usar la cultura invariant en lugar de la actual.

Además de todas estas novedades, el equipo del BCL está pensando en otra serie de novedades tal y como podréis leer en este enlace.

WSS 3.0 & MOSS: Planning de soluciones SharePoint (II)!

Continuando con los aspectos a tener en cuenta a la hora de hacer el planning de soluciones de SharePoint, es necesario tener en cuenta que en los proyectos de SharePoint como en los de otro tipo vamos a tener una serie de especificaciones funcionales que tenemos que saber interpretar. Estas especificaciones funcionales se derivan de los requisitos de negocio que a su vez se componen de requisitos funcionales y no funcionales. Los primeros son los que se obtienen a partir de lo que el cliente necesita para su negocio. Los segundos son los que están implícitos en la funcionalidad demandada. Toda estos requisitos se determinan a partir de las planning worksheets para MOSS.

Requisitos funcionales

Como sabéis, una función viene a ser aquel aspecto de una solución con la que el usuario interactuará de manera segura. Esto nos lleva a que los requisitos funcionales para una aplicación MOSS incluyan aspectos como:

  • Funciones de negocio.
  • Interfaces de usuario.
  • Interfaces de programación.
  • Capacidades.
  • Interacción.
  • Apariencia.
  • Interoperabilidad.
  • Navegación.
  • Arquitectura de contenidos.

Muchos de estos requisitos aplican a varios tipos de aplicaciones y no son exclusivos de soluciones MOSS. Sin embargo, hay uno especial que aplica a SharePoint y que no es típica de las aplicaciones web tradicionales: la arquitectura de contenidos. Este requisito implica que los stakeholder claves y el equipo de diseño determinen que tipos de contenidos se podrían almacenara en cada uno de los siguientes niveles propios de SharePoint:

  • Colección de sitios.
  • Sitio.
  • Página.
  • Lista y biblioteca de documentos.
  • carpetas y subcarpetas en listas y bibliotecas de documentos.
  • Documentos.
  • Elementos de lista.

Es importante destacar que es fundamental un buen diseño de la estructura de contenidos ya que esta afecta a la eficiencia de los trabajadores, la gestión de la solución, la escalabilidad, la seguridad, la funcionalidad de contenidos y la funcionalidad de búsquedas.

Requisitos No-Funcionales

Los requisitos no-funcionales aparecen normalmente bajo los requisitos tecnológicos o los requisitos de negocio. Por ejemplo, para una solución de negocio crítica es clave asegurar durante el diseño continuidad en los procesos de negocio. Por otra parte, normalmente los usuarios de negocio van a querer que la aplicación esté siempre disponible. Por lo tanto, nuestra misión como diseñadores de la solución pasa por identificar el nivel de continuidad de negocio que requieren los usuarios. ¿Cómo lo determinamos? Pues preguntando a estos usuarios e identificando a partir de sus respuestas agregadas que infraestructura y plataforma puede soportar los requisitos de disponibilidad de negocio solicitada.

Entre los requisitos no-funcionales que nos encontraremos en el planning de soluciones SharePoint tenemos:

  • Seguridad.
  • Gobernanza.
  • Niveles de servicio.
  • Continuidad de negocio.
  • Capacidad.
  • Rendimiento.
  • Integridad de datos.
  • Help Desk.
  • Mantenimiento.

De esta lista, es destacable el requisito de seguridad puesto que en SharePoint vamos a tener usuarios con acceso remoto, acceso desde dispositivos móviles, ….lo que implicará la aparición de issues relacionados con autenticación y acceso a la solución. Y hasta aquí llega este segundo post sobre planning de soluciones SharePoint.

Un control interesante y gratuito para aplicaciones ASP.NET: FreeTextBox!

Seguramente muchas veces os habréis encontrado con la necesidad de poder utilizar un control de tipo Rich Text Box en vuestras aplicaciones ASP.NET. Pues bien. hasta ahora Visual Studio en sus distintas versiones no ha incluido un control de estas características en la toolbox de proyectos web. Sin embargo, existe un control gratuito en la red que nos da esta funcionalidad y que podemos utilizar en nuestras aplicaciones: FreeTextBox.

image

Podéis ver una demo live de este control en este enlace.

SSRS 2008: Algunos WhitePapers (I)!

El equipo de SQL Server Reporting Services (SSRS) ha anunciado recientemente la disponibilidad de una serie de Whitepapers relacionados con algunas de las novedades aparecidas con SSRS 2008:

Finalmente, y también por cortesía del equipo de SSR 2008, aquí os dejo el enlace a todos los whitepapers sobre SQL Server 2008.

logo-header-sql08-dg

WebDAV y SharePoint!

El explorador de Windows proporciona un mecanismo de conexión con bibliotecas de SharePoint a través del protocolo WebDAV (Web Distributed Authoring and Versioning). Este protocolo también se usa en la vista de explorador que tenemos en cualquier biblioteca de documentos. La plataforma SharePoint 2007 soporta de manera nativa WebDAV, lo que permite visualizar y trabajar con documentos de bibliotecas de documentos como si estuviéramos trabajando con carpetas del sistema de ficheros.

La forma más sencilla de utilizar WebDAV consiste en utilizar la opción Open With Windows Explorer del menú de acciones de una biblioteca de documentos de SharePoint. De este modo, se abrirá el explorador de Windows y tendremos acceso al contenido de la biblioteca de documentos, pero fuera del contexto de Internet Explorer.

image image

Además de poder acceder a los contenidos de una biblioteca de documentos de la forma anterior, podremos comprobar como en el explorador de Windows aparece bajo My Network Places un acceso directo a nuestras bibliotecas de SharePoint:

image

Para añadir un acceso directo de manera manual, tendremos que seguir los siguientes pasos:

  • Abrimos el explorador de Windows, y hacemos click sobre My Network Places.
  • Hacemos doble click sobre Add Network Place.
  • Pulsamos Next.
  • Seleccionamos la opción Choose another network location y pulsamos Next.
image image image
  • Especificamos la url de la biblioteca de documentos que queremos añadir y pulsamos Next.
  • Especificamos el nombre del network palce.
  • A continuación pulsamos Finish.
image image image

De este modo, tendremos accesible el contenido de la biblioteca de documentos:

image

Además de crear accesos directos bajo My Network Places, podemos usar WebDAV para mapear una carpeta de red a una biblioteca de documentos. Para mapear una carpeta de red a una biblioteca de documentos basta con seguir los siguientes pasos:

  • Abrimos el explorador de Windows.
  • Hacemos click sobre Tools y luego Map Network Drive.
  • Seleccionamos una letra para la carpeta de red.
  • Especificamos el path de la biblioteca de documentos: \nombre_servidornombre_sitiobiblioteca
  • Pulsamos Finish.

Y hasta aquí llega lo que os quería contar sobre SharePoint y WebDAV. Espero que el post os haya resultado interesante.