WSS 3.0 & MOSS: Construyendo vistas avanzadas con SharePoint Designer 2007 (III)!

Siguiendo con la serie de post de construcción de aplicaciones de SharePoint utilizando SharePoint Designer 2007 como herramienta y entorno de desarrollo, en este post vamos a ver como dotar de funcionalidad al formulario de inserción de datos que añadimos en el último post. Si recordamos el aspecto de la página de vista de datos finalmente desplegada:

image

Como veíamos en el post previo, esta página permite insertar datos en la BD SQL Server mediante el formulario de inserción, estos datos insertados se visualizan de manera automática en la web part correspondiente. Además, también veíamos como conectar en el entorno de SD 2007 distintas web parts para que funcionaran de manera coordinada. Ahora bien, y a raíz de que me haya planteado la cuestión por e-mail, está página se puede mejorar aún más en cuanto a que podamos añadirle validaciones al formulario de inserción de datos. El problema de realizar validaciones para este formulario de inserción es que tenemos que tener en cuenta que se trata de nuestra vieja amiga la Data Form Web Part, por lo que para añadir la validación vamos a tener que recurrir a utilizar JavaScript…si además tenemos en cuenta que el entorno de desarrollo es SD 2007 (un dolor…), pues resulta que construir esta sencilla validación puede dar más de un quebradero de cabeza. Por suerte, en la red (y aunque hay pocos recursos sobre este tema), hay un par de artículos a partir de los cuáles he podido construir la lógica de validación:

Ahora bien, aunque estos recursos han sido claves para saber como atacar el problema, en mi caso (y muchos otros) me ha llevado un buen rato llegar a una solución operativa y en funcionamiento debido a las peculiaridades de la Data Form Web Part y la estructura XSL que “escupe” y que es muy sensible a carácteres especiales. Empecemos.

Modelando la solución

Tal y como se comenta en los dos enlaces que os he indicado, y sobre todo en el segundo, el principal problema que hay que superar es como añadir un evento  a alguno de los botones que genera la Data Form Web Part en el momento en el que estamos añadiendo una vista de datos desde SD 2007 de acuerdo a la opción New Form (ver post anterior) debido a que no exponen de manera pública un evento que se pueda programar. Como nos comenta Fabián Imaz, la solución a este problema es aprovecharnos de la función AttachEvent de JavaScript que nos permite, y para Internet Explorer (restricción importante!), registrar eventos para controles y especificar la función JavaScript que se encargará de manejar dicho evento (Por cierto, para Firefox la función JavaScript equivalente es addEventListener). Una vez que sabemos como registrar un evento para un control, el siguiente paso es elegir el evento que vamos a registrar. De nuevo me remito a Fabián y su excelente entrada para constar de que no podemos registrar el evento click porque el formulario ya habrá pasado por el proceso de Submit y por lo tanto no se puede cancelar el proceso (en este caso se trata del proceso de guardar los datos en la BD). Entonces como alternativa, podemos utilizar otro evento típico para controles tipo botón o imágenes como es el onmouseup o el onmouseover (que es el que voy a utilizar en mi caso).

Una vez que sabemos como registrar el evento para un control y hemos elegido el evento que vamos a registrar, necesitamos una forma de obtener el control especifico al que vamos a añadirle este evento. Para ello, tenemos los métodos getElementById o getElementByName.

Finalmente, necesitamos saber dónde colocar todo el código JavaScript que vamos a utilizar para registrar los eventos de los controles, así como añadirlo en el evento Load de la carga del formulario. Para el primer punto, no conozco una regla fija, sino que simplemente hay que pensar en XSLT y lo delicado que es para saber dónde colocar todo el código JavaScript. En mi caso, y por intuición, lo he colocado a continuación de los botones a los que quiero registrar el evento y antes del tag </xsl:template> (por cierto, este post puede resultar esclarecedor para comprender la estructura XSL de la Data Form Web Part):

<xsl:template name=”dvt_1.formactions”>

                                               <td nowrap=”nowrap” class=”ms-vb”>

                                                                      <input type=”button” value=”Save” name=”btnSave” onclick=”javascript: {ddwrt:GenFireServerEvent(‘__commit’)}” />

                                               </td>

                                               <td nowrap=”nowrap” class=”ms-vb” width=”99%”>

                                                                      <input type=”button” value=”Cancel” name=”btnCancel” onclick=”javascript: {ddwrt:GenFireServerEvent(‘__cancel’)}” />

                                               </td>

<script  language=”javascript” type=”text/javascript”>

//Código JavaScript

</script> </xsl:template>

Y para el segundo de los puntos, añadir todo este código JavaScript a la pila de funciones JavaScript que dispara el evento Load de la página dónde se embebe el formulario tenemos la función JavaScript siguiente:

_spBodyOnLoadFunctionNames.push(“EventButton”);

Una vez modelada la validación, vamos a ver como implementarla.

Implementando la validación

Lo primero que tenemos que hacer es llamar a la función JavaScript anterior que se encarga de añadir la función EventButton a la pila de funciones JavaScript de la página. Una vez que hemos hecho esto, creamos la función y en la misma tenemos que hacer lo siguiente:

  • Declarar dos objetos que se correspondan con los controles (los botones Save y Cancel del formulario) a los que les vamos a registrar los eventos.
  • Encontrar estos objetos entre toda la colección de controles del formulario. Para ello utilizaré la función getElementById, puesto que para el caso de los botones SharePoint devuelve un ID limpio (lo que no sucede con los controles de tipo caja de texto).
  • Registrar mediante attachEvent el evento onmouseover para cada control y especificar la función que se encargará de manejarlo.

El código necesario para realizar todo lo anterior es el siguiente:

function EventButton()

{

                       PonerFocoInicial();

                       var objAceptar=document.getElementById(“btnSave”);

                       objAceptar.attachEvent(“onmouseover”,Aceptar); 

                       var objCancelar=document.getElementById(“btnCancel”);

                       objCancelar.attachEvent(“onmouseover”,Cancelar);

}

Nota: En el código he añadido una función adicional PonerFocoInicial() que simplemente pone el foco del cursor en una de las cajas de texto del formulario.

Una vez que hemos registrado los eventos y añadido los manejadores, el siguiente paso es definir estos últimos:

  • Manejador Cancelar: Simplemente mostrará por pantalla un mensaje infomativo (utilizando alert()).

