VLINQ: Diseñador de consultas para LINQ To SQL!

Si hace unos meses hablábamos de una útil e imprescindible herramienta para probar nuestras consultas LINQ como es LINQPad, hace un rato me he encontrado otro diseñador de consultas específico para LINQ To SQL, pero que se diferencia de LINQPad en qué se trata de un diseñador que se integra con Visual Studio 2008 como un Add-In más y que nos ayuda en el diseño de dichas consultas. Se trata del proyecto VLINQ, que durante 6 meses fue desarrollado y liderado por un equipo de desarrollo francés en colaboración con Microsoft. Os podéis descargar VLINQ de este enlace.

SQL Server Reporting Services: Preguntas y Respuestas (I)!

Uno de los seminarios “tradicionales” que hemos impartido en el CIIN es el de SQL Server Reporting Services (SSRS). Durante estas sesiones han surgido numerosas preguntas que he tratado de responder con el tiempo, siempre desde el punto de vista práctico, y sin preocuparme mucho si la solución planteada a las cuestiones es una buena práctica o no. El caso es que llevaba tiempo con ganas de publicar estas preguntas y respuestas sobre SSRS, y aquí está el comienzo. Como varéis, he dividido las preguntas y respuestas en secciones con temáticas similares.  También espero que los cracks de SSRS den su opinión y otras alternativas posibles ;). Hoy comenzaremos con cuestiones relativas al formato de salida de un informe. Empecemos.

Cuestiones sobre el formato de salida de un informe

Esta sección está enfocada a cuestiones relativas al formato de salida del informe en cuanto a su aspecto gráfico, lograr ciertas funcionalidades a priori  no posibles, etc.

i. ¿Cómo se pueden visualizar sólo cierto número de filas de un informe?

Una forma de conseguir esto es la siguiente:

  • Insertar un nuevo grupo en el informe a través de la opción Insert Group y en la pestaña general definir la siguiente expresión de agrupamiento: =int((RowNumber(“Scope”)-1)/20).

image

  • Marcamos también Page break at end:

image

Y ya está. Más información sobre el tema en este enlace.

ii. ¿Qué manera puede haber de saber si es página par o impar para poner salto de página?

Hay una extensión de impresión pensada para este tipo de situaciones. Más información sobre esta extensión en el este enlace.

iii. ¿Cómo se pueden añadir números de página a un sub-informe?¿y cabeceras? En subreport no se pueden poner Footer ni Header por lo tanto: No se pueden usar las Globals tipo PageNumber.

Efectivamente esto es así, por lo que la única solución que veo es que por código (inline o mediante assembly) accedas a estas propiedades y las puedas utilizar en un elemento tipo Texbox de tu subreport. Sería algo tal que así:

Public Function PageNumber() as String
     Dim str as String
     str = Me.Report.Globals!PageNumber.ToString()
     Return str
End Function

Public Function TotalPages() as String
     Dim str as String
     str = Me.Report.Globals!TotalPages.ToString()
     Return str
End Function

Y esta function se usaría del siguiente modo:

=”Page ” + Code.PageNumber() + ” of ” + Code.TotalPages()

Más información en este enlace.

iV. ¿Qué es necesario para poder exportar un informe a formato Word?

Aquí la opción sería exportar el informe a Excel que si es editable y es un formato de salida más característico para volcar informes. De todos modos, si es un requisito que el informe se pueda exportar a Word, la opción pasa por que te crees una extensión de renderizado que te lo permita. En la misma:

  • Se tendría que coger el rdl de tu informe.
  • Llamar a la extensión de procesamiento de SSRS.
  • Construir el documento Word (la extensión de renderizado) en el que vas a mostrar los resultados.

Precisamente este es uno de los puntos de extensibilidad de la plataforma de SSRS. Crear la extensión no es para nada trivial, y hay productos de terceros como este. Habrá que ver con SQL Server 2008 como se comporta una de las novedades con las que viene: renderizado de informes en Microsoft Word.

Preguntas para las que no tengo todavía respuesta en esta sección

Aparte de estas cuestiones que he podido resolver de forma más o menos completa, tengo otras que todavía no he resuelto de manera clara y que os dejo aquí por si alguien en la comunidad tiene la respuesta para las mismas:

i. ¿Es posible adaptar las celdas de un informe al tamaño del contenido que tendrán? O lo que es lo mismo, ¿Se puede ajustar de manera dinámica la anchura de los controles de tipo TextBox que forman el informe?

