viernes, 24 de junio de 2011

Vincular una lista de SharePoint con una tabla de SQL

Vincular una lista de SharePoint con una tabla de SQL fué un reto la primera vez que me lo sugieron. Normalmente no me gusta mezclar las cosas, sí las tablas estan en SQL pues que se queden todas ahi y las sacamos a través de reportes, sí son listas de SharePoint entonces que se queden ahi y las sacamos con vistas o exportamos a Excel.

Antes de comenzar tengo que aclarar que en este post no estoy poniendo instrucciones paso a paso para que hagas este ejercicio, estoy simplemente resumiendo el trabajo que hice. Si en tu caso te urge mas info y quieres ponerte en contacto conmigo mandame correo-e a fabian.munozag@gmail.com

El caso fúe el siguiente: Tengo una base de datos en SQL Server 2005, quiero relacionar un registro de una de esas tablas a un registro en una lista de SharePoint.

Porque asi?, porque nuestros usuarios les gustan los formularios de SharePoint además de que es muy comodo crear tus tipos de contenido, ponerlos en una lista y de ahi crear tus registros.

Estos son los pasos que segui:

1.- Crear el tipo de contenido: crear tipos de contenido es muy util porque lo puedes reutilizar, además es heredable a sub-sitios, sí haces cambios o actualizaciones todas las listas que lo usen serán actualizadas, es una forma efectiva de hacer el trabajo de administración de registros. Cuando hagas esto asegurate de que en tu tipo de contenido hayas incluido el campo de ID que va a guardar el ID del registro en tu tabla de SQL.






2.- Agrega tu tipo de contenido a tu lista. Otra de las ventajas de trabajar con tipos de contenido es que puedes vincular varios y de diferentes tipos a tu lista ;-) Mira la imagen abajo y veras que hay el tipo de contenido Hardware y el tipo PC Checklist Base.





3.- Abre su SharePoint Designer y conectate al sitio en cuestión.
4.- Crear una biblioteca para guardar Web Part Pages, esto es importante porque este tipo de contendio son paginas .ASPX ya con las zonas para meter Web Parts. Las vistas de datos que vas a agregar son Web Parts.
5.- Crea una conexión a tu tabla en SQL Server desde SharePoint Designer. En mi post anterior comente como hacer una y las cosas que tienes que cuidar sí no te quieres enfrascar en horas de tedio buscando porque no funciona, aqui esta la liga Crear conexión a SQL desde SPD

6.- Bien aqui llega la parte que mas me gusta. En la paginas, pones a la izquierda el Data View con el detalle de tu registro de la tabla en SQL y a la derecha el detalle de los registros relacionados que estan en la lista de SharePoint. Aqui va la imagen y abajo la explicación.

En el data view que ves a la derecha estoy mostrando unicamente un solo registro, esto con la idea de que los usuarios vean el registro xxxxxx y a su derecha los elementos relacionados. Para que se vea asi, tienes que configurar el data view y cambiar su layout a Repeating form with border, si no me equioco es el cuarto de arriba hacia abajo en la pestaña Layout del cuadro de dialogo Data View Properties. Luego te vas a la pestaña Paging y en Display items in sets of this size: y pones un 1. Ojo hay que configurar las opciones de filtrado para muestre el registro que el usuario seleccionó desde la lista donde aparecen todos los regirstros de la tabla de SQL, el ID de ese registro va a venir en el QueryString ya que ahi lo configuré.

Talvez ya para este punto te tengo todo confindido(a), por favor sigueme leyendo y mas adelante te ire aclarando el punto ;-)

Lo que sigue es crear el otro Data View, solo que este va a conectado a tu lista de registros en SharePoint, el procedimiento es casi igual solo que mucho mas sencillo porque solo tienes que arrastrar la lista de hacia el Web Part Zone y SharePoint Designer hace el resto:



Por ultimo hay que configurar el filtro de este Data View, la idea es que muestre solo aquellos registros relacionados con el Data View de la izquierda (aquel que trae el registro de tu tabla en SQL). Primero selecciona el Data View de tu lista de SharePoint (el que acabas de insertar), luego abre el menu contextual de Common Data View Tasks y da clic en la primera opción: Filters, esto abre otro cuadro de dialogo con las opciones para que configures tu filtro. Te muesto la imagen para que lo veas mas claramente:



En la imagen puedes ver que estoy seleccionando el campo (Field Name) Workstation ID, ese viene del tipo de contenido que creaste en los primeros pasos y por eso es tan importante. Cabe mencionar que ya que el ID en mi tabla de SQL es un campo numerico el tipo de dato de mi campo en la lista de SharePoint también es numerico y con cero decimales, eso es importante.

Regresando al tema del filtro, esta pagina que estamos creando la mando llamdar desde otra pagina. Asi es, perdona si te lo estoy haciedo mas confuso pero la razón es esta. Cuando mis usuarios entran a SharePoint, quieren ver primero que nada una lista con los registros de la tabla de SQL y luego si quieren ver el detalle de un registro cualquiera dan clic y los mando a esta pagina. Cuando los mando a esta página, envio en la URL o QueryString el ID del registro y esto me sirve para filtrar los webparts. El post de donde saque la idea y que viene muy bien redactado esta aqui

Aqui la imagen de los filtros en mis web parts:


Esta imagen muestra el filtro configurado en el Data View de la izquierda, el que muestra un solo registro de la tabla de SQL.


 Este otro es la configuración del parametro que servirá para filtrar el del web part de la derecha, que tiene los registros de la lista de SharePoint.

Basicamente estos son los pasos, nuevamente me disculpo por lo posiblemente confuso de mi explicación, mandame correo electronico y con gusto te ayudo.

miércoles, 22 de junio de 2011

Experiencias con SharePoint Designer

Hacía ya algun tiempo que no escribia nada a mi Blog, muy mal pero de verdad que he estado con las manos ocupadas en mil cosas, por un lado mi cambio de casa, mi cambio de empleo, etc. no que sea queja pero bueno, imaginaras como he estado.

Hoy escribo esto desde Phoenix, Arizona. Asi es, ando en estas calurosas tierras y ahorita que traigo fresco el tema de SharePoint Designer (SPD) comentare sobre lo que me paso.

Hay gente por ahi que he escuchado que SPD no es mas que un (talvez triste) FrontPage para SharePoint, sí tu eres uno de ellos, reconsidera. Mi primera experiencia con SPD no fué agradable y para ser sincero también pense que no era gran cosa. Hoy, varios años despues doy las gracias a SPD. Estoy metido en un proyecto de manejo de registros con SharPoint y resulta cierta información reside en SQL y otra en (recientemente) en SharePoint, asi que la pregunta es ¿como los conectas?, como conectas un registro de una base de datos de SQL Server con uno que esta en una lista de SharePoint sin perder la integridad de los datos.

Mi solución no es ni la mejor ni la mas sofisticada, simplemente es la nos funcionó. Creo que antes que nada te platicaré un poco el antecedente para ponerte en contexto, tengo en mis manos una compleja base de datos que controla registros de inventario de una empresa grande. Esos registros los muestran en SharePoint con la ayuda de ciertos WebParts (que no hice yo) y aunque estan feos y lo que le sigue, son muy funcionales. La primera vez que lo vi mi primera pregunta fué "que hacen esos registros allá en esa BD y porque no estan en listas de SharePoint en donde se pueden controlar con mucha elegancia a través de Tipos de Contenido"?

Basicamente lo que tenía que hacer era tomar un registro de la tabla de PCs (del inventario de PCs que tenemos) y relacionarlo con otro registro pero de una lista de SharePoint. Si lo ves de una forma muy sencilla, son dos tablas en bases de datos diferentes. Entonces todo se resumió a:

  1. Traer los registros las PCs a una vista de datos de SPD (Data View)
  2. Relacionarlo a un registro en la lista de SharePoint
En internet hay una buena cantidad de blogs que hablan sobre el manejo de "Data View" y SharePoint Designer, te voy a poner aqui los dos que mas me ayudaron, talvez ahi encuentres tu alguna respuesta y ya no tengas que leerme.

http://sharepointhillbilly.com/archive/2008/12/24/creating-a-sharepoint-list-parent--child-relationship---out.aspx

http://geekswithblogs.net/SoYouKnow/archive/2009/10/29/setting-sharepoint-form-fields-using-query-string-variables-without-using.aspx

El autor ahi habla de como crear la funcionalidad Padre-Hijo con registros de SharePoint, revisarlo y espero te sirva tanto como a mi.

Bien, si continuas conmigo te va a interesar saber como le hice para traer registros de SQL a una pagina de SharePoint. Primero que nada tienes que saber si le batalle un buen rato, ayer me dormi tardisimo entendiendo porque diablos no funcionaba la conexión, como en casi todos los productos de Microsoft, SPD a veces se pone en un modo dificil y hace muchos berrinches, asi que si te esta costando trabajo no te sientas mal, nos pasa a todos.

Voy a asumir que ya tienes una pagina "Web Part Page" lista y abierta en tu SPD (a proposito es gratis tambien el SPD para SP2010). Luego ve al menu Task Panes y selecciona Data Source Library pues necesitar ver ese panel para poder crear la conexión.

En la imagen que te muestro, bajo la sección de Database Connections verás que tengo ya ahi dos creadas, estas son conexiones directas a tablas en SQL.

Antes de que continuemos, necesitas un usuario con acceso a SQL, de preferencia un usuario no de Windows sino de SQL. Ese usuario tiene que tener permisos para ver al menos la tabla que intentas traerte.
Ya que lo tengas, das clic en Connect to a database...


Escribe el nombre de tu servidor de SQL, pon tu usuario y contraseña y listo!.
Que creaías que estaba tan sencillo, pues no U_U
Mira yo le batalle aqui un buen rato, mi problema fué que el servidor de bases de datos esta en algun lugar remoto y lo unico que tengo es la dirección IP. Luego sí tu servidor de SQL tiene varias instancias de SQL es otro lío, en fin no te quiero quitarte el ánimo y si tu tienes algun caso asi complicado lo que te recomiendo (porque fué lo que me funcionó) es ir a http://www.connectionstrings.com/sql-server-2005 (para SQL 2005) y de ahi saca el formato de conexión de OLE DB prodiver  ----- OJO FIJATE MUY BIEN LO QUE DIJE, OLE DB provider. Hay otros pero es un problema configurarlos y que funcionen como el de .NET o el de ODBC.
Saca de ahi la cadena de conexión a tu servidor y seleccioanr la casilla "Use custom connection string", y de nuevo te digo, fijate que al final de tu conexión diga Provider=SQLNCLI o Provider=SQLNCLI10

Lo que va a pasar a continuación es que el asistente de conexión iniciará y te mostrará la opcion de que selecciones tablas o vistas o procedimientos almacenados. Esta es la parte que me gusto mucho de SPD pues en verdad que esta muy completa la forma en la que puedes traer los datos. Puedes crerar una SQL Statement complejo, ponerlo en el asistente y con eso te traes tus datos ya denormalizados!, bastante bien para algo que antes no bajabas de un simple FrontPage no?

Ok aqui viene la otra parte mala. Me sucedió algo de lo mas extraño pues cuando logre conectarme me traje todos los registros y todos los campos de la tabla y para ser una base de datos de control de inventario tengo que decir que es un volumen muy grande con el que trate. Al principio todo bien pero luego me cambie de red y ahi se fué todo al caño. No se porque pero la conexión dejo de funcionar y comenzo mi vía crucis, borre la conexión y la volvi a crear unas 30 veces haciendo pruebas diferentes con cadenas de conexiones, usuarios y contraseñas, etc. hasta que me tope con un blog donde decía que probar trayendome solo 10 o 50 registros, usando una sentencia de SQL  como esta:

SELECT TOP 10 * FROM TuTabla

Bendito remedio!, funciono y termine mi diseño para la presntación de hoy en la mañana con mi Manager.. phew!!
Algo de lo que puede hacer se ve como esto:



Fijate bien en la imagen, tengo la vista de datos de las Workstations (perdon por la combinación de idiomas) configurada para hacer filtrado y ordenado desde el titulo de las columnas además de otras cosas.
Tambien me metí a investigar algo sobre XSL, lenguaje en el que aun soy neófito y me encontré con agradables sorpresas de todo lo que se puede hacer con esto.
Ve otra vez la imagen y fijate en la primer columna que dice View, esta la agregue con HTML y XSL para que cuando el usaurio de clic ahi, lo lleve a otra pagina donde se muesta el detalle del registro seleccionado.

Por lo pronto tengo que dejar de escribir y concluir, en otra ocación voy a actualizar mas este post.
Mi conclusión es que si bien con SPD puedes hacer maravillas como traerte toda tu base de datos a SharePoint Services sin necesidad de usar Business Data Catalog (BDC) que como sabes solo esta disponible en MOSS y no en WSS, puedes ligar registros de tu base de datos con otros de la lista de SharePoint de forma sencilla y tener un sistema de registros decente.