Применяется к
SharePoint в Microsoft 365 SharePoint в Microsoft 365 для малого бизнеса

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Реализация:

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

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

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

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

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

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

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

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

  6. Задайте свойство "XSL Link" для веб-части представления списка с помощью пользовательского интерфейса.

  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 Link".

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

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

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

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

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

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

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

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

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

Сводка

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

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

-Джастин

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

Комментарии

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

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

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

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

Отличный пост 30.11.2011 9:53 Привет Великий пост.Я использую SharePoint 2007.У меня нет раздела Misc, как было сказано выше.Есть ли у вас шаги для конфигурации с пакетом обновления 2007 (SP2007)? Спасибо.

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

Решение для европейских форматов дат 11.10.2011 6:45 Снова привет Джастин, FYI, я нашел решение для проблемы, о которой я упоминал ранее на этой странице;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> Однако я могу только получить его, чтобы кклулировать разницу правильно половину времени. Например, с этой датой (формат дд/ММ/гггг); 12.30.2011 Он вычисляется правильно, но с этой датой (в том же формате) 10.12.2011 Он вычисляет как будто 10 декабря 2011 года, а не 12 октября 2011 года.Я попытался просто переключить позиции значений дня и месяца в переменной JulianStartDate, как показано ниже; <xsl:with-param name="Month" select="substring(ddwrt:FormatDateTime(string($StartDate), 1033, 'yyyyMdd'),7,2)"/> <xsl:with-param name="Day" select="substring(ddwrt:FormatDateTime(string($StartDate), 1033, 'yyyyMdd'),5,2)"/> И это исправило проблему со второй датой, однако тогда она была неправильной для первой даты! Я также попытался изменить вызовы FormatDateTime для использования европейских LCID и различные изменения последнего параметра FormatDateTime (например, ddMMyyyyy, MMddyyyyy) с соответствующими корректировками позиционных параметров подстроки безуспешно.Я очень ценю любой совет, который вы можете предложить.Спасибо Крис

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

Нужна дополнительная помощь?

Нужны дополнительные параметры?

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