Las celdas de un informe (controles TextBox) sólo permiten jugar visualmente con el atributo Width. Por lo tanto, parece que la única opción para este requerimiento pasa por:

  • Ver si con código in-line puedes acceder a estas propiedades utilizando ReportItems.
  • Probar lo mismo con un ensamblado.
  • La última opción es que pases del BI Management Studio y te crees una aplicación que genere el informe y tenga esa funcionalidad….

ii. ¿Cómo se puede conseguir impresión dúplex para el caso de tener sub-informes en un informe?

Tenemos un report con un subreport dentro de una lista. Si se quiere imprimir ese informe en Duplex, el problema es que los subreport pueden tener tanto páginas pares como impares.

Espero que el post os haya resultado de interés. Seguiré con esta serie de faqs próximamente.

Nuberos.NET & CIIN: Materiales del evento de Visual Studio Team System!

Gracias a Rodrigo e Ibón, ya tenemos disponibles en la página de Nuberos.NET para descarga las presentaciones del evento del pasado viernes: Gestión de proyectos y metodologías con Visual Studio Team System. Las presentaciones os las podéis descargar en los siguientes enlaces:

En la misma sección de descargas están los materiales del evento previo sobre LINQ & ADO.NET Entity Framewok.

WSS 3.0: Planning de soluciones SharePoint (I)!

Hace tiempo escribíamos un par de posts (partes I y II) sobre consideraciones y buenas prácticas a tener en cuenta a la hora de poner en marcha soluciones de WSS 3.0. Retomando el tema, y a raíz de comentarios que he recibido últimamente, he pensado poner un poco en orden muchas de las ideas ya expuestas, dejando claro cuáles deberían ser los pasos lógicos a realizar antes de realizar el despliegue de una infraestructura de WSS 3.0. De hecho, estos pasos son fundamentales puesto que aunque WSS 3.0 es escalable después de desplegado, Microsoft recomienda como buena práctica la realización de un planning previo para evitar de esta forma duplicar esfuerzos de manera innecesaria. Como veremos en esta serie de posts, el planning de WSS 3.0 implica determinar los siguientes puntos:

  • Las necesidades de la organización donde se va a realizar el despliegue de WSS 3.0. En concreto, se trata de:
    • Determinar los objetivos de la solución SharePoint.
    • Determinar las necesidades del usuario.
    • Determinar la jerarquía del sitio.
  • Planificar la creación de sitios, su mantenimiento y seguridad.
  • Planificar los requerimientos del servidor y la topología o topologías a utilizar.
  • Determinar la cantidad de espacio en disco que se necesita y el rendimiento pico.
  • Identificar la topología para la instalación de WSS 3.0.

Toda esta información y mucha más está reunido en el recurso por excelencia para el planning de WSS 3.0: Planning and architecture for Windows SharePoint Services 3.0 technology. Empecemos.

Determinando las necesidades de la organización

Sin duda, este es el primer paso necesario antes de realizar cualquier otro que nos lleve a realizar el despliegue de una solución SharePoint. Es necesario perfilar de manera adecuada las necesidades de la organización para evitar problemas e inconvenientes futuros. En concreto, esta fase implica determinar los objetivos de la solución SharePoint a construir, el entorno de hosting, las características de la solución, las necesidades del usuario y la jerarquía del sitio. Vamos a ir viendo cada una de las implicaciones de estos puntos.

Determinando los objetivos de la solución

Este punto implica la identificación de los objetivos y metas de la solución para alinearlos con las necesidades de la organización y maximizar la utilización de recursos. Además, será necesario determinar el entorno en el que la solución estará hosteada. Por ejemplo, un escenario típico es diseñar una solución pensada para el almacenamiento de documentos (objetivo) dentro de la Intranet de la organización (entorno de host). Pero, ¿Cómo identificamos estos objetivos? La respuesta es sencilla: a partir de las funcionalidades y capacidades que ofrece SharePoint: Comunicación, Colaboración y Almacenamiento de Documentos. Así, si la organización necesita la solución para realizar diversos anuncios, recoger feedback o mostrar un calendario de eventos, el objetivo del sitio será Comunicación. En cambio, si los miembros de un departamento tienen la necesidad de usar la solución/sitio para compartir documentos, contestar a ideas, realizar un seguimiento de tareas o participar en una encuesta, el objetivo del sitio será Colaboración. Finalmente, si se trata de almacenar y mantener documentos en una ubicación centralizada, el objetivo del sitio será el almacenamiento de documentos.

