Code Segment

SharePoint - Usando los servicios web de SharePoint desde Access

Dec 28 2005 by csegura @ 23:23

Continuando con el trabajo que estaba realizando en Access necesitaba poder acceder a las listas de SharePoint e ir agregando el contenido a una tabla de SQL Server.

Como comentaba en el post anterior, por el momento estaba manteniendo una lista de sitios en una tabla de Access, recorriendo dicha tabla cargaba las listas en el SQL Server. Ahora necesito recabar información de los sub-sitios que se encuentran por debajo, con lo cual necesito recuperar las direcciones de dichos sitios para poder cargar los datos en el SQL Server.

Para ello he usado el Web Services Toolkit del office 2003 (se puede descargar aquí), este kit es un complemento que nos ayudará a crear una clase Proxy para acceder a los servicios web.

En este caso voy a usar el servicio webs.asmx para recuperar las sub-webs he modificado el código generado por Web Services Toolkit, dejando el constructor vacio y pasando el código del constructor a un método llamado Connect que usaré para conectarme al sitio.

'*****************************************************************
'Esta clase fue creada por Web Services Toolkit
' de Microsoft Office 2003
'*****************************************************************
 
Private Const c_SERVICE As String = "Webs"
Private Const c_PORT As String = "WebsSoap"
Private Const c_SERVICE_NAMESPACE As String = "http://schemas.microsoft.com/sharepoint/soap/"
 
Private sc_Webs As SoapClient30
Private WSDL_URL As String
 
Private Sub Class_Initialize()
End Sub
 
Public Sub Connect(url As String)
    Dim str_WSML As String
    str_WSML = ""
 
    Set sc_Webs = New SoapClient30
    
    WSDL_URL = url + "\_vti_bin\webs.asmx?wsdl"
    
    sc_Webs.MSSoapInit2 WSDL_URL, str_WSML, c_SERVICE, c_PORT, c_SERVICE_NAMESPACE
    sc_Webs.ConnectorProperty("ProxyServer") = "<CURRENT_USER>"
    sc_Webs.ConnectorProperty("EnableAutoProxy") = True
End Sub
 
Private Sub Class_Terminate()
    'Intercepción de errores
    On Error GoTo Class_TerminateTrap
 
    Set sc_Webs = Nothing
Exit Sub
Class_TerminateTrap:
    WebsErrorHandler ("Class_Terminate")
End Sub
 
Private Sub WebsErrorHandler(str_Function As String)
    'Error SOAP
    If sc_Webs.FaultCode <> "" Then
        Err.Raise vbObjectError, str_Function, sc_Webs.FaultString
    'Error no SOAP
    Else
        Err.Raise Err.Number, str_Function, Err.Description
    End If
End Sub
 
Public Function wsm_WebUrlFromPageUrl(ByVal str_pageUrl As String) As String
    'Intercepción de errores
    On Error GoTo wsm_WebUrlFromPageUrlTrap
 
    wsm_WebUrlFromPageUrl = sc_Webs.WebUrlFromPageUrl(str_pageUrl)
Exit Function
wsm_WebUrlFromPageUrlTrap:
    WebsErrorHandler "wsm_WebUrlFromPageUrl"
End Function
 
Public Function wsm_GetAllSubWebCollection() As MSXML2.IXMLDOMNodeList
    'Intercepción de errores
    On Error GoTo wsm_GetAllSubWebCollectionTrap
 
    Set wsm_GetAllSubWebCollection = sc_Webs.GetAllSubWebCollection()
Exit Function
wsm_GetAllSubWebCollectionTrap:
    WebsErrorHandler "wsm_GetAllSubWebCollection"
End Function
 
Public Function wsm_GetListTemplates() As MSXML2.IXMLDOMNodeList
    'Intercepción de errores
    On Error GoTo wsm_GetListTemplatesTrap
 
    Set wsm_GetListTemplates = sc_Webs.GetListTemplates()
Exit Function
wsm_GetListTemplatesTrap:
    WebsErrorHandler "wsm_GetListTemplates"
End Function
 
Public Function wsm_GetWeb(ByVal str_webUrl As String) As MSXML2.IXMLDOMNodeList
    'Intercepción de errores
    On Error GoTo wsm_GetWebTrap
 
    Set wsm_GetWeb = sc_Webs.GetWeb(str_webUrl)
Exit Function
wsm_GetWebTrap:
    WebsErrorHandler "wsm_GetWeb"
End Function
 
Public Function wsm_GetWebCollection() As MSXML2.IXMLDOMNodeList
    'Intercepción de errores
    On Error GoTo wsm_GetWebCollectionTrap
 
    Set wsm_GetWebCollection = sc_Webs.GetWebCollection()
Exit Function
wsm_GetWebCollectionTrap:
    WebsErrorHandler "wsm_GetWebCollection"
End Function

Ahora puedo conectarme a un sitio y recuperar la lista de webs de dicho sitio.

Para clarificar un poco la respuesta del servicio he pasado la respuesta a un array de dos dimensiones conteniendo el nombre y la dirección del sitio.