function Cancelar()

{

                       var ICancelarEvento=false;

                       alert(“Cancelada la insercción de un nuevo curso”);

                       return ICancelarEvento;

}

  • Manejador Aceptar, que es dónde introduciremos la lógica de validación. Lógicamente es aquí dónde empiezan las complicaciones, y dónde más quebraderos de cabeza me he llevado, puesto que para buscar el control a comprobar no tenemos una referencia clara como ocurre con los botones…de hecho, el ID de una caja de texto tiene la siguiente forma:

ctl00$m$g_5437d929_64a3_4a68_be70_f2452c6f6981$ff2_new

Vamos, que además de que a priori no conoces el valor de este ID, y encima es bastante feo. Sin embargo, si nos fijamos en el ID, si que hay una parte que se corresponde con el ID que aparece en SD 2007 cuando examinamos los controles que ha generado la Data Form Web Part: ff2_new. Y de esto nos aprovechamos para utilizar la función getTagFromIdentifierAndTitle que aparece en el post que os comenté del equipo de SD 2007 (si bien, y como os explicaré, he tenido que modificar la función getTagFromIdentifierAndTitle para que funcione correctamente encajada dentro del XSL de la Data Form Web Part). No me enrollo más…el código del manejador Aeptar es el siguiente:

function Aceptar()

{

                       var ICancelarEvento=false;

                       var lsNombreProducto=null;

                       lsNombreProducto=document.getElementById(getTagFromIdentifierAndTitle(“input”,”ff2_new”,””));

                       if(lsNombreProducto.value==””)

                       {

                                               alert(“EL campo Nombre Producto no puede estar vacío!”);

                                               lsNombreProducto.focus();

                       }                     

                       return ICancelarEvento;

}

Cómo veis en la función anterior, la clave para encontrar el control a validar está de nuevo en el método getElementById dentro de la cuál se llama a la función getTagFromIdentifierAndTitle que recibe como parámetros el tipo de control y la cadena de texto a buscar entre los ID de la colección de controles del formulario. El código de dicha función es el siguiente:

function getTagFromIdentifierAndTitle(tagName, identifier, title)

{

    var len = identifier.length;

    var tags = document.getElementsByTagName(tagName);   

    for (var i=0;i&lt;tags.length;i++) {

        var tempString = tags[i].id;

       

        if (tags[i].title == title &amp;&amp; (identifier == “” || tempString.indexOf(identifier) == tempString.length – len))

        {

            return tempString

        }

    }

}

En este caso, lo más peculiar de esta función es que debido a la sensibilidad de XSL, en el bucle for he tenido que usar la representación estándar HTML del símbolo < pues SD 2007 y SharePoint no admiten que especifiques este símbolo a no ser que indique un tag. Dentro del bucle for que recorre todos los controles del formulario (y que almaceno en el objeto tags, que he “rellenado” mediante la método getElementsByTagName) simplemente busco aquel control cuyo ID contenga la palabra clave que le he pasado a la función y lo devuelvo (por cierto, fijaros de nuevo que en el if he tenido que reemplazar && por &amp;&amp; por lo mismo que antes).

  • Función PonerFocoInicial, esta es la más sencilla de todas una vez explicado lo anterior ;):

function PonerFocoInicial()

{

                       var ICancelarEvento=false;

                       var lsNombreProducto=null;

                       lsNombreProducto=document.getElementById(getTagFromIdentifierAndTitle(“input”,”ff2_new”,””));

                       if(lsNombreProducto.value==””)

                       {                                             

                                               lsNombreProducto.focus();

                       }                     

                       return ICancelarEvento;

 

}

Juntándolo todo y probando la validación

Sin más, vamos a probar que toda la validación funciona de manera correcta. Para ello, desde SD 2007 hacemos  un Preview de la página:

  • Al pasar el ratón por el botón Save, aparece el mensaje de que no se ha introducido un cierto dato.

image

  • Al pasar el ratón por el botón Cancel, aparece el mensaje correspondiente.

image

Para concluir este post, el código completo encajado en la estructura XSL de la Data Form Web Part es:

<xsl:template name=”dvt_1.formactions”>

                                               <td nowrap=”nowrap” class=”ms-vb”>

                                                                      <input type=”button” value=”Save” name=”btnSave” onclick=”javascript: {ddwrt:GenFireServerEvent(‘__commit’)}” />

                                               </td>

                                               <td nowrap=”nowrap” class=”ms-vb” width=”99%”>

                                                                      <input type=”button” value=”Cancel” name=”btnCancel” onclick=”javascript: {ddwrt:GenFireServerEvent(‘__cancel’)}” />

                                               </td>

<script  language=”javascript” type=”text/javascript”>

// Esta función es propia de Sharepoint y nos permite poner

//una función nuestra dentro de la pila de funciones que serán disparadas en el evento Load del mismo cuando

//se carge.

 _spBodyOnLoadFunctionNames.push(“EventButton”);

function EventButton()

{

                       PonerFocoInicial();

                       var objAceptar=document.getElementById(“btnSave”);

                       objAceptar.attachEvent(“onmouseover”,Aceptar); 

                       var objCancelar=document.getElementById(“btnCancel”);

                       objCancelar.attachEvent(“onmouseover”,Cancelar);

}

 

function getTagFromIdentifierAndTitle(tagName, identifier, title)

{

    var len = identifier.length;

    var tags = document.getElementsByTagName(tagName);   

    for (var i=0;i&lt;tags.length;i++) {

        var tempString = tags[i].id;

       

        if (tags[i].title == title &amp;&amp; (identifier == “” || tempString.indexOf(identifier) == tempString.length – len))

        {

            return tempString

        }

    }

}

function Aceptar()

{

                       var ICancelarEvento=false;

                       var lsNombreProducto=null;

                       lsNombreProducto=document.getElementById(getTagFromIdentifierAndTitle(“input”,”ff2_new”,””));

                       if(lsNombreProducto.value==””)

                       {

                                               alert(“EL campo Nombre Producto no puede estar vacío!”);

                                               lsNombreProducto.focus();

                       }                     

                       return ICancelarEvento;

} 

function Cancelar()

{

                       var ICancelarEvento=false;

                       alert(“Cancelada la insercción de un nuevo curso”);

                       return ICancelarEvento;

}

