2016-08-16 6 views
0

У меня есть календарь SharePoint с категорией событий («Посещение», «Встреча» ...) Я хочу получить счет текущего события дня, ведь категория «Посещение». Вот мой сценарий:Получить список товаров счет

var clientContext = SP.ClientContext.get_current(); 
    var list = clientContext.get_web().get_lists().getByTitle("Artdesk-calendrier"); 
    var caml = new SP.CamlQuery(); 
caml.set_viewXml("<View><Query>"+ 
    "<Where>"+ 
     "<And>"+ 
      "<Eq><FieldRef Name=\"Category\" /><Value Type=\"Choice\">Visite</Value></Eq>" + 
      "<And>"+ 
       "<Leq><FieldRef Name=\"EventDate\"/><Value Type=\"DateTime\" IncludeTimeValue=\"False\"><Today Offset=\"1\"/></Value></Leq>"+ 
       "<Geq><FieldRef Name=\"EndDate\"/><Value Type=\"DateTime\" IncludeTimeValue=\"False\"><Today /></Value></Geq>"+ 
      "</And>"+ 
     "</And>"+ 
    "</Where>"+ 
"</View></Query>"); // empty query also works 

var listItemCollection = list.getItems(caml); 

clientContext.load(listItemCollection); 
clientContext.executeQueryAsync(function() { 
    var listItemEnumerator = listItemCollection.getEnumerator(); 
    var count = 0; 
var eventsToday = []; 
var eventsTomorrow = []; 
var today = new Date(); 
today.setHours(0); today.setMinutes(0); today.setSeconds(0); today.setMilliseconds(0); 
var tomorrow = new Date(today); 
tomorrow.setDate(tomorrow.getDate()+1); 
while (listItemEnumerator.moveNext()) { 
    count++; 
    var item = listItemEnumerator.get_current(); 
    var startDate = item.get_item("EventDate"); 
    var endDate = item.get_item("EndDate"); 
    var title = item.get_item("Title"); 
    if(endDate < tomorrow || eventDate < tomorrow){ 
     eventsToday.push(title); 
    }else{ 
     eventsTomorrow.push(title); 
    } 
} 
document.getElementById("TodaysEvents").innerHTML = eventsToday.join("\n"); 
document.getElementById("TomorrowsEvents").innerHTML = eventsTomorrow.join("\n"); 
document.getElementById("alerte1").innerHTML = count; 
}, function(sender, args) { 
    window.console && console.log(args.get_message()); 
}); 

Это работает просто отлично, но получить мне только заголовок последнего события категории «Визит». Что я хочу, так это: чтобы получить подсчет событий текущего дня, который категория «Посещение».

Любая помощь будет приветствоваться.

ответ

1

Привет iv'e нашел решение, чтобы получить день + 1 количество: у меня есть изменения, и это прекрасно работать, вот весь сценарий:

function getevents() 
{ 
var clientContext = SP.ClientContext.get_current(); 
    var list = clientContext.get_web().get_lists().getByTitle("Artdesk-calendrier"); 
    var caml = new SP.CamlQuery(); 
caml.set_viewXml("<View><Query>"+ 
    "<Where>"+ 
     "<And>"+ 
      "<Eq><FieldRef Name=\"Category\" /><Value Type=\"Choice\">Visite</Value></Eq>" + 
      "<And>"+ 
       "<Leq><FieldRef Name=\"EventDate\"/><Value Type=\"DateTime\" IncludeTimeValue=\"False\"><Today OffsetDays='1'/></Value></Leq>"+ 
       "<Geq><FieldRef Name=\"EndDate\"/><Value Type=\"DateTime\" IncludeTimeValue=\"False\"><Today /></Value></Geq>"+ 
      "</And>"+ 
     "</And>"+ 
    "</Where>"+ 
"</View></Query>"); // empty query also works 

var listItemCollection = list.getItems(caml); 

clientContext.load(listItemCollection); 
clientContext.executeQueryAsync(function() { 
    var listItemEnumerator = listItemCollection.getEnumerator(); 
    var count_ajrd = 0; 
    var count_demain = 0; 
var eventsToday = []; 
var eventsTomorrow = []; 
var today = new Date(); 
today.setHours(0); today.setMinutes(0); today.setSeconds(0); today.setMilliseconds(0); 
var tomorrow = new Date(today); 
tomorrow.setDate(tomorrow.getDate()+1); 
while (listItemEnumerator.moveNext()) { 

    var item = listItemEnumerator.get_current(); 
    var startDate = item.get_item('EventDate'); 
    var endDate = item.get_item('EndDate'); 
    var title = item.get_item('Title'); 
    if(endDate < tomorrow || startDate < tomorrow){ 
     eventsToday.push(title); 
     count_ajrd++; 
    }else{ 
     eventsTomorrow.push(title); 
     count_demain++; 
    } 
} 
document.getElementById("alerte2").innerHTML = eventsToday.join("\n"); 
document.getElementById("alerte1").innerHTML = eventsTomorrow.join("\n"); 
document.getElementById("todaynum").innerHTML = count_ajrd; 
document.getElementById("tomorrownum").innerHTML = count_demain; 
}, function(sender, args) { 
    window.console && console.log(args.get_message()); 
}); 
} 

Спасибо @Thriggle за помощь

0

Когда вы получаете правильный запрос CAML с фильтром в текущую дату, вы можете получить номер позиции с помощью метода get_itemCount() в своей коллекции элементов списка после загрузки его с помощью вашего запроса. Попробуйте следующий код

clientContext.executeQueryAsync(function() { 
    window.console && console.log('Total Visits: ' + list.get_itemCount()); 
}, function(sender, args) { 
    window.console && console.log(args.get_message()); 
}); 
+0

Я пробую ваш код, и он не работает, у меня есть ошибка: Uncaught TypeError: listItemCollection.get_itemCount не является функцией кажется, что это не так. – ysfibm

+0

. Моя badania вы должны использовать 'get_itemCount' в объекте списка. Я редактировал пример кода выше – nizzik

1

Получение количество элементов в вашем списке Элемент коллекции

Вы можете получить доступ к коллекции списка элемента подсчета имущества непосредственно в качестве Nizzik предложил (с использованием listItemCollection.get_count()), или сделать некоторые простые математические самостоятельно, как показано ниже.

var count = 0; 
while (listItemEnumerator.moveNext()) { 
    count++; 
} 
document.getElementById("alerte1").innerHTML = count; 

Ограничение ваших результатов сегодняшних и событий завтрашних

Если у вас нет каких-либо повторяющихся событий, чтобы беспокоиться о том, вы можете обновить ваш CAML запрос для фильтрации результатов, ограничение на события, которые начинаются завтра или раньше и которые заканчиваются сегодня или позже. Используйте поле EventDate, чтобы отфильтровать поле «Дата начала» и поле EndDate, чтобы отфильтровать «Дата окончания» (это внутренние имена этих полей).

Ваш полученный CAML запрос может в конечном итоге, как это:

"<View><Query>"+ 
    "<Where>"+ 
     "<And>"+ 
      "<Leq><FieldRef Name=\"EventDate\"/><Value Type=\"DateTime\" IncludeTimeValue=\"False\"><Today Offset=\"2\"/></Value></Leq>"+ 
      "<Geq><FieldRef Name=\"EndDate\"/><Value Type=\"DateTime\" IncludeTimeValue=\"False\"><Today /></Value></Geq>"+ 
     "</And>"+ 
    "</Where>"+ 
"</View></Query>" 

также ограничить его к событиям с категорией, равной «Visite», как и в примере кода вы предоставили, вы можете использовать следующий CAML :

"<View><Query>"+ 
    "<Where>"+ 
     "<And>"+ 
      "<Eq><FieldRef Name=\"Category\" /><Value Type=\"Choice\">Visite</Value></Eq>" + 
      "<And>"+ 
       "<Leq><FieldRef Name=\"EventDate\"/><Value Type=\"DateTime\" IncludeTimeValue=\"False\"><Today Offset=\"1\"/></Value></Leq>"+ 
       "<Geq><FieldRef Name=\"EndDate\"/><Value Type=\"DateTime\" IncludeTimeValue=\"False\"><Today /></Value></Geq>"+ 
      "</And>"+ 
     "</And>"+ 
    "</Where>"+ 
"</View></Query>" 

в то различие между сегодняшним и завтрашним событий, вы можете проверить свои EventDate и EndDate значения внутри цикла while, как вы перечислить по результатам.

var count = 0; 
var eventsToday = []; 
var eventsTomorrow = []; 
var today = new Date(); 
today.setHours(0); today.setMinutes(0); today.setSeconds(0); today.setMilliseconds(0); 
var tomorrow = new Date(today); 
tomorrow.setDate(tomorrow.getDate()+2); 
while (listItemEnumerator.moveNext()) { 
    count++; 
    var item = listItemEnumerator.get_current(); 
    var startDate = item.get_item("EventDate"); 
    var endDate = item.get_item("EndDate"); 
    var title = item.get_item("Title"); 
    if(endDate < tomorrow || startDate < tomorrow){ 
     eventsToday.push(title); 
    }else{ 
     eventsTomorrow.push(title); 
    } 
} 
document.getElementById("TodaysEvents").innerHTML = eventsToday.join("<br/>"); 
document.getElementById("TomorrowsEvents").innerHTML = eventsTomorrow.join("<br/>"); 
document.getElementById("alerte1").innerHTML = count; 

Вы, возможно, потребуется настроить логику в зависимости от того, как вы хотите, чтобы нарисовать линию между «сегодняшних» событий и «завтрашних событий,» особенно в странных ситуациях, например, когда событие начинается в один день и заканчивается другой.

+0

, потому что он отлично работает, поэтому как я могу применить его к текущему дню, а день + 1 Пример: сегодня 16 августа, так что я хочу получить число сегодняшних событий, ведь категория «Посещение», , поместите его в раздел div. - и получить количество событий дня + 1, ведьма категория "Посещение" – ysfibm

+0

Есть ли у вас какие-то повторяющиеся события в календаре? Если это так, вам может потребоваться использовать более сложную технику, упомянутую в [этом ответе] (http://stackoverflow.com/questions/38876519/retrieve-events-number-from-sharepoint-calendar-using-js/38883928#38883928) для ограничения результатов до заданного диапазона дат; если вы не имеете повторяющихся событий, вы можете фильтровать столбцы EventDate и EndDate как обычно. – Thriggle

+0

@Thriggle, который будет работать до тех пор, пока запрос не достигнет предела 5000 единиц, и я не думаю, что op помещает там какие-либо индексы. – nizzik