簡體   English   中英

如何根據幾個已知值確定Sharepoint ListItem是否存在?

[英]How can I determine if a Sharepoint ListItem exists based on a couple of known values?

我有這個Sharepoint(2010)Javascript(改編自這里 )在ListItem中插入或更新各種“字段”:

var listId;

. . .

function upsertPostTravelListItemTravelerInfo1() {
  var clientContext = new SP.ClientContext(siteUrl);
  var oList = clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');

  var itemCreateInfo = new SP.ListItemCreationInformation();
  this.oListItem = oList.addItem(itemCreateInfo);

  listId = this.oListItem.ID;
  oListItem.set_item('ptli_formFilledOut', new Date());
  oListItem.set_item('ptli_TravelersName', $('travelername').val());
    . . .

  oListItem.update();

  clientContext.load(oListItem);

  clientContext.executeQueryAsync(Function.createDelegate(this, this.onQuerySucceeded), Function.createDelegate(this, this.onQueryFailed));
}

在上面的代碼中,第一個“upsert”存儲“listId”; 后續寫入列表(它是逐段編寫的,以防用戶停止或某些東西停止它們,然后再返回它們)使用getItemById()方法獲取之前開始的ListItem:

function upsertPostTravelListItemTravelerInfo2() {
  var clientContext = new SP.ClientContext(siteUrl);
  var oList = clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');
  this.oListItem = oList.getItemById(listId);

  oListItem.set_item('ptli_tripNumber', $('tripnumber').val());
    . . .

我的挑戰是在用戶想要在上面顯示的兩種方法中的第一種(upsertPostTravelListItemTravelerInfo1())中更新數據的第一位(它們插入那些,然后稍后返回並決定更改某些內容)的情況。

我也需要在這里使用getItemById()。 當這是第一個條目時,它還不存在,我使用:

listId = this.oListItem.ID;

...但是當這部分正在更新時,需要listId以便我可以:

this.oListItem = oList.getItemById(listId);

為此 - 為listId分配正確的值 - 我將需要詢問列表以查看某些值的“記錄”是否已經存在,因此已經存在listId; 偽代碼:

listId = //a "record" with a username value of "<userName>" and a payeeName of "<payeeName>" with a "Completed" value of "false")
if (listId == null) {
      var itemCreateInfo = new SP.ListItemCreationInformation();
      this.oListItem = oList.addItem(itemCreateInfo);
      listId = this.oListItem.ID;

} else {
      this.oListItem = oList.getItemById(listId);
}

我的問題是:我需要用什么代替偽代碼? Sharepoint 2010 ListItem如何查詢,類似於查詢,以查找特定ListItem成員值的匹配“記錄”?

UPDATE

根據crclayton的第一個想法,我在想這個:

function upsertPostTravelListItemTravelerInfo1() {
  var clientContext = new SP.ClientContext(siteUrl);
  var oList = clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');

  this.website = context.get_web();
  this.currentUser = website.get_currentUser();

  var itemCreateInfo = new SP.ListItemCreationInformation();
  this.oListItem = oList.addItem(itemCreateInfo);

  var travelersEmail = $('traveleremail').val());

  /* If this is an update, the call to getListItemID() will return a val; otherwise (an insert), get from newly instantiated ListItem.  */
  listId = getListItemID(currentUser, travelersEmail);
  if (listId === '') {
    listId = this.oListItem.ID; 
  }

  oListItem.set_item('ptli_formFilledOut', new Date());
  oListItem.set_item('ptli_TravelersName', $('travelername').val());
  oListItem.set_item('ptli_TravelersEmail', travelersEmail);
  . . .
}