function PonerFocoInicial()

{

                       var ICancelarEvento=false;

                       var lsNombreProducto=null;

                       lsNombreProducto=document.getElementById(getTagFromIdentifierAndTitle(“input”,”ff2_new”,””));

                       if(lsNombreProducto.value==””)

                       {                                             

                                               lsNombreProducto.focus();

                       }                     

                       return ICancelarEvento; 

} 

</script> </xsl:template>

Sin más, hasta aquí llega el tercer post de la serie de creación de vistas avanzadas de datos en SharePoint con SD 2007…creo que no será el último porque mis compañeros del CIIN tienen muchas cosas en la re-cámara listas para contar.  Espero que el post os haya resultado interesante.

WSS 3.0 & MOSS: Recopilación de enlaces interesantes (XVI)

Después de un mes desde el último recopilatorio de enlaces sobre SharePoint, y teniendo en cuenta que por el medio tuvo lugar la SharePoint Conference, ha habido mucho movimiento entre la inquieta comunidad de SharePoint. Y como muestra, estos son los recursos más destacados de la decimosexta entrega del recopilatorio:

Artículos & Documentación

Tips & Tricks

Recursos & Novedades

MOSS SaaS Feature Matix

Y  hasta aquí llega esta nueva entrega del tradicional recopilatorio de recursos sobre SharePoint. Espero que toda la información que incluye os resulte de interés.

WSS 3.0 & MOSS: Construyendo vistas avanzadas con SharePoint Designer 2007 (II)!

En el último post veíamos como de una forma sencilla podíamos construir vistas avanzadas de datos de una cierta BD a partir de la Data Form Web Part y utilizando SharePoint Designer 2007 (SD 2007) como herramienta y entorno de desarrollo. La página de vista de datos tenía el siguiente aspecto:

image

Ahora bien, os comentaba que está página tenía un funcionamiento pobre, puesto que las web parts que visualizan la información de la BD son independientes y sin ningún tipo de relación entre ellas. La idea de este segundo post es ver como podemos conectar de manera lógica estas web parts y como además con SD 2007 podemos añadir un formulario de inserción de datos en la BD. Empecemos.

Conectando las Web Parts con SD 2007

Lo primero que vamos a ver es como podemos conectar de manera lógica las web parts que aparecen en la página Productos. Para ello, seleccionamos una de las web parts de nuestra página y seguimos los siguientes pasos:

  • Accedemos al menú Common Data View Tasks que ofrece la Web Part Productos, para a continuación seleccionar la opción Web Part Connections que nos permite conectar esta Web Part con alguna de las otras Web Parts disponibles en la página.
  • Tras pulsar la opción Web Part Connections, se inicia un asistente en el que seguiremos los siguientes pasos:
    • Especificar la acción a realizar para la conexión. Dejamos la que vienen por defecto: Send a Row of Data To. Pulsamos Next.
    • En la siguiente pantalla dejamos la opción que viene marcada por defecto: Connect to a Web Part on this page . Pulsamos Next.
    • En la siguiente pantalla especificamos los parámetros siguientes:
      • Target Web Part: Categoría Producto.
      • Targe action: Get Filter Values From.

      Pulsamos Next.

    • En la siguiente pantalla tenemos que especificar qué campos de la Web Parts productos utilizamos como parámetros para filtrar en la Web Part Categoría Producto. En este caso el campo de filtrado tanto en la Web Part origen como en destino es ID_CategoriaProducto. Pulsamos Next.
    • En la siguiente pantalla especificamos que campo de la Web Part origen utilizamos como enlace con la Web Part destino. Especificamos:
      • Create a hyperlink on: sNombreProducto.
      • Indicate current selection using: marcamos el check.

      En la pantalla que se abre al marcar el check, especificamos que el campo de enlace es sNombreProducto. Pulsamos el botón Next.

image image image
    • En la siguiente pantalla simplemente pulsamos el botón Finish.
    • Repetimos el proceso para conectar el resto de Web Parts de nuestra página:
      • Por ejemplo, conectar Web Part Producto con la Web Part Subcategoría Producto. En este caso, al utilizar la opción Web Part Connections que ofrece el menú Common Data View Tasks de la Web Categoría Producto, se abrirá la siguiente pantalla en la que tendremos que pulsar el botón Add:

image

    • En este caso, los campos utilizados para la conexión en origen y destino son:
      • ID_CategoriaProducto.
      • ID_SubcategoriaProducto.

image

Como campo de enlace utilizamos de nuevo sNombreProducto.

    • Finalmente, repetimos el mismo procedimiento para conectar la Web Part Productos con la Web Part Descripción de Producto. En este caso, los campos utilizados para la conexión en origen y destino son:
      • ID_DescripcionProducto.
      • Como campo de enlace utilizamos de nuevo sNombreProducto.

Sin más, previsualizamos de nuevo la página y comprobamos que la conexión entre las Web Parts funciona correctamente: File -> Preview in Browser -> Windows Internet Explorer 7.0.

image

Creación del formulario de inserción de datos

Para finalizar el post vamos a ver como se podría construir un formulario de inserción de datos a partir de las conexiones de datos ya creadas. En particular, vamos a ver cómo podríamos insertar un nuevo producto en la BD. Los pasos necesarios son los siguientes:

  • Seleccionamos la zona de inserción de Web Parts en Header dentro de la vista de diseño de la página Productos.
  • Desde Data Source Library seleccionamos la conexión Productos y luego Show Data.
  • En la pestaña Data Detail seleccionamos todos los campos del nuevo dataset Productos (1) y luego en la opción Insert Selected Fields as.. específcamos New Form.

image

El resultado que obtenemos es el siguiente:

image

Sin más, previsualizamos de nuevo la página y en el formulario de entrada de datos especificamos:

  • ID_Producto: CURS12
  • sNombreProducto: Curso de WCF
  • ID_DescripcionProducto: DESC08
  • ID_CategoriaProducto: Desarrollo
  • ID_SubcategoriaProducto: Herramientas
  • iCantidadProducto:2

Al pulsar el botón Save, veremos que el nuevo producto se ha añadido de manera efectiva a la BD.

image

Y hasta aquí llega este segundo post sobre creación de vistas avanzadas y formularios de insercción con SD 2007. Espero que el post os haya resultado interesante.

