2009-01-15 14 views
3

J'ai une liste SharePoint avec, entre autres choses, deux colonnes qui m'intéressent; dans Excel-ese, je veux correspondre à la valeur X dans la colonne 1, et retourner la valeur correspondante dans la colonne 2. Je suis en mesure d'utiliser une variante du code à http://guruj.net/node/63 pour récupérer l'information (je pense), donc je pense mon problème se concentre sur la navigation XML dans VBA sans DLLs téléchargées (j'ai un tas de MSXML? .DLLs, 2, 2.6, 3, 4, 5, 6).Listes SharePoint, GetListItems, XML et VBA - Je veux juste faire une référence croisée!

Les articles MSDN les plus proches que je trouve référence .NET (je suis coincé dans le VBA/VB6? Qui vient avec Office 2003) ou une DLL téléchargeable.

La réponse de Nat ci-dessous décrit la plupart de ce que j'ai trouvé ou besoin mais comme ce que j'ai trouvé c'est dans la mauvaise langue et une partie de mon problème est de trouver des termes de recherche. J'ai mélangé une partie de la traduction, par exemple, XMLDocument semble être DOMDocument, mais les parties XML sont IXMLDOMNode ou similaires. Le problème majeur que je rencontre en ce moment est que j'obtiens une incompatibilité de type sur l'appel SOAP pour effectuer la requête, ou l'objet ne supporte pas cette méthode quand j'essaie de refaire les joueurs (listQuery, listViewFields, listQueryOptions). J'ai laissé diverses parties en variante, puis les ai castées au fur et à mesure que le type retournait (puisque je n'ai pas de bibliothèque spécifique au SP "référencé", je le fais un peu aveugle) et j'ai obtenu des discordances.

Il semble presque que ce serait plus facile de filtrer les textes pour le texte.

Répondre

4

Woah, vous êtes si loin dans le trou du lapin ...

D'accord, le code que vous regardez est vous avoir une vue sur la liste SharePoint, qui peut-être pas le meilleur endroit pour commencer, mais le Le fait que tout se fasse en VBA le rend vraiment difficile. J'ai le code .NET C# pour interroger une liste et récupérer les éléments qui ont une valeur particulière. La conversion VBA je ne suis pas capable de faire. L'IntranetLists est une référence Web .net au fichier lists.asmx

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;    
    } 

Vous devrez rechercher comment utiliser le service web lists.asmx à partir de VBA, vous devrez alors appeler GetListItems avec une requête qui représente la valeur de colonne que vous voulez rechercher.

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

La syntaxe de cette requête est CAML

alors vous allez devoir analyser le xml qui revient à trouver l'élément et le champ de l'élément avec la valeur dont vous avez besoin. Toute requête xpath doit avoir les espaces de noms corrects ajoutés, par ex.

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); 
    } 

Cependant, je ne suis pas sûr que vous même avoir accès à quelque chose qui parser XML dans votre configuration VBA, donc vous pouvez avoir à télécharger un outil VBA supplémentaire pour le faire - peut même être bloqué pour vous.

Espérons que cela aide un peu.

Questions connexes