Řešení bez kódu: Zobrazení počtu dnů od poslední změny položky seznamu

napsal(a) Justin Joyce, LANtek

Poznámka

Tento článek je součástí sbírky příspěvků z posledních čtyř ročníků blogu Get the Point pro koncové uživatele SharePointu.

Přehled: Vlastní sestavy stárnutí bez kódu

Jednou z často požadovaných funkčních součástí sharepointového webu je sestava stárnutí pro úkoly nebo položky seznamu. Jinými slovy, kolik dní nebo měsíců uplynulo od poslední změny této položky seznamu?

Na první pohled se zdá, že je to velmi jednoduchý požadavek. Koneckonců, máme data pro vytváření a úpravy položek, máme možnost ukládat vlastní data, kdy dojde k určitým změnám položek prostřednictvím příjemců událostí. Vypočítali jsme sloupce, do kterých můžeme použít vzorce podobné Excelu pro práci s našimi informacemi. To se zdá jako docela přímočarý návrh. Vybereme pole kalendářního data, vytvoříme počítaný sloupec a pak uděláme vzorec ve stylu [DatumPole] – [Dnes]. Ach, ne tak rychle! Každý, kdo se o tento "jednoduchý" úkol pokusil, ví, že pokus o použití něčeho jako [Dnes] v počítaném sloupci způsobuje problémy. Pokuste se do pole vzorce v počítaném sloupci vložit text [Today] a zobrazí se chybová zpráva, která vypadá nějak takto:

Chybová zpráva

Proč tomu tak je? Souvisí to se způsobem, jakým se počítají sloupce.

Vezměme si jako příklad jednoduchý vzorec:

= KDYŽ( [Sloupec1]<=[Sloupec2]; "OK"; "Není OK")

Říká to jen, že pokud je Sloupec1 menší než nebo roven Sloupci2, pak zobrazit OK, v opačném případě zobrazit Není OK. Toto je poměrně typický základní vzorec pro počítaný sloupec, který poskytuje základní předpoklad o položce seznamu, která obsahuje tyto sloupce: Hodnoty pro Sloupec1 a Sloupec2 se nikdy nebudou moct změnit bez události Update u položky seznamu.

Správně, počítané sloupce se přepočítají jenom při aktualizaci (nebo vytvoření seznamu), protože předpokládají, že informace, které vypočítáváte, jsou obsaženy v samotné položce. To vytvoří problém, pokud se pokoušíte použít něco, co se mění nezávisle na polích položky, například aktuální datum.

Nebyl jsem na schůzce, kde se rozhodli, že takto budou fungovat počítané sloupce, ale kdybych měl udělat kvalifikovaný odhad, předpokládal bych, že takto fungují z hlediska výkonu. Představte si, že byste měli seznam několika tisíc položek, z nichž každá by obsahovala počítaný sloupec, který by vyžadoval "živou" aktualizaci. To by znamenalo, že nějaký mechanismus, třeba úloha časovače, by musel iterovat každou položku, která obsahuje tento počítaný sloupec, a aktualizovat jeho hodnotu. To může být velmi náročné z hlediska výkonu, protože při větším nasazení může tato úloha neustále běžet a měnit věci. To je jen můj odhad, ale když se nad tím zamyslíte, dává to docela smysl.

Existují návrhy na podobná řešení, která zahrnují oklamání SharePointu, aby přijal hodnotu Dnes tak, že nejprve vytvoří sloupec s názvem Today, pak ho přidáte do vzorce a pak ho odstraníte. To vše je v pořádku, ale pamatujte si, co jsem říkal při aktualizaci počítaných sloupců. Tato hodnota se změní jenom při aktualizaci položky, což znamená, že vaše hodnoty budou brzy nesprávné, zejména v případě výpočtu dne.

Viděl jsem jiné, jak používají chytrý JavaScript k zápisu hodnot na stránku. To by také fungovalo, ale jsem do značné míry kategoricky proti klientskému skriptu, pokud se tomu lze vyhnout.