WSS 3.0 & MOSS: Construyendo vistas avanzadas con SharePoint Designer 2007 (I)!

Hacía tiempo que quería escribir sobre las capacidades que nos da SharePoint Designer 2007 (SD 2007) para crear rápidamente vistas avanzadas y formularios en una solución SharePoint. La clave de este desarrollo rápido y sin código está en la versatilidad y juego que nos da la Data Form Web Part. Esta Web Part tan especial permite consumir datos de orígenes de datos diversos como: listas y bibliotecas de SharePoint, feeds RSS, datos de una base de datos, servicios web o bien combinaciones de todas estas posibilidades. En este post vamos a ver como consumir datos de una cierta BD SQL Server. Empecemos.

Creación de la sección de visualización

Lo primero que vamos a hacer es crear la sección de visualización de los datos de la BD. Este sección va a ser una página de Web Parts de SharePoint. Para crearla:

  • Para crear la página de Web Parts en un cierto sitio de SharePoint, desde la página principal nos vamos a Site Actions -> Create.
  • Dentro de la sección Web Pages seleccionamos Web Part Pages.
  • Especificamos los siguientes parámetros de configuración para la página:
    • Name: Productos.
    • Layout Template: Header, Footer, 3 Columns.
    • Document Library: Shared Documents.
image image image

Tras comprobar que la página de Web Parts se ha creado, vamos a SD 2007 y abrimos el sitio de SharePoint dónde reside está página. A continuación, a través del Folder List de SD 2007 buscamos la página que acabamos de crear y hacemos doble clic sobre ella para tener disponible la vista de diseño de la página. De este modo, ya estamos listos para empezar a consumir los datos de una cierta BD (bastante sencilla como podéis  ver) utilizando la Data Form Web Part.

image image

Creando las vistas de datos

Para crear las vistas de datos, lo primero es acceder al panel Data Source Library. Para ello, en el menú de SD 2007 nos vamos a Task Panes -> Data Source Library. Una vez que se ha desplegado el panel, los pasos a seguir para crear las vistas de datos son:

  • Nos vamos a la sección Database Connectios y pulsamos la opción Connect to a Database. En la venta que se abre, realizamos las siguientes configuraciones:
    • Pestaña General especificamos Productos en la sección Name.
    • En la pestaña Source pulsamos el botón Configure Database Connection.
image image image
    • En la nueva ventana que se abre especificamos los siguientes parámetros:
      • Server Name: NOMBRE_SERVIDOR
      • User name: USUARIO_BD
      • Password: PASSWORD_USUARIO

Nota: En este caso estamos utilizando unas credenciales de usuario de BD. Si bien, se podría utilizar Single Sign On (SSO) o definir de manera personalizada la cadena de conexión.

    • Pulsamos Next y en las siguientes pantallas del asistente:
      • En la siguiente ventana del asistente, seleccionamos BD_Clientes en el combo de BD’s , dejamos marcada la opción Select a table or view y seleccionamos la tabla MD_Productos. Pulsamos Finish.
      • En la siguiente ventana pulsamos el botón Ok.

Si os dais cuenta, al definir la vista de este modo estamos haciendo un select * de los datos de la tabla. Por supuesto, podríamos especificar que campos filtrar, los filtros a definir y la ordenación de los datos. Además, podríamos haber optado por especificar directamente una sentencia Select para definir la vista, e incluso las sentencias Update, Insert y Delete en el caso de que queramos ir más allá de definir una vista de datos y queramos definir un formulario de inserción, actualización o borrado.

image image image
  • Una vez que hemos creado la primera conexión, para utilizar los datos de la misma nos vamos a la ventana Data Source Library hacemos clic sobre el menú de Productos y luego seleccionamos la opción Show data. A continuación en la pestaña Data Source Details seleccionamos los campos  de interés (en este caso: ID_Producto, sNombreProducto y iCantidad).
  • Una vez que los campos están seleccionados, en la página Productos seleccionamos el área de inserción de Web Part en la LeftColumn pulsamos Insert Selected Fields as… y seleccionamos la opción Multiple item view.
  • Tras hacer esta operación, ya podremos ver ver la composición y aspecto de la primera vista de datos.
image image image
  • Volvemos a la pestaña Data Source Library y repetimos parte del proceso anterior para añadir el resto de vista de datos que necesitamos.
  • El siguiente paso es utilizar estas conexiones de datos en la página de manera similar a como utilizamos la conexión a Productos. La diferencia es que en este caso vamos a insertar vistas de detalle en lugar de vistas múltiples. Veamos cuál es el procedimiento a seguir para la conexión Categorías Productos:
    • Seleccionamos Categorías Productos y en el menú que ofrece marcamos Show data.
    • En la pestaña Data Source Details nos aseguramos de tener seleccionados todos los campos de la conexión.
    • En la página Productos seleccionamos en este caso el área de inserción de Web Part de la MiddleColumn.
    • Dentro de Data Source Detail y en la sección Inserted Selected Fields as escogemos en este caso Single Item View.
  • Luego en este caso, el resultado obtenido es el de una vista de detalle de información frente al listado del caso anterior.
image image image
  • Repetimos el proceso para las otras dos vistas de datos.

Para visualizar la página en tiempo de ejecución, nos vamos al menú File de SD Designer y luego a Preview in Browser -> Windows Internet Explorer 7.0. El resultado que obtenemos es el que a continuación se muestra:

image 

Aunque el resultado es bueno, esta página es un poco pobre en cuanto a funcionamiento puesto que las Web Parts de la misma son independientes y no tienen ningún tipo de conexión. Pero esto lo dejamos para el siguiente post de la serie, en el qué a ver como conectar de manera lógica las Web Parts que forman parte de la página Productos.  Espero que el post os haya resultado interesante.

CIIN & Nuberos.NET: LINQ & ADO.NET Entity Framework!

Después del retorno y primer evento de Nuberos.Net en 2008 (sobre Silverlight y en el que José María Cuesta nos contó las posibilidades de Silverlight y surgieron discusiones interesantes sobre las otras grandes opciones que hay en el mercado: SVG y Flex), estamos que no paramos y ya tenemos en marcha el evento correspondiente a este mes de marzo: LINQ & ADO.NET Entity Framework. Aquí van los detalles del evento:

CIIN & Nuberos.NET: LINQ & ADO.NET Entity Framework

