Un patán en Sharepoint
Sharepoint me interesa como usuario de Access 2007 por las posibilidades que tienen ambos de interactuar. Lo acabo de descubrir con esta versión de Access, así que no esperes de mí más que de cualquier novato: estoy aprendiendo y lo que haré en esta página es ir anotando mis tribulaciones y mis descubrimientos. En realidad, hablaré poco de Sharepoint y trataré de hablar más de cómo conectar éste como Back End de Access.
Por otro lado, ya están disponibles las grabaciones del evento que se hicieron con Live Meeting, tanto para verlas online como para descarga:
Parte I: http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032402125&Culture=es-ESParte II: http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032402128&Culture=es-ES La parte II es la que trata específicamente sobre Access y Sharepoint.
Parte I: http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032402125&Culture=es-ESParte II: http://msevents.microsoft.com/CUI/EventDetail.aspx?EventID=1032402128&Culture=es-ES
La parte II es la que trata específicamente sobre Access y Sharepoint.
Debéis ser indulgentes con mi intervención: las cosas se me torcieron provocando un retraso de media hora, de manera que cuando empecé estaba tan agobiado que no daba pie con bola.
Si desde Access 2007, en vez de vincular una Lista de Sharepoint, vinculamos una Vista de ésta, obenemos claras ventajas, la más evidente limitar el tráfico de datos por la red a los que realmente queremos, pero también otras bastante interesantes, como restringir los datos a los del usuario registrado en el sitio Sharepoint. Sin embargo, los asistente de Access sólo facilitan vincular Listas, debiendo recurrir al método TransferSharePointList para poder conseguirlo.
La misma ayuda de Access sobre TransferSharePointList nos informa de cómo obtener algunos de los paramátros necesarios:
Para obtener el identificador GUID de una lista o una vista del sitio de SharePoint puede utilizar el procedimiento siguiente:
La dirección de la barra de dirección del explorador contiene los identificadores tanto de la lista como de la vista. El identificador GUID de la lista sigue a List=, y el de la vista sigue a View=. Sin embargo, en la dirección, cada carácter { (abrir llave) se representa mediante la cadena %7B, cada carácter - (guión) mediante la cadena %2D, y cada carácter } (cerrar llave) mediante la cadena %7D. Por ejemplo:
http://MySite12/_layouts/ViewEdit.aspx?List=%7B2A . . . 7D&View=%7B357B4FE6 . . . 1579B%7D
Para poder utilizar los identificadores GUID de la dirección como argumentos de esta acción de macro, primero debe reemplazar cada cadena %7B por el carácter {, cada cadena %2D por el carácter - y cada cadena %7D por el carácter }. No incluya el carácter & (y comercial) que sigue a la cadena %7D en el identificador GUID de la lista.
(Me he permitido recortar la URL que la ayuda usa de ejemplo para que me quepa mejor y porque, en el mismo ejemplo de la ayuda, ya la URL está truncada al final)
Le faltan unas imágenes que ayuden un poco ¿no? Pues se las ponemos:
Seguir las instrucciones “a mano alzada”, cortando y pegando con el ratón y editando una cadena tan larga, se hace aguantando la respiración y, al final, casi seguro que sale mal (a mí nunca me ha salido bien). Pero para seguir instrucciones al pie de la letra está la programación y en Access contamos con VBA, así que me he hecho el siguiente procedimiento que sólo necesita que copiemos la URL y se la pasemos como cadena de texto:
'--------------------------------------------------------------------------------------- ' Procedure : VincularVistaWSS ' DateTime : 30/12/08 20:36 ' Author : Chea ' Purpose : Vincula una Vista de Sharepoint a partir de una URL ' Para vincular una Vista de Sharepoint, debemos, en primer lugar, ir al ' sitio de Sharepoint, a la página de configuración de dicha vista y copiar ' la URL completa: Esa URL, delimitada por comillas, es el argumento que ' debemos pasar a esta función en el parámetro CadenaURL '--------------------------------------------------------------------------------------- ' Public Sub VincularVistaWSS(CadenaURL As String, Optional NombreTabla) Dim GUIDList As String Dim GUIDView As String Dim strSite As String Dim v As Variant, V2 As Variant, V3 As Variant, i As Integer Dim stTmp As String ' "Traducimos" caracteres de la cadena URL CadenaURL = Replace(CadenaURL, "%7b", "{") CadenaURL = Replace(CadenaURL, "%7d", "}") CadenaURL = Replace(CadenaURL, "%252E", ".") CadenaURL = Replace(CadenaURL, "%252F", "/") CadenaURL = Replace(CadenaURL, "%253A", ":") CadenaURL = Replace(CadenaURL, "%2D", "-") ' Obtenemos la segund parte de la URL, desde el aspx? v = Split(CadenaURL, "aspx?") stTmp = v(1) 'Obtenemos las distintas secciones, que van separadas por "&" v = Split(stTmp, "&") For i = 0 To UBound(v) V2 = Split(v(i), "=") If Trim(V2(0)) = "List" Then GUIDList = V2(1) End If If Trim(V2(0)) = "View" Then GUIDView = V2(1) End If If Trim(V2(0)) = "Source" Then strSite = V2(1) V3 = Split(strSite, "/Lists/") strSite = V3(0) End If Next i ' Vinculamos la vista DoCmd.TransferSharePointList acLinkSharePointList, strSite, GUIDList, GUIDView, NombreTabla End Sub
Javi Terán, a base de buenas prácticas, demuestra cómo se debe hacer la exportación a Sharepoint: http://javiteran.web.officelive.com/default.aspx
Después de un sabroso hilo en las news de Access, llega a la conclusión de que estableciendo todas las relaciones y con la pesataña de búsqueda completada, al mover toda la base de datos a la vez, se renumeran los índices pero también se actualizan en cascada las claves externas vinculadas.
Seguro que Javi pondrá un detallado artículo en su blog y fácil que yo haga algo más detallado en este mismo, pero ahora urgía poner esta nota para corregir mi anterior apunte en el que decía que había que borrar las relaciones.
Antes, yo tenía el problema de que no conseguía mover la base de datos entera y lo apañaba intentando hacerlo por partes, con la cantidad de problemas que eso me suponía. Precisamente para conseguir un escenario similar al de Javi, a base de intentos lo conseguí y tomé algunas notas:
- Si hay alguna tabla vinculada, parece que no se puede subir la aplicación
- Una tabla que se resistía a copiarse (y bloqueaba toda la subida) dejó de hacerlo cuando suprimí un campo de datos adjuntos. Sin embargo, después otras con datos adjuntos que contenían datos, subieron sin problema. La diferencia es que en la primera conteían música (varios megas cada adjunto) y en la segunda, la que subía sin problemas, sólo había unas pocas imágenes con poco peso.
- Una tabla que también se resistía no tenía datos adjuntos, ni nada raro en su estructura, pero eran unos 14.000 registros.
Parece que el peso de las tablas es un obstáculo importante a la hora de mover la aplicación de una vez a Office Live Small Business.
El primer ensayo fue del todo frustrante. Probé con una aplicación compleja, con datos no excesivos pero bastantantes, abundantes tablas, con uso profuso de subformularios, cuadros combinados, etc. y la subí de un tirón. Aquello no había manera de moverlo y, encima, los datos eran incoherentes. Estaba claro que se habían cambiado todos los campos clave, que faltaban índices y que había que replantear la aplicación buscando estrategias para disminuir el tráfico de red.
Los últimos ensayos los he realizado con una aplicación pequeñita, sencilla y con pocos registros y me ha ido mucho mejor. Suena a trampa usar una aplicación así, pero ese tipo de aplicación existe y es frecuente en Access, de hecho, la aplicación está en uso. Además, si queremos iniciarnos en albañilería de software, debemos empezar por reformar la cocina, no por el Escorial, ya tendremos tiempo, con un poco de experiencia, de ver el alcance de nuestras posibilidades.
Algo que vas a perder definitivamente con Sharepoint son la integridad referencial y la eliminación en cascada, entonces ¿para qué queremos las relaciones? Sharepoint es "tan listo" que cuando ve una relación es capaz de crear un campo de búsqueda en la tabla que subimos, pero es "tan tonto" que sube una copia de la tabla de búsqueda por cada una de las tablas que tengan una relación a ella como clave externa. Cierto que cuando he comprobado este fallo ha sido subiendo las tablas una a una, porque me fallaba la opción de subirlas todas a la vez, pero con una vez que pase ya es suficiente para librarnos de las relaciones.
¿Qué pinta la tabla SwitchBoardItems en el servidor de Sharepoint? Lo mismo pasa con las provincias, meses... Otros datos, como los países, tipos de iva, etc. cambian de tarde en tarde, pero para eso podríamos tener un sistema de doble copia, en el servidor y en local ,y mantener una tabla de versiones que se comprobaría al iniciar la aplicación y copiaría a local los datos del servidor en caso de ser una versión distinta. De momento, como estamos en pruebas, dejemos esas tablas en local y ya encontraremos una solución más andelante, antes de que el mapamundi cambie de nuevo.
¡Aaarrrg! Has subido y vinculado tu tabla y compruebas con horror que tu campo IDMitabla ha sido sustituido por un simple ID renumerado desde cero, de manera que ya no coincide con tu numeración, que tenía sus huecos. Tus valores no aparecen por ningún lado ¿Cómo vas a poder relacionar así? No hagas como hice yo, que el teclado no tiene la culpa para tratarlo así. ´
Abre la tabla vinculada, sitúate sobre la fila de nombres de campos y, con el botón derecho del ratón, selecciona "Mostrar columnas..." y elige el campo _ID, con guión bajo delante. Ahí están los datos originales. Sin indexar, pero ahí están.
Ahora toca la parte pesada: ir tabla por tabla, buscando qué claves externas hacen referencia a esa y cambiarle los datos. Podemos usar una serie de consultas de este tipo:
UPDATE LaOtraTabla LEFT JOIN Mitabla ON laOtraTabla.id_Mitabla = Mitabla.[_ID] SET LaOtraTabla.id_Mitabla = [Mitabla].[ID];
Seguramente, podremos hacernos unos procedimientos para evitar tener que ir diseñando la consulta tabla por tabla y clave externa por clave externa, pero, como se supone que estamos probando con una aplicación sencillita, de momento, no nos vamos a entretener en ello.
En Sharepoint no se va a notar mucho, pues vemos las listas planas, pero en Access vamos a relacionar unas tablas con otras y que los campos claves estén indizados se va a notar mucho en velocidad.
Los índices deben añadirse en el sitio Sharepoint, pero podemos ir al formulario de modificación directamente desde Access. Pinchando con el botón derecho del ratón sobre la tabla vinculada, podemos elegir "Opcione de Lista de Sharepoint" y ahí "Modificar columnas y configuración"
Si todo parece salir bien a la primera, seguro que estás equivodo
Ya nos iremos contando nuestras tribulaciones.