Una vez que se han identificado los objetivos del sitio, hay que identificar el entorno dónde se va a ubicar. Dicho entorno puede ser:

  • Intranet, es decir, la organización necesita un sitio corporativo aislado de la red. Este escenario es típico para crear sitios accesibles sólo para empleados de una organización, como son las Intranet corporativas con sitios departamentales.
  • Internet, es decir, la organización requiere que la información sea pública. Un ejemplo claro de este entorno es el típico sitio que contiene información de productos de una organización.
  • Extranet, es decir, la organización necesita compartir información, documentos con agentes externos (proveedores, clientes), lo que implica que estos puedan acceder a la solución permita el acceso con los permisos apropiados.

Identificando las características del sitio

Una vez que se han identificado los objetivos de la solución/sitio y el entorno de host, el siguiente paso consiste en identificar las características que la solución debe incluir. Por ejemplo, si el objetivo del sitio es Comunicación, necesitaremos elementos como anuncios, calendarios compartidos, envío de mensajes por e-mail, o encuestas para facilitar el intercambio de información y la interacción entre los miembros del sitio.

Si se trata de un sitio de Colaboración, los elementos necesarios serán paneles de discusión, seguimiento de issues, listas de contactos o elementos de presencia. Finalmente, en el caso de un sitio de almacenamiento de documentos necesitaremos determinar las características de almacenamiento de documentos que se necesitan como bibliotecas de documentos, bibliotecas de imágenes, listas de tareas o la papelera de reciclaje.

En cualquiera de los tres casos, necesitaremos determinar si necesitamos otros elementos como alertas, feeds RSS, búsquedas, blogs, wikis o bien espacios de documentos y/o reuniones.

Identificando las peticiones del usuario

La última fase en la determinación de las necesidades de la organización pasa por identificar peticiones especiales del usuario relacionadas con las características de su negocio. Entre ellas tendremos que determinar:

  • Integración con aplicaciones cliente, es decir, que aplicaciones tienen que interactuar con un sitio de WSS 3.0. El ejemplo más claro de integración es el todo el suite de Microsoft Office que permite que en sitios de WSS 3.0 podamos realizar operaciones de Check-In o Check-Out de documentos.
  • Integración en el servidor, es decir, que servidores tiene que interactuar con WSS 3.0. Así por ejemplo, este escenario lo tenemos en la Integración de Microsoft Exchange Server con WSS 3.0 de manera que se habilita el uso de características propias de Exchange, como el calendario, en sitios de WSS 3.0.
  • Integración con aplicaciones LOB (Line-Of-Business), es decir, que aplicaciones de negocio se tienen que integrar con un sitio de WSS 3.0. Por ejemplo, podríamos utilizar web parts personalizadas para visualizar datos de SAP.

Y en principio estos son todos los elementos que necesitamos tener claros para identificar las necesidades de una organización. Lógicamente, para ayudarnos con esta labor existe una hoja de recogida de especificaciones y requisitos: Site objectives and environments worksheet. Como veréis en dicha hoja, se trata de enumerar los sitios a crear, los objetivos por sitio y los entornos en los que se utilizarán dichos sitios. Otra forma alternativa a dicha hoja, made in CIIN, es la siguiente:

image

Espero que el post os haya resultado de utilidad, seguiremos con la serie en próximos posts.

Nuberos.NET & CIIN: Gestión de proyectos y metodologías…las fotos!

Esta tarde se ha celebrado el tercer evento de la nueva era de Nuberos.Net. En el mismo hemos contado con dos cracks de la talla de Rodrigo Corral e Ibon Landa, y durante cuatro horas nos han contado las espectaculares posibilidades y características de Visual Studio Team System 2008 como herramienta fundamental a utilizar en la gestión de proyectos de desarrollo, así como las posibilidades que da para la aplicación de distintas metodologías. El evento fue espectacular, comenzando con una gran introducción de Ibon Landa a Visual Studio Team System durante 1:30 horas, para luego comenzar Rodrigo a hablar de las bondades de Scrum aplicado en la práctica. Sin duda la sesión superó las expectativas de los asistentes (casi 50 personas, lo que es de agradecer teniendo en cuenta que el evento lo hemos realizado un viernes por la tarde), que además intentaron transmitir a Rodrigo e Ibon sus problemas, inquietudes y dudas en los diversos temas tratados…aunque subiremos todas las fotos a la web de Nuberos.Net, os dejo alguna d Ibon y Rodrigo en plena acción, así como de la embelesada audiencia :PPPP

Nuberos_Net_ 009 Nuberos_Net_ 020  

Nuberos_Net_ 022

Por supuesto, hubo momentos anecdóticos como el momento MVP (¿qué tendrá esa pegatina? ;) ) o el momento Scrum :PPP

