viernes, 16 de diciembre de 2011

Registros duplicados

Recientemente estuve trabajando en localizar y eliminar duplicados de registros en uno de los inventarios que manejamos con SQL Server 2005.

La premisa es muy sencilla: "Localiza y elimina los registros duplicados"

La tabla es sencilla sin muchas columnas, simplemente es un inventario de impresoras donde almacenamos el tipo de impresora, la marca y modelo, su dirección IP y dirección MAC, número de serie y el puerto por donde sale a la red, bien hasta aquí.

El problema es que los usuarios nos avisaron de que había registros donde se veían direcciones MAC duplicadas y también encontraron Numeros de Serie duplicados, me puedo imaginar al pobre usuario intentando actualizar su inventario para darse cuenta de que hay discrepancias y que ahora no esta seguro "cual registro es el bueno".

Sin duda eliminar registros duplicados puede ser un trabajo muy sencillo o sumamente complicado y digo esto por la razón de que si sencillamente quieres quitar duplicados sin revisar o calificar los registros para saber "cual es el bueno" entonces la solución esta a un 'tris' de tus dedos, pero si vas a revisar cuales son esos duplicados, analizar los valores de las columnas para decidir cual es registro con el que te quedas y finalmente borrar lo que decides que son registros basura entonces todo toma un sentido diferente y la tarea se vuelve complicada por no decir que consume mucho tiempo  (al menos hablando desde mi experiencia y asegurando que hice todo lo posible por rápidamente entender los mejores pasos a tomar para resolver este divertido reto).

Continuando, describo las opciones que tuve y cual tome así como los pasos que seguí para mejorar el inventario.

Debido a que yo trabajo con tecnología de Microsoft mis opciones se convirtieron en usar cualquiera de las siguiente herramientas:

  • Excel 2007
  • Access 2007
  • Lenguaje Transact SQL
  • Integration Services (SSIS)
Lo primero que pense fué "Voy a automatizar esto con SSIS y en un santiamén lo resuelvo" (ja! iluso) y encontre este excelente artículo de Todd McDermid titulado "Eliminating Duplicate Primary Keys in SSIS". 

No quise utilizar ni Excel ni Access porque sabía que habría mas trabajo manual del que pudiera soportar, sin embargo no descarto que se puedan utilizar y que puedan ayudar mucho en la tarea de encontrar duplicados y eliminarlos de la tabla. Tal vez si el trabajo es hecho por mas de una persona se pueda facilitar el proceso, en mi caso solo estaba yo para resolver el problema y por eso es que necesite ayuda de algo mas sofisticado como Integration Services.

Solo un comentario mas sobre Excel 2007, sus tablas dinámicas si me sivieron para filtrar los registros y con esto me pude dar una mejor idea de los pasos que tomaría para automatizar el proceso de elimado de duplicados, ya eso es todo ahora si a continuar...

Aviso importante: Me voy a permitir describir a continuación y en resumen lo que Todd ahí comparte con respecto al tema de "deduplicación de registros", cualquier buena idea aquí mostrada la tome a partir de su publicación.

Usando SSIS hay 3 formas para eliminar duplicados de una tabla: La super fácil, La moderadamente dificil y La muy dificil.

La super fácil consta de sencillamente poner en un "Data Flow" un componente de conexión a la tabla donde están los registros duplicados, luego conectarla a un componente "Sort" para ordenar y en este es donde debes utilizar la columna donde se sabe que estan los datos duplicados. En el editor del componente Sort se activa la casilla de elimnar duplicados y finalmente se conecta a un componente de destino.




La moderadamente difícil (que fue la finalmente yo tome como base para comenzar mi trabajo) utiliza una columna donde se califican los registros. El concepto a primera vista es sencillo de entender, digamos que se tiene un registro que esta repetido tres veces, a partir del valor o los valores de los campos de esos registros se crea una columna con la calificación y esta es la que servirá para tomar el mejor calificado y conservarlo. Este modo es solo bueno sí hay la forma de determinar esta "calificación", yo en realidad no hice mucho aqui y mi punto de partida fué tomando el campo de clave primaria (priamry key) viendo cual era el registro mas nuevo para borrar los mas viejos, asi de sencillo.

