none
Problème d'ajout dans une liste sharepoint RRS feed

  • Question

  • Bonjour, j'ai crée un formulaire pour ajouter dans un liste. J'ai pu récupérer les valeurs entrées en testant avec Response.Write mais je ne peux pas ajouter à ma liste et une erreur se produit au niveau de la méthode Update

    try
            {
                ArrayList peEntities = userPicker.Entities;
                PickerEntity pickEn = (PickerEntity)peEntities[0];
                string nom = TxtNom.Text;
                string description = TxtDescription.Text;
                string chefdeprojet = pickEn.Key;
                string datedebut = DateDebut.SelectedDate.Date.ToString();
                string datefin = DateFin.SelectedDate.Date.ToString();

                objSPListItem = objSPListItemCollection.Add();
                objSPListItem["Nom"] = nom;
                objSPListItem["Description_x0020_Projet"] = description;
                objSPListItem["Chef_x0020_De_x0020_Projet"] = chefdeprojet;
                objSPListItem["Date_x0020_D_x00e9_but"] = datedebut;
                objSPListItem["Date_x0020_Fin"] = datefin;
              
                objSPListItem.Update();

              

            }
            catch (Exception E)
            {
                Response.Write(E.StackTrace);
            }
    lundi 14 avril 2008 15:33

