Рішення без коду: відображення днів останньої зміни елемента списку
Застосовується до
Джастін Джойс, LANtek
Примітка.: Ця стаття входить до колекції дописів за чотири роки блоґу Get the Point для кінцевих користувачів SharePoint.
Огляд: настроювані звіти про старіння без коду
Один із часто запитаних функціональних фрагментів сайту SharePoint – це звіт про старіння для завдань або елементів списку. Іншими словами, скільки днів і місяців минуло з моменту останнього змінення цього елемента списку?
На поверхні це, здається, дуже простий запит. Зрештою, у нас є дати для елементів, які створюються та змінюються, ми маємо можливість зберігати настроювані дати, коли певні зміни в елементах відбуваються через одержувачів подій. Ми обчислюємо стовпці, де можна включити формули, подібні до Excel, для роботи з нашою інформацією. Це здається досить прямою пропозицією вперед. Ми вибираємо поле дати, створюємо обчислюваний стовпець, а потім виконуємо формулу по рядках [DateField] – [Сьогодні]. Ах, не так швидко, хоча! Як знає кожен, хто спробував це "просте" завдання, спроба використати щось на кшталт [Сьогодні] в обчислюваному стовпці викликає проблеми. Спробуйте вставити [Сьогодні] в поле формули обчислюваного стовпця, щоб отримати повідомлення про помилку приблизно такого вигляду:
Чому це так? Це пов'язано зі способом обчислення обчислюваних стовпців.
Розглянемо просту формулу як приклад:
= IF( [Стовпець1]<=[Стовпець2];"OK";"Не OK")
Все це говорить про те, що якщо Стовпець1 менше або дорівнює Стовпець2, то відображення OK, в іншому випадку відображення Не OK. Це досить типова базова формула для обчислюваного стовпця, яка дає базове припущення щодо елемента списку, який містить ці стовпці: значення для "Стовпець1" і "Стовпець2" ніколи не зможуть змінюватися без події Update в елементі списку.
Саме так обчислювані стовпці переобчислюються, лише коли список оновлюється (або створюється), оскільки припускається, що відомості, які ви обчислюєте, містяться в самому елементі. Це створює проблему, коли ви намагаєтеся використати щось, що змінюється незалежно від полів елемента, наприклад сьогоднішньої дати.
Тепер я не був на зустрічі, де вони вирішили, що це так, що обчислювані стовпці будуть функціонувати, однак, якби мені довелося зробити освічене припущення, я хотів би припустити, що вони функціонують таким чином для продуктивності. Уявіть собі, якби у вас був список із кількох тисяч елементів, кожен з яких містив обчислюваний стовпець, який потребував оновлення "live". Це означало б, що якийсь механізм, можливо, завдання таймера, доведеться ітерувати через кожен елемент, який містив цей обчислюваний стовпець кожен так часто і оновлювати його значення. Це може бути надзвичайно оподатковуваним з точки зору продуктивності, тому що з більшими розгортаннями це завдання може постійно виконуватися і змінювати речі. Це тільки моє припущення, але це має досить сенс, якщо ви думаєте про це.
Є кілька пропозицій щодо подібних рішень, які плавають там, які передбачають обман SharePoint, щоб прийняти значення "Сьогодні", спочатку створивши стовпець "Сьогодні", а потім додавши його до формули, а потім видаливши. Це все добре, але пам'ятайте, що я сказав, коли обчислювані стовпці оновлюються. Це значення зміниться лише в разі оновлення елемента, що означає, що незабаром ваші значення будуть неправильними, особливо в разі обчислення дня.
Я бачив, як інші користувачі використовують clever JavaScript, щоб записувати значення на сторінку. Це буде працювати також, але я в значній мірі категорично проти клієнтських сценаріїв, коли його можна уникнути.
Здійснення:
Так що ж робити? Обчислювані стовпці не піддаються сумніву для так званих "мінливих" функцій, таких як Today. Можливо, ми могли б розробити спеціальний код, щоб подбати про це для нас, як обчислюваний стовпець, завдання таймера або запланований процес, щоб прийти разом і оновити кожен елемент, який потребує цього обчислення зроблено. Це повертає нас до проблеми продуктивності я згадав в останньому абзаці, хоча, і, крім того, це крихке рішення, яке було б дуже специфічним для сайту / списку / стовпця в питанні. На вершині цих двох проблем, ви також повинні піти знайти нерівний хлопець, такий як я, який знає, як код і переконати його розробити це рішення для вас. Але є і простіший спосіб!
Якщо ви маєте право створювати поля та редагувати сторінки на сайті, а також маєте трохи знань про XSLT і створення подань, ви можете об'єднати шаблон XSL, який можна включити в подання списку та з вірою обчислювати значення щоразу під час кожного запиту сторінки. Цей сценарій усуває нашу стурбованість продуктивністю та не вимагає розробки та розгортання настроюваного коду за допомогою рішення.
Чудово! Отже, як ми це робимо?
-
Створіть або виберіть поле, яке використовуватиметься як джерело. Це має бути тип дати.
-
Створіть наше поле, яке використовуватиметься як покажчик місця заповнення для значення, яке обчислюється.
-
Додайте обидва ці поля до типу вмісту та додайте його до списку.
-
Створення подання цього списку, що містить як вихідні, так і заповнювачі стовпців.
-
Завантажте шаблон XSL до бібліотеки стилів.
-
Установіть властивість "Посилання XSL" для веб-частини подання списку за допомогою інтерфейсу користувача.
-
Успішно завершено!
Розгляньмо приклад сценарію виконання та проглянемо його. Наш клієнт хотів переглянути основний список, який розповість йому, як довго певний елемент списку сидів у своєму стані. Цей список містив настроюваний тип вмісту сайту, який походить від типу елемента та додається до списку. На місці вже був одержувач подій, який записує щоразу, коли поле стану в елементі списку було змінено, і зберігав цю дату в стовпці "Дата змінення стану". Все це проводки не обов'язково, і може бути зроблено з будь-яким полем дати (просто так відбувається це наша реалізація, але не соромтеся експериментувати). Мінімальний мінімальний розмір – це вихідне поле дати та поле покажчика місця заповнення для обчислення (докладніше про це в наступному абзаці), додане до списку, хоча я пропоную використовувати стовпці сайту та типи вмісту сайту на випадок, якщо ви захочете повторно використовувати це рішення в інших місцях на сайті.
Таким чином, у нас є вихідна дата, яку ми можемо використовувати в наших обчисленнях проти сьогоднішньої дати. Тепер ми можемо створити настроюваний стовпець сайту, який використовуватиметься як контейнер для обчислюваного значення. У цьому випадку я вибираю використання обчислюваного стовпця, оскільки його не можна буде змінювати в нових або редагувати форми елементів, але його можна вибрати для відображення в поданнях, оскільки ми не хочемо, щоб користувачі вводять довільні значення в цей стовпець. Це може бути заплутаним щодо того, чому він не відображається в поданнях і т.д.
Тепер, коли у нас є стовпець сайту, ми можемо додати його до наших типів вмісту, які будуть використовуватися в нашому списку. Далі потрібно створити наше подання, яке пізніше буде налаштовано за допомогою 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 у бібліотеці стилів, яке ви скопіювали раніше (це може бути відносне або абсолютне посилання).
Натисніть кнопку "OK", щоб зберегти зміни, а потім натисніть кнопку "Припинити редагування" на стрічці "Сторінка" у верхній частині сторінки.
Якщо все настроєно правильно, у стовпці "Стан днів" мають відображатися числа.
І, нарешті, ось як це виглядатиме з деякими тестовими даними різних дат:
Зведення.
Існує: гарно відформатований, надійний і ефективніший спосіб створення звіту про старіння в SharePoint., у комплекті з простим впровадженням без коду. У цьому випадку є досить багато потенційних програм, окрім сценарію використання, який ми дослідили тут. Інший поширений сценарій для цього типу звіту – вкласти його до списку завдань, щоб побачити, скільки часу минуло з моменту створення завдання.
Приємного користування!
--Джастін
Джастін Джойс, ЛАНтек
Примітки
Відсутні
дії 10/8/2012 3:51 РАНКУ OK Я виконав кроки, але там повинно бути щось відсутнє - як XSL знатиме, яку дату використовувати, або яке поле, щоб додати дні з тих пір? не ненавидіти його, коли пропущено кроки.No-Code, agreed!
8/30/2012 12:12 ВЕЧОРА Я згоден - я не думаю, що це дійсно вважається "немає коду". Цікаво, що через деяку викрутку SharePoint у мене є робочий обчислюваний стовпець за допомогою сьогодні... не впевнений, як і чому, тому що я не можу змусити його зробити це знову, але той все ще там і працює.Формула для обчислюваного стовпця "Дні за станом"?
5/2/2012 7:39 РАНКУ Джастін - Яка формула використовується для обчислюваного стовпця сайту "Днів у стані" (стовпець покажчика місця заповнення)? Це був "=today"?SharePoint 2007
12/2/2011 11:29 РАНКУ Наразі я не намагався застосувати це рішення до SharePoint 2007, але я дивлюся на нього. На жаль, у веб-частині немає властивості XslLink через інтерфейс користувача.Великий пост
11/30/2011 9:53 РАНКУ Привіт Чудова публікація. Я використовую SharePoint 2007. У мене немає розділу Misc, як зазначено вище. У вас є кроки для конфігурації SP2007? Дякую.Re: No-code solution: Displaying the days since a SharePoint list item was last changed
10/11/2011 8:24 РАНКУ Привіт Кріс. чудова знахідка! Я збираюся подивитися на те, що ви опублікували сподіваюся пізніше сьогодні і подивитися, якщо я можу зробити це рішення трохи більш надійним. Я радий, що вам сподобався пост, і я дуже радий, що ви змогли знайти рішення європейського формату дати. :) -ДжастінРішення для європейських форматів датhttps://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/
10/11/2011 6:45 РАНКУ Привіт знову Джастін, Примітка. Я знайшла рішення для проблеми, згаданої раніше на цій сторінці;Європейські формати дат
10/7/2011 3:59 РАНКУ Привіт Джастін, Це дійсно гарне рішення спасибі, і тільки така річ, яку я провів останні два дні шукає! Однак у мене є трохи проблем з ним, і я сподівався, що ви можете допомогти мені. Я трохи змінив ваш код, щоб обчислювати кількість днів, доки щось не станеться, а не з тих пір, переключивши змінні в останньому рядку функції "DateDiff"; <xsl:value-of select="$JulianToday – $JulianStartDate"></xsl:value-of> Однак я можу тільки отримати його, щоб caclulate різницю правильно половину часу. Так, наприклад, з цією датою (формат дд/ММ/рррр); 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 04:27 AM Я не думаю, що XSL кваліфікується як рішення "без коду", оскільки розуміння мови XSL не для всіх - однак це не передбачає програмування. Крім того: Гарне рішення, спасибі!