Решение без кода: отображение дней с момента последнего изменения элемента списка
Applies To
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 для записи значений на страницу. Это также сработает, но я категорически против использования клиентских сценариев, когда этого можно избежать.
Реализация:
Что нужно сделать? Вычисляемые столбцы не поддерживаются таким образом, чтобы назывались "наклейками", такими как "Наслаждается". Возможно, мы можем разработать некоторый пользовательский код, чтобы принять такие же важные сведения, как столбец вычисляемого столбца, задания таймера или запланированного процесса, и обновляли все необходимые элементы, которым необходим это расчет. Это вернется к проблеме производительности, упомянутого в последнем абзаце, а, в последнем абзаце, а, в полном случае это решение, которое в актуально конкретном уровне сайта или списка, стоит лишь частично выбрать определенный вопрос. В настоящее время эти два раза также придется найти неочень мой гул, который знает, как кодировать и подождать, чтобы разрабатывать это решение. Но существует еще проще!
Если у вас есть права на создание полей и редактирование страниц на сайте, а также немного знаний о XSLT и создании представлений, вы можете создать шаблон XSL, добавить его в представление списка, и он будет вычислять значение при каждом запросе страницы. Этот сценарий не влияет на производительность и не требует написания и развертывания собственного решения.
Разве это не идеал? Так что же нужно сделать?
-
Создайте или выберите поле, которое будет являться источником. Оно должно иметь тип даты.
-
Создайте поле, которое будет являться заполнителем для вычисляемого значения.
-
Добавьте оба поля в тип контента, а затем добавьте тип контента в список.
-
Создайте представление этого списка, содержащее исходный столбец и столбец-заполнитель.
-
Добавьте шаблон XSL в библиотеку стилей.
-
Настройте свойство "Ссылка на XSL" для веб-части представления списка через пользовательский интерфейс.
-
Готово!
Давайте подробнее рассмотрим реализацию на примере варианта использования. Нашему клиенту было нужно представление основного списка, в котором показывалось, как долго определенный элемент списка имел текущее состояние. Список включал данные пользовательского типа контента сайта, который был создан на основе типа "Элемент" и добавлен в список. Уже существовал получатель событий, который регистрировал время изменения поля состояния для элемента списка и сохранял соответствующую дату в столбец "Дата изменения состояния". Такие настройки не являются обязательными, и способ можно применять для ЛЮБОГО поля даты (в нашей реализации уже были такие настройки, но вы можете попробовать обойтись без них). По минимуму вам потребуются исходное поле даты и поле-заполнитель для хранения результатов вычисления (подробнее об этом в следующем абзаце), которые были добавлены в список, хотя я рекомендую использовать столбцы сайта и типы контента сайта, на случай если вы захотите повторно использовать это решение для других объектов на сайте.
Итак, у нас есть исходная дата, для которой можно вычислить разницу с текущей датой. Теперь мы можем создать пользовательский столбец сайта, который будет использоваться в качестве контейнера для вычисленного значения. В этом случае я решил использовать вычисляемый столбец, так как он будет изменяться в формах создания и изменения элементов, но его можно выбрать для отображения в представлениях, чтобы предотвратить ввод неправильных значений в этот столбец. Могут возникать вопросы о том, почему он не отображается в представлениях, и т. д.
Теперь, когда у нас есть столбец сайта, мы можем добавить его к типам контента, которые будут использоваться в списке. Затем нужно создать представление, которое мы позже настроим с помощью XSLT. Обязательно создайте стандартное представление, содержащее исходный столбец даты и новый вычисляемый столбец, который будет использоваться в качестве заполнителя для вычисленного значения.
Мы создали все, что нужно для настраиваемого отчета по срокам. Теперь осталось только создать шаблон XSL, добавить его в библиотеку стилей сайта и связать его с нашим представлением списка. Шаблон XSL, который мы будем использовать, будет содержать обычную разметку SharePoint для создания представления, а также нашу собственную разметку, переопределяющую ее некоторые части и вычисляющую нужное значение.
Наличие кредитов, в котором истекает срок и сроки, шаблоны XSL для выполнения фактических вычислений, которые я использую это решение, было проигнорировано на форумах MSDN на форумах 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, вы увидите в избранном виде, чтобы отрицать представления, если продолжить прокрутку вниз до строки 357, в первую очередь вы увидите начало настраиваемых шаблонов, которые я вставляю в FieldRef_printTableCell_EcbAllowed разметку, а Days_x0020_At_x0020_Status затем — "Вычислить в юбиле". Это три шаблона, на основе которых можно использовать наши вычисления в наших представлениях. Если вы планируете использовать имена полей, отличные от указанных выше в этой статье, вам потребуется просмотреть эти шаблоны и заменить ссылки на другие имена. Помните, что вэтом вам потребуется упомянуть внутреннее имя поля, а не отображаемое имя.
После настройки шаблона перейдите к библиотеке стилей, добавьте его в папку "Таблицы стилей XSL", а затем скопируйте ссылку на файл. Это позволит при желании легко вносить в него изменения или добавлять его в различные части сайта.
Затем перейдите к списку и выберите представление, которое вы создали выше в этой статье. В меню "Действия сайта" выберите команду "Изменить страницу".
Найдите на странице веб-часть представления списка и откройте меню веб-части, щелкнув маленькую стрелку вниз в правом верхнем углу. В этом меню выберите "Изменить веб-часть".
В правой части окна браузера откроется меню веб-части.
Щелкните + в разделе для "Разное" и найдите свойство "Ссылка на XSL".
Вставьте ссылку в XSL-файл в библиотеке стилей, который вы скопировали в нее (ссылка может быть относительной или абсолютной).
Нажмите кнопку "ОК", чтобы сохранить изменения, а затем нажмите кнопку "Остановить изменение" на ленте "Страница" в верхней части страницы.
Если все настроено правильно, в столбце "Days At Status" должны появиться числа.
Вот как страница выглядит с различными тестовыми датами:
Сводка
Итак, вот он: надежный способ создания отчета по возрасту элементов в SharePoint, обеспечивающий привлекательное форматирование и хорошую производительность, а также не требующий программирования для реализации. Он может пригодиться в различных ситуациях в дополнение к той, которую мы здесь рассмотрели. Такие отчеты также часто добавляют к списку задач, чтобы видеть, сколько времени прошло с момента создания задачи.
Надеюсь, вам понравилась эта статья.
-Джастин
Джастин Joyce (Justin Joyce), LANtek
Комментарии
Пропущенные действия
08.10.2012 03:51 я выполнил описанные действия, но не должно быть ничего не случилось: как XSL узнает дату использования XSL или в какое поле добавить число дней? Не люблю, когда действия пропущены.Без кода согласен!
30.08.2012 12:12 Принимаю соглашение. Я не считаю, что это действительно считается "без кода". Интересно, в какой-то степени SharePoint у меня есть работающий вычисляемый столбец с сегодня... Не знаете, как это сделать, так как его невозможно восстановить, но в этом случае и работа ет он все еще находится.Формула для вычисляемого столбца "Days At Status"?
02.05.2012, 07:39 Джастин: какая формула использовалась для вычисляемого столбца сайта "Days At Status" (столбец-заполнитель)? Может быть, "=today"?SharePoint 2007
02.01.2011, 01:29 В настоящее время я не пытаюсь применить это решение в SharePoint 2007, но изучаю его. К сожалению, свойство XslLink недоступно в веб-части через пользовательский интерфейс.Отличная запись
30.11.2011, 09:53 Здравствуйте, Отличная запись. Я использую SharePoint 2007. У меня нет раздела "Миксы", как было описано выше. У вас есть действия по настройке с помощью SP2007? Спасибо.Андрей: решение без кода: отображение дней с момента последнего изменения элемента списка
SharePoint 11.10.2011, 8:24 Здравствуйте! Отлично подходит! Я понимаю, что вы опубликовали надежно, и посмотрим, можно ли сделать это решение более надежным. Я рады понравилась запись, и я очень рады узнать, что вы понравились найти решение для европейского формата даты европейского формата. :) -ДжейнРешение форматов европейского даты https://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/
11.01.2011, 06:45 Здравствуйте, К вашему данным я нашли решение проблемы, упомянутое ранее на этой странице.Европейские форматы
дат 07.01.2011 3:59 Здравствуйте, Это хорошее решение, и я затратил две дни искать нужные дни! Но у меня возникли с ним проблемы, и я надеюсь, что ты можешь помочь. Мне немного изменить код, чтобы немедленно вычислить количество дней, а не с тех пор, пока не будет выполняться что-то другое, переключая переменные в последней строке функции DateDiff; <xsl:value-of select="$JulianToday - $JulianStartDate"></xsl:значение-of> Но я могу сделать его только в половине времени. Например, этот пример с помощью этой даты (формат дд.мм.гггг); 30.12.2011 Оно правильно вычисляет, но с этой датой (в одном формате) 10.12.2011 Она вычисляет так, как если 10-дек-2011 а не 12-окт-2011. После попытки просто переключить позиции значений дня и месяца в переменной "ИюльИна" я только: <xsl:with-param name="Month" select="substring(ddwrt:FormatDateTime($StartDate), 1033, 'yyyyMdd'),7,2)"/>/> <xsl:with-param name="День" выберите="Substring(ddwt:FormatDateTime($StartDate), 1033, 'yyyyMdd'),5,2)"/>/> Так как эта проблема устранена второй датой, неверная для первой даты, эта проблема была неверной. Кроме того, я попытались изменить вызовы формата FormatDateTime для использования европейских и других альтернативных вариантов для последнего параметра FormatDateTime (например, ddMMyyy, MMddyyy), соответствующим положением параметров положения не удастся. Я хорошо ценит любые советы, которые вы можете предложить. Спасибо, КрисБез кода
21.09.2011, 07:27 Я не считаю, что решение с XSL можно использовать как решение без кода, так как понимание языка XSL не предусмотрена для всех пользователей, но программирование не требуется. За исключением этого, отличное решение, спасибо!