Realizace:

Co tedy dělat? Počítané sloupce nepřicházejí v úvahu pro tzv. "volatilní" funkce, jako je Today. Je možné, že bychom mohli vyvinout nějaký vlastní kód, který by se o to postaral za nás, jako je vypočítaný sloupec, úloha časovače nebo naplánovaný proces, který by přišel a aktualizoval každou jednotlivou položku, která potřebuje tento výpočet provést. To nás přivádí zpět k problému výkonu, který jsem zmínil v posledním odstavci, a navíc se jedná o křehké řešení, které by bylo velmi specifické pro daný web/seznam/sloupec. Kromě těchto dvou obav byste také museli najít podivína, jako jsem já, který ví, jak kódovat a přesvědčit ho, aby pro vás vyvinul toto řešení. Existuje ale jednodušší způsob!

Pokud máte práva pro vytváření polí a úpravy stránek na webu a máte nějaké znalosti o XSLT a vytváření zobrazení, můžete sestavit šablonu XSL, kterou lze zahrnout do zobrazení seznamu a která věrně vypočítá vaši hodnotu pokaždé, když je stránka požadována. Tento scénář odstraňuje naše obavy o výkon a nevyžaduje vývoj a nasazení vlastního kódu prostřednictvím řešení.

Skvěle. Jak to tedy uděláme?

  1. Vytvořte nebo vyberte pole, které bude fungovat jako zdroj. Musí se jednat o datový typ.
  2. Vytvořte pole, které bude sloužit jako zástupný symbol pro počítanou hodnotu.
  3. Přidejte obě tato pole do typu obsahu a přidejte tento typ obsahu do seznamu.
  4. Vytvořte zobrazení tohoto seznamu obsahující zdrojový i zástupný sloupec.
  5. Nahrajte šablonu XSL do knihovny stylů.
  6. Prostřednictvím uživatelského rozhraní nastavte vlastnost Odkaz na XSL pro webovou část Seznam.
  7. Hotovo.

Pojďme se podívat na příklad případu použití a projít si implementaci. Náš zákazník požadoval zobrazení svého hlavního seznamu, které by mu řeklo, jak dlouho je konkrétní položka seznamu ve stavu. Tento seznam obsahoval vlastní typ obsahu webu odvozený z typu Položka a přidaný do seznamu. Existuje již přijímač události, který zaznamená každou změnu pole stavu u položky seznamu a uloží dané datum do sloupce s názvem "Datum změny stavu: Stav: Změna". Veškeré toto zapojení není nutné a lze jej provést s JAKÝMKOLI datovým polem (shodou okolností je to naše implementace, ale nebojte se experimentovat). Naprosté minimum, které budete potřebovat, je pole zdrojového data a zástupné pole pro uložení vašeho výpočtu (více o tom v dalším odstavci) přidaného do seznamu, i když doporučuji použít sloupce webu a typy obsahu webu pro případ, že byste chtěli toto řešení znovu použít na jiných místech na vašem webu.

Máme tedy zdrojové datum, které můžeme použít při výpočtu oproti aktuálnímu datu. Teď můžeme vytvořit vlastní sloupec webu, který použijeme jako kontejner pro počítanou hodnotu. V tomto případě jsem se rozhodl použít počítaný sloupec, protože nebude možné jej změnit v nových nebo upravitelných formulářích položek, ale lze jej vybrat pro zobrazení v zobrazeních, protože nechceme, aby uživatelé do tohoto sloupce zadávali libovolné hodnoty. Mohlo by být matoucí, proč se nezobrazuje v zobrazeních atd.

Teď, když máme sloupec webu, ho můžeme přidat k typům obsahu, které se budou používat v našem seznamu. Dále musíme vytvořit zobrazení, které bude později přizpůsobeno pomocí našeho XSLT. Je nutné vytvořit standardní zobrazení, které bude obsahovat sloupec zdrojového kalendářního data a nový počítaný sloupec, který bude sloužit jako zástupný symbol pro počítanou hodnotu.