Nuberos_Net_ 017

Nuberos_Net_ 025

 

Lástima que finalmente no pudiésemos grabar el evento, porque el sistema de grabación todavía no está operativo. Aprovecho el post para comentar un par de cosas:

BTS 2006 R2: Microsoft BizTalk Operations Guide!

A través del recién estrenado blog de Eduardo Azanza,  uno de los pilares del grupo de BPM y SOA de Microsoft Ibérica, me he enterado de que Microsoft acaba de publicar la guía de operaciones de Microsoft BizTalk Server. Como nos comenta Eduardo y podemos leer en la página principal de la guía, se trata de la primera edición de una guía enfocada a la administración e implementación de soluciones BizTalk en general, y de las versiones BTS 2006 y BTS 2006 R2.

image

La guía que es puede descargar en formato chm, pdf o dox a través de este enlace, está basada en la experiencia de profesionales de Microsoft, partners y clientes que tienen un gran bagaje en el planing, despliegue, mantenimiento y administración de soluciones de BizTalk. La base de esta guía es la propia sección de ayuda de BTS 2006 R2, whitepapers, artículos de la knowledge base de Microsoft y otros recursos que han sido revisados a conciencia por miembros del equipo de desarrollo de BTS.

En cuanto a la organización de la misma, podemos ver que está divida en las siguientes secciones:

  • Planning the Environment for BizTalk Server, dónde podremos comprobar si toda nuestra infraestructura y aplicaciones BizTalk está lista desde el punto de vista operacional.
  • Operations Checklist, para ayudarnos en la evaluación de la operatividad de un despliegue de BizTalk.
  • Managing BizTalk Server.
  • Monitoring BizTalk Server.
  • Maintaining BizTalk Server.
  • Increasing Availability for BizTalk Server.
  • Optimizing Performance for BizTalk Server, dónde podremos encontrar las formas que tenemos para optimizar el rendimiento de nuestra infraestructura de BizTalk

Una gran sorpresa: MVP en MOSS!

Los que me conocen saben que no se me dan bien este tipo de anuncios, y que me gusta más estar en el anonimato…pero se lo debo a mis compañeros del CIIN…bueno, pues aquí va la noticia que me ha dejado literalmente perplejo esta tarde a eso de las 16:00: me han nombrado MVP de MOSS…la verdad es que recibir una noticia de este tipo te deja en un estado difícil de describir…en cualquier caso, este premio se lo dedico a mis compañeros Pablo y Ángel de los que aprendo día a día un montón de cosas y porque juntos somos capaces de salir bien parados de cualquier marrón. Se lo dedico también a Luis Romero, porque gracias a él tuve la oportunidad de entrar a formar parte de este proyecto llamado CIIN que ya tiene 2 años de duración y que sigue por buen camino, y por supuesto se lo dedico a las personas de Microsoft que me consta me propusiero para ser nominado para el premio…Intentaré durante el próximo año seguir dando guerra tanto en plataforma SharePoint como en otras lides (es lo que tiene formar parte de un centro de innovación). Finalmente, muchas gracias a todos los que leéis este blog, porque también habéis contribuido a que haya sido reconocido como MVP.

¡Gracias a todos!

MOSS: Añadiendo nuevas propiedades en las opciones de búsqueda avanzada!

Hace un tiempo hablábamos de que uno de los componentes más importantes de MOSS es el potente motor de búsqueda que lleva incorporado dentro de los llamados Shared Services Providers (que proporcionan varios servicios compartidos entre distintos sitios de MOSS: Búsqueda, Business Data Catalog, User Profiles y My Sites, Excel y Form Services, Audiencias).Los Shared Services Providers se crean y mantienen desde la administración central de MOSS. La idea de este posts es volver a hablar sobre las grandes prestaciones del motor de búsqueda de MOSS a través de las posibilidades que dan las búsquedas avanzadas de MOSS y como le podemos añadir nuevas propiedades de búsqueda. Empecemos.

Creando un sitio de búsquedas

Aunque MOSS incorpora out-of-the box una plantilla de tipo Search Center, podemos crear nuestro propio sitio de búsqueda utilizando las web parts de búsqueda que vienen con MOSS. Para crear nuestro sitio de búsquedas:

  • En el sitio raíz de nuestra Site Collection (el sitio por defecto que se crea en una instalación típica de MOSS), creamos un nuevo sitio a través de  Site Actions -> Create Site.
  • En la página de creación de sitio elegimos una plantilla de tipo Team Site y especificamos los parámetros de creación necesarios (nombre del sito y la porción de la url que falta).
  • Una vez creado el nuevo sitio, y en la página principal, cerramos todas las web parts que tiene por defecto la página principal y pasamos a modo edición mediante Site Actions -> Edit Page.
