none
[Liste][Views] requete CAML RRS feed

  • Question

  • Bonjour,
    J'ai une requete CAML qui ne fonctionne pas et qui me retourne le msg suivant :

    "Un ou plusieurs types de champs ne sont pas installés correctement. Accédez à la page des paramètres de liste pour supprimer ces champs."

    et voila ma requete :

    "<Where><And><Contains><FieldRef Name=\"Article\"/><Value Type=\"Text\">726</Value><FieldRef Name=\"Status\"/><Value Type=\"Text\">Ter</Value></Contains></And></Where>"

     

    ;

    Je ne comprend pas pourquoi cela ne marche pas..en meme temps je ne trouve pas beaucoup de docs a propos des requetes CAML
    si quelqu'un vois ce qui ne va pas. merci






    Développeur en herbe..
    jeudi 10 décembre 2009 14:38

Réponses

  • Bonjour,

    Pourriez-vous vérifier que chacun des FieldRef correspond bien au InternalName cible ?
    Toutes les infos nécessaires ici : http://www.davehunter.co.uk/Blog/Lists/Posts/Post.aspx?List=f0e16a1a%2D6fa9%2D4130%2Dbcab%2Dbaeb97ccc4ff&ID=119

    D'autre part il me paraitrait interessant de valider votre requete CAML en dehors du cadre d'une SPView jusqu'à avoir identifié le problème.
    Comme Alexandre l'a suggéré, vous pourriez utiliser CAMLBuilder et/ou CAMLViewer pour vous aider dans la réalisation/validation de votre requête, avant de l'implémenter dans le code.

    Sinon, pourriez vous nous montrer le code actuel? dans ce que vous avez copié/collé il semble que votre structure CAML soit invalide au niveau de l'imbrication des <And>. Les recommandations d'Alexandre a ce sujet sont les bonnes.
    http://blogs.developpeur.org/anouvel
    Merci de valider les réponses qui correspondent à votre problème afin qu'il apparaisse comme résolu.
    • Marqué comme réponse HeB91 lundi 21 décembre 2009 09:46
    samedi 12 décembre 2009 09:35

Toutes les réponses

  • Bonjour, Apparemment le problème vient des champs. Sont ils corrects ? le type est il bon ? Sinon il faudrait avoir la requête CAML dans sont ensemble, il n'y a que la clause "where" ici. Un bon outil pour tester ses requêtes CAML sur son site sharepoint : http://www.u2u.be/Res/Tools/CamlQueryBuilder.aspx en espérant avoir apporter de l'aide.
    jeudi 10 décembre 2009 17:01
  • Bonjour,

    Merci de ta réponse, j'ai télécharger le logiciel et je pense que ca va m'aider pour mes futures requetes.
    J'ai réussi a régler mon probleme en ajoutant un <Contains></Cointains dc un pour chaque champs..
    Maintenant j'ai un autre probleme, j'ai ajouté ce code dans l'évenement d'un bouton mais ça ne marche pas.. il m'affiche "Erreur inatendue s'est produite".

    voila mon code si quelqu'un pouvait trouver la faille!

     // Récupération du site courant et de la liste DE
                    SPWeb web = SPContext.Current.Web;
                    // Obligé d'autorisé des requetes sans sécurité pour éxécuter la query
                    web.AllowUnsafeUpdates = true;
                    SPList list = web.Lists["DE"];
                    SPView vue_filtrer = list.Views["réduit"];
                    string query = "<Where><And>";
                    if (!string.IsNullOrEmpty(TB_Article.Text))
                        query  += "<Contains><FieldRef Name=\"Article\"/><Value Type=\"Text\">" + TB_Article.Text + "</Value></Contains>";
                    if (!string.IsNullOrEmpty(TB_Etat.Text))
                        query  += "<Contains><FieldRef Name=\"Status\"/><Value Type=\"Text\">" + TB_Etat.Text + "</Value></Contains>";
                    if (!string.IsNullOrEmpty(TB_NumDE.Text))
                        query  += "<Contains><FieldRef Name=\"Title\"/><Value Type=\"Text\">" + TB_NumDE.Text + "</Value></Contains>";
    
                    query  += "</And></Where>";
    vue_filtrer.Queyr=queyr;
                    vue_filtrer.Update();

    Développeur en herbe..
    • Modifié HeB91 vendredi 11 décembre 2009 08:57
    vendredi 11 décembre 2009 08:43
  • Déjà je vois une vue avec un nom comportant un accent.
    Il faut éviter ce genre de choses.

    Deuxièmement la clause <And> de ta requète ne peux comprendre que 2 éléments Contains, ici il y en a 3.

    Il faut donc faire 2 <And> imbriqués: 


    <And>

    <And>
    <Contains>
    <Contains>
    </And>

    <Contains>
    </And>

    Cela fonctionnera déjà un peu mieux comme ça.

    Ne pas hésiter à tester les requétes CAMl avec l'outil précisé dans mon post précédent, cela évitera ce genre de fautes.
    vendredi 11 décembre 2009 08:54
  • JE sais bien pour les accents..ce n'est pas moi qui l'ais créée, Merci pour le And , ça a l'air de marcher sauf quand un ou tous les champs sont nuls. Et puis Incrémenter directement la query ne semblait pas marche j'ai donc fait ainsi :

    // Récupération du site courant et de la liste DE
                    SPWeb web = SPContext.Current.Web;
                    // Obligé d'autorisé des requetes sans sécurité pour éxécuter la query
                    web.AllowUnsafeUpdates = true;
                    SPList list = web.Lists["DE"];
                    SPView vue_filtrer = list.Views["réduit"];
                    string query = "<Where><And>";
                    if (!string.IsNullOrEmpty(TB_Article.Text))
                    {
                        query += "<Contains><FieldRef Name=\"Article\"/><Value Type=\"Text\">";
                        query += TB_Article.Text;
                        query += "</Value></Contains>";
                    }
                    if (!string.IsNullOrEmpty(TB_Etat.Text))
                    {
                        query += "<Contains><FieldRef Name=\"Status\"/><Value Type=\"Text\">";
                        query += TB_Etat.Text;
                        query += "</Value></Contains>";
                    }
                    if (!string.IsNullOrEmpty(TB_NumDE.Text))
                    {
                        query += "</And><And><Contains><FieldRef Name=\"Title\"/><Value Type=\"Text\">";
                        query += TB_NumDE.Text;
                        query += "</Value></Contains>";
                    }
    
                    query += "</And></Where>";
                    vue_filtrer.Query = query;
                    vue_filtrer.Update();



    Je n'ais pas encore redémarré pour finir d'installer l'outil .. je vais d'ailleur redémarrer maintenant.


    Développeur en herbe..
    vendredi 11 décembre 2009 09:03
  • Oui ici les <And> ne sont pas imbriqués, toutes les conditions ne seront pas respectées.

    Votre requète est de type : 

    <and>
    contains
    contains
    </and>

    <and>
    contains
    </and>

    alors qu'il faudrait qu'elle soit comme ceci : 

    <And>

    <And>
    <Contains>
    <Contains>
    </And>

    <Contains>
    </And>

    Pour les champs nuls vous parlez des champs que vous requètez ou des champs que vous passez en paramètre ?
    • Proposé comme réponse Arnault Nouvel samedi 12 décembre 2009 09:35
    vendredi 11 décembre 2009 09:23
  • D'accord, merci, ce sont les parametres ( récupéré via des textbox).
    Sinon, j'aimerais savoir si il y a une requete spécifique pour afficher tous les éléments ? ou alors je doit requeter sur quelque chose que l'on trouve sur tous?

    De plus, est-ce que l'on peut executer une requete sur une liste ayant déjà été requétée ?
    Je m'explique, j'ai 3 champs texte et un bouton qui déclenche l'éxécution de la requete, j'aimerais pouvoir requter la liste colonne par colonne. par exemple, d'abord afficher les éléments résultant de la requete déclenchée par la 1er textbox puis effectuer une autre requete via une autre textbox sur la liste contenant le résultat de la précédente etc..
    Développeur en herbe..
    vendredi 11 décembre 2009 09:32
  • hum :$ désolé je ne vois pas trop comment utiliser cela.. je ne vois pas bien à quoi sers le scope =recursiveAll.
    J'ai réssyaer le code d'Arnault
    SPQuery allItemsQuery = new SPQuery();
    allItemsQuery.ViewAttributes = "Scope='RecursiveAll'";
    SPListItemCollection items = list.GetItems(allItemsQuery);
    

    mais sans succès..
    Développeur en herbe..
    vendredi 11 décembre 2009 10:07
  • Vous n'avez pas besoin de clause where en fait pour afficher tous les éléments.

    Et si vous avez des dossiers dans votre liste et bien le scope recursiveAll vous permettra d'en afficher les éléments à l'infini.
    vendredi 11 décembre 2009 10:17
  • J'ai toujours du code qui ne fonctionne pas..je me décide donc à écrire dans un label le résultat final de ma query et sur ce, je n'obtiens rien..
    meme lorsque je fais :

    string query=@"</where>";

    Cela ne m'affiche rien.. je ne sais pas pourquoi.
    Développeur en herbe..
    vendredi 11 décembre 2009 13:08
  • Bonjour,

    Pourriez-vous vérifier que chacun des FieldRef correspond bien au InternalName cible ?
    Toutes les infos nécessaires ici : http://www.davehunter.co.uk/Blog/Lists/Posts/Post.aspx?List=f0e16a1a%2D6fa9%2D4130%2Dbcab%2Dbaeb97ccc4ff&ID=119

    D'autre part il me paraitrait interessant de valider votre requete CAML en dehors du cadre d'une SPView jusqu'à avoir identifié le problème.
    Comme Alexandre l'a suggéré, vous pourriez utiliser CAMLBuilder et/ou CAMLViewer pour vous aider dans la réalisation/validation de votre requête, avant de l'implémenter dans le code.

    Sinon, pourriez vous nous montrer le code actuel? dans ce que vous avez copié/collé il semble que votre structure CAML soit invalide au niveau de l'imbrication des <And>. Les recommandations d'Alexandre a ce sujet sont les bonnes.
    http://blogs.developpeur.org/anouvel
    Merci de valider les réponses qui correspondent à votre problème afin qu'il apparaisse comme résolu.
    • Marqué comme réponse HeB91 lundi 21 décembre 2009 09:46
    samedi 12 décembre 2009 09:35