Conoce LINQ, el nuevo framework que habilita la definición de consultas integradas en el lenguaje y permite crear querys contra objetos de memoria, bases de datos relacionales, documentos XML, y otros elementos. Haremos un recorrido práctico de las principales características y novedades de este nuevo lenguaje que vendrá con la nueva versión de Visual Studio, y que se apoya en las innovaciones de lenguaje introducidas en las nuevas versiones de C# (3.0) y VB (9.0). Veremos alguno de los sabores de LINQ como: LINQ To Objects, LINQ To SQL o LINQ To Entities…y completaremos el evento con la nueva revolución tecnológica en el acceso a datos en plataforma .NET: ADO.NET Entity Framework. Ven con nosotros y preparate para la gran revolución: Are you ready?

Datos de interés:

  • Audiencia: Desarrolladores, Jefe de Proyecto

  • Requistos previos: Conocimientos del entorno Visual Studio 2005 / Visual Studio 2008 

  • Fecha: Jueves, 27 de marzo

  • Hora:  19:00 a 21:00

  • Precio: gratuito

  • Ponente: Juan Carlos González Martín (Centro de Innovación en Integración, CIIN). 

  • Lugar:

AGENCIA DE DESARROLLO LOCAL DE SANTANDER – Servicio de Promoción de Empresas y Autoempleo

Bajos del Mercado de México

c/ Alta 133

39008  Santander  CANTABRIA

España

Más información y registro al evento en este enlace.

Un poco de humor: Alcanza el Nirvana de la Programación ;)

La verdad es que  no me esperaba encontrarme esto en un flash newsletter de Microsoft, pero me he reído un rato con el personaje y sus explicaciones de como alcanzar el Nirvana de la programación. Tampoco tienen desperdicio las 7 leyes del Nirvana:

image

Espero que os haga tanta gracia como a mí ;)…por supuesto, la nota de humor tiene relación con la tecnología y no sólo por los enlaces a los que nos lleva cada tópico para alcanzar el Nirvana…el entorno gráfico está hecho con Silverlight ;).

Interoperabilidad entre MOSS & SAP: Algunos recursos!

Ya han sido varias las ocasiones en las que nos han preguntado sobre la interoperabildad e integración de estos dos grandes monstruos: SAP y MOSS. El caso es que la semana pasada recibí un flash de la Microsoft SAP Technical Community muy interesante, que además de otra información relevante, incluía un enlace a la página de Microsoft | SAP Alliance en el que aparece una tabla estupenda con una serie de whitepapers que recogen las posibilidades de integración e interoperabilidad de ambas plataformas…os reproduzco la tabla para que la tengáis a mano puesto que sin duda es un recurso de gran utilidad:

Interoperability Resources – SharePoint

Integration Topic

Document

Abstract

Date

SAP Enterprise Portal, SharePoint Server, WSRP

clip_image001 Evaluating Microsoft and SAP Portal Interoperability using WSRP

Enterprises looking for a way to consume SAP Enterprise Portal iViews using Microsoft Office SharePoint System 2007 can consider Web Services for Remote Portlets (WSRP). The goal of the WSRP technology is to facilitate the reusability of portlets across the boundaries of specific manufacturer implementations. This technology extends SAP Enterprise Portal functionality and data to SharePoint end users without the complexities or the expense of custom solutions.

12/2007

SharePoint Server, SAP NetWeaver Portal

clip_image001 CB_045_Interoperability between SAP NetWeaver Portal and Microsoft SharePoint Server 2007.pdf

This Technical Reference Guide lays out the status quo of existing interoperability scenarios between SAP NetWeaver Portal and SharePoint Technologies as of today. The paper was jointly developed by SAP and Microsoft and is a mature statement of do’s and don’ts in the Portal Interoperability today. Solution scenarios describe the high level overview where how to guides let consultants and interested techies step through the implementation.

12/2007

SharePoint Server, SAP Web Dynpro

clip_image001 Integration of SAP Web Dynpro with SharePoint 2007

This paper describes how to implement a SAP Web Dynpro application with Microsoft Office SharePoint Server 2007. This paper introduces the technologies and architecture used, describes the Web Dynpro customer contact scenario, and provides a detailed technical walkthrough of the implementation process.

10/2007

SharePoint Server, SAP NetWeaver Portal

clip_image003 Integrating Microsoft Office SharePoint Server and SAP

Interoperability between Microsoft Office SharePoint Server and SAP NetWeaver is a complex topic with lots of valuable scenarios. This overview animation explains options and possibilities as well as limitations in the combination of SharePoint 2007 and SAP NetWeaver.

10/2007

SharePoint Portal Server, SAP NetWeaver, SAP Business Suite

clip_image001 Integrating Microsoft Office SharePoint Server and SAP

Microsoft is committed to empowering information workers with simplified access to key business data and processes through the Microsoft Office System. This paper describes how organizations can extend the benefits of SAP to information workers through integration with Microsoft Office SharePoint Server 2007

06/2007

SAP Business Server Pages, SharePoint Server

clip_image001 SAP BSP – MOSS Integration

This paper provides information about how to use SAP Business Server Pages (SAP BSP) with SharePoint 2007. The paper gives an overview about the technologies and a contains a detailed walk-through of how to configure the SAP system and SharePoint Server in order to use Business Server Page Packages from SAP like the SAP Learning Solution (SAP LSO) from within SharePoint 2007.

05/2007

.NET Framework 2.0, ASP.NET, Microsoft Office SharePoint Server, SAP NetWeaver Portal, SAP Enterprise Portal (EP)

clip_image001 Performing Enterprise Search With MOSS in SAP NetWeaver Portal

The new Office SharePoint Server 2007 (MOSS) has significantly enhanced the search capabilities to provide the enterprise information workers with a consistent and quality search experience. It supports strongly the unification of enterprise data across unstructured documents, structured business data, and people to enable federated search across them. This whitepaper reviews the improvements concerning the search capabilities of the new MOSS server and demonstrates how to use them to provide enhanced search experience for the end user. Furthermore, this whitepaper checks up the possibilities and the constraints to build federated search with the new MOSS server and provides a simple sample to demonstrate how to integrate SAP NetWeaver Portal (also known as SAP Enterprise Portal) search into MOSS.

01/2007

SharePoint Portal Services, NetWeaver EP, WebDav

clip_image001 How to Integrate WSS and Exchange into SAP EP

