none
CAML et Lookup MultiValeur RRS feed

  • Question

  • Bonjour à tous,

    J'ai un soucis avec une requête CAML. Je souhaite récupérer la valeur d'une colonne Recherche acceptant plusieurs valuers.

    A l'exécution de la requete, la valeur de ce champ est de type:

    value1;#2;#Value2;#3;#Value3;

    
    

    Il manque l'identifiant de la première valeur.... Du coup lorsque je veux instancier un SPFieldLookupCollection(String) çà plante vue le format de chaîne n'est pas correct.

    J'ai contourné le problème en  passant par par SPListItem["MaColonne"].toString(), j'ai bien

    #1;#value1;#2;#Value2;#3;#Value3;

    
    

    Est-ce que quelqu'un a déjà rencontré ce problème?  Ma solution de contournement ne me plait pas forcément pour une raison de performance. Je suis obligé de recharger un listItem supplémentaire.

    

    Merci de vos retours.

    NicoBzh

    lundi 30 avril 2012 12:16

Réponses

  • ReReBonjour,

    Voilà le résultat de mes investigations. Le SPListItemCollection.getDataTable formate les champs LookUp en ne conservant que la valeur du champs. CEla fonctionne impeccable pour les champs n'acceptant pas plusieurs valeurs. dans le cas contraire, cela supprime juste le premier identifiant trouvé, la chaine de caractère résultante n'a plus d'intérêt.

    J'ai besoin de récupérer les identifiants  des champs Lookup. J'ai trouvé 2 possibilités :

    1.
    SPListItemCollection results = listeARequeter.GetItems(query);
     System.Data.DataTable dt2 = results.GetDataTable();
    Dans ce là, je dois parcourir la table et recharger le SPListItem via maSPList.GetItemById(monID). Il faut dans ce cas que dans ma requête CAML je retourne l'ID de mon Item. Cela fonctionne bien, mais pour des listes conséquentes cela peut provoquer des problèmes de performances.

    2.
    maSPList.GetDataTable(query, SPListGetDataTableOptions.RetrieveLookupIdsOnly, out spListItemPosition);
    Ca marche bien, je récupère l'ensemble des identifiants  de mon Champ LookUp. Inconvénient, pour les champs LooKup n'autorisant pas plusieurs valeurs, je perd la valeur du champ, en effet je n'ai plus que son identifiant. Cela m'oblige donc à le recharger...


    Je vais donc sans doute partir de la première solution (J'ai plus de champs lookUp Simple valeur que multiValeur). et A l'usage s'il y a des problèmes de performances j'affinerai. (la fonctionnalité en cours de développement ne sera utilisée que par un nombre restreint d'utilisateur et ce sera un usage ponctuel...).

     

    NicoBzh
    lundi 30 avril 2012 15:23

Toutes les réponses

  • ReBonjour,

    Petite précision, la perte de l'identifiant de la première valeur, est présente dans la datatable générée via la méthode SPListItemCollection.GetDatable. Si je travaille avec les SPListItem pas de soucis la valeur de ma colonne lookup est bien formatée...

    J'ai besoin de rajouter des colonnes supplémentaires (que je ne peux pas obtenir via la requête CAML), c'est pour cela que je génère la datatable.... A partir de la datatable, je peux instancier un SPListItem mais cela fait une requête supplémentaire qui plombe les performances car ma datatable peut contenir plusieurs milliers de lignes.

    Une idée pour ce soucis de perte d'identifiant lorsqu'on passe de SPListItemCollection en Datatable?

    NicoBzh

    lundi 30 avril 2012 13:36
  • ReReBonjour,

    Voilà le résultat de mes investigations. Le SPListItemCollection.getDataTable formate les champs LookUp en ne conservant que la valeur du champs. CEla fonctionne impeccable pour les champs n'acceptant pas plusieurs valeurs. dans le cas contraire, cela supprime juste le premier identifiant trouvé, la chaine de caractère résultante n'a plus d'intérêt.

    J'ai besoin de récupérer les identifiants  des champs Lookup. J'ai trouvé 2 possibilités :

    1.
    SPListItemCollection results = listeARequeter.GetItems(query);
     System.Data.DataTable dt2 = results.GetDataTable();
    Dans ce là, je dois parcourir la table et recharger le SPListItem via maSPList.GetItemById(monID). Il faut dans ce cas que dans ma requête CAML je retourne l'ID de mon Item. Cela fonctionne bien, mais pour des listes conséquentes cela peut provoquer des problèmes de performances.

    2.
    maSPList.GetDataTable(query, SPListGetDataTableOptions.RetrieveLookupIdsOnly, out spListItemPosition);
    Ca marche bien, je récupère l'ensemble des identifiants  de mon Champ LookUp. Inconvénient, pour les champs LooKup n'autorisant pas plusieurs valeurs, je perd la valeur du champ, en effet je n'ai plus que son identifiant. Cela m'oblige donc à le recharger...


    Je vais donc sans doute partir de la première solution (J'ai plus de champs lookUp Simple valeur que multiValeur). et A l'usage s'il y a des problèmes de performances j'affinerai. (la fonctionnalité en cours de développement ne sera utilisée que par un nombre restreint d'utilisateur et ce sera un usage ponctuel...).

     

    NicoBzh
    lundi 30 avril 2012 15:23
  • Hello

    ça sens quand même un peu le bug ds la méthode GetDataTable tout ça....

    Qu'elle version de Sharepoint (et quel niveau de mise à jour ) ?

    As tu tenter un passage à reflector de la methode GetdataTable ?

    Moi je dis selon ta version (une des plus récente), un ptit bug sur Connect ça peut être mérité :)


    Blog Sharepoint : www.paslatek.net Twitter : @LimozinLionel

    jeudi 3 mai 2012 20:13