Post_Busquedas_MOSS_1 Post_Busquedas_MOSS_2  

Post_Busquedas_MOSS_3

  • Desde la vista de edición de la página principal del site, añadimos las siguientes web parts de búsqueda:
    • Advanced Search Box.
    • Search Core Results.
    • Search Paging (añadimos dos de este tipo, para paginar adecuadamente los resultados).
    • Search Summary.
    • Search Statistics.
  • Configuramos la web part Advanced Search Box para que muestre los resultados de la búsqueda en la página actúal en lugar de en la página por defecto de resultados. Para ello, en las propiedades de la web part y en la sección Miscellaneus especificamos como Results Url la url actual: http://servidor/Busquedas/default.aspx. Quitamos también la opción de que aparezca la posibilidad de especificar un idioma de búsqueda (Sección Scopes, quitamos el check de la opción Show the languages picker).
Post_Busquedas_MOSS_4 Post_Busquedas_MOSS_5  

image

  • Cerramos la configuración de la web part, salimos del modo de edición de la página y probamos que el resultado de las búsquedas se muestra en la página actual…en este caso la búsqueda no devuelve resultados puesto que no tenemos ninguna coincidencia (en el nombre de archivo o contenido del mismo) con la palabra clave.
  • Para probar mejor las búsquedas, voy a subir unos cuantos documentos a la biblioteca Shared Documents y a través de la SharePoint 3.0 Central Administration voy a realizar un Full Crawling para que se indexe el nuevo contenido y ahora la búsqueda anterior si produzca resultados.
Post_Busquedas_MOSS_8 image  

image

  • Para forzar el Full Crawling basta con seleccionar la opción Start Full Crall disponible en la página Manage Content Sources y esperar a que la columna status recupere el valor Idle.
  • Volvemos a la página de búsquedas y ahora comprobaremos que si se producen resultados.
image image

Añadiendo una nueva propiedad a la búsqueda avanzada

En esta sección vamos a ver como podemos añadir una nueva propiedad a las que aparecen por defecto en la búsqueda avanzada de MOSS. Para ello, lo primero que vamos a hacer es añadir una nueva columna a la biblioteca Shared Documents denominada MiColumna. Una vez añadida, configuramos alguno de los documentos de la biblioteca para que tenga un valor en dicha columna.

Los pasos previos a poder añadir la columna entre las propiedades de búsqueda que ofrece la búsqueda avanzada de MOSS son los siguientes:

  • Realizar de nuevo un Full Crawl para que se indexe la nueva propiedad.
  • Comprobar que dicha propiedad se ha indexado a través de Metadata Property Mappings -> Crawled Properties. A continuación buscamos que la columna que añadimos anteriormente se haya indexado.
image image  

image

  • Una vez que hemos comprobado que la columna ya se ha indexado, lo siguiente que haremos es añadirla dentro de las Managed Properties: Pulsamos en la opción Managed Properties de la última ventana y a continuación New Managed Property.
    • Especificamos un nombre para la columna, el tipo de dato y una descripción.
    • Marcamos la opción Include values from a single crawled property based on the order specified
    • Añadimos la propiedad o propiedades con las que se va a mapear la propiedad (2 en mi caso).
image image  

image

  • Marcamos la opción Allow this property to be used in scopes.
  • Realizamos un nuevo Full Crawl para que los cambios tengan efecto.
  • Una vez añadida la propiedad, volvemos al sitio de búsquedas y configuramos la Advanced Search Web Part para que tenga en cuenta esta nueva propiedad. Para ello:
    • Nos vamos a la sección Properties dentro de los parámetros de configuración de esta Web Part.
    • Abrimos el XML de la Properties y añadimos lo siguiente:
      • En la sección <PropertyDefs> añadimos la definición de una nueva propiedad (justo al final): <PropertyDef Name=”MiColumna” DataType=”text” DisplayName=”Mi Columna”/>.
      • En la sección <ResultType DisplayName=”Documents” Name=”documents”> añadimos la referencia a esta nueva propiedad: <PropertyRef Name=”MiColumna”/>
  • Sin más, probamos que la búsqueda utilizando esta nueva columna funciona sin problemas.
image image  

image

Sin más, hasta aquí llega este nuevo post sobre configuraciones de búsquedas en MOSS. Espero que os haya resultado interesante.