Wie kann ich ermitteln, ob eine Sharepoint-Listenelement vorhanden ist, basierend auf ein paar bekannte Werte?

Habe ich diese Sharepoint (2010) Javascript (adaptiert von hier), um insert-oder Update-verschiedene "Felder" in der 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));
}

In dem code oben, der erste "upsert" speichert die "listId"; anschließende schreibt in die Liste (es wird geschrieben werden, Stück für Stück, im Falle dass der Benutzer beendet oder etwas hält Sie, und kommen Sie später darauf zurück) bekommen, die vorher beginnen ListItem über die getItemById () - Methode:

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());
    . . .

Ist meine Herausforderung, in einem Fall, wo der Benutzer wünscht, zu aktualisieren, die ersten bits der Daten (Sie legen Sie die, die kommen dann später wieder und beschließen, etwas zu ändern) in die erste der beiden Methoden oben gezeigt (upsertPostTravelListItemTravelerinfo1()).

Werde ich die Notwendigkeit der Verwendung getItemById (), auch hier. Wenn dies der erste Eintrag, es existiert noch nicht, und ich benutze:

listId = this.oListItem.ID;

...aber wenn das Teil gerade aktualisiert wird, müssen die listId so kann ich:

this.oListItem = oList.getItemById(listId);

Tun - um den richtigen Wert zuzuweisen listId - ich werde müssen, befragen Sie die Liste, um zu sehen, wenn der "record" für bestimmte Werte, die bereits vorhanden ist, und somit gibt es schon eine listId; pseudocode:

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);
}

Meine Frage ist: was brauche ich, um zu ersetzen, dass pseudocode mit? Wie wird eine Sharepoint 2010 ListItem abgefragt, die Abfrage-wie zu finden einen passenden "Datensatz" für bestimmte ListItem Mitglied Werte?

UPDATE

Basierend auf crclayton erste Idee, ich denke dieses:

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 '';
}

...könnte das richtige sein.

UPDATE 2

Aus der Antwort, ich bin immer ein Fehler in dieser Zeile:

var arrayListEnum = oList.getEnumerator();

Nämlich, "Uncaught TypeError: oList.getEnumerator ist nicht eine Funktion"

Ist der Fall, dass es keine solche Funktion namens getEnumerator(), oder...???

UPDATE 3

Bekomme ich noch, "Uncaught TypeError: oList.getEnumerator ist nicht eine Funktion" mit diesem (modifizierten) code:

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 '';
    });
}

Nenne ich es so:

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;
    }

So ist getEnumerator() eine gültige Funktion oder nicht? Wenn ja, was mache ich falsch? Wenn nicht, was kann ich statt dessen?

  • Was ich getan habe in der Vergangenheit liegt mein code so, dass er anfangs davon ausgegangen, das der Artikel bereits vorhanden ist und versucht, Sie zu aktualisieren; wenn ich der wind bis in die onQueryFailed Funktion zur Verfügung gestellt executeQueryAsync ich kann annehmen, dass das Element nicht existiert und dass muss ich jetzt erstellen.
  • Das ist eine Idee; ich könnte am Ende mit es.
  • Ich finde es einfacher mit der REST api...
  • Pflege zu teilen ein Beispiel dafür?
  • Definitiv aber nicht heute Abend, am Handy, wo ist dein code, web-Teil, eigene Seite...?
  • Es ist eine Web-Teil auf einer eigenen Seite.
  • siehe REST-Beispiel, hoffe es hilft...
  • Tausend Dank; ich werde czech it out.

Schreibe einen Kommentar