Bien, Todd describe por pasos como crear ese paquete así:

  1. Después de crear el componente de origen de datos, se envían esos datos aun componente de "Derived Column" en donde se crea esta columna de calificación la cual se utilizará mas adelante.
  2. Luego se conecta a un componente "Multicast" para hacer una copia de estos datos. Se utilizarán dos salidas que para efectos de simplicidad se describen como Salida A y Salida B.
  3. La Salida A se conecta con un componente "Aggregate" para realizar la operación de agregación "Group By"  UNICAMENTE a la(s) columna(s) donde estan los datos repetidos. En mi caso fué la dirección MAC de la impresora. Ojo!, al conectar la Salida A al componente Aggregate las demás columnas y sus datos se perderán, no hay problema y por eso reitero unicamente agrupar la(s) columnna(s) que tiene los datos repetidos.
  4. A continuación se envía la Salida A a un componente "Sort" y se ordena primero por la columna de clave principal (primary key) y después por la columna de calificación. Es necesario hacer esto pues el componente de Merge Join requiere que haya al menos una columna ordenada.
  5. Conectar la Salida A a un componenete Merge Joing. Ponerlo en LEFT Side.
  6. Enviar la Salida B a un componente "Sort" y ordenar por la columna donde estan los datos repetidos. NO seleccionar la casilla para remover duplicados.
  7. Conectar la Salida B al componente Merge Join, configurarlo en RIGHT Side.
  8. Editar el componente "Merge Join", hay que dejar la configuración predeterminada de "Inner Join" esto hace que el resultado sean solo aquellos registros donde haya coincidencia en la columna que esta ordenada. Finalmente, se activa la casilla en los campos de la Salida B o lo que entro por RIGHT Side del componente.
La teoría y los pasos ahi estan, la siguiente imagen muestra lo que yo hice, puse tres secciones enmarcadas en rojo para describir los pasos principales del proceso, primero se obtienen los datos duplicados, se califican en el componente "Derived Colunn" y se pasan al componente "Multicast". Despues se trabaja con cada una de las salidas donde la Salida A se agrupa por las columnas donde haya datos repetidos y se ordenan. La Salida B unicamente se ordena por la columna donde haya datos duplicados.

Ahora bien, en mi caso decidi primero atacar aquellos registros donde hubiera unicamente dos registros duplicados. Lo decidi asi porque al analizar los datos en la tabla dinámica de Excel me di cuenta de que en esas dos repeticiones podía tomar el registro donde la clave principal fuera mayor y eliminar el otro registro. Por esta razon agregue el componente "Conditional Splilt" para tomar unicamente los registros donde hubiera dos repeticiones.
Despues de hacer la selección de los registros con solo dos duplicados, se pasan los datos por el componente Merge Join para efectuar la operación Inner Join, el resultado es entonces enviado al tercer paso del proceso. En este paso vuelo a pasar los datos por un componente "Aggregate" porque es ahi donde seleccione con la función MIN el registro que tenía que eliminar. 
El componente "Multicast" que viene despues tiene como objetivo crear una copia de esos registros que iba a borrar. Una copia fué enviado a un archivo plano para tenerlo como referencia en caso de que me hubiera equivocado y necesitara restaurarlos y la otra copia se fué a un componente "OLE DB Command" donde escribi un "query" bastante sencillo:

DELETE FROM Tabla_Impresoras WHERE ID = ?

Aqui la imagen de como se ve mi paquete:




Algo que no comente fué que en el componente "Aggregate" en el cuadro 2, hay que agrupar por la columna donde estan los datos duplicados con la función de agregación "Group By" y luego hay que incluir la columna de la clave principarl con la función de conteo, de otra forma el componente de agregación del cuadro 3 no va a funcionar.