Réponses

  • 1) Le people picker s'appui sur le ou les fournisseurs d'authentification définis dans le web.config de l'application web. Par défaut c'est l'AD, mais on peut très bien avoir une base SQL avec un SQLMemberShipProvider pour gérer ses utilisateurs ailleurs que dans l'AD (cas fréquent pour un extranet par exemple). Mais les utilisateurs de ce people picker correspondent forcément à des utilisateurs gérés par ce Provider d'authentification.

     

    2) Dans les pages SharePoint existantes, oui, car il y a du code Behind qui se charge de ça. Mais dans votre page, non... d'où la nécessité d'utiliser la méthode EnsureUser().

     

    3) Un user est avant tout idéntifié par un ID. Chaque user correspond à un item de la liste UserInfo du site dans lequel vous vous trouvez (je vous inviste à consulter un des posts de mon blog pour plus de détails à ce sujet (http://blogs.developpeur.org/gribouillon/archive/2008/04/10/comment-tendre-les-donn-es-utilisateur-sharepoint.aspx).

    Du coup, votre champs de type User est une sorte de champs LookUp. Tous les champs LookUp de SharePoint fonctionnent de la même manière, avec un ID, la chaîne "#;" suivie du libellé à afficher (le login ici). Vous aurez donc toujours cet affichage. Il faut vous donc découper la chaîne de caractères pour retrouver le nom, ou bien faire une requête CAML sur la liste UserInfo pour retrouver les informations complètes de l'utilisateur à partir de son ID.

    mardi 15 avril 2008 12:23
    Modérateur

Toutes les réponses

  • Bonjour, veuillez essayez ceci :

     

    Code Snippet

     

    objSPListItem.List.ParentWeb.AllowUnsafeUpdates = true;

    objSPListItem.Update();

     

     

    Si cela ne résout pas votre problème, pourriez vous nous montrer le message d'erreur et la stacktrace svp ?
    lundi 14 avril 2008 15:57
  • Le message d'erreur :Invalid data has been used to update the list item. The field you are trying to update may be read only.



    at Microsoft.SharePoint.Library.SPRequest.AddOrUpdateItem(String bstrUrl, String bstrListName, Boolean bAdd, Boolean bSystemUpdate, Boolean bPreserveItemVersion, Boolean bUpdateNoVersion, Int32& plID, String& pbstrGuid, Guid pbstrNewDocId, Boolean bHasNewDocId, String bstrVersion, Object& pvarAttachmentNames, Object& pvarAttachmentContents, Object& pvarProperties, Boolean bCheckOut, Boolean bCheckin, Boolean bMigration, Boolean bPublish) at Microsoft.SharePoint.SPListItem.AddOrUpdateItem(Boolean bAdd, Boolean bSystem, Boolean bPreserveItemVersion, Boolean bNoVersion, Boolean bMigration, Boolean bPublish, Boolean bCheckOut, Boolean bCheckin, Guid newGuidOnAdd, Int32& ulID, Object& objAttachmentNames, Object& objAttachmentContents, Boolean suppressAfterEvents) at Microsoft.SharePoint.SPListItem.UpdateInternal(Boolean bSystem, Boolean bPreserveItemVersion, Guid newGuidOnAdd, Boolean bMigration, Boolean bPublish, Boolean bNoVersion, Boolean bCheckOut, Boolean bCheckin, Boolean suppressAfterEvents) at Microsoft.SharePoint.SPListItem.Update() at NewProjet.CmdAjouter_Click(Object sender, EventArgs e)
    lundi 14 avril 2008 16:15
  • Je pense que le problème vient du typage dans les colonnes Date Début et Date Fin. Si ce sont des colonnes de type date, il faut fournir aux champs correspondants une date, et non une String.

     

     

     

    lundi 14 avril 2008 16:26
  • D'accord, mais quand je récupère les valeurs correctement avec des webs contrôls wss
    lundi 14 avril 2008 16:43
  • Bonjour,

     

    avant de vous répondre, une petite chose : pensez à donner tous les éléments de votre contexte. Pour avoir répondu à un autre de vos postes je suis en mesure de deviner quel est le problème... mais j'aurais été incapable de le faire autrement. Pensez donc à exprimer votre problème le plus clairement possible, et à donner le maximum de détails.

     

    Votre problème provient de ces lignes ci :

     

    Code Snippet

    string chefdeprojet = pickEn.Key;

    /// ...
    objSPListItem["Chef_x0020_De_x0020_Projet"] = chefdeprojet;

     

    votre colonne ["Chef_x0020_De_x0020_Projet"] doit certainement référencer un utilisateur de votre site.

     

    Par rapport à ça, j'imagine que pickEn.Key désigne la clé de votre PeoplePicker. Et c'est votre premier problème. La valeur à stocker dans votre colonne n'est pas la clé du people picker, mais une chaîne de la forme "3;#DOMAIN\username".

     

    Vous trouverez un exemple d'utilisation valide du People Picker sur ce site : http://mysharepointblog.com/post/2007/07/How-to-use-the-PeoplePicker-in-SharePoint.aspx

     

    Très important également : pour manipuler un objet SPUser de cette façon, il est primordiale qu'il soit déjà connu de votre collection de sites (notion différente de votre AD). Il vous faut donc ajouter l'utilisateur dans la liste des utilisateurs SharePoint s'il ne s'y trouve pas déjà. Pour celà, utilisez la méthode EnsureUser() de la classe SPWeb. L'essentiel de cette classe est décrit sur le MSDN : http://msdn2.microsoft.com/en-us/library/microsoft.sharepoint.spweb.ensureuser.aspx.

    lundi 14 avril 2008 20:16
    Modérateur
  • Bonjour la  colonne ["Chef_x0020_De_x0020_Projet"] est de type person or group.
    Concernant la chaine retourné de ce composant pourquoi je récupère la forme "
    3;#DOMAIN\username", j'ai un champ dans un gridview qui bound cette valeur mais affiche seulement "DOMAIN\username".

    Finalement concernant le SPUser, je suis entrain d'ajouter uniquement les utilisateurs dans mon site shrapoint (normalement dans l'AD) pourquoi je dois utiliser
      la méthode EnsureUser() ? Y 'a t-il une différence entre les utlisateurs sharepoint et AD ?

    Merci, j'espère que j'étais clair
    mardi 15 avril 2008 06:59
  • La méthode EnsureUser() vous permet de reccupérer un objet SPUser à partir d'un login et, dans le cas où cet utilisateur n'existe pas, de le créer implicitement avant de le reccupérer. L'utilisation de cette méthode vous permettra d'être sûr de ne pas référencer un utilisateur non connu au niveau de votre site (la liste des utilisateurs SharePoint est stockée dans une liste SharePoint (masquée) nommée "UserInfo".

     

    Cette liste ne contient pas tous les users de votre AD, mais seulement ceux ayant contribué à votre site SharePoint, ou ceux dont le nom est explicitement référencé au niveau de la gestion des droits de votre site SharePoint. Bref, c'est un Best Practice... ça vous évitera des ennuis par la suite.

     

    mardi 15 avril 2008 08:51
    Modérateur
  • Bonjour, merci vous m'avez eclaircit beaucoup de chose mais j'ai des ambiguité s:

    1/ Est ce que les utilisateurs du site sharepoint doivent être issuent de l'Active Directory ? Est ce qu'on peut ajouter des users non disponiblent  dans l'AD ?

    2 / Quand j'utilise le PeopleEditor, seul il valide les utilisateurs mentionnées s'il existent ou non .

    3 / J'ai aussi un problème avec la valeur enregistré d'un utilisateur (chefdeprojet): Dans un grid je récupère uniquement Domaine\user et quand je fais un affichage de la listitem dans une page à par , j'obtient 1;#Domaine\user .

    Ceci est du à quoi ?

    Voila le côde :
    i
    Code Snippet

    f (!IsPostBack)
                {
                    if (Request.Params["id_projet"] != null && Request.Params["nom_projet"] != null)
                    {
                        id_projet = Request.Params["id_projet"];
                        nom_projet = Request.Params["nom_projet"];

                        SPQuery objSPQuery = new SPQuery();
                        objSPQuery.ViewFields =
                             @"
                           <FieldRef Name='ID' />
                           <FieldRef Name='NomProjet' />
                           <FieldRef Name='StatutProjet' />
                           <FieldRef Name='ChefDeProjet' />
                           <FieldRef Name='DescriptionProjet' />
                           <FieldRef Name='DateDebut' />
                           <FieldRef Name='DateFinProjet' />";


                     

                        objSPQuery.Query =
                            @" <Where>
                              <And>
                                 <Eq>
                                    <FieldRef Name='ID' />
                                    <Value Type='Counter'>" + id_projet + @"</Value>
                                 </Eq>
                                 <Eq>
                                    <FieldRef Name='NomProjet' />
                                    <Value Type='Text'>" + nom_projet + @"</Value>
                                 </Eq>
                              </And>
                           </Where>";

                        objSPListItemCollection = objSPList.GetItems(objSPQuery);

                        foreach (SPListItem item in objSPListItemCollection)
                        {
                            LblNom.Text = item["NomProjet"].ToString();
                            LblStatut.Text = item["StatutProjet"].ToString();
                            LblChefProjet.Text = item["ChefDeProjet"].ToString().Trim();
                            LblDescription.Text = item["DescriptionProjet"].ToString().Trim();
                            LblDateDebut.Text = item["DateDebut"].ToString().Trim();
                            LblDateFin.Text = item["DateFinProjet"].ToString().Trim();
                        }

                    }
                }




    mardi 15 avril 2008 10:23
  • 1) Le people picker s'appui sur le ou les fournisseurs d'authentification définis dans le web.config de l'application web. Par défaut c'est l'AD, mais on peut très bien avoir une base SQL avec un SQLMemberShipProvider pour gérer ses utilisateurs ailleurs que dans l'AD (cas fréquent pour un extranet par exemple). Mais les utilisateurs de ce people picker correspondent forcément à des utilisateurs gérés par ce Provider d'authentification.

     

    2) Dans les pages SharePoint existantes, oui, car il y a du code Behind qui se charge de ça. Mais dans votre page, non... d'où la nécessité d'utiliser la méthode EnsureUser().

     

    3) Un user est avant tout idéntifié par un ID. Chaque user correspond à un item de la liste UserInfo du site dans lequel vous vous trouvez (je vous inviste à consulter un des posts de mon blog pour plus de détails à ce sujet (http://blogs.developpeur.org/gribouillon/archive/2008/04/10/comment-tendre-les-donn-es-utilisateur-sharepoint.aspx).

    Du coup, votre champs de type User est une sorte de champs LookUp. Tous les champs LookUp de SharePoint fonctionnent de la même manière, avec un ID, la chaîne "#;" suivie du libellé à afficher (le login ici). Vous aurez donc toujours cet affichage. Il faut vous donc découper la chaîne de caractères pour retrouver le nom, ou bien faire une requête CAML sur la liste UserInfo pour retrouver les informations complètes de l'utilisateur à partir de son ID.

    mardi 15 avril 2008 12:23
    Modérateur
  • Bonjour, je suis vraiment désolé si je suis entrain de vous embêttez.
    Pouvez vous me donnez un bou de code qui illustre l'utilisation de PeoplePicker avec la méthode EnsureUser parceque je n'ai pas trouvé d'explication dans le lien que vous m'avez donné.

    Merci
    mardi 15 avril 2008 14:25