This whitepaper describes how Microsoft Windows SharePoint Services (WSS) and Microsoft Exchange Server 2003 can be integrated into SAP Enterprise Portal (SAP EP) by using WebDAV today without using extensions available only with the Repository Manager addition for Windows SharePoint Services or Microsoft SharePoint Portal Server. Additionally, it will examine what possibilities arise from integrating these solutions into SAP Enterprise Portal and what features can be used with the current software versions.

07/2006

SharePoint Portal Services, NetWeaver Portal

clip_image001 SAP Enterprise Portal and Windows Sharepoint Services Interoperability

The document addresses several questions in the context of SAP Enterprise Portal and Windows SharePoint Services co-existence. It covers the three main areas Document Management Interoperability, Front-end and Content Integration and Collaboration Interoperability. While the focus is on providing general guidance about integration opportunities, the document in some cases also offers technical How-Tos.

09/2005

Además de esta tabla, otros recursos de interoperabilidad entre ambas plataformas son los siguientes:

Sin más, espero que la información os resulte de utilidad.

Nuberos.Net & CIIN: Gestión de proyectos y metodologías con Visual Studio Team System…seguimos con fuerza!!!!!

El próximo día 4 de abril el CIIN y Nuberos.Net (esperemos que para esa fecha esté lista la nueva web implementada en MOSS) organizaremos de forma conjunta un nuevo evento en el que contaremos con la presencia de Rodrigo Corral que seguro va a impartir una charla espectacular sobre el mundo de la gestión de proyecto y las metodologías de desarrollo con Visual Studio Team System. La verdad es que la organización del evento ha sido rápida por la total disposición de Rodrigo a venirse a Cantabria para charlar sobre el apasionante mundo de la gestión de proyectos…fue comentarle que varias empresas de la región tenían ciertos problemas y necesidades en cuanto que herramientas y que pautas seguir a la hora de desarrollar sus proyectos, que el mismo se ofreció a venir a impartir una sesión de 4 horas y un viernes por la tarde…muchas gracias Rodrigo!!!

Nuberos.Net & CIIN: "Gestión de proyectos y metodologías con Visual Studio Team System"

En cuanto a los detalles del evento en sí:

Todo proceso de desarrollo de software debe combinar la optimización de personas, herramientas y procesos para obtener como resultado un software de calidad, en tiempo, presupuesto y funcionalidad definida.

La Gestión de Proyectos  es clave a la hora de identificar las variaciones que puedan hacer fracasar un desarrollo, donde la colaboración entre los distintos roles del ciclo de vida de desarrollo y el uso de las distintas metodologías: ágiles, scrum, CMMI,etc…son claves para el éxito de cada proyecto.

Durante el seminario trataremos de forma práctica todos estos aspectos.

Ponente: Rodrigo Corral González, MVP de Team System

Datos de interés:

Requisitos previos: Conocimientos del entorno Visual Studio 2005

Audiencia: Desarrolladores, Jefe de Proyecto

Fecha: Viernes, 4 de Abril

Hora:  16:30 a 20:30

Precio: GRATUITO

Lugar de celebración:

Centro de Promoción e Innovación Tecnológica
Calle Tanos, s/n , Tanos, Torrelavega
Torrelavega, Cantabria, 39316

Esperamos que el evento atraiga al mayor número de participantes (no adelanto nada, pero todo indica que así va a ser ;). Podéis inscribiros en el evento a través de este enlace.

Nuberos.Net & CIIN: "Gestión de proyectos y metodologías con Visual Studio Team System"

Microsoft Office Live Workspace: Por fin!

Aunque fue ayer a través de un comunicado de prensa cuando Microsoft anunció la disponibilidad pública a nivel mundial de la Beta 1 de Office Live Workspace, no ha sido hasta hoy cuando me he enterado después de ver que en mi cuenta de correo tenía el siguiente mensaje: Your workspace is ready!…Nada más leerlo, me he puesto a probarlo…y para los que os animéis a experimentar, no tenéis más que acceder a Office Live Workspace. Lo primero que hay que hacer es completar el proceso de sign-up iniciado previamente (en mi caso hace 3 meses), tras aceptar las condiciones del contrato, por fin aparece el citado Workspace:


image


…lógicamente me dije, no nos vamos a quedar aquí y vamos a probar algunas de las cosillas que ofrece y que prometen (Por cierto, la plataforma huele mucho a mi querido SharePoint ;)). Empecemos:


Crear un nuevo elemento


A través de la opción New podemos crear una serie de elementos típicos del espacio: Notas, Listas, Listas de Tareas, Listas de Eventos, Listas de contactos y documentos Word, Excel y PowerPoint. Vamos a elegir la creación de un documento de tipo Word…¿qué pasará?…no todo iba a ser tan fácil, lo primero que se recomienda es instalar es un update para Microsoft Office Live Workspace (no pasa nada, estamos en Beta1 :)). Pues nada, descargamos la actualización y lo instalamos (por cierto, es una descarga de 20. 4 MB).







image image image

Una vez instalada la actualización (que por cierto tarda lo suyo…se instalan unos cuantos hotfixes por el camino…y hay que reiniciar el PC, pero merece la pena por probar Office Live Workspace), probamos de nuevo indicando en este caso que ya tenemos instalado el update anterior y aceptando el aviso de seguridad correspondiente, con lo que a continuación se abre nuestro amigo Microsoft Office Word…hasta aquí todo va bien y esto parece mucho a SharePoint como ya os comentaba :)…Guardamos el documento para ver que pasa…le cuesta, se cuelga Word…mmm, vamos a darle tiempo…por fin aparecen las credenciales de Windows Live para poder guardar el documento en el Workspace…bien!…tras introducir las credenciales y esperar de nuevo un tiempo (mi módem Vodafone a veces no está para dar muchas alegrías :PPP), se empieza a visualizar la ventana de guardar documento, con la opción de poder guardarlo en el Workspace:







image image image

Hasta aquí todo bien, pero…¿se habrá guardado el documento realmente en el Workspace? Para salir de dudas, nos vamos al navegador…y ahí está…impresionante:


image


Una vez creado el documento, podremos hacer con el las típicas operaciones de moverlo entre workspaces, compartirlo o borrarlo…y por encima de estas funcionalidades, visualizar el documento directamente en el Workspace…fijaros en como queda…cool!!!!!