Aquí la imagen de como quedo el mío:




La muy difil no la comento mucho pues no use este metodo sin embargo la propuesta de Todd es interesante. Para esta opearción se utiliza un componente "Script" que funciona de manera asíncrona.
Se agregan las columnas que se desea pasar al componente y luego configura las columnas de salida. Finalmente hay que tirar codigo en el "Script" que contenga la logica necesaria para la seleccionar los registros que estan duplicados.

Espero esta entrada haya sido provechosa, termino agradeciendote por haber leido hasta aqui y comentando que además de estas opciones, hay personas que estan haciendo deduplicación con las fucniones RANK() y ROW_NUMBER() de SQL.

Yo hice algunas pruebas, aqui mi script


SELECT ROW_NUMBER() OVER (PARTITION BY MACAddress ORDER BY SerialNumber ASC) AS RowNumber, MACAddress, SerialNumber, IPAddress
FROM Printer_Manual_Data
WHERE MACAddress IS NOT NULL


Saludos y suerte!

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.

martes, 10 de mayo de 2011

Plan de Gobernabilidad para SharePoint

Hoy durante mi busqueda sobre nuevo contenido para SharePoint me tope con un Live Meeting que desde hace tiempo estuve buscando: "SharePoint Governance Plan" presentado por Dan Lewins (Senior Consultant, Microsoft Corp) aqui el vínculo, además venía acompañado por un documento en Word que sirve como plantilla para preparar la información. El documento lo revise y esta bastante aceptable, para ser sincero nunca he realizado uno con tanta formalidad y este me sirvió mucho para darme una buena idea de como prepararlo. El documento fué prepardo por Hank Farlow, de la empresa ALI Inc.

Bien, pues dicho todo esto lo quiero comentar es que no puedo recalcar lo suficiente la importancia que tiene tener un plan de este tipo. Primero que nada no importa sí tu instalación de SharePoint la administra solo una persona y tienes 10 o 20 usarios, no importa sí tu instalación es una granja con multiples administradores, desarrolladores, diseñadores y tienes cientos o miles de usuarios, sí quieres que tu trabajo se formalice y sea una solución profesional que de servicio a todos tus usuarios para ayudarlos en sus esfuerzos y no se convierta en otra herramienta mas que tienen que aprender a usar tienes que tener tu PLAN DE GOBERNABILIDAD DE SHAREPOINT.

Dado que este documento no es hecho por unicamente una persona, pudiera llevarte semanas o meses en crearlo -¿Como sabes sí acabas de decir que nunca has hecho uno?-, tienes razón, ¿como lo se?, lo se porque dentro de mis actividades como administrador de proyectos he creado varios documentos "Project Charter" y "Project Scope Statement". Esta información es el resultado del proceso de la definición de un proyecto bajo la metodología estandar (y mundialmente reconocida) del PMI. Asi que cuando vayas a comenzar asegurate muy bien de identificar a toda la gente que estará involucarda, hagan juntas y reflexionen juntos lo que involucrará administrar Sharepoint bajo un plan de gobernabilidad.

Quiero describir muy brevemente el documento, se divide en 9 secciones, toca puntos desde el objetivo y el alcance, recursos, jerarquía de gobernabilidad, etc. Es imporante saber que durante la creación de este documento y debido que se debe involucrar a diversos roles de la organización tales como el patrocinador del proyecto de SharePoint, la alta gerencia, los "stakeholders" (disculpen la combinación de terminos español, ingles, realmente no he encontrado aun una palabra que defina a mi gusto un Stakeholder, pero puedes pensarlo como aquellas personas que directa o indirectamente son afectadas por el proyecto, no importa si positiva o negativamente) y mas vale que indentifiques a los stakeholders que aun no quieran a SharePoint pues estos pueden hacerte la vida muy dificil en tus esfuerzos administrativos y de difusión de uso de la herramienta en tu organización. Quisiera compartir tambien este otro documento "Governance Sharepoint Server 2010", esta en formato PDF y te servirá como resumen, imprimelo en amplias dimensiones, y leelo leelo leelo hasta que lo memorices.

