Решение без кода: вывод количества дней с момента последнего изменения элемента списка SharePoint

Решение без кода: вывод количества дней с момента последнего изменения элемента списка SharePoint

Важно :  Данная статья переведена с помощью машинного перевода, см. Отказ от ответственности. Используйте английский вариант этой статьи, который находится здесь, в качестве справочного материала.

20.09.2011 15:01

Джастин Joyce (Justin Joyce), LANtek

Примечание : Эта статья входит в коллекцию записей, опубликованных за четыре года в блоге Get the Point для конечных пользователей SharePoint.

Обзор: создание собственных отчетов по срокам без программирования

Одной из часто запрашиваемых функций сайта SharePoint является отчет по срокам для задач и элементов списков. Другими словами, пользователям интересно знать, сколько дней и месяцев прошло с момента последнего изменения элемента списка.

На первый взгляд, этот запрос кажется очень простым. У нас есть даты создания и изменения элементов, а также возможность сохранять настраиваемые даты при определенных изменениях элементов с помощью приемников событий. Также существуют вычисляемые столбцы, которые могут включать формулы в стиле Excel для работы с информацией. На первый взгляд, все очень просто. Нужно выбрать поле даты, создать вычисляемый столбец, а затем ввести примерно такую формулу, как [DateField] – [Сегодня]. К сожалению, это не сработает. Любой, кто пытался выполнить эту "простую" задачу, знает, что использование таких функций, как [Сегодня], в вычисляемом столбце сулит проблемы. Попробуйте вставить [Сегодня] в поле формулы вычисляемого столбца, и вы получите сообщение об ошибке, например:

Сообщение об ошибке

Почему это происходит? Это связано с тем, как вычисляются столбцы .

В качестве примера рассмотрим простую формулу:

= ЕСЛИ( [Столбец1]<=[Столбец2]; "ОК"; "Неверно")

Она означает, что если значение "Столбец1" не больше значения "Столбец2", нужно вывести "ОК", а в противном случае — "Неверно". Это типичная простая формула для вычисляемого столбца, которая предполагает следующее об элементе списка, содержащем эти столбцы: значения "Столбец1" и "Столбец2" никогда не смогут изменяться без обновления элемента списка.

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

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

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

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

Реализация:

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

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

Разве это не идеал? Так что же нужно сделать?

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

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

  3. Добавьте оба поля в тип контента, а затем добавьте тип контента в список.

  4. Создайте представление этого списка, содержащее исходный столбец и столбец-заполнитель.

  5. Добавьте шаблон XSL в библиотеку стилей.

  6. Настройте свойство "Ссылка на XSL" для веб-части представления списка через пользовательский интерфейс.

  7. Готово!

Давайте подробнее рассмотрим реализацию на примере варианта использования. Нашему клиенту было нужно представление основного списка, в котором показывалось, как долго определенный элемент списка имел текущее состояние. Список включал данные пользовательского типа контента сайта, который был создан на основе типа "Элемент" и добавлен в список. Уже существовал получатель событий, который регистрировал время изменения поля состояния для элемента списка и сохранял соответствующую дату в столбец "Дата изменения состояния". Такие настройки не являются обязательными, и способ можно применять для ЛЮБОГО поля даты (в нашей реализации уже были такие настройки, но вы можете попробовать обойтись без них). По минимуму вам потребуются исходное поле даты и поле-заполнитель для хранения результатов вычисления (подробнее об этом в следующем абзаце), которые были добавлены в список, хотя я рекомендую использовать столбцы сайта и типы контента сайта, на случай если вы захотите повторно использовать это решение для других объектов на сайте.

Итак, у нас есть исходная дата, для которой можно вычислить разницу с текущей датой. Теперь мы можем создать пользовательский столбец сайта, который будет использоваться в качестве контейнера для вычисленного значения. В этом случае я решил использовать вычисляемый столбец, так как он будет изменяться в формах создания и изменения элементов, но его можно выбрать для отображения в представлениях, чтобы предотвратить ввод неправильных значений в этот столбец. Могут возникать вопросы о том, почему он не отображается в представлениях, и т. д.

Теперь, когда у нас есть столбец сайта, мы можем добавить его к типам контента, которые будут использоваться в списке. Затем нужно создать представление, которое мы позже настроим с помощью XSLT. Обязательно создайте стандартное представление, содержащее исходный столбец даты и новый вычисляемый столбец, который будет использоваться в качестве заполнителя для вычисленного значения.

Мы создали все, что нужно для настраиваемого отчета по срокам. Теперь осталось только создать шаблон XSL, добавить его в библиотеку стилей сайта и связать его с нашим представлением списка. Шаблон XSL, который мы будем использовать, будет содержать обычную разметку SharePoint для создания представления, а также нашу собственную разметку, переопределяющую ее некоторые части и вычисляющую нужное значение.

Сделав где осуществляются кредит, XSL-шаблоны для выполнения фактических вычислений, я использую для этого решения любезно предоставлены «swirch» на форумах MSDN:
http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/

Таблицу стилей XSL, которую я создал (aging.zip), можно скачать отсюда:
https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissionsChanged=1&id=C262E8E2D59A86D9!104

Откройте ее в своем любимом текстовом редакторе, и вы увидите обычную разметку SharePoint XSL для отрисовки представлений. Если вы прокрутите файл вниз до строки 357, вы увидите начало настраиваемых шаблонов, которые я добавил к разметке: сначала шаблон "DateDiff", а затем "calculate-julian-day" и "FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020_Status". Это три шаблона, которые будут выполнять и отображать вычисления в представлениях. Если вы собираетесь использовать другие имена полей, чем было указано выше в этой статье, потребуется будет просмотреть эти шаблоны и заменить имена в ссылках. Помните, что для этого необходимо использовать ВНУТРЕННЕЕ имя поля, а не его отображаемое имя.

После настройки шаблона перейдите к библиотеке стилей, добавьте его в папку "Таблицы стилей XSL", а затем скопируйте ссылку на файл. Это позволит при желании легко вносить в него изменения или добавлять его в различные части сайта.

Затем перейдите к списку и выберите представление, которое вы создали выше в этой статье. В меню "Действия сайта" выберите команду "Изменить страницу".

Команда "Изменить страницу" в меню "Действия сайта"

Найдите на странице веб-часть представления списка и откройте меню веб-части, щелкнув маленькую стрелку вниз в правом верхнем углу. В этом меню выберите "Изменить веб-часть".

Команда "Изменить веб-часть" в меню веб-части

В правой части окна браузера откроется меню веб-части.

Меню веб-части

Щелкните + в разделе для "Разное" и найдите свойство "Ссылка на XSL".

Свойство ссылки XSL в меню веб-части

Вставьте ссылку в XSL-файл в библиотеке стилей, который вы скопировали в нее (ссылка может быть относительной или абсолютной).

Вставленная ссылка на XSL-файл

Нажмите кнопку "ОК", чтобы сохранить изменения, а затем нажмите кнопку "Остановить изменение" на ленте "Страница" в верхней части страницы.

Кнопку "Остановить изменение" на вкладке "Страница"

Если все настроено правильно, в столбце "Days At Status" должны появиться числа.

Столбец "Количество дней с этим состоянием" с числом

Вот как страница выглядит с различными тестовыми датами:

Отчет по срокам оплаты с тестовыми данными

Сводка

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

Надеюсь, вам понравилась эта статья.

-Джастин

Джастин Joyce (Justin Joyce), LANtek

Комментарии

Пропущены шаги
08.10.2012 3:51
Я попробовал выполнить действия, но чего-то не хватает: откуда XSL узнает, какую дату использовать и в какое поле добавить число дней? Не люблю, когда действия пропущены.

"Без кода", согласен!
30.08.2012 12:12
Согласен, я не считаю, что это действительно решение "без кода".
Интересно, что благодаря какой-то ошибке в SharePoint у меня есть работающий вычисляемый столбец с "Сегодня"... Не знаю, как и почему это произошло, так как больше этот фокус не проходит, но старый столбец на месте и работает.

Формула для вычисляемого столбца "Days At Status"?
02.05.2012 7:39
Джастин, какая формула использовалась для вычисляемого столбца сайта "Days At Status" (столбце-заполнителя)? Может быть, "=today"?

SharePoint 2007
02.12.2011 11:29
Я пока не пытался применить это решение в SharePoint 2007, но изучаю его. К сожалению, свойство XslLink недоступно в веб-части через пользовательский интерфейс.

Отличная статья
30.11.2011 9:53
Привет,
отличная статья.
Я использую SharePoint 2007.
У меня нет раздела "Разное", как указано выше.
Нет ли инструкций по настройке для SP2007?
Спасибо!

НА: Решение без кода: вывод числа дней с последнего изменения элемента списка SharePoint
11.10.2011 8:24
Привет, Крис!
Отличная находка!
Я взгляну на то, что ты написал (надеюсь, сегодня) и попробую сделать это решение более надежным.
Я рад, что тебе понравилась эта статья, и очень рад, что ты смог найти решение для европейского формата даты. :)
-Джастин

Решение для европейских форматы даты
10 или 11 и 2011 6:45:00
высокой снова Джастин
пометить для информации, я найти решение проблемы ли уже было сказано на этой странице;
https://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/

Европейские форматы даты
07.10.2011 3:59
Привет, Джастин!
Спасибо тебе за это замечательное решение, я уже два дня ищу что-то подобное! Но у меня возникли с ним проблемы, и я надеюсь, что ты можешь помочь.
Я немного изменил твой код, чтобы вычислить количество дней до какого-либо события, поменяв местами переменные в последней строке функции "DateDiff":

<xsl:value-of select="$JulianToday - $JulianStartDate"></xsl:value-of>

Однако разница высчитывается правильно через раз. Например, для этой даты (в формате дд/мм/гггг)

30/12/2011

результат вычисляется правильно, но дата (в том же формате)

12/10/2011

интерпретируется как 10 декабря 2011 г., а не 12 октября 2011 г.
Я попробовал просто поменять местами день и месяц в переменной "JulianStartDate":

<xsl:with-param name="Month" select="substring(ddwrt:FormatDateTime(string($StartDate), 1033, 'yyyyMMdd'),7,2)"/>
<xsl:with-param name="Day" select="substring(ddwrt:FormatDateTime(string($StartDate), 1033, 'yyyyMMdd'),5,2)"/>

Это решило проблему со второй датой, однако результат для первой даты стал неверным!
Я также попытался изменить вызовы FormatDateTime так, чтобы использовались европейские LCID, и попробовал различные варианты для последнего параметра FormatDateTime (например, ddMMyyyy, MMddyyyy), соответствующим образом изменив позиционные параметров подстроки, но ничего не помогло.
Я был бы рад твоему совету.
Спасибо,
Крис

Без кода
21.09.2011 4:27
Я не думаю, что решение с XSL можно считать решением "без кода", так как не все понимают язык XSL, однако программирование не требуется. За исключением этого, отличное решение, спасибо!

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

Совершенствование навыков
Перейти к обучению
Первоочередный доступ к новым возможностям
Присоединиться к программе предварительной оценки Office

Были ли сведения полезными?

Спасибо за ваш отзыв!

Благодарим за отзыв! Возможно, будет полезно связать вас с одним из наших специалистов службы поддержки Office.

×