Nyní máme vše, co budeme potřebovat k podpoře naší vlastní zprávy o stárnutí. Zbývá jen vytvořit šablonu XSL, nahrát ji do knihovny stylů webu a propojit ji se zobrazením seznamu. Šablona XSL, kterou budeme používat, bude obsahovat nějaké normální značky generované SharePointem pro generování zobrazení a také naše vlastní značky, které se použijí k přepsání určitých částí tohoto nastavení a výpočtu požadované hodnoty.

Abych uvedl zásluhy tam, kde je to zasloužené, šablony XSL pro provádění skutečných výpočtů, které pro toto řešení používám, byly laskavě poskytnuty "swirch" na fórech MSDN:
http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/

Stáhněte si XSL stylesheet (aging.zip), který jsem sestavil a který se nachází zde:
https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissionsChanged=1&id=C262E8E2D59A86D9!104

Když to otevřete ve svém oblíbeném textovém editoru, uvidíte spoustu normálních značek SharePoint XSL pro vykreslování zobrazení, pokud budete pokračovat dolů na řádek 357, uvidíte začátek vlastních šablon, které jsem přidal do kódu, první z nich je šablona "DateDiff" následovaná "calculate-julian-day" a "FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020_Status". Toto jsou naše tři šablony, které budou provádět a zobrazovat naše výpočty v našich zobrazeních. Pokud budete používat jiné názvy polí, než bylo uvedeno dříve v tomto článku, budete muset projít tyto šablony a nahradit všechny odkazy na jiné názvy. Nezapomeňte, že pro tento účel bude vhodné použít INTERNÍ název pole, nikoli zobrazovaný název.

Jakmile budete spokojeni, že je šablona připravena k použití, přejděte do knihovny stylů, nahrajte ji do složky Šablony stylů XSL a poté zkopírujte odkaz na soubor. To nám umožní později snadno provádět změny nebo přidávat do různých částí webu, jak chceme.

Dále přejděte do seznamu a vyberte zobrazení, které jste vytvořili dříve v tomto článku. V menu "Akce webu" klikněte na "Upravit stránku".

Příkaz Upravit stránku v nabídce Akce webu

Najděte na stránce webovou část Seznam a kliknutím na malou šipku směřující dolů v pravém horním rohu otevřete nabídku webové části. V této nabídce vyberte Upravit webovou část.

Příkaz Upravit webovou část v nabídce Webová část

Otevře se nabídka webové části na pravé straně okna prohlížeče.

Nabídka Webová část

Klikněte na + pro část "Různé" a vyhledejte vlastnost "Odkaz na XSL".

Vlastnost Odkaz na data XSL v nabídce Webová část

Vložte odkaz na soubor XSL do knihovny stylů, kterou jste předtím zkopírovali dolů (může to být relativní nebo absolutní odkaz).

Odkaz na soubor XSL vložený do

Kliknutím na "OK" uložte změny a poté klikněte na tlačítko "Ukončit úpravy" na pásu karet "Stránka" v horní části stránky.

Tlačítko Ukončit úpravy na kartě Stránka

Pokud bylo všechno správně nakonfigurované, měli byste teď ve sloupci "Stav dní" vidět čísla.

Sloupec stavu ke dni zobrazující číslo

A nakonec je to, jak by to vypadalo s některými testovacími daty různých dat:

Sestava stárnutí zobrazující testovací data

Shrnutí:

A je to tady: pěkně formátovaný, robustní a výkonnější způsob, jak vytvořit sestavu stárnutí v SharePointu, doplněný jednoduchou implementací bez použití kódu. To má několik potenciálních aplikací kromě jednoho případu použití, který jsme zde prozkoumali. Jiný obvyklý scénář pro tento typ sestavy je její připojení k seznamu úkolů, abyste na první pohled viděli, jak dlouho od vytvoření úkolu uplynulo.

Bavte se!

--Justin

Justin Joyce, LANtek

Komentáře

Chybějící kroky
8.10.2012 3:51
Dobře, postupoval jsem podle kroků, ale něco asi chybí - jak bude XSL vědět, které datum použít, nebo do kterého pole přidat dny od doby? Nesnáším, když se vynechávají kroky.

Bez kódu, souhlasím!
30.08.2012 12:12
Souhlasím - nemyslím si, že se to opravdu počítá jako "bez kódu".
Zajímavé je, že díky nějakému zpackání SharePointu mám funkční počítaný sloupec pomocí Today... Nejsem si jistý, jak nebo proč, protože to nemůžu udělat znovu, ale ten tam stále je a funguje.

Vzorec pro počítaný sloupec "Dny ve stavu"?
02.05.2012 7:39
Jan: Jaký vzorec jste použili pro počítaný sloupec webu (zástupný sloupec) "Dny ke stavu"? Bylo to "=dnes"?

SharePoint 2007
02.12.2011 11:29
V současné době jsem se nepokusil aplikovat toto řešení na SharePoint 2007, ale zvažuji to. Ve webové části přes uživatelské rozhraní se bohužel nezobrazuje žádná vlastnost XslLink.

Skvělý příspěvek
30.11.2011 9:53
Dobrý den!
Skvělý příspěvek.
Používám SharePoint 2007.
Nemám sekci Různé, jak je uvedeno výše.
Máte kroky pro konfiguraci SP2007?
Děkujeme.

Re: Řešení bez kódu: Zobrazení dnů od poslední změny položky seznamu SharePointu
11.10.2011 8:24
Ahoj Chrisi.
Skvělý nález!
Podívám se na to, co jste doufejme zveřejnili později dnes, a uvidím, zda mohu toto řešení udělat trochu robustnější.
Jsem rád, že se vám příspěvek líbil, a jsem velmi rád, že se vám podařilo najít řešení evropského formátu data. :)
-Justin

Řešení pro evropské formáty data
11.10.2011 6:45
Ještě jednou zdravím Justine,
Pro vaši informaci, našel jsem řešení problému, který jsem zmínil dříve na této stránce;
https://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/

Evropské formáty data
7.10.2011 3:59
Ahoj Justine,
To je opravdu dobré řešení, díky, a přesně to, co jsem strávil poslední dva dny hledáním! Mám s tím však trochu problém a doufal jsem, že byste mi mohli pomoci.
Mírně jsem pozměnil váš kód, aby se počítal počet dní, než se něco stane, spíše než potom, přepnutím proměnných v posledním řádku funkce "DateDiff";

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

Podařilo se mi však správně vypočítat rozdíl pouze v polovině případů. Takže například s tímto datem (formát dd/MM/rrrr);

30/12/2011

Vypočítá se správně, ale s tímto datem (stejný formát)

12/10/2011

Vypočítá se jako 10. prosince 2011 a ne 12. října 2011.
Zkusil jsem jednoduše přepínat pozice hodnot dne a měsíce v proměnné "JulianStartDate", jako takto;

<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)"/>

A tím se napravil problém s druhým rande, ale u prvního rande to pak bylo špatně!
Také jsem se pokusil změnit volání FormatDateTime tak, aby používala evropské identifikátory LCID a různé změny posledního parametru FormatDateTime (např. ddMMyyyy, MMddyyyy) s příslušnými úpravami pozičních parametrů podřetězce bez úspěchu.
Velmi bych ocenil jakoukoli radu, kterou můžete nabídnout.
Díky,
Chris

No-Code
21.9.2011 4:27
Nemyslím si, že XSL se kvalifikuje jako "no-code" řešení, protože porozumění jazyku XSL není pro každého - nicméně nezahrnuje programování. Kromě toho: Pěkné řešení, děkuji!