Списки SharePoint, GetListItems, XML и VBA - я просто хочу сделать перекрестную ссылку! - PullRequest
3 голосов
/ 15 января 2009

У меня есть список SharePoint с двумя другими столбцами, которые мне нужны; в Excel, я хочу сопоставить значение X в столбце 1 и вернуть соответствующее значение в столбце 2. Я могу использовать вариант кода на http://guruj.net/node/63, чтобы получить информации (я думаю), поэтому я думаю, что моя проблема сосредоточена на навигации по XML в VBA без загруженных библиотек DLL (у меня есть куча MSXML? .DLLs, 2, 2.6, 3, 4, 5, 6).

В ближайших статьях MSDN я нахожу ссылку .NET (я застрял в VBA / VB6?, Поставляемой с Office 2003) или загружаемую DLL.

В ответе Ната описывается большая часть того, что я нашел или нуждаюсь , но , например, то, что я нашел, не на том языке, и часть моей проблемы - поиск поисковых терминов. Я собрал воедино некоторые переводы, например, XMLDocument, кажется, является DOMDocument, но части XML являются IXMLDOMNode или похожими.

Основная проблема, с которой я сталкиваюсь в данный момент, заключается в том, что при вызове SOAP для выполнения запроса у меня возникает несоответствие типов, или объект не поддерживает этот метод, когда я пытаюсь перерисовать проигрыватели (listQuery, listViewFields, listQueryOptions ). Я оставил различные части в качестве варианта, а затем привел их к возвращаемому типу (поскольку у меня нет библиотеки SP, на которую я ссылаюсь, я делаю это немного слепо), и получил несоответствия.

Похоже, что было бы проще проверить текст на экране.

1 Ответ

4 голосов
/ 15 января 2009

Ух ты, ты так далеко в кроличьей норе ...

Хорошо, код, который вы просматриваете, дает вам представление о списке SharePoint, который, возможно, не лучшее место для начала, но тот факт, что все это делается в VBA, делает его действительно сложным. У меня есть .NET C # код для запроса списка и получения элементов, которые имеют определенное значение. Преобразование VBA я не могу сделать.

public static string GetPageId(string listName, string webPath, string pageTitle)
    {
        string pageId = "";
        IntranetLists.Lists lists = new IntranetLists.Lists();
        lists.UseDefaultCredentials = true;
        lists.Url = webPath + "/_vti_bin/lists.asmx";
        XmlDocument doc = new XmlDocument();
        doc.LoadXml("<Document><Query><Where><Contains><FieldRef Name=\"Title\" /><Value Type=\"Text\">" + pageTitle + "</Value></Contains></Where></Query><ViewFields /><QueryOptions /></Document>");
        XmlNode listQuery = doc.SelectSingleNode("//Query");
        XmlNode listViewFields = doc.SelectSingleNode("//ViewFields");
        XmlNode listQueryOptions = doc.SelectSingleNode("//QueryOptions");

        Guid g = GetWebID(webPath);

        XmlNode items = lists.GetListItems(listName, string.Empty, listQuery, listViewFields, string.Empty, listQueryOptions, g.ToString());
        foreach (XmlNode listItem in SPCollection.XpathQuery(items, "//sp:listitems/rs:data/z:row"))
        {
            XmlAttribute id = listItem.Attributes["ows_Id"];
            if (id != null)
            {
                pageId = id.Value;                    
            }

        }
        return pageId;            
    }

IntranetLists - это веб-ссылка .net на файл lists.asmx.

Вам нужно будет изучить, как использовать веб-сервис lists.asmx из VBA, Затем вам нужно будет вызвать GetListItems с запросом, который представляет значение столбца, которое вы хотите найти.

<Where><Contains><FieldRef Name="Title" /><Value Type="Text">MyValue</Value></Contains></Where>

Синтаксис этого запроса: CAML

тогда вам нужно будет проанализировать возвращаемый xml, чтобы найти элемент и поле элемента с требуемым значением. Любой запрос xpath должен иметь добавленные правильные пространства имен, например

  public static XmlNodeList XpathQuery(XmlNode xmlToQuery, string xPathQuery)
    {
        XmlDocument doc = new XmlDocument();
        doc.LoadXml(xmlToQuery.OuterXml);
        XmlNamespaceManager mg = new XmlNamespaceManager(doc.NameTable);
        mg.AddNamespace("sp", "http://schemas.microsoft.com/sharepoint/soap/");
        mg.AddNamespace("z", "#RowsetSchema");                                   
        mg.AddNamespace("rs", "urn:schemas-microsoft-com:rowset");
        mg.AddNamespace("y", "http://schemas.microsoft.com/sharepoint/soap/ois");
        mg.AddNamespace("w", "http://schemas.microsoft.com/WebPart/v2");
        mg.AddNamespace("d", "http://schemas.microsoft.com/sharepoint/soap/directory");
        return doc.SelectNodes(xPathQuery, mg);
    }

Однако я не уверен, что у вас даже был бы доступ к чему-то, что могло бы проанализировать xml в вашей настройке VBA, поэтому вам, возможно, придется скачать какой-то дополнительный инструмент VBA для этого - возможно, даже заблокированный для вас.

Надеюсь, это немного поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...