Sub Test()
    Dim websService As New clsws_Webs
    Dim resultNodeList As IXMLDOMNodeList
    
    websService.Connect "HTTP://SRVTEST/SITES/CSEGROLLUP"
    
    Set resultNodeList = websService.wsm_GetWebCollection
    Debug.Print resultNodeList.Item(0).XML
    
    Dim aWebs() As String
    
    ProcesaRespuesta resultNodeList, aWebs
    
    For i = 0 To UBound(aWebs)
        Debug.Print aWebs(i, 0)
        Debug.Print aWebs(i, 1)
    Next i
End Sub
 
Sub ProcesaRespuesta(resultWebCollection As IXMLDOMNodeList, ByRef aWebs() As String)
    Dim i As Integer
    Dim webs As IXMLDOMNode
    Dim web As IXMLDOMNode
    
    Set webs = resultWebCollection.Item(0)
    
    ReDim aWebs(webs.childNodes.length, 1)
    
    For i = 0 To webs.childNodes.length - 1
        Set web = webs.childNodes.Item(i)
        aWebs(i, 0) = web.Attributes.getNamedItem("Title").Text
        aWebs(i, 1) = web.Attributes.getNamedItem("Url").Text
    Next
    
End Sub

Ahora un poquito de recursiviad y voila …

Comments (0)

SharePoint - Vinculando listas con SQL Server usando Access

Dec 28 2005 by csegura @ 14:40

Estos días he necesitado pasar datos de mi servidor SQL a SharePoint y viceversa, después de realizar algunas pruebas y mientras no tenga el SQL 2005 (el cual permite mediante los servicios de transformación de datos DTS atacar servicios web).

Con mi SQL 2000 he tratado de hacer un pequeño truco que en otras ocasiones había dado buen resultado, el truco consiste en vincular las tablas a través de Access e incluir dicho archivo en un DTS para pasar los datos, esto no funciona con las tablas vinculadas a SharePoint.

Finalmente lo que he hecho a sido usar una base de datos de Access y vincular tablas a mi SQL Server y a las listas de SharePoint que necesitaba.

De modo que ahora puedo realizar un pequeño programa en visual Basic para traspasar el contenido de una lista a una tabla de SQL Server y viceversa.

Para automatizar el proceso he creado dos funciones en Access que me permiten ir vinculando y desvinculando las listas a mi antojo de manera que puedo mantener una tabla fija con los sites de sharepoint que me interesan, recorrer dicha tabla e ir vinculando, copiando el contenido y  desvinculando las listas.

Function VinculaLista(sSitio, sLista, sNombreTabla)
    DoCmd.TransferDatabase acLink, "WSS", sSitio, acTable, sLista, sNombreTabla
    RefreshDatabaseWindow
End Function
 
Function DesVinculaLista(sNombreTabla)
    DoCmd.DeleteObject acTable, sNombreTabla
End Function

Comments (0)

Feliz Navidad

Dec 24 2005 by csegura @ 18:33

Buon Natale e Felice Anno Nuovo 
Shinnen omedeto. Kurisumasu Omedeto 
Pax hominibus bonae voluntatis 
Vrolijk Kerstfeest en een Gelukkig Nieuwjaar! 
Merry Christmas & Happy New Year 
Joyeux Noël et Bonne Année! 
Fröhliche Weihnachten und ein glückliches Neues Jahr!

Feliz navidad para todos y una vez más garcias por leer este blog.

Carlos.

Comments (1)

SharePoint - Problemas hojas de excel que llevan macros

Dec 21 2005 by csegura @ 19:17

Estas últimas noches he estado depurando algunos fallos del csegRollUp v3 así que en unos días estará la versión 3.1, también el editor de CAML me ha llevado algunas horas que no tenía, de modo que se quedará un poco parado pero en GotDotNet.

Hoy me he encontrado con un problema curioso cuando trataba de abrir hojas de excel desde una biblioteca de documentos, utilizando el sistema que describí el otro día para tener múltiples plantillas de documentos asociadas en una lista, de modo que al usar una plantilla determinada sharepoint se redirija al sitio donde debe guardarse el documento creado con esa plantilla.

El problema se origina al abrir un documento desde el sitio A y guardarlo en el sitio B, y que dicho sitio B sea el que el usuario a seleccionado previamente. Para ello hay que introducir esta macro en el libro de excel (no ha de importar ya que este error solo ocurre con libros que llevan macros).

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
   Application.DefaultFilePath = Application.ActiveWorkbook.FullNameURLEncoded
End Sub

Ahora si, cuando salvemos el libro automáticamente aparecerá el sitio que habíamos seleccionado previamente.

Comments (0)

SharePoint - CAMLEditor v1.0 is here to stay

Dec 18 2005 by csegura @ 08:10

Days ago I show my last toy project called CAML Editor, this first sketch was only a test application. Now I have the pleasure to announce that the first version is here to stay ;-).

• New tabbed interface
• Code completion and folding support in text editor
• CAML code generator completely rewritten
• Many Bugs fixed
• New Validation error interface inside of the editor


 You can download it here... CAMLEditor v1.0.zip (246,46 KB)

Comments (5)