Используйте Excel-VBA (объект MSXML2.XMLHTTP) для обновления списка SharePoint.

Общая информация. Мне нужно обновить (добавить/отредактировать) список SharePoint из Excel. Я смог сделать это с помощью ListObject, однако это не то направление, к которому мы движемся.

Прочитав все возможности Google, мне пришла в голову (может быть, я ошибаюсь) идея использовать объект MSXML2.XMLHTTP для обновления списка SharePoint.

Текущая проблема. Мой приведенный ниже код выполняется до конца, я получаю objXMLHTTP.Status = 200, но список SharePoint не обновляется.

Код

Option Explicit

Const SharepointUrl As String = "http://share.corning.com/sites/ipp/PMOSandbox/"
Const ListName As String = "{60CE6622-D25B-447A-BFBF-8F3DD5B9FCF0}"
Const VIEWNAME As String = "{91ADBAE5-479F-4C80-A5FF-8EDA7A233B82}"

Sub Add_Item()

Dim objXMLHTTP As MSXML2.XMLHTTP    
Dim strListNameOrGuid As String
Dim strBatchXml As String
Dim strSoapBody As String    
Dim ValueVar As String, FieldNameVar As String

Set objXMLHTTP = New MSXML2.XMLHTTP

FieldNameVar = "IPP #"
ValueVar = "Shai"

'Add New Item'    
strBatchXml = "<Batch OnError='Continue'><Method ID='1' Cmd='New'><Field Name='" + FieldNameVar + "'>1004</Field>" + _
          "<Field Name='Title'>Uploaded from VBA</Field>" + _
          "<Field Name='Next KD Status'>" + ValueVar + "</Field>" + _
          "</Method></Batch>"

objXMLHTTP.Open "POST", SharepointUrl + "_vti_bin/Lists.asmx", False
objXMLHTTP.setRequestHeader "Content-Type", "text/xml; charset=""UTF-8"""
objXMLHTTP.setRequestHeader "SOAPAction", "http://schemas.microsoft.com/sharepoint/soap/UpdateListItems"

strSoapBody = "<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' " _
 & "xmlns:xsd='http://www.w3.org/2001/XMLSchema' " _
 & "xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'><soap:Body><UpdateListItems " _
 & "xmlns='http://schemas.microsoft.com/sharepoint/soap/'><listName>" & ListName _
 & "</listName><updates>" & strBatchXml & "</updates></UpdateListItems></soap:Body></soap:Envelope>"

objXMLHTTP.send strSoapBody

Do
    ' wait for response
Loop Until objXMLHTTP.Status = 200

Set objXMLHTTP = Nothing

MsgBox "Finished Running !"

End Sub

person Shai Rado    schedule 05.03.2017    source источник
comment
Возможно, использование ADO было бы лучшим вариантом? Вы можете просто обновить таблицу с помощью оператора SQL.   -  person Ryan Wildry    schedule 05.03.2017
comment
@RyanWildry Я открыт для предложений, как вы это реализуете?   -  person Shai Rado    schedule 05.03.2017
comment
Подключитесь к ADO, см.: connectionstrings.com/sharepoint часть Microsoft ACE OLEDB 12.0, затем обновите таблицу. со строкой подключения. Похоже, у вас уже есть список GUID, он понадобится вам для настройки соединения.   -  person Ryan Wildry    schedule 05.03.2017
comment
@RyanWildry Спасибо, но я уже читал эту страницу, она не содержит информации о том, как получить доступ к определенной записи и изменить определенное поле.   -  person Shai Rado    schedule 05.03.2017


Ответы (1)


Вот основные принципы того, как это сделать с помощью ADO.

Option Explicit

Public Sub Update()
On Error GoTo ErrHand

    'Create the connection object with ADO
    Dim conn        As Object: Set conn = CreateObject("ADODB.Connection")

    'Write your update statement
    Dim sql         As String
    sql = "Update MyTable set Field1= 'A', Field2='B' Where MyID=1234"

    'Open the connection and submit the update
    'In my experience, credentials should be requested by the server -
    'by way of a windows pop-up
    With conn
        .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;WSS;IMEX=0;RetrieveIds=Yes;" & _
                            "DATABASE=MySharePointURL;" & _
                            "LIST={MyListGUID};"
        .Open
        .Execute sql
    End With

CleanExit:
    If conn.State = 1 Then conn.Close: Set conn = Nothing
    Exit Sub

ErrHand:
    Debug.Print Err.Number, Err.Description
    GoTo CleanExit
End Sub
person Ryan Wildry    schedule 05.03.2017
comment
спасибо за помощь, завтра на работе проверю. Как вы используете sql в этом случае для обновления 2 полей (скажем, значение "Next KD Status" от "LA" до "GA" и "Status" от "GR" до "YL), где поле "IPP#" равно 1002 - person Shai Rado; 05.03.2017
comment
Звучит как новый вопрос SO SQL. Возможно, попробуйте эмулировать свою среду в Access/Excel, чтобы увидеть, что вам нужно сделать. Это очень похоже на оператор обновления с некоторыми параметрами в предложении where. - person Ryan Wildry; 05.03.2017
comment
Большое спасибо, это работает, теперь я просто ломаю голову над синтаксисом SQL для обновления, вы тоже хорошо разбираетесь в SQL? я должен отправить вам ссылку на мой новый пост ? - person Shai Rado; 07.03.2017
comment
Конечно, я могу посмотреть - person Ryan Wildry; 07.03.2017
comment
Я должен упомянуть, что это базовый пример. Вы должны параметризовать эти запросы. См. документацию SO по ADO, она отлично справляется со своей задачей: /3578/ - person Ryan Wildry; 07.03.2017
comment
Спасибо за добавленную информацию, у меня все заработало, но я еще не начал обрабатывать все ошибки, то, что вы прислали, мне поможет :) - person Shai Rado; 07.03.2017