2015-10-01 2 views
0

J'essaie de mettre à jour une liste SharePoint via un formulaire InfoPath. Une date de début SelectedDAM est entrée, et le code calcule ensuite 6 dates. Les dates nouvellement calculées doivent être mises à jour dans la liste SP originale.Comment valider si la mise à jour de l'élément de liste SharePoint a été réussie

Le code ci-dessous ne déclenche aucune exception en mode débogage et même en production. J'ai vérifié que 'jobs' est rempli avec des données, et que les noms de liste de fichiers sont conformes à leur nom SharePoint. Malheureusement, lorsque je regarde la liste SharePoint par la suite, les éléments n'ont pas été mis à jour.

public void SetDAMButton_Clicked(object sender, ClickedEventArgs e) 
    { 
     string SelectedCEC = nav.SelectSingleNode("/my:mesChamps/my:DAMSection/my:CEC", this.NamespaceManager).Value; 
     string SelectedDAM = nav.SelectSingleNode("/my:mesChamps/my:DAMSection/my:DAM", this.NamespaceManager).Value; 

     //Query all jobs and dates from SharePoint List 
     XmlDocument xmlDoc = new XmlDocument(); 
     XmlNode query = xmlDoc.CreateNode(XmlNodeType.Element, "Query", ""); 
     XmlNode viewFields = xmlDoc.CreateNode(XmlNodeType.Element, "ViewFields", ""); 

     query.InnerXml = "<Where>" + 
          "<Contains><FieldRef Name='CEC'/>" + 
          "<Value Type='Text'>" + SelectedCEC.Trim() + "</Value></Contains>" + 
         "</Where>"; 

     viewFields.InnerXml = "<FieldRef Name='ID' />" + 
      "<FieldRef Name='JRS_x0020_Avant' />"+ "<FieldRef Name='JRS_x0020_Pr_x00e9_vus' />"+ 
      "<FieldRef Name='JRS_x0020_Prevus_x0020_2' />"+ "<FieldRef Name='JRS_x0020_Avant_x0020_2' />"+ 
      "<FieldRef Name='JRS_x0020_Pr_x00e9_vus_x0020_3' />" + "<FieldRef Name='JRS_x0020_Avant_x0020_3' />"; 

     XmlNode listItems = sp.getListService().GetListItems(SPJobsListGlobal, null, query, viewFields, "10000000", null, null); 

     //Extract jobs data to an internal list 
     List<string[]> jobs = new List<string[]>(); 
     for (int i = 1; i != listItems.ChildNodes[1].ChildNodes.Count; i += 2) 
     { 
      string jobId = listItems.ChildNodes[1].ChildNodes[i].Attributes[0].InnerXml; 
      string JRSAvant = listItems.ChildNodes[1].ChildNodes[i].Attributes[1].InnerXml; 
      string JRSPrevus = listItems.ChildNodes[1].ChildNodes[i].Attributes[2].InnerXml; 
      string JRSPrevus2 = listItems.ChildNodes[1].ChildNodes[i].Attributes[3].InnerXml; 
      string JRSAvant2 = listItems.ChildNodes[1].ChildNodes[i].Attributes[4].InnerXml; 
      string JRSPrevus3 = listItems.ChildNodes[1].ChildNodes[i].Attributes[5].InnerXml; 
      string JRSAvant3 = listItems.ChildNodes[1].ChildNodes[i].Attributes[6].InnerXml; 
      jobs.Add(new string[] { jobId.Trim(), JRSAvant.Trim(), JRSPrevus.Trim(),JRSAvant2.Trim(), JRSPrevus2.Trim(), JRSAvant3.Trim(), JRSPrevus3.Trim() }); 
     } 
     jobs.RemoveAt(jobs.Count - 1); 

     //Update each item of SharePoint list with dates calculated from new DAM 
     for(int i = 0; i != jobs.Count; i++) 
     { 
      XmlDocument doc = new XmlDocument(); 
      XmlElement batch = doc.CreateElement("Batch"); 
      batch.InnerXml = "<Method ID='1' Cmd='Update'>" + 
       "<Field Name='ID'>" + SecurityElement.Escape(jobs[i][0]) + "</Field>" + 
       "<Field Name='DateDebut'>" + SecurityElement.Escape(Convert.ToDateTime(SelectedDAM).AddDays(-validateJRS(jobs[i][1])).ToString("yyyy-MM-dd")) + "</Field>" + 
       "<Field Name='DateFin'>" + SecurityElement.Escape(Convert.ToDateTime(SelectedDAM).AddDays(-validateJRS(jobs[i][1])).AddDays(validateJRS(jobs[i][2])).ToString("yyyy-MM-dd")) + "</Field>" + 
       "<Field Name='Date_x0020_D_x00e9_but_x0020_2'>" + SecurityElement.Escape(Convert.ToDateTime(SelectedDAM).AddDays(-validateJRS(jobs[i][3])).ToString("yyyy-MM-dd")) + "</Field>" + 
       "<Field Name='Date_x0020_Fin_x0020_2'>" + SecurityElement.Escape(Convert.ToDateTime(SelectedDAM).AddDays(-validateJRS(jobs[i][3])).AddDays(validateJRS(jobs[i][4])).ToString("yyyy-MM-dd")) + "</Field>" + 
       "<Field Name='Date_x0020_D_x00e9_but_x0020_3'>" + SecurityElement.Escape(Convert.ToDateTime(SelectedDAM).AddDays(-validateJRS(jobs[i][5])).ToString("yyyy-MM-dd")) + "</Field>" + 
       "<Field Name='Date_x0020_Fin_x0020_3'>" + SecurityElement.Escape(Convert.ToDateTime(SelectedDAM).AddDays(-validateJRS(jobs[i][5])).AddDays(validateJRS(jobs[i][6])).ToString("yyyy-MM-dd")) + "</Field>" + 
       "</Method>"; 
      sp.UpdateListItems(SPJobsListGlobal, batch); 
     } 

Pourquoi cela ne fonctionne-t-il pas? Y at-il une ligne supplémentaire que je pourrais ajouter pour confirmer la mise à jour.

+0

@ ama1111 Encore merci. En regardant les résultats XmlNode ' 0x81020014 Un ou plusieurs types de champs ne sont pas installés correctement. Accédez à la page des paramètres de la liste pour supprimer ces champs. 'est apparu. Je vais maintenant essayer de trouver si l'erreur est due à des types de champs, comme indiqué, ou à une mauvaise référence de la liste, comme suggéré dans un autre post [link] http://stackoverflow.com/questions/1300656/0x81020014one-or-more-field -types-ne-sont-pas-installés-correctement-vont-à-la-liste-ensemble [/ link] – Spelya

+0

Ci-dessus soulève également une autre question: Comment peut intercepter ce genre d'erreur interne? Quand j'ai lancé InfoPath, je suis passé inaperçu et j'ai trouvé que c'était réussi. – Spelya

+0

Je peux maintenant intercepter l'erreur en utilisant une condition 'If (Results.XmlText! = "0x00000000"'. Merci @ ama1111 – Spelya

Répondre

0

Pour confirmer la mise à jour, vous pouvez vérifier la valeur de retour de Lists.UpdateListItems, qui est un XmlNode qui contient l'état de la mise à jour.

De MSDN:

Valeur de retour

Un fragment XMLDATA sous la forme suivante qui indique l'état de chaque bloc de procédé publié par le paramètre de mise à jour et qui peut être affecté à un System.XML. Objet XmlNode. Pour les éléments mis à jour avec succès, un fragment de ligne est renvoyé avec les valeurs de ligne mises à jour.

+0

Réservoirs pour l'information ama1111 Je devrais essayer au travail demain. – Spelya