CAML из JavaScript для извлечения всех элементов с доски объявлений SharePoint - PullRequest
2 голосов
/ 26 февраля 2010

Я использую JavaScript для вызова метода GetListItems веб-службы SP и передаю следующий CAML:

    var CAML = "<Query>"
            + "<ViewAttributes Scope=\"Recursive\" />"
            + "<Where>"
            + "<Or>"
            + "<Eq>"
            + "<FieldRef Name=\"ID\"/>"
            + "<Value Type=\"Counter\">" + id + "</Value>"
            + "</Eq>"
            + "<Eq>"
            + "<FieldRef Name=\"ParentFolderId\" />"
            + "<Value Type=\"Integer\">" + id + "</Value>"
            + "</Eq>"
            + "</Or>"
            + "</Where>"
            + "</Query>";

    var fieldinfo = "<ViewFields><FieldRef Name='Title' /><FieldRef Name='Body' /><FieldRef Name='CorrectBodyToShow' /><FieldRef Name='Created' /><FieldRef Name='Author' /><FieldRef Name='Editor' /><FieldRef Name='PersonalImage' /><FieldRef Name='DiscussionLastUpdated' /></ViewFields>"

И я получаю только элемент верхнего уровня ... элемент Тип обсуждения. Существует 2 элемента типа сообщения, связанных с ParentFolderId, равным 1, но они не возвращаются.

Кроме того, если я запускаю CAML в инструменте U2U, он возвращает всю цепочку ... одно обсуждение и два сообщения.

Ответы [ 3 ]

1 голос
/ 27 февраля 2010

рекурсивная функция является частью объекта параметров запроса, а не объекта параметров просмотра в веб-сервисе

0 голосов
/ 27 февраля 2010

Вам необходимо установить свойство Scope = Recursive. Вы сделали это в CAML, но не в том месте.

Если вы используете объектную модель, вы должны использовать

query.ViewAttributes = "Scope = \" Recursive \ "";

Однако вы используете веб-сервис. В вашем примере вы поместили ViewAttributes как дочерний элемент узла Query - но это неверно.

Он должен быть частью параметра queryOptions для GetListItems

Таким образом, в дополнение к указанному выше коду вы должны

   var queryOptions = "<QueryOptions>" +
                         "<ViewAttributes Scope='Recursive' />" +
                      "</QueryOptions>";

Тогда внутри вашей оболочки javascript вы бы назвали это примерно так (ПРИМЕЧАНИЕ. Очевидно, это не будет работать как есть, но вы поняли)

listService.GetListItems("List_Name", null,
                         CAML, fieldinfo , null, 
                         queryOptions, null);
0 голосов
/ 27 февраля 2010

У меня есть догадка, что вам нужно установить recusion в объекте SPQuery, а не в запросе caml, например:

qry.ExpandRecurrence = true

но я могу ошибаться :) Я обнаружил, что некоторая сортировка тоже не всегда работает.

...