Para terminar esta nota y si has llegado hasta este parrafo te agradezco la molestia de leerme hasta aca ;-) , tu como administrador de Sharepoint puedes lograr que tu empresa tenga un avance sorprendente en el uso de SharePoint gracias a tu buenas practicas de adminsitración y gobernabilidad (creo que abuse de esta palabra en esta nota, lo siento), recuerda que la gente en verdad quiere aprender a utilizarla no importa que tanto puedan renegar eventualmente se darán cuenta de todo lo que pueden hacer, asi que queda de tu parte lograrlo.

lunes, 11 de abril de 2011

Conociendo SharePoint 2010

La semana pasada por fin pude lograr una configuración de SharePoint 2010 que me dejara contento. No se sí este haciendo lo correcto pero comenze intentando identificar lo que ya conozco bien en MOSS e investigarlo en SP2010 a manera de ver las mejoras de la funcionalidad existente. En algunos casos me lleve sorpresas por ejemplo en la autenticación por formularios (FBA) ahora se maneja el termino "Claims", cuando creas una aplicación web y seleccionas "Claims" puedes escoger una combinación de formas de autenticación por ejemplo por formularios y por windows usando NTLM. Otro cambio es la administración central, me gusta mucho como se ve la banda de herramientas (no se sí el termino banda es el adecuado, a mi me hace sentido que la traducción de "ribbon" sea banda), el monitor de avisos tambien es nuevo ahi por ejemplo pude saber que el hecho de que el espacio libre del HDD sea menor al doble de lo que tengo en RAM afectaría el desempeño, tambien te avisa sí estas usando cuentas de sistema con elevados privilegios en las aplicaciones web, etc.

Aun no construyo nada que utilice las nuevas opciones de flujos de trabajo, o las características sociales o la búsqueda con FAST, sin embargo eso me preocupa poco. Mas he estado pensando como debería presentarselos a mis usuarios finales. En mi entrada anterior donde hablo sobre mi experiencia con MOSS, comentaba algunos de los retos que tengo respecto a lograr que el usuario se sienta comodo con la herramienta y adopte los paradigmas que propone, ahora con PS2010 creo en primer instancia que los que mejor acogeran las nuevas características de SharePoint 2010 serán mis usuairos mas jovenes, aquellos que siguen se cerca las nuevas tendencias. Como siempre y comulgando con las ideas de autores como Bill English, Dux Sy Raymond, etc: Hay que conocer las necesidades del negocio para mejor implementar SharePoint. En particular Dux tiene un enfoque muy práctico y me gusta mucho como ofrece soluciones sencillas a problemas comunes como por ejemplo ¿como llevar la administración de permisos en el sitio?, sencillo: Crea un documento de Excel donde lo describas y guardalo en el sitio en un biblioteca especial para administración.

Volviendo a SharePoint 2010, he descargado ya creo que 8 diferentes libros con diferntes temas como "Branding" (me encanta ester termino porque cuando lo digo la gente me entienden Brandy :-p), Administración, Programación, etc.
Algo de lo que he visto es que muchos aun estamos en la investigación y pruebas de como migrar nuestro ecosistema de portales en MOSS a SP2010, este tema me ha mantenido en constante preocupacion pues al parecer hay muchas formas de hacerlo y los resultados pueden variar. He decidido que lo que haré es tener dos instalaciones en paralelo una con el MOSS que hoy tengo en producción y otra con SP2010, probablemente te preguntes ¿cuanto hardware tiene entonces para tener dos ambientes en paralelo? y la respuesta es que tenemos suficiente y que además estamos trabajando con virtualización. En el 2009 me funciono muy bien haberme entrevistado con todos los usuarios clave de cada área y departamento, asi que esta vez  en lugar de primero migrar todo a SP2010 y luego arreglar los sitios y demás ahi mismo, voy a trabajar de nuevo con todos los involucrados e interesados para primero dejar listo su sitio de colaboración, mejorarlo sí es que se requiere y luego migrar el contenido. Talvez lo haga alguna herramienta en el mercado como AvePoint o Xavor.

