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 JavaScript
viaXMLHttpRequest
or JQuery
via$.ajax
or MicrosoftAjax.js
viaSys.Net.WebRequest
as 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?"