Какое-либо решение проблемы вычисляемых сегодня столбцов - это SharePoint? - PullRequest
10 голосов
/ 18 мая 2009

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

Проблема в том, что этот метод не работает надежно - расчет не является динамическим; он создается только при сохранении элемента, и поэтому «столбец» Сегодня фактически становится датой изменения. (Вероятно, именно поэтому SharePoint не позволит вам использовать функцию Today простым способом.)

Кто-нибудь нашел решение, которое работает? Я знаю, что могу использовать javascript для получения фактической даты на стороне клиента и отображения цветов, флагов, чего угодно, но я ищу решение "на стороне сервера".


Для справки, уловка с колонкой Today и ее проблемы достаточно хорошо описаны в этих двух постах и ​​связанных комментариях: http://blogs.msdn.com/cjohnson/archive/2006/03/16/552314.aspx и http://pathtosharepoint.wordpress.com/2008/08/14/calculated-columns-the-useless-today-trick/

Ответы [ 9 ]

4 голосов
/ 25 июня 2009

В дополнение к статье Кристофа (PathToSharePoint) в ней также рассказывается о трюке Today и о том, почему он не работает

Правда об использовании Today в вычисляемых столбцах

Существует множество помадок, вероятно, лучшим из них является консольное приложение Десси (упомянутое MNM выше)

Динамическое обновление вычисляемого столбца SharePoint, содержащего ссылку «Сегодня»

Это хорошо, но не идеально, например, вам, возможно, придется беспокоиться о разных часовых поясах.

Прежде чем идти по этому пути, вы должны спросить себя, действительно ли вам это нужно. Например: -

  • Если вы хотите отсчет (просроченные дни / оставшиеся дни для выполнения задачи) , тогда вы можете использовать SPD и веб-часть XLST Data View

  • Если вы хотите, чтобы представление показывало просроченные элементы или элементы, созданные за последние X дней, то вы можете использовать [Сегодня] в фильтре представлений 2

4 голосов
/ 19 мая 2009

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

Можно создать настраиваемое поле, которое будет отображать значение с использованием текущей даты в его расчете.

1 голос
/ 04 марта 2013

Если вы создаете столбец «Сегодня», его необходимо обновить. Вы можете сделать это либо с помощью задания таймера, либо поместив скрипт jquery на страницу, на которую нажал пользователь. Сценарий может вызвать SPServices.SPUpdateMultipleListItems для выполнения обновления. Передайте предложение CAML, чтобы обновлять только те элементы списка, для которых необходимо обновить значение Today, например, один раз в день

0 голосов
/ 30 октября 2013

Я использовал следующее и у меня не было проблем.

Имя поля: просрочено

Тип поля: Рассчитано

Тип возвращаемых данных: Да / Нет

Формула: =AND([Due Date]<NOW(),Status<>"Completed",[Due Date]<>"")

0 голосов
/ 14 декабря 2012

Я попробовал подход @ Фарзада, и он, кажется, работает отлично. Я хотел сделать пользовательский подсчет для Прошедших дней , поэтому добавил вычисляемый столбец, который ранее я использовал разницу между Дата создания и Дата изменения Столбцы появлялся только всякий раз, когда пользователь обновлял сообщение, к моему ужасу.

Теперь у меня есть формула, которая работает так, как я хотел бы, и использует столбец Today , и здесь она предназначена для всех, кто хотел бы ее использовать. У меня также есть столбец «Состояние», на основе которого используется база «На удержании», а остальные формулы основаны на разнице дат Сегодня - Создано .

=IF(Status="On Hold","On Hold",IF(AND(Today=Created,(DATEDIF(Created,Today,"D")=0)),"New",IF(AND(Today<>Created,(DATEDIF(Created,Today,"D")=0)),"New (updated)",IF(DATEDIF(Created,Today,"d")>3,"Need Update Immediately",IF(DATEDIF(Created,Today,"d")=1,"One day old",IF(DATEDIF(Created,Today,"d")=2,"Two days old",""))))))