Mas adelante planeo escribir mas sobre el avance en este proyecto. Estaré mencionando errores que haya cometido y como logre resolverlos asi como el tiempo que me llevo hacerlo.

lunes, 4 de abril de 2011

Mi proyecto de SharePoint 2007

Desde Junio del 2009 cuando me involucre en cuerpo y alma al proyecto de SharePoint en Sistemas Digitales me tope con una serie de retos que anteriormente había tratado pero unicamente en esfuerzos individuales, por ejemplo en IWS atendía clientes donde necesitaban solo instalar SharePoint o donde solo necesitaban consultoría para implementar InfoPath Forms Services por nombrar algunos ejemplos. El paquete de trabajo que tenía era una línea recta con un inicio y un fin, no había otras líneas paralelas y raramente las había perpendiculares (pensando la analogía entre líneas y proyectos). Sistemas Digitales en su carrera por implementar innovación a través de nuevas tecnologías eligió a SharePoint como la que sería aquel barco que navegaría en las tranquilas aguas de la colaboración, búsqueda, formas electronicas, etc. Solo para dar una breve reseña de SharePoint 2007 pongo aqui los pilares que lo componen, para aquellos que no conocen esta aplicación de software por favor no lo vean como solo "un programa de tecnología NNF (Next, Next, Finish)"

  1. El nucleo es Windows SharePoint Services (ojo, lean bien SERVICES)
  2. Pilar de Colaboración (Collaboration)
  3. Pilar de Portales (Portal)
  4. Pilar de ECM (Enterprise Content Management) 
  5. Pilar de Búsqueda (Search)
  6. Pilar de Formularios de Negocio (Business Forms)
  7. Pilar de Inteligencia de Negocio (Business Intelligence)


Algo que he aprendido de los proyectos de SharePoint es que no puedes ni deberías pensarlos como la simple y llana instalación de otro software mas para servidor de Microsoft. Tuve la fortuna de platicar con gente muy interesante como Francisco Hernandez, alguna vez product manager de MOSS y PPS en México, Bill English el famoso autor de varios libros sobre SharePoint, Dux Sy Raymond quien ha venido fusionando el mundo el Project Managment en SharePoint y otros buenos amigos que conocen la herramienta como Aldert Arturo Ramirez ahora junior developer radicando en Los Angeles. Invariablemente todos abordan el tema de los proyectos de Sharepoint no como la instalación y, configuración sino como la implementación de la estrategia de colaboración entre empleados o la automatización de los "excelitos de negocio", aquellos silvestres y sorprendente aceptados formularios hechos en Excel para revisar solicitudes de viaticos, nuevos puestos, vacaciones, etc, etc. No se diga la presentación de reportes de Excel con Excel Web Acces, muchas veces confundido con BI.

A lo que quiero llegar al fin es que el inicio del proyecto se determino su fracaso, Sistemas Digitales pecó de exceso de fé en la herramienta y no en la metodología para implementarla. La frustración pronto llego, los sitios web pronto proliferaron sin control y termino por convertirse en una triste "intranet" con casi nula aceptacion.

La lección es clara sí vas a implementar un proyecto profesional de SharePoint: Conoce primero de lo que se compone el producto no solo a nivel técnico sino los paradigmas a los que se pretende dirigir, entrevista y conoce a los usuarios... lo repito una vez mas entrevista y conoce a los usuarios pues al final ellos son quienes formarán parte del ecosistema de sitios o colección de portales que se implementen.

Despues de instalar, configurar y liberar SharePoint, entrevista a los grupos de usuarios, haz que te comenten sus actividades del día y como interactuan con las otras áreas. Observa cuidadosamente las señales que te den para traducirlas a cosas muy puntuales y puedas decidir entre sí es mejor ponerles un sitio o simplemente una librería dentro de un sitio ya existente.

