#sharepoint
#sharepoint
Вопрос:
Я использую список календаря для некоторых бронирований номеров, все в порядке, но возникают проблемы только с перекрытием или двойным бронированием номера в один и тот же день и время.
Я пытаюсь выяснить, передавая данные, введенные пользователем в форме, в запрос CAML и проверяя, существует ли эта запись или нет
Если запись уже существует, отмените бронирование или, если нет, продолжайте.
Например: если период с: 10:00 до 11:00 уже забронирован.
перекрывающиеся сценарии могут быть:
если пользователь вводит в форму с: 10:00 до 10:30
С: 9:00 до 11:00 .. Я предполагаю, что дата такая же, и для меня имеет значение только время.
Как получить запрос CAML, если дата одна и та же, и меняется только время, и проверить пользовательский ввод от amp; До time с помощью диапазона, существующего в уже забронированных элементах.
используя запрос, приведенный ниже, но не проверяемый для всех сценариев
<Where><And><Geq><FieldRef Name='EventDate' /><Value IncludeTimeValue='TRUE' Type='DateTime'>" strSPEventDateFormat "</Value></Geq><And><Leq><FieldRef Name='EndDate' /><Value IncludeTimeValue='TRUE' Type='DateTime'>" strSPEndDateFormat "</Value></Leq><Eq><FieldRef Name='Room' /><Value Type='Lookup'>" strCheckRoomAvail "</Value></Eq></And></And></Where>
Пожалуйста, помогите мне в этом
Заранее спасибо
Ответ №1:
Напишите CAML, чтобы получить все номера, конфликтующие со временем НАЧАЛА. Время начала не должно находиться между временем начала и окончания, выбранным пользователем И напишите CAML, чтобы все номера противоречили времени окончания. Время окончания не должно находиться между временем начала и окончания, выбранным пользователем
Если номер, выбранный пользователем, отсутствует в приведенных выше результатах, возвращенных CAML, вы можете продолжить и забронировать номер.
q.Query = "<Where><And><Geq><FieldRef Name=""StartTime"" /><Value IncludeTimeValue=""TRUE"" Type=""DateTime"">" _
Utilities.SPUtility.CreateISO8601DateTimeFromSystemDateTime(startTime) _
"</Value></Geq><Leq><FieldRef Name=""StartTime"" /><Value IncludeTimeValue=""TRUE"" Type=""DateTime"">" _
Utilities.SPUtility.CreateISO8601DateTimeFromSystemDateTime(endTime) _
"</Value></Leq></And></Where><OrderBy><FieldRef Name=""ID"" Ascending=""True"" /></OrderBy>"
q1.Query = "<Where><And><Geq><FieldRef Name=""EndTime"" /><Value IncludeTimeValue=""TRUE"" Type=""DateTime"">" _
Utilities.SPUtility.CreateISO8601DateTimeFromSystemDateTime(startTime) _
"</Value></Geq><Leq><FieldRef Name=""EndTime"" /><Value IncludeTimeValue=""TRUE"" Type=""DateTime"">" _
Utilities.SPUtility.CreateISO8601DateTimeFromSystemDateTime(endTime) _
"</Value></Leq></And></Where><OrderBy><FieldRef Name=""ID"" Ascending=""True"" /></OrderBy>"
Ответ №2:
Этот поток довольно старый, но я только что столкнулся с той же проблемой. Итак, вот мое рабочее решение, может быть, оно кому-нибудь поможет.
Примечание: Для поиска по времени-caml вам нужен параметр IncludeTimeValue=’TRUE’ для
/**
* {Boolean} formModeEdit To determine if this form is an New or Edit form
*/
function checkDoubleBooking(formModeEdit, listId, currentItemId, startDate, endDate) {
var results = [];
var liHtml = "";
var checkOverlappingQueryArray = [];
//Construct caml query
checkOverlappingQueryArray.push("<And>");
checkOverlappingQueryArray.push("<Leq>");
checkOverlappingQueryArray.push("<FieldRef Name='EventDate' /><Value Type='DateTime' IncludeTimeValue='TRUE'>" moment(endDate).format() "</Value>");
checkOverlappingQueryArray.push("</Leq>");
checkOverlappingQueryArray.push("<Geq>");
checkOverlappingQueryArray.push("<FieldRef Name='EndDate' /><Value Type='DateTime' IncludeTimeValue='TRUE'>" moment(startDate).format() "</Value>");
checkOverlappingQueryArray.push("</Geq>");
checkOverlappingQueryArray.push("</And>");
if (formModeEdit) {
checkOverlappingQueryArray.unshift("<And>");
checkOverlappingQueryArray.push("<Neq>");
checkOverlappingQueryArray.push("<FieldRef Name='ID' /><Value Type='Integer'>" currentItemId "</Value>");
checkOverlappingQueryArray.push("</Neq>");
checkOverlappingQueryArray.push("</And>");
}
checkOverlappingQueryArray.unshift("<Where>");
checkOverlappingQueryArray.push("</Where>");
checkOverlappingQueryArray.unshift("<Query>");
checkOverlappingQueryArray.push("</Query>");
jQuery().SPServices({
operation: "GetListItems",
async: false,
listName: listId,
CAMLViewFields: "<ViewFields>"
"<FieldRef Name='ID' />"
"<FieldRef Name='Title' />"
"<FieldRef Name='EventDate' />"
"<FieldRef Name='EndDate' />"
"<FieldRef Name='PeoplePickerField1' />"
"</ViewFields>",
CAMLQuery: checkOverlappingQuery,
CAMLQueryOptions: "<QueryOptions>"
"<ExpandUserField>True</ExpandUserField>" //Expand People Picker values
"</QueryOptions>",
CAMLRowLimit: 10, // Override the default view rowlimit
completefunc: function(xData, Status) {
$(xData.responseXML).SPFilterNode("z:row").each(function() {
countOverlappingEvents ;
results.push({
title: $(this).attr("ows_Title"),
eventDate: $(this).attr("ows_EventDate"),
endDate: $(this).attr("ows_EndDate"),
peoplePickerField1: userToJsonObject($(this).attr("ows_PeoplePickerField1"))
});
}
}
});
return results;
}
function userToJsonObject(userObj) {
if (userObj.length === 0) {
return null;
} else {
var thisUser = userObj.split(";#");
var thisUserExpanded = thisUser[1].split(",#")
if (thisUserExpanded.length == 1) {
return {
userId: thisUser[0],
userName: thisUser[1]
}
} else {
return {
userId: thisUser[0],
userName: thisUserExpanded[0].replace(/(,,)/g, ","),
loginName: thisUserExpanded[1].replace(/(,,)/g, ","),
email: thisUserExpanded[2].replace(/(,,)/g, ","),
sipAddress: thisUserExpanded[3].replace(/(,,)/g, ","),
title: thisUserExpanded[4].replace(/(,,)/g, ",")
}
}
}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment-with-locales.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.SPServices/2014.02/jquery.SPServices-2014.02.min.js"></script>