По сути, это просто набор вложенных IF условий, которые дают мне метки, на основании которых я могу добавить группу в свое представление и отфильтровать данные, если это необходимо. Надеюсь, это поможет любому, кто ищет ответ!

0 голосов
/ 28 мая 2012

Вот обходной путь:

Создайте столбец даты с именем Today. Используйте этот столбец в вычисленной формуле (игнорируйте тот факт, что формула возвращает неправильное значение). После завершения работы с формулой удалите столбец «Сегодня» из списка.

Почему-то так работает! Теперь Sharepoint рассматривает сегодняшнее в вашей формуле как сегодняшнюю дату.

Примечание. Если вы решите изменить формулу, вам придется снова создать столбец Сегодня. В противном случае он не распознает Today как допустимый столбец.

0 голосов
/ 25 июня 2009

Я придумал очень грубое, но работающее решение этой проблемы без необходимости какого-либо кодирования. Я объясню и то, как я сделал колонку Today, и как я работал над ней с просроченной колонкой, потому что эту колонку было очень трудно узнать, как это сделать.

Сначала я сделал колонку с именем «сегодня» (задыхаясь!). Затем я сделал колонку под названием «Просроченные дни». Затем я открыл дизайнер sharepoint и создал новый рабочий процесс. Я установил его запуск каждый раз, когда элемент редактируется / обновляется (имейте в виду, что я отключил управление версиями для этого списка, иначе мне пришлось бы прибегнуть к кодированию, чтобы избежать скопления бесполезных данных на нашем сервере). Я установил действия, чтобы просто сохранить измененную дату в переменной рабочего процесса, а затем изменить значение столбца сегодня на эту переменную. хотя измененный столбец - это дата / время, а мой столбец сегодня - просто дата, он переносится просто отлично. Затем я установил рабочий процесс на паузу на 2 часа. Вы можете установить это на любое количество времени, которое вы хотите, очевидно, это просто изменит самое позднее возможное время для обновления вашего сегодняшнего столбца, то есть 2 часа ночи в моем случае.

к столбцу просроченных дней. это код этого парня -

=IF([Due Date]>Today,"None",IF([Date Closed]=0,Today-[Due Date],IF([Due Date]>[Date Closed],"None",IF(Today>=[Date Closed],[Date Closed]-[Due Date],IF([Due Date]<Today,Today-[Due Date])))))

Показывает просроченные дни в числовой форме или, если не просроченные, показывает «Нет». Вы можете использовать числовой или строковый формат, но НЕ ФОРМАТ ДАТЫ. Ну, я надеюсь, что это поможет любому, кто сталкивается с этой проблемой и не хочет углубляться в кодирование.

РЕДАКТИРОВАТЬ: я забыл сказать, что в приведенном выше коде для столбца просроченных дней, я вставил, что, если сегодня больше, чем закрытая дата, использовать закрытую дату минус дату исполнения вместо сегодняшнего дня минус дата исполнения, что расчет не происходит после того, как элемент был закрыт. Вы, вероятно, заметили бы это в коде, но я чувствовал, что должен указать это на всякий случай.

РЕДАКТИРОВАТЬ 2: код, который я имел до моего 2-го редактирования для моего вычисляемого столбца, не рассчитывал должным образом просроченные дни после того, как проблема была помечена как "закрытая". Я вставил обновленный код. Последняя часть кода не имеет смысла, так как это та же логика, что и в начале, но она сработала, поэтому я не хотел рисковать! :)

Мир.

0 голосов
/ 17 июня 2009

Я тоже искал решение, но все же не повезло ... У трюка с колонкой Today есть ограничение: он не динамический.

Хотя у меня есть одно предложение, почему бы нам не создать задание таймера, которое будет обновлять определенный определенный столбец с текущей датой каждый день в 12:00. Я знаю, что некоторые из вас могут подумать, что это над головой. Просто мое предложение: D !!

0 голосов
/ 19 мая 2009

Мой совет - создать поле on, которое выполнит этот расчет за вас, а затем сослаться на него в списке SharePoint. Не простая реализация, но она будет работать.

...