Voy a dar un ultimo consejo sobre SharePoint, disculpen la insistencia y obsesión, es como algunos autores dicen "I cannot stress it enough": No creen nuevo contenido en SharePoint (sitios, librerías, listas) sí no hay un proposito claro y definido, creanme sí no quieren ahogarse en la administración de cientos de sitios y librerias sin sentido.

En el camino vas a encontrarte algunos usuarios muy capaces y con un gran don: saben lo que quieren, pero siento decirte que en mi experiencia la gente sencillamente no tiene una idea de lo que necesitan. Muchas veces me he preguntado cuales serán los factores implicados para encontrar con tanta facilidad gente que no sabe lo que quiere, no lo se y creo que es sano dejarlo como tema para otra discusión.

Entonces que hacer?, has escuchado el termino disciplina?: Implementalo
Crea reglas sobre:

  • Como y cuando solicitar un sitio, una biblioteca, una lista.
  • Juntas semestrales o trimestrales para hacer revisión del contenido de los sitios.
  • Administracion de la seguridad en los sitios ------ MUCHO CUIDADO CON ESTE PUNTO
  • Personalización y "Branding" de los sitios.
  • Etc
Estas reglas y procedimientos asegurate de difundirlos ampliamente a los usuarios, es muy importante que los enteniendan y de ser posible que exista un usuario catalizador, es decir aquel que tiene un entendimiento respetable a nivel técnico pero no necesariamente es ingeniero en sistemas y que vive del lado del negocio. Por ejemplo para aqui en Sistemas Digitales, para el área de Servicio Jose De La Torre es un clarisimo ejemplo, el tiene claro lo que Servicio vive y necesita y a su vez conoce las aplicaciones a un nivel resptable, gracias a eso los requerimientos del negocio del área de Servicio hacia TI han mejorado mucho (me refiero a que piden cosas que en verdad les van a servir y no solemente cosas para tapar el sol con un dedo).

Siendo muy sincero, los controles que llevo y mi concepto de disciplina en el uso de SharePoint no han cuajado como yo quisiera y estoy consciente de que esa responsabilidad cae en mis hombros. Puede ser complejo cuando hay nuevos empleados pero lo es mas cuando los empleados que ya tienen mas tiempo se reusan a cambiar sus viejas formas de trabajo, es casi como quitarle el tanque de oxigeno a un buzo y he visto que cuando los gerentes o directores (Fernando Guarneros: Gracias!) estan convencidos del cambio y te apoyan, son capaces de hacer que la estrategia caiga con peso.

Seguire platicando mas al respecto y ahora que ya tengo en manos la migración a SharePoint 2010 mas y nuevos retos llegan, espero poder hacer algo novedoso y que valga la pena compartir con todos.

miércoles, 30 de marzo de 2011

Buscando la minería de datos

