Что не так с этой верблюжьей оговоркой - PullRequest
1 голос
/ 17 октября 2019

Просто учусь пользоваться верблюдом и возникают проблемы. Я могу правильно сделать два разных запроса, но когда я объединяю их, я получаю сообщение об ошибке. Я посмотрел документацию и до сих пор не понимаю, в чем проблема.

Query1:

   var specifier1 = "<Where><Eq><FieldRef Name='Requestor_x0020_Name' LookupId='True'/><Value Type='Lookup'>" +
                           "<UserID/></Value></Eq></Where>";

Query2:

   var specifier2 = "<Where><Eq><FieldRef Name='ID'/><Value Type='Text'>"+currentItemID+"</Value>"+
                           "</Eq></Where>";

Комбинированный запрос:

   var specifier = "<Where><And><Eq><FieldRef Name='Requestor_x0020_Name' LookupId='True'/><Value Type='Lookup'>" +
                           "<UserID/></Value></Eq><And><Eq>"+
                           "<FieldRef Name='ID'/><Value Type='Text'>"+currentItemID+"</Value>"+
                           "</Eq></And></And></Where>";

Ошибка, которую я получаю с комбинированным запросом:

Request Failed.One or more field types are not installed properly. Go to the list settings page to delete these fields.
undefined

После задания строки Iесть следующие звонки. Может быть, это должно быть иначе, когда у вас есть условия? Мой console.log в моем цикле перечисления, кажется, там, где вещи терпят неудачу. Кажется, что сообщение об ошибке следует за 6x: xxxxxx

   camlQuery.set_viewXml("<View><Query>"+specifier+"</Query></View>");
   var collListItems = list.getItems(camlQuery);
   ctx.load(collListItems);
   ctx.executeQueryAsync(
        function(){
            var enumerator = collListItems.getEnumerator();
            count = collListItems.get_count();
            while(enumerator.moveNext()){
                var item = enumerator.get_current();
                console.log("xxxxxID : " + item.get_id());
            }
            if (count == 0) {
                LockDownCells();
            }
        },
        function(sender,args){
             console.log("xxxxxxRequest Failed."+args.get_message() + "\n" + args.get_stackTrace());
        }
    );

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Измените код, как показано ниже.

<script type="text/javascript">
SP.SOD.executeFunc('sp.js', 'SP.ClientContext', retrieveListItems);
function retrieveListItems(){
    var currentItemID=2;     
    var listTitle="CL1017"; 
    var specifier = "<Where><And>"+
                     "<Eq><FieldRef Name='Requestor_x0020_Name' LookupId='True'/><Value Type='Lookup'><UserID/></Value></Eq>"+
                     "<Eq><FieldRef Name='ID'/><Value Type='Text'>"+currentItemID+"</Value></Eq>"+
                     "</And></Where>";

    var ctx = new SP.ClientContext.get_current();
    var list = ctx.get_web().get_lists().getByTitle(listTitle);
    var camlQuery = new SP.CamlQuery();
    camlQuery.set_viewXml("<View><Query>"+specifier+"</Query></View>");
    var collListItems = list.getItems(camlQuery);
    ctx.load(collListItems);
    ctx.executeQueryAsync(
        function(){
            var enumerator = collListItems.getEnumerator();
            count = collListItems.get_count();
            while(enumerator.moveNext()){
                var item = enumerator.get_current();
                console.log("xxxxxID : " + item.get_id());
            }
            if (count == 0) {
                //LockDownCells();
            }
        },
        function(sender,args){
             console.log("xxxxxxRequest Failed."+args.get_message() + "\n" + args.get_stackTrace());
        }
    );
}
</script>

Если вы хотите запрашивать элемент списка только по идентификатору элемента, я предлагаю вам использовать приведенный ниже код, нам не нужно использовать CAML Query.

<script type="text/javascript">
SP.SOD.executeFunc('sp.js', 'SP.ClientContext', retrieveListItems);
function retrieveListItems(){
    var itemId=2;    
    var listTitle="CL1017";                          
    var ctx = new SP.ClientContext.get_current();
    var list = ctx.get_web().get_lists().getByTitle(listTitle);  
    var listItem = list.getItemById(itemId);
    ctx.load(listItem);
    ctx.executeQueryAsync(
        function(){
            console.log("xxxxxID : " + listItem.get_id());
        },
        function(sender,args){
             console.log("xxxxxxRequest Failed."+args.get_message() + "\n" + args.get_stackTrace());
        }
    );
}
</script>
0 голосов
/ 17 октября 2019

Попробуйте это:

<Query>
   <Where>
      <And>
         <Eq>
            <FieldRef Name='ID'/>
            <Value Type='Text'>currentItemID</Value>
         </Eq>
         <Eq>
            <FieldRef Name='Requestor_x0020_Name' LookupId='True'/><Value Type='Lookup'>
            <UserID/></Value>
         </Eq>
      </And>
   </Where>
</Query>
...