image


A nivel de documento, podremos editarlo en Microsoft office Word, añadirle comentarios, compartirlo o guardarlo en el historial de versiones


Crear un nuevo Workspace


Lo siguiente que he probado, y aquí lo dejo en cuanto a que nos permite hacer el Workspace, es la funcionalidad de creación de un nuevo Workspace para compararlo con la creación de Site Collections y Sites de SharePoint en cuanto a como se realiza el proceso y el tipo de plantillas disponibles…y la verdad es que hay unas cuantas plantillas (un total de 12)…en mi caso he escogido la Meeting Workspace…una vez que el proceso acaba, el resultado no es tan espectacular como esperaba (no huele tanto a SharePoint :PPPP) puesto que la plantilla base en si es la misma, pero incluye una serie de documentos tipo y elementos (lista de asistentes) que se consideran como típicos en un espacio de tipo Meeting…supongo que conforme siga evolucionando la plataforma esta plantilla y otras se irán enriqueciendo..pero como dije, Office Live Workspace promete y mucho.







image image image

Y lo último Microsoft Office Live Add-In


Esto si que es lo último que pruebo, el Microsoft Office Live Add-In que permite integrar los clientes Office con Office Live Workspace…tras instalarlo (está disponible en el propio Workspace, y la instalación es bastante sencilla), y abrir Microsoft Office Word 2007, los añadidos que tenemos son los siguientes:



  • Open from Office Live

  • Save to Office Live

image


Y hasta aquí las primeras pruebas de Office Live Workspace…no se, pero me da a mi que voy a utilizar bastante estas funcionalidades :PPPP. Espero que el post os haya resultado intersante.

Extensibilidad de LINQ: LINQ Flavours!

Como sabéis, una de las grandes novedades de Visual Studio 2008 y de .NET Framework 3.5 es el Language Integrated Query (LINQ) que habilita la definición de consultas integradas en el lenguaje de programación y es una de las piedras angulares de las nuevas versiones de C# y VB. Precisamente, muchas de las innovaciones que se han introducido en estas nuevas versiones son la base de LINQ, y el resumen de las mismas es el siguiente:

image 

Ahora bien, además de apoyarse en estas innovaciones, LINQ define un modelo ampliable y extensible para definir nuestras propias consultas o API’s de consulta, de manera que podemos ir más allá de las extensiones para LINQ que por defecto vienen con Visual Studio 2008, .NET Framework 3.5 y ADO.NET Entity Framework:

image
  • LINQ To Objects y LINQ To XML para trabajar con fuentes de datos no relacionales.
  • Para ADO.NET tenemos:
    • LINQ To Datasets
    • LINQ To SQL
    • LINQ To Entities

Tras esta pequeña introducción, la idea de este post es hacer una recopilación y recorrido por las extensiones que para LINQ se han ido creando durante los últimos dos años, algunos de los cuales presentó Octavio Hernández en su charla dentro del lanzamiento de Visual Studio 2008, SQL Server 2008 y Windows Server 2008 (me hubiera gustado estar en el evento y asistir a esta charla).. Empecemos.

Proveedores de LINQ Personalizados

Como comentábamos, LINQ es un modelo completamente extensible y aquí están algunas de las extensiones que he ido descubriendo cuando he preparado seminarios de LINQ, en los propios cursos de LINQ,…

IEnumerable<T> data = …;
var q = from x in data.AsParallel() where p(x) orderby k(x) select f(x);
foreach (var e in q) a(e);
  • CLINQ (que no es Continuous LINQ, proyecto en Codeplex que he descubierto esta tarde…), en este caso nos referimos al proyecto CLINQ que Tomas Petricek, MVP de C#, inició para que el lenguaje C++ tuviese soporte para LINQ (de hecho, cualquier lenguaje que soporte la CLS puede añadir sus propias implementaciones de LINQ). Por ejemplo, mediante las extensiones desarrolladas por Tomas para C++, la consulta a una BD en C++ quedaría:
// create connection to database
NorthwindData db(".. connection string ..");

// declare database query
Expr<Customers^> cvar = Var<Customers^>("c");
CQuery<String^>^ q = db.QCustomers
  ->Where(clq::fun(cvar, cvar.City == "London"))
  ->Select(clq::fun(cvar, 
      cvar.ContactName + Expr<String^>(", ") + cvar.CompanyName));

// execute query and output results
for each(String^ s in q->Query)
  Console::WriteLine(s);

Tomas ha creado una sección en Codeplex dedicada a extensiones para LINQ. De momento está incluido CLINQ, pero según el autor, poco a poco irá añadiendo alguna más.

  • LINQ To SharePoint, como no podía ser de otro modo, existe desde hace tiempo un proveedor de LINQ específicamente pensado para realizar consultas contra listas de SharePoint usando sintaxis LINQ. Esta extensión tiene su sección correspondiente en Codeplex, y además de habilitar consultas LINQ, dispone de una herramienta de creación de clases sobre las que definir consultas a partir de listas de SharePoint: SpMetal (misma idea que el SQLMetal de LINQ To SQL). Actualmente en Codeplex tenemos disponble la versión v0.2.4.0 alfa preparada para .NET Framework 3.5 y Visual Studio 2008. Un ejemplo de uso de esta extensión es el siguiente:

var ctx = new SharePointDataContext(new Uri(http://fileserver));
ctx.Credentials = new NetworkCredential(“dimitri”,”LinqToSharePoint”);

var books = ctx.GetList<Books>();

var res = from b in books
select new { b.Title, b.Author};

foreach (var u in res)
Console.WriteLine(u);

  • LINQ To Amazon, en este caso se trata de una extensión creada por uno de los autores del libro LINQ in Action, Fabrice Marguerie, que permite consultar libros de Amazon mediane LINQ. De hecho, esta extensión permite consultas LINQ contra un cierto catálogo de libros, obteniendo las estructuras XML que devuelven los servicios web de Amazon. Un ejemplo de uso de esta extensión sería el siguiente:

var query =
  from book in new Amazon.BookSearch()
  where
    book.Title.Contains(“ajax”) &&
    (book.Publisher == “Manning”) &&
    (book.Price <= 25) &&
    (book.Condition == BookCondition.New)
  select book;

var sequence = query.ToSequence();

  •  LINQ To NHibernate, esta extensión permite escribir consultas LINQ que son posteriormente traducidas a Criteria Queries que son ejecutadas por un objeto de Sesión NHibernate. Todo el código de este proyecto está accesible en este enlace…y aunque un poco fuera de tópico, fijaros en la sorpresa que os encontraréis si entráis en la página principal Hooked on LINQ: LINQ Reference Stuff…pero fijaros en el formato 😉 :
Image Image

        Desde luego, las tazas son “molonas”, creo que me las voy a pedir por esto y porque merece la pena darle soporte a Hooked on LINQ. Están realizando un excelente trabajo.

  • DbLINQ Project, se trata de un proyecto en Code2Code en el que podéis encontrar las bases de un proveedor LINQ para bases de datos Oracle, MySQL y PostgreSQL. Como se comenta en la página del proyecto DbLINQ, se garantiza que las consultas simples funcionarán sin problemas, aunque no las complejas…precisamente la disponibilidad del código habilita que los desarrolladores puedan testear bien estas extensiones y evaluar, extender y corregir el comportamiento del proveedor al modelar consultas complejas. Las releases del código están en este enlace. Todo el proyecto se está desarrollando bajo licencia MIT para ser compatible con el proyecto Mono.
  • LINQ To LDAP, se trata de un proveedor capaz de enviar consultas LINQ a un directorio activo sobre LDAP partiendo de las expresiones de filtrado en LDAP que aparecen en la RFC 2254. Un ejemplo de uso de este proveedor creado por Bart de Smet’s es el siguiente:
var users = new DirectoryObject<User>(new DirectoryEntry(“LDAP://localhost”), SearchScope.Subtree);
var groups = new DirectoryObject<Group>(new DirectoryEntry(“LDAP://localhost”), SearchScope.Subtree);
var res1 = from usr in users select usr;
Console.WriteLine(“QUERY 1n=======”);
foreach (var w in res1)
     Console.WriteLine(“{0}: {1} {2}”, w.Name, w.Description, w.PasswordLastSet);
     Console.WriteLine();
var res2 = from usr in users where usr.Name == “A*” select usr;
Console.WriteLine(“QUERY 2n=======”);
foreach (var w in res2)
    Console.WriteLine(“{0}’s full name is {1}”, w.Name, w.Dn);
    Console.WriteLine();
  • LINQ To TFS, esta nueva extensión creada por Octavio Hernández,y de la que tuve conocimiento a raíz del post de Octavio, la podemos encontrar en Codeplex y se trata de un proveedor de LINQ preparado para consultar el repositorio de Team Foundation Server en el que se hace el almacenamiento y control de versiones de Work Items.
  • LINQ To Flickr, esta extensión al estilo de LINQ To Amazon permite consultar fotografías de Flickr por tag, fecha de creación, identificador de usuario o título. El autor de esta extensión es el egipcio

    Mohammed Hossam El-Din.

  • LINQ To JSON, se trata de una extensión para JSon.NET que permite crear y consultar objetos JSON mediante consultas de LINQ. Su creador es James Newton, y esta extensión permite trabajar con objetos JSON de manera similar a como LINQ To XML permite manipular estructuras XML.

JObject o = JObject.FromObject(new

{

  channel = new

  {

    title = “James Newton-King”,

    link = “http://james.newtonking.com”,

    description = “James Newton-King’s blog.”,

    item = from p in posts orderby p.Title

         select new

        {

          title = p.Title,

          description = p.Description,

          link = p.Link,

          category = p.Categories

        }

  }

});

  • BLINQ, en este caso no se trata de una extensión en sí, sino de una herramienta (descontinuada) que permite generar sitios ASP.NET para visualizar, crear y manipular datos obtenidos mediante LINQ a partir de un cierto esquema relacional.

Y como podéis ver en este recopilatorio Hosam Kamel, el listado completo de proveedores de LINQ que podemos encontrar en la red es este:

  • LINQ to Amazon.
  • LINQ to Active Directory.
  • LINQ to Bindable Sources (SyncLINQ).
  • LINQ to CRM.
  • LINQ to Geo – Language Integrated Query for Geospatial Data.
  • LINQ to Excel
  • LINQ to Expressions (MetaLinq).
  • LINQ to Flickr.
  • LINQ to Google.
  • LINQ to Indexes (LINQ and i40).
  • LINQ to IQueryable.
  • LINQ to JSON.
  • LINQ to LDAP.
  • LINQ to NHibernate.
  • LINQ to JavaScript.
  • LINQ to Lucene.
  • LINQ to Metaweb(freebase).
  • LINQ to MySQL, Oracle and PostgreSql (DdLINQ project).
  • LINQ to RDF Files.
  • LINQ to Sharepoint.
  • LINQ to SimpleDB.
  • LINQ to Streams.
  • LINQ to WebQueries.
  • LINQ to WMI.
  • LINQ to XtraGrid.

Está claro que el título del post de Hosam, LINQ To Everything, es muy apropiado.

Creación de proveedores de LINQ personalizados

Además de las extensiones comentadas, cualquier desarrollador puede crear las suyas propias. De hecho, estos son algunos ejemplos que muestran como habría que proceder:

  • Escribir un proveedor personalizado desde cero: en esta entrada tenéis un ejemplo.
  • Escribir proveedores personalizados partiendo del proyecto LINQExtender de Codeplex. El ejemplo en este caso está aquí.

Nota: Ambos ejemplos han sido realizados por Mehfuz Hossain.

…¿y existe LINQ fuera de la plataforma Microsoft? Buena pregunta, y la respuesta es que sí. De hecho, en el mundo Java ya ha aparecido LINQ for Java o Quaere. Como se comenta en este post, Quaere is a DSL que añade sintaxis de consultas tipo SQL en el desarrollo de aplicaciones Java basándose en el modelo del proyecto LINQ ;)…como muestra, un pequeño ejemplo de Quaere:

Integer[] numbersA = {0, 2, 4, 5, 6, 8, 9};
Integer[] numbersB = {1, 3, 5, 7, 8};
Iterable<Variant> pairs =
from("a").in(numbersA).
from("b").in(numbersB).
where(lt("a", "b")).
select(
create(
property("a"),
property("b")
)
);

Sin más, hasta aquí llega este post en el que he intentado reflejar la extensibilidad de LINQ. Espero que os haya resultado interesante.