El tema de minería de datos me ha llamado mucho la atención desde que estaba en la universidad allá por el 2002.
Primero me tope con el libro "Data Mining Techniques for marketing, sales and customer relationship management" de Michael Berry y Gordon Linoff. Ahi ellos describen un buen numero de expriencias de trabajo con conjunto de datos y diversas técnicas para aplicar conceptos tales como la agrupación, la clasificación, predicción, estimación, perfilación, etc. Desafortunadamente en ese momento no contaba con experiencia practica que me diera un marco mental donde pudiera aterrizar todas esas maravillosas ideas y lo que es posible encontrar cuando se aplican a los datos adecuados.
Hoy día mi experiencia ha sido catalizador para aterrizar no todo pero buena parte de lo leído. Tuve la fortuna de estar en un seminario con el señor Bill Inmon (el padre del data warehouse) y asistir tambien a la primer conferecia de BI que Microsoft ofreció en Seattle (2007). Me he visto expuesto a conceptos como los del DW2.0 asi como su competidor el Datamart del señor Ralph Kimball. Comento todo esto porque me doy cuenta que antes de poder ejecitar cualquier modelo y aplicar tecnicas de minería de datos hay que pasar por una serie de etapas donde el "negocio" o la actividad descrita por el proceso da como resultado datos que deben de ser perfilados de tal manera que puedan ser minados.
Donde trabajo actualmente uno de los trabajo de mas reto es el tema de la calidad de datos, usuacios allá afuera, por favor sí leen esto, recuerden caputrar con el mas riguroso sentido de detalle los datos de los cuales son responsables, ahorrar incontables horas de trabajo en el futuro creanmelo y despues sientanse satisfechos de que su trabajo bien hecho aportará a futuras generaciones. Disculpen, me salgo del punto, el punto es que me he topado con el reto de tener que limpiar muchos registros, los cuales son la base para poder armar dimensiones, hechos, jerarquías, medidas etc (toda esta terminología encuentro acoplada a la de Analysis Services de Microsoft). En fin, mucha de la ayuda que he recibido ha sido por parte de los key users del negocio, en este caso las pesonas que son dueñas de la información que se almacena en el sistema de CRM y de Help Desk, SAP ni se diga, el departamento de finanzas esta hecho trizas ahi y nos han puesto en un predicamento sin igual para extraer datos, cotejarlos y demás y es que el detalle esta en que esas personas exportan los datos, los manipulan en excel con macros y despues los vuelven a manipular, cosa que esta prohibidisima cuando se realizan esfuerzos de automatización con ETL para estructurar datos. Nuestro SAP se ha vuelto una Elba Esther Gordillo: un mounstro demasiado poderoso al que nadie se atreve a ponersele al brinco y frenar su lastimoso trabajo que afecta negativamente a todos.
Enlisto de una vez la tecnología que usamos para todo la estrategia de Data Warehousing y al final Data Mining:
1.- SQL Server 2005 SP2
2.- Integration Services
3.- Analysis Services
4.- XTract IS (Theobald) -- carisimo este componente para extraer datos de SAP
5.- QlikView
6.- Excel 2010 + Tablas dinámicas
7.- ProClarity -- Realmente ya lo dejamos usar, tristemente lo tuve que tirar pues los usuarios de negocio no tienen el nivel para entender esta herramienta de analisis
8.- SharePoint
9.- Reporting Services -- predilecta de muchos (entoces para que compramos QlikView?)
Ahora dejenme platicarles sobre la metodología, aunque de primer instancia estuve expuesto a Bill Inmon y me cautivo lo encontré sumamente complejo y nunca pude entender donde comenzar, crear una BD?, crear un modelo?, documentar, documentar, documentar? me fué muy frustrante encontrarme en un lugar donde lo unico que me hacía sentido eran las estrellas que son el fundamento para los Data Marts y fué aqui donde me tope con Ralph Kimball, por fin ahi pude comenzar a entregar "algo" (segun la visión de dirección claro esta, este publico normalmente quiere ver las cosas hechas en un minimo tiempo, con un gran nivel de impacto). Aqui en este punto pregunto ¿quien en México puede reclamar que usa la metodología de Ralph Kimball para construir los Data Mart?. Yo me tope con Gopac y lo que me dieron fué un experto en T-SQL que me contruyo cuantas dimensiones se le ocurrió por un precio exorbitante, por favor tengan cuidado y sean claros con lo que venden, no toda la gente somos neofitos y habemos algunos que en realidad hacemos nuestra tarea y leemos U_U
Bien pues en donde estoy hoy con respecto a la minería de datos: ya construi mi data mart para el área de Servicio en la empresa la cual se encarga de todo lo que es help desk y servicio segun el modelo ITIL V3, la carga la realizo usando con hechos acumulados (en el libro de Kimball se llaman Accumulating Facts), tengo las dimensiones con atributos SCD1 y SCD2 (SCD = Slowly Changing Dimension) y solo me falta ver que técnica de minería voy a implementar.
A propósito y hablando de SCD, quiero agrader mucho a Todd McDermid por su componente de SCD para SSIS, me ha servido de maravilla.