Любое решение проблемы Today Calculated Column - SharePoint?

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

Проблема заключается в том, что этот метод не работает надежно - расчет не является динамическим; это делается только тогда, когда элемент сохраняется, и поэтому столбец "Сегодня" фактически становится Модифицированной датой. (Вероятно, поэтому 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/

Ответ 1

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

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

Ответ 2

В дополнение к статье Christophe (PathToSharePoint) это также охватывает трюк Today и почему он не работает.

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

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

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

Я тоже искал решение, все равно не повезло.. Сегодняшний трюк имеет ограничение не быть динамическим.

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

Ответ 6

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

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

на просроченную дату. это код для этого парня -

=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])))))

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

EDIT: я забыл сказать, что в приведенном выше коде для просроченной колонки я добавил, что если сегодня минута закрытая дата, использовать закрытую дату минус установленная дата вместо сегодняшней минусовой даты, чтобы обеспечить что вычисление не будет продолжаться после того, как элемент был закрыт. вы, наверное, заметили бы, что в коде, но я чувствовал, что должен указать это на всякий случай.

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

Мир.

Ответ 7

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

Имя поля: просрочка

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

Тип данных: Да/Нет

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

Ответ 8

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

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

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

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

Ответ 9

Я пробовал подход @Farzad и, похоже, работает отлично. Я хотел сделать собственный счет на Days Elapsed, добавив вычисляемый столбец, который ранее использовал разницу между Дата создания и Измененная дата Столбцы, которые отображались только в том случае, если пользователь обновил сообщение, к большому разочарованию.

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

=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 условий, которые получают мне ярлыки, на основе которых я могу добавить группу в свое представление и отфильтровывать данные, если это необходимо. Надеюсь, это поможет любому, кто ищет ответ!