function getListItemID(username, payeename) {
  var arrayListEnum = oList.getEnumerator();

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

     if(listItem.get_item("ptli_formPreparedBy") === username &&
        listItem.get_item("ptli_TravelersEmail") === payeename &&
        listItem.get_item("ptli_formCompleted") == false) {

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

......可能是票。

更新2

從答案來看,我在這一行上得到了一個錯誤的消息:

var arrayListEnum = oList.getEnumerator();

即,“Uncaught TypeError:oList.getEnumerator不是函數”

是不是沒有這樣的函數名為getEnumerator(),或者...... ???

更新3

我仍然得到“Uncaught TypeError:oList.getEnumerator不是一個函數”這個(修改過的)代碼:

function getListItemID(username, payeename, oList) {
    var clientContext = new SP.ClientContext.get_current();
    var listItems = oList.getItems("");
    clientContext.load(listItems);
    clientContext.executeQueryAsync(function () {

        var arrayListEnum = oList.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();
            }
        }
        return '';
    });
}

我這樣稱呼它:

function upsertPostTravelListItemTravelerInfo1() {
    var clientContext = SP.ClientContext.get_current();
    var oList = clientContext.get_web().get_lists().getByTitle('PostTravelFormFields');

    this.website = clientContext.get_web();
    currentUser = website.get_currentUser();

    var itemCreateInfo = new SP.ListItemCreationInformation();
    this.oListItem = oList.addItem(itemCreateInfo);

    var travelersEmail = $('traveleremail').val();

    /* If this is an update, the call to getListItemID() will return a val; otherwise (an insert), get from newly instantiated ListItem.  */
    listId = getListItemID(currentUser, travelersEmail, oList);
    if (listId === '') {
        listId = this.oListItem.ID;
    }

那么getEnumerator()是否是一個有效的函數? 如果是的話,我做錯了什么? 如果沒有,我可以用它代替什么?

它可能不像你想的那樣是查詢,但是如下所示:

 var clientContext = new SP.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();    
         }
     }
 });

或者您可以像這樣使用CAML查詢:

 var query = new SP.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");});

 ...

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

使用REST的CRUD示例
按照SharePoint 2010的要求

RESTful服務的美妙之處- >一切都通過HTTP發生

因此,您可以通過 XMLHttpRequest使用純JavaScript

JQuery 通過 $.ajax

或者通過 Sys.Net.WebRequest MicrosoftAjax.js
正如此示例所示,因為它已在SharePoint 2010 Web部件中可用

// test rest on SharePoint 2010
testREST();

function testREST() {
  /*
  **  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.d
      if (jsonObj.d.results.length === 0) {
        // nothing found, insert new item
        insertItem();
      } else {
        // check field for _first_ item returned -- NumberColumn
        if (jsonObj.d.results[0].NumberColumn < 2) {
          // update if less than 2
          updateItem(jsonObj.d.results[0]);
        } else {
          // delete if greater than or equal to 2
          deleteItem(jsonObj.d.results[0]);
        }
      }
    },
    'fail': function (errCode, errMessage) {
      console.log(errCode + ' = ' + errMessage);
    },
  });
}

function insertItem() {
  /*
  **  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 list
      Title: "TEST",
      TextColumn: "row 1",
      EmployeeId: _spPageContextInfo.userId,
      NumberColumn: 1,
      DateColumn: new Date()
    }),

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

    // on complete
    'success': function (jsonObj) {
      // print new list item to console
      var 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);
    },
  });
}

function updateItem(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 console
      var 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);
    },
  });
}

function deleteItem(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 request
      console.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)
function invokeRequest(requestObj) {
  // new web request
  var webRequest = new Sys.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 match
  if (requestObj.match !== null) {
    webRequest.get_headers()['If-Match'] = requestObj.match;
  }

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

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

  // set request body
  if (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 request
function serviceComplete(executor, args) {
  // check response
  if (executor.get_responseAvailable()) {
    // check status
    switch (executor.get_statusCode()) {
      case 200:   // OK
      case 201:   // Created
        // raise success callback - pass list item
        executor.get_webRequest().get_userContext().success(
          executor.get_object()
        );
        break;

      case 202:   // Accepted
      case 203:   // Non auth info
      case 204:   // No content
      case 205:   // Reset
      case 206:   // Partial
      case 1223:  // No content (SP)
        // raise success callback - pass original request object
        executor.get_webRequest().get_userContext().success(
          executor.get_webRequest().get_userContext()
        );
        break;

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

有關SharePoint 2010中命名約定的更多信息
更多關於spPageContextInfo

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM