Skip to content Skip to sidebar Skip to footer

How Can I Determine If A Sharepoint Listitem Exists Based On A Couple Of Known Values?

I have this Sharepoint (2010) Javascript (adapted from here) to insert or Update various 'fields' in the ListItem: var listId; . . . function upsertPostTravelListItemTravelerInfo

Solution 1:

It might not be a query-like as you'd like, but what about something like:

var clientContext = newSP.ClientContext.get_current();
 var listItems = oList.getItems("");
 clientContext.load(listItems);
 clientContext.executeQueryAsync(function(){

     var arrayListEnum = listItems.getEnumerator();

     while (arrayListEnum.moveNext()) {
         var listItem = arrayListEnum.get_current();

         if(listItem.get_item("userName") === "<userName>" &&
            listItem.get_item("payeeName") === "<payeeName>" &&
            listItem.get_item("Completed") == false) {

                return listItem.get_id();    
         }
     }
 });

Or you can use CAML query like so:

var query = newSP.CamlQuery();
 query.set_viewXml("<View><Query><Where><Contains><FieldRef Name='userName'/>" +
                    "<Value Type='Text'>userName</Value></Contains></Where></Query>" + 
                    "</View>");
 listItems = oList.getItems(query);

 clientContext.load(listItems);
 clientContext.executeQueryAsync(onQuerySucceeded, function(){Alert("not found");});

 ...

 functiononQuerySucceeded() {
    var listEnumerator = listItems.getEnumerator();
    while (listEnumerator.moveNext()) {
        console.log(listEnumerator.get_current().get_id());
    }  
 }

Solution 2:

CRUD example using RESTas requested using SharePoint 2010

The beauty of a RESTful service --> everything happens over HTTP

Thus, you can use pure JavaScriptviaXMLHttpRequest

or JQueryvia$.ajax

or MicrosoftAjax.jsviaSys.Net.WebRequestas this example demonstrates, since it is already available in a SharePoint 2010 web part

// test rest on SharePoint 2010testREST();

functiontestREST() {
  /*
  **  List name: Test List (collapse spaces)
  **  Find list item - Set query in url --> ListName?$filter=
  **  Or access by list item id --> ListName(id)
  */invokeRequest({
    // make GET request with url query// REST also allows expansion of lookup fields//  --  here, i check `ModifiedBy` for `[Me]`'url': "TestList?$filter=" +
           "TextColumn eq 'row 1' and " +
           "NumberColumn lt 3 and " +
           "ModifiedById eq " + _spPageContextInfo.userId,

    // GET request'verb': "GET",

    // not needed for GET requests'body': null,
    'match': null,
    'method': null,

    // on complete'success': function (jsonObj) {
      // check the results of our query, returned in array: jsonObj.d.results// fyi -- if id used -- ListName(id) -- no array, one object: jsonObj.dif (jsonObj.d.results.length === 0) {
        // nothing found, insert new iteminsertItem();
      } else {
        // check field for _first_ item returned -- NumberColumnif (jsonObj.d.results[0].NumberColumn < 2) {
          // update if less than 2updateItem(jsonObj.d.results[0]);
        } else {
          // delete if greater than or equal to 2deleteItem(jsonObj.d.results[0]);
        }
      }
    },
    'fail': function (errCode, errMessage) {
      console.log(errCode + ' = ' + errMessage);
    },
  });
}

functioninsertItem() {
  /*
  **  List name: Test List
  **  Insert list item
  */invokeRequest({
    // make POST request for insert'url': "TestList",
    'verb': "POST",

    // use MicrosoftAjax.js to serialize our new list item'body': Sys.Serialization.JavaScriptSerializer.serialize({
      // set a key: value according to the column names in the listTitle: "TEST",
      TextColumn: "row 1",
      EmployeeId: _spPageContextInfo.userId,
      NumberColumn: 1,
      DateColumn: newDate()
    }),

    // new item -- match & method not needed'match': null,
    'method': null,

    // on complete'success': function (jsonObj) {
      // print new list item to consolevar s = '';
      for (var key in jsonObj.d) {
        if (jsonObj.d.hasOwnProperty(key)) {
          s += key + ' = ' + jsonObj.d[key] + '\n';
        }
      }
      console.log('new list item\n' + s);
    },
    'fail': function (errCode, errMessage) {
      console.log(errCode + ' = ' + errMessage);
    },
  });
}

functionupdateItem(listItem) {
  /*
  **  List name: Test List
  **  Update list item
  */invokeRequest({
    // make POST request for insert -- set ID on url'url': "TestList(" + listItem.Id + ")",
    'verb': "POST",

    // serialize our updates -- literal w/ field name keys'body': Sys.Serialization.JavaScriptSerializer.serialize({
      Title: listItem.TextColumn + " test",
      NumberColumn: Number(listItem.NumberColumn) + 1
    }),

    // send the -- etag match -- for our update'match': listItem.__metadata.etag,

    // MERGE allows updates to one or more fields'method': "MERGE",

    // on complete'success': function (jsonObj) {
      // print request body -- _updated fields_ -- to consolevar newFields = Sys.Serialization.JavaScriptSerializer.deserialize(jsonObj.body);
      var s = '';
      for (var key in newFields) {
        if (newFields.hasOwnProperty(key)) {
          s += key + ' = ' + newFields[key] + '\n';
        }
      }
      console.log('updated list item\n' + s);
    },
    'fail': function (errCode, errMessage) {
      console.log(errCode + ' = ' + errMessage);
    },
  });
}

functiondeleteItem(listItem) {
  /*
  **  List name: Test List
  **  Delete list item
  */invokeRequest({
    // make POST request for delete -- set ID on url'url': "TestList(" + listItem.Id + ")",
    'verb': "POST",

    // no body needed for delete'body': null,

    // send the match for delete method'match': listItem.__metadata.etag,
    'method': "DELETE",

    // on complete'success': function (jsonObj) {
      // print request url for delete requestconsole.log('deleted list item request\n' + jsonObj.url);
    },
    'fail': function (errCode, errMessage) {
      console.log(errCode + ' = ' + errMessage);
    },
  });
}

// invoke web request using [MicrosoftAjax.js](https://msdn.microsoft.com/en-us/library/vstudio/bb397536(v=vs.100).aspx)functioninvokeRequest(requestObj) {
  // new web requestvar webRequest = newSys.Net.WebRequest();

  // set request headers
  webRequest.get_headers()['Cache-Control'] = 'no-cache';
  webRequest.get_headers()['Accept'] = 'application/json';
  webRequest.get_headers()['Content-Type'] = 'application/json';

  // set etag matchif (requestObj.match !== null) {
    webRequest.get_headers()['If-Match'] = requestObj.match;
  }

  // set methodif (requestObj.method !== null) {
    webRequest.get_headers()['X-HTTP-Method'] = requestObj.method;
  }

  // set request verb
  webRequest.set_httpVerb(requestObj.verb);

  // set request bodyif (requestObj.body !== null) {
    webRequest.set_body(requestObj.body);
  }

  // set request url
  webRequest.set_url(
    _spPageContextInfo.webServerRelativeUrl + '/_vti_bin/ListData.svc/' + requestObj.url
  );

  // set user context
  webRequest.set_userContext(requestObj);

  // set completed callback and invoke request
  webRequest.add_completed(serviceComplete);
  webRequest.invoke();
}

// process web requestfunctionserviceComplete(executor, args) {
  // check responseif (executor.get_responseAvailable()) {
    // check statusswitch (executor.get_statusCode()) {
      case200:   // OKcase201:   // Created// raise success callback - pass list item
        executor.get_webRequest().get_userContext().success(
          executor.get_object()
        );
        break;

      case202:   // Acceptedcase203:   // Non auth infocase204:   // No contentcase205:   // Resetcase206:   // Partialcase1223:  // No content (SP)// raise success callback - pass original request object
        executor.get_webRequest().get_userContext().success(
          executor.get_webRequest().get_userContext()
        );
        break;

      // Errordefault:
        // raise fail callback - pass status
        executor.get_webRequest().get_userContext().fail(
          executor.get_statusCode(),
          executor.get_statusText()
        );
    }
  } else {
    // check timeoutif (executor.get_timedOut()) {
      executor.get_webRequest().get_userContext().fail(408,'Request Timeout');
    } else {
      // check abortif (executor.get_aborted()) {
        executor.get_webRequest().get_userContext().fail(800,'Request Aborted');
      } else {
        executor.get_webRequest().get_userContext().fail(801,'Unknown Error');
      }
    }
  }
}

more on naming conventions in SharePoint 2010 more on spPageContextInfo

Post a Comment for "How Can I Determine If A Sharepoint Listitem Exists Based On A Couple Of Known Values?"