Riešenie bez kódu: Zobrazenie dní od poslednej zmeny položky zoznamu
Vzťahuje sa na
Justin Joyce, LANtek
Poznámka: Tento článok je súčasťou kolekcie príspevkov zo štyroch rokov blogu Získať bod pre koncových používateľov SharePointu.
Prehľad: Vlastné zostavy starnutia bez kódu
Jednou z často požadovaných funkčných častí lokality SharePoint je zostava starnutia pre úlohy alebo položky zoznamu. Inými slovami, koľko dní alebo mesiacov uplynulo od poslednej úpravy tejto položky zoznamu?
Na povrchu sa to zdá byť veľmi jednoduchá požiadavka. Koniec koncov, máme dátumy pre položky, ktoré sa vytvárajú a upravujú, máme možnosť ukladať vlastné dátumy, keď sa určité zmeny položiek uskutočnia prostredníctvom príjemcov udalostí. Máme vypočítané stĺpce, v ktorých môžeme zahrnúť vzorce podobné Excelu, aby sme mohli pracovať s našimi informáciami. Vyzerá to ako celkom priamočiarý návrh. Vyberieme pole dátumu, vytvoríme vypočítavaný stĺpec a potom vytvoríme vzorec v riadkoch [DateField] – [Dnes]. Ach, nie tak rýchlo hoci! Ako vie každý, kto sa pokúsil o túto "jednoduchú" úlohu, pokus o použitie niečoho ako [Dnes] vo vypočítanom stĺpci spôsobuje problémy. Skúste vložiť [Dnes] do poľa vzorcov vypočítaného stĺpca a zobrazí sa chybové hlásenie približne takto:
Prečo je to tak? No, to má čo do činenia s spôsobom vypočítaných stĺpcov sú vypočítané.
Zoberme si jednoduchý vzorec ako príklad:
= IF( [Stĺpec1]<=[Stĺpec2]; "OK"; "Nie je to OK")
Všetko, čo hovorí, je, že ak Stĺpec1 je menšia alebo rovná Stĺpec2, potom zobraziť OK, v opačnom prípade zobraziť Nie je v poriadku. Toto je pomerne typický základný vzorec pre vypočítavaný stĺpec a vytvára základný predpoklad o položke zoznamu, ktorá obsahuje tieto stĺpce: Hodnoty stĺpcov Column1 a Column2 sa nikdy nebudú dať zmeniť bez udalosti Aktualizácie v položke zoznamu.
To je pravda, vypočítané stĺpce sa prepočítajú len vtedy, keď sa zoznam aktualizuje (alebo vytvorí), pretože predpokladajú, že vypočítavané informácie sú obsiahnuté v samotnej položke. Tento problém sa vyskytne, keď sa pokúšate použiť niečo, čo sa mení nezávisle od polí položky, ako je napríklad dnešný dátum.
Teraz som nebol na stretnutí, kde sa rozhodli, že je to spôsob, akým vypočítané stĺpce budú fungovať, však, keby som mal urobiť vzdelaný odhad by som predpokladať, že fungujú týmto spôsobom pre výkon. Predstavte si, že by ste mali zoznam niekoľkých tisíc položiek, z ktorých každá obsahovala vypočítaný stĺpec, ktorý potreboval dynamickú aktualizáciu. To by znamenalo, že určitý mechanizmus, možno úloha časovača, by musel iterovať cez každú položku, ktorá obsahovala tento vypočítaný stĺpec každý tak často a aktualizovať jeho hodnotu. Z hľadiska výkonu to môže byť mimoriadne zdanenie, pretože pri väčších nasadeniach môže byť táto úloha neustále spustená a môže meniť veci. To je len môj odhad, ale to dáva docela trochu zmysel, ak si myslíte o tom.
Existuje niekoľko návrhov podobných riešení, ktoré zahŕňajú podvod so SharePointom pri prijímaní hodnoty dnes tak, že najprv vytvoríte stĺpec s názvom Dnes, potom ho pridáte do vzorca a potom ho odstránite. To všetko sú v poriadku a dobré, ale pamätajte, čo som povedal o tom, kedy vypočítané stĺpce sú aktualizované. Táto hodnota sa zmení len pri aktualizácii položky, čo znamená, že hodnoty budú čoskoro nesprávne, najmä v prípade výpočtu dňa.
Videl som iní pomocou chytré JavaScript napísať hodnoty na stránku. To by fungovalo tiež, ale ja som do značnej miery kategoricky proti skriptu klienta, keď sa dá vyhnúť.
Realizácia:
Tak čo robiť? Vypočítané stĺpce sú nesporné pre tzv. nestále funkcie, ako je napríklad Dnes. Je možné, že by sme mohli vytvoriť vlastný kód, aby sme sa o to postarali, napríklad vypočítaný stĺpec, úloha časovača alebo plánovaný proces, aby sme mohli prísť a aktualizovať každú jednu položku, ktorá potrebuje tento výpočet. To nás privádza späť k problému výkonu som sa zmienil v poslednom odseku aj keď, a navyše je to krehké riešenie, ktoré by bolo veľmi špecifické pre stránky / zoznam / stĺpec v otázke. Na vrchole týchto dvoch obáv, budete tiež musieť ísť nájsť blbecek chlap, ako som ja, ktorý vie, ako kód a presvedčiť ho, aby rozvíjať toto riešenie pre vás. Existuje však jednoduchšia cesta!
Ak máte práva na vytváranie polí a úpravu stránok na lokalite a máte trochu vedomostí o XSLT a vytváraní zobrazení, môžete zostaviť šablónu XSL, ktorá môže byť zahrnutá v zobrazení zoznamu a verne vypočíta vašu hodnotu pri každej požiadavke na stránku. Tento scenár odstraňuje naše obavy z výkonu a nevyžaduje vlastný kód, ktorý sa má vyvíjať a nasadzovať prostredníctvom riešenia.
Dokonalý. Tak ako to urobíme?
-
Vytvorte alebo vyberte pole, ktoré bude slúžiť ako náš zdroj. Musí to byť typ dátumu.
-
Vytvorte pole, ktoré bude slúžiť ako zástupný objekt pre vypočítavanú hodnotu.
-
Pridajte obe tieto polia do typu obsahu a tento typ obsahu pridajte do zoznamu.
-
Vytvorte zobrazenie tohto zoznamu obsahujúceho zdrojové aj zástupné stĺpce.
-
Nahrajte šablónu XSL do knižnice štýlov.
-
Nastavte vlastnosť XSL Link pre webovú časť Zobrazenie zoznamu prostredníctvom používateľského rozhrania.
-
Úspech!
Pozrime sa na príklad prípadu použitia a prejdime si implementáciu. Náš zákazník chcel zobraziť ich hlavný zoznam, ktorý by im povedal, ako dlho určitá položka zoznamu sedela pri jeho stave. Tento zoznam obsahoval vlastný typ obsahu lokality odvodený od typu Položka a pridaný do zoznamu. Na mieste už bol príjemca udalostí, ktorý zachytáva vždy, keď sa toto pole stavu v položke zoznamu zmenilo a uložilo tento dátum do stĺpca s názvom Dátum zmeny stavu. To všetko zapojenie nie je potrebné, a možno vykonať s ľubovoľným dátum poľa (to len tak sa stane, je to naša implementácia, ale neváhajte experimentovať). Minimum, ktoré budete potrebovať, je pole zdrojového dátumu a zástupné pole, aby ste udržali výpočet (viac o tom v nasledujúcom odseku) pridaný do zoznamu, aj keď navrhujem, aby ste používali stĺpce lokality a typy obsahu lokality v prípade, že chcete toto riešenie znova použiť na iných miestach na vašej lokalite.
Máme teda náš zdrojový dátum, ktorý môžeme použiť vo výpočte oproti dnešnému dátumu. Teraz môžeme vytvoriť vlastný stĺpec lokality, ktorý sa použije ako kontajner pre vypočítanú hodnotu. V tomto prípade som sa rozhodol použiť vypočítavaný stĺpec, pretože sa nebude dať zmeniť vo formulároch nových alebo upravovaných položiek, ale možno ho vybrať na zobrazenie v zobrazeniach, pretože nechceme, aby používatelia zadávali ľubovoľné hodnoty do tohto stĺpca. Mohlo by byť mätúce, prečo sa nezobrazuje v zobrazeniach atď.
Teraz, keď máme stĺpec lokality, môžeme ho pridať do našich typov obsahu, ktoré sa použijú v našom zozname. Ďalej musíme vytvoriť naše zobrazenie, ktoré bude neskôr prispôsobené pomocou nášho XSLT. Uistite sa, že vytvoríte štandardné zobrazenie obsahujúce stĺpec zdrojového dátumu a nový vypočítaný stĺpec, ktorý bude slúžiť ako zástupný objekt pre vypočítavanú hodnotu.
Teraz máme všetko, čo budeme potrebovať na podporu našej vlastnej zostavy starnutia. Všetko, čo zostáva, je vytvoriť našu šablónu XSL, nahrať ju do knižnice štýlov lokality a prepojiť ju so zobrazením zoznamu. Šablóna XSL, ktorú použijeme, bude obsahovať bežné značky generované SharePointom na generovanie zobrazenia, ako aj vlastné značky, ktoré sa používajú na prepísanie niektorých častí tohto zobrazenia a výpočet požadovanej hodnoty.
Dať úver, kde úver je splatná, XSL šablóny pre to skutočné výpočty používam pre toto riešenie boli láskavo poskytované "swirch" na MSDN fórach:http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/
Stiahnite si šablónu so štýlmi XSL (aging.zip), ktorá sa nachádza tu:https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissionsChanged=1&id=C262E8E2D59A86D9!104
Po otvorení tohto obsahu v obľúbenom textovom editore sa zobrazí veľa bežných značiek XSL SharePointu na vykresľovanie zobrazení. Ak sa budete posúvať nadol do riadka 357, uvidíte začiatok vlastných šablón, ktoré som pridal do značky, pričom prvou bude šablóna DateDiff, za ktorou nasledujú "calculate-julian-day" a "FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020_Status". Toto sú naše tri šablóny, ktoré budú robiť a zobrazovať naše výpočty v našich zobrazeniach. Ak sa chystáte používať iné názvy polí, ako boli uvedené vyššie v tomto článku, budete musieť prejsť týmito šablónami a nahradiť všetky odkazy na iné názvy. Nezabúdajte, že v tomto prípade budete chcieť použiť názov INTERNAL poľa, nie zobrazovaný názov.
Keď sa presvedčíte, že šablóna je pripravená na prechod, prejdite do knižnice štýlov a nahrajte ju do priečinka Šablóny so štýlmi XSL a potom skopírujte prepojenie na súbor. Umožní nám to neskôr v ňom jednoducho vykonávať zmeny alebo ho podľa potreby pridať do rôznych častí lokality.
Potom prejdite do zoznamu a vyberte zobrazenie, ktoré ste vytvorili predtým v tomto článku. V ponuke Akcie lokality kliknite na položku Upraviť stránku.
Vyhľadajte webovú časť Zobrazenie zoznamu na stránke a kliknutím na malú šípku nadol v pravom hornom rohu otvorte ponuku webovej časti. V tejto ponuke vyberte položku Upraviť webovú časť.
Otvorí sa ponuka webovej časti na pravej strane okna prehliadača.
Kliknite na znak + pre časť Rôzne a vyhľadajte vlastnosť XSL Link.
Prilepte prepojenie na súbor XSL do knižnice štýlov, ktorý ste predtým skopírovali (môže to byť relatívne alebo absolútne prepojenie).
Kliknutím na tlačidlo OK uložte zmeny a potom kliknite na tlačidlo Zastaviť úpravy na páse s nástrojmi Stránka v hornej časti stránky.
Ak bolo všetko správne nakonfigurované, v stĺpci Stav dní by sa teraz mali zobrazovať čísla.
A nakoniec, tu je to, ako by to vyzeralo s niektorými testovacími údajmi z rôznych dátumov:
Súhrn:
Existuje: pekne naformátovaný, robustný a výkonnejší spôsob vytvorenia zostavy starnutia v SharePointe s jednoduchou implementáciou bez kódu. To má pomerne málo potenciálnych aplikácií okrem jedného prípadu použitia sme preskúmali tu. Ďalším bežným scenárom pre tento typ zostavy je jej pripojenie k zoznamu úloh, aby ste mohli vidieť, ako dlho uplynula od vytvorenia úlohy na prvý pohľad.
Príjemnú zábavu!
--Justin
Justin Joyce, LANtek
Komentáre
Chýbajú kroky 8.10.2012 3:51 ok som postupovali podľa krokov, ale tam musí byť niečo chýba - ako bude XSL vedieť, ktorý dátum použiť, alebo ktoré pole pridať dni od tej doby do? nenávidia, keď kroky sú zmeškané.
No-Code, súhlasil! 30.8.2012 12:12 Súhlasím - Nemyslím si, že to naozaj počíta ako "žiadny kód".Zaujímavé je, že cez niektoré skrutku SharePoint, mám pracovný vypočítaný stĺpec pomocou Dnes ... nie ste si istí, ako a prečo, pretože nemôžem dostať to urobiť znova, ale ten je stále tam a pracuje.
Vzorec pre vypočítavaný stĺpec Dni v stave? 2. 5. 2012 7:39 Justin – Aký vzorec ste použili pre vypočítaný stĺpec lokality Days At Status (zástupný stĺpec)? Bolo to "=today"?
SharePoint 2007 2.12.2011 11:29 V súčasnosti som sa nepokúsil použiť toto riešenie na SharePoint 2007, ale hľadám v ňom. Bohužiaľ neexistuje žiadna vlastnosť XslLink vyplávala na povrch vo webovej časti prostredníctvom používateľského rozhrania.
Veľký príspevok 30.11.2011 9:53 Dobrý deň Great Post.Používam SharePoint 2007.Nemám sekciu Misc, ako je uvedené vyššie.Máte kroky na konfiguráciu balíka SP2007? Ďakujem.
Re: No-code solution: Displaying the days since a SharePoint list item was last changed 11.10.2011 8:24 Dobrý deň, Chris.skvelé nájsť! Budem sa pozrieť na to, čo ste vyslaný dúfajme, že neskôr dnes a uvidíme, či môžem urobiť toto riešenie trochu robustnejšie.Som rád, že sa vám páčil príspevok, a som veľmi rád, že ste boli schopní nájsť riešenie pre európsky formát dátumu. :) -Justin
Riešenie pre formáty európskych dátumov 11.10.2011 6:45 Ahoj znova Justin, FYI, našiel som riešenie problému som sa zmienil skôr na tejto stránke;https://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/
Formáty európskeho dátumu 7.10.2011 3:59 Dobrý deň, Justin, To je naozaj dobré riešenie vďaka, a len také veci, ktoré som strávil posledné dva dni hľadá! Avšak mám trochu problém s ním a dúfal som, že by ste mi mohli pomôcť.Zmenil som váš kód mierne vypočítať počet dní, kým sa niečo stane, skôr než od tej doby, prepnutím premenných v poslednom riadku funkcie "DateDiff"; <xsl:value-of select="$JulianToday - $JulianStartDate"></xsl:value-of> Avšak som len schopný si to caclulate rozdiel správne polovicu času. Takže napríklad s týmto dátumom (formát dd/MM/rrrr); 12. 30. 2011 Vypočíta sa správne, ale s týmto dátumom (rovnaký formát) 10. 12. 2011 Vypočíta sa, ako keby bol 10. dec 2011 namiesto 12. októbra 2011.Snažil som sa jednoducho prepínanie pozícií deň a mesiac hodnoty v premennej "JulianStartDate", ako je tento; <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 to opraviť problém s druhým dátumom, ale to bolo potom nesprávne pre prvý dátum! Tiež som sa pokúsil zmeniť FormatDateTime volania používať európske LCID a rôzne zmeny na posledný parameter FormatDateTime (napr. ddMMyyyy, MMddyyyy) s príslušnými úpravami podreťazec pozičné parametre bez úspechu.Veľmi by som ocenil akúkoľvek radu, ktorú môžete ponúknuť.Vďaka Chris
Bez kódu 21.9.2011 4:27 Nemyslím si, že XSL kvalifikuje ako "no-code" riešenie, ako pochopenie jazyka XSL nie je pre každého - však to nezahŕňa programovanie. Okrem toho: Pekné riešenie, ďakujem!