Rješenje bez koda: prikaz dana od zadnje promjene stavke popisa

napisao Justin Joyce, LANtek

Napomena

Ovaj je članak dio zbirke objava iz četiri godine bloga Get the Point za krajnje korisnike sustava SharePoint.

Pregled: prilagođena izvješća o zastarivanju bez koda

Jedan od najčešće traženih funkcionalnih dijelova SharePoint web-mjesta izvješće je o zastarivanju zadataka ili stavki popisa. Drugim riječima, koliko je dana/mjeseci prošlo od zadnje izmjene ove stavke popisa?

Na površini se čini da je to vrlo jednostavan zahtjev. Uostalom, imamo datume za stvaranje i izmjenu stavki, imamo mogućnost pohrane prilagođenih datuma kada se određene promjene stavki dovrše putem primatelja događaja. Izračunali smo stupce u koje možemo uvrstiti formule slične programu Excel za rad s našim podacima. Ovo se čini kao prilično jednostavan prijedlog. Izaberemo polje datuma, stvorimo izračunati stupac, a zatim napravimo formulu nešto slično stilu formule [Polje datuma] – [Danas]. Ah, ali ne tako brzo! Kao što svatko tko je pokušao izvršiti taj "jednostavni" zadatak zna, pokušaj korištenja nečega kao što je [Danas] u izračunatom stupcu uzrokuje probleme. Pokušajte umetnuti [Danas] u okvir formule izračunatog stupca prikazat će vam se poruka o pogrešci nalik sljedećoj:

Poruka o pogrešci

Zašto je to tako? To je povezano s načinom na koji se izračunati stupci izračunavaju.

Uzmimo za primjer jednostavnu formulu:

= IF( [Stupac1]<=[Stupac2]; "U redu", "Nije u redu")

Savjetujemo samo da ako je Stupac1 manji od ili jednak stupcu2, onda se prikazuje U redu; u suprotnom prikaži Nije u redu. Ovo je prilično tipična osnovna formula za izračunati stupac, a osnovna pretpostavka o stavci popisa koja sadrži stupce: vrijednosti za stupac1 i stupac2 nikad se neće moći promijeniti bez događaja ažuriranja na stavci popisa.

Tako je, izračunati će se stupci ponovno izračunavati tek nakon ažuriranja (ili stvaranja popisa) jer pretpostavljaju da su informacije koje izračunavate sadržane u samoj stavci. To stvara problem kada pokušavate koristiti nešto što se mijenja neovisno o poljima stavke, kao što je današnji datum.

Nisam bio na sastanku na kojem su odlučili da će tako funkcionirati izračunati stupci, međutim, ako bih morao napraviti obrazovanu pretpostavku, pretpostavio bih da funkcioniraju na ovaj način radi performansi. Zamislite da imate popis od nekoliko tisuća stavki, od kojih svaka sadrži izračunati stupac koji treba ažurirati "uživo". To bi značilo da bi neki mehanizam, možda posao mjerača vremena, morao iterirati svaku stavku koja sadrži taj izračunati stupac svako toliko i ažurirati njegovu vrijednost. To bi moglo biti iznimno opterećujuće u smislu performansi jer s većim implementacijama ovaj posao može stalno biti pokrenut i mijenjati stvari. To je samo moja pretpostavka, ali ima dosta smisla ako razmislite o tome.

Dostupni su prijedlozi sličnih rješenja koji podrazumijevaju prijevaru sustava SharePoint da prihvati vrijednost Danas tako da najprije stvori stupac naziva Danas, doda ga u formulu i izbriše. Sve je to u redu, no ne zaboravite što sam rekao kada se ažuriraju izračunati stupci. Ta će se vrijednost promijeniti tek kada se stavka ažurira, što znači da će vaše vrijednosti uskoro biti netočne, osobito u slučaju izračuna po danu.

Vidio sam druge kako koriste pametan JavaScript za zapisivanje vrijednosti na stranicu. I ovo bi funkcioniralo, ali ja sam prilično kategorički protiv klijentske skripte kada se to može izbjeći.

Provedba:

Pa što učiniti? Izračunati stupci ne dolaze u obzir za takozvane "promjenjive" funkcije kao što je Today. Moguće je da bismo mogli razviti neki prilagođeni kod koji bi se pobrinuo za to umjesto nas, poput izračunatog stupca, zadatka mjerača vremena ili zakazanog procesa koji bi se pojavio i ažurirao svaku pojedinu stavku za koju je potreban ovaj izračun. To nas vraća na problem performansi koji sam spomenuo u posljednjem odlomku, a osim toga to je krhko rješenje koje bi bilo vrlo specifično za dotičnu stranicu/popis/stupac. Povrh te dvije brige, također biste morali pronaći štrebera, poput mene, koji zna kodirati i uvjeriti ga da razvije ovo rješenje za vas. No postoji i lakši način!

Ako imate prava na stvaranje polja i uređivanje stranica na web-mjestu te ste dobro upoznati s XSLT-om i stvaranjem prikaza, možete sastaviti XSL predložak koji se može uvrstiti u prikaz popisa i koji će vjerno izračunati vrijednost svaki put kada se zatraži stranica. Taj scenarij uklanja našu zabrinutost oko performansi i ne zahtijeva razvoj i implementaciju prilagođenog koda putem rješenja.

Savršeno. Pa kako to radimo?

  1. Stvorite ili odaberite polje koje će funkcionirati kao naš izvor. Mora biti vrste datuma.
  2. Stvorite polje koje će funkcionirati kao rezervirano mjesto za vrijednost koja se izračunava.
  3. Dodajte oba polja u vrstu sadržaja i dodajte tu vrstu sadržaja na popis.
  4. Stvorite prikaz tog popisa koji sadrži i izvorni stupac i stupac rezerviranog mjesta.
  5. Prenesite XSL predložak u biblioteku stilova.
  6. Putem korisničkog sučelja postavite svojstvo "XSL veza" za web-dio prikaza popisa.
  7. Uspjelo je!

Istražimo primjer slučaja korištenja i prođimo kroz implementaciju. Naši su klijenti željeli prikaz glavnog popisa koji bi im pokazao koliko je dugo određena stavka popisa stajala na statusu. Taj je popis sadržavao prilagođenu vrstu sadržaja web-mjesta izvedenu iz vrste stavke i dodanu na popis. Već je postojao primatelj događaja koji bilježi svaki put kada je polje stanja u stavci popisa promijenjeno i sprema taj datum u stupac pod nazivom "Datum promjene statusa". Svo ovo ožičenje nije potrebno, a može se obaviti s BILO KOJIM poljem datuma (slučajno je ovo naša implementacija, ali slobodno eksperimentirajte). Minimum koji vam je potreban je izvorno polje datuma i polje rezerviranog mjesta za izračun (više o tome u sljedećem odlomku) koji je dodan na vaš popis, iako predlažem da koristite stupce web-mjesta i vrste sadržaja web-mjesta u slučaju da ovo rješenje želite ponovno koristiti na drugim mjestima na web-mjestu.

Dakle, imamo izvorišni datum koji možemo koristiti u izračunu s današnjim datumom. Sada možemo stvoriti prilagođeni stupac web-mjesta koji će se koristiti kao spremnik izračunate vrijednosti. U ovom slučaju odabrali sam izračunati stupac jer se neće moći mijenjati na obrascu za novu stavku ili obrascu za uređivanje, ali će se moći odabrati za prikaz u prikazima jer ne želimo da korisnici u taj stupac unose proizvoljne vrijednosti. Moglo bi biti zbunjujuće zašto se ne prikazuje u prikazima, itd.

Sada kada imamo stupac web-mjesta, možemo ga dodati u naše vrste sadržaja koje će se koristiti na našem popisu. Zatim moramo stvoriti prikaz koji će se kasnije prilagoditi uz XSLT. Obavezno stvorite standardni prikaz koji sadrži stupac izvorišnog datuma i novi izračunati stupac koji će funkcionirati kao rezervirano mjesto za izračunatu vrijednost.

Sada imamo sve što nam je potrebno za podršku prilagođenom izvješću o zastarivanju. Preostaje samo stvoriti naš XSL predložak, prenijeti ga u biblioteku stilova web-mjesta i povezati ga s našim prikazom popisa. XSL predložak koji ćemo koristiti sadržavat će neke normalne oznake koje generira SharePoint za generiranje prikaza, kao i naše prilagođene oznake koje se koriste za nadjačavanje određenih dijelova ovoga i izračun željene vrijednosti.

Odajući priznanje tamo gdje je zasluga, XSL predloške za obavljanje stvarnih izračuna koje koristim za ovo rješenje ljubazno je pružio "swirch" na MSDN forumima:
http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/

Preuzmite XSL listu stilova (aging.zip) koju sam sastavio, a nalazi se ovdje:
https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissionsChanged=1&id=C262E8E2D59A86D9!104

Ako ovo otvorite u omiljenom uređivaču teksta, vidjet ćete mnoštvo uobičajenih SharePoint XSL oznaka za prikaz prikaza, ako se nastavite pomicati prema dolje do retka 357, vidjet ćete početak prilagođenih predložaka koje sam dodao oznaci, prvi je predložak "DateDiff" nakon kojeg slijede "calculate-julian-day" i "FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020_Status". Ovo su tri predloška koji omogućuju stvaranje i prikaz izračuna u našim prikazima. Ako namjeravate koristiti drugačije nazive polja od onih koji su navedeni ranije u ovom članku, morate pregledati te predloške i zamijeniti sve reference na druge nazive. Imajte na umu da ćete za to koristiti INTERNI naziv polja, a ne zaslonski naziv.

Kada se uvjerite da je predložak spreman za upotrebu, pronađite biblioteku stilova i prenesite je u mapu "XSL listovi stilova", a zatim kopirajte vezu na datoteku. To će nam omogućiti da ga kasnije lako mijenjamo ili dodamo u različite dijelove web stranice kako želimo.

Zatim idite na popis i odaberite prikaz koji ste stvorili na početku članka. U izborniku "Akcije web-mjesta" kliknite "Uredi stranicu".

Snimka zaslona za odabir primarnog uređaja

Na stranici pronađite web-dio prikaza popisa i kliknite malu strelicu prema dolje u gornjem desnom kutu da biste otvorili izbornik web-dijela. Na tom izborniku odaberite "Uredi web-dio".

Izgled SmartArt grafika

Time ćete na desnoj strani prozora preglednika otvoriti izbornik web-dijela.

Izbornik web-dijela

Kliknite na + za odjeljak "Razno" i pronađite svojstvo "XSL veza".

XSL Link property on Web Part menu

Zalijepite vezu na XSL datoteku u biblioteku stilova koju ste ranije kopirali (može biti relativna ili apsolutna veza).

Snimka zaslona s pločicom povijesti i više izravnih poruka. Propuštena je izravna poruka istaknuta.

Kliknite "U redu" da biste spremili promjene, a zatim kliknite gumb "Zaustavi uređivanje" na vrpci "Stranica" pri vrhu stranice.

Stop Editing button on Page tab

Ako je sve ispravno konfigurirano, sada biste trebali vidjeti brojeve u stupcu "Dani u statusu".

Days At Status column displaying number

I na kraju, evo kako bi to izgledalo s nekim testnim podacima različitih datuma:

Aging Report displaying test data

Sažetak:

Evo ga: lijepo oblikovan, robustan i uspješniji način stvaranja izvješća o zastarivanju u sustavu SharePoint, upotpunjen jednostavnom implementacijom bez koda. Ovo ima dosta potencijalnih primjena osim jednog slučaja upotrebe koji smo ovdje istražili. Drugi je uobičajen scenarij za tu vrstu izvješća prilaganje izvješća popisu zadataka da biste na prvi pogled mogli vidjeti koliko je vremena prošlo od stvaranja zadatka.

Uživajte!

--Justin

Justin Joyce, LANtek

Komentari

Nedostaju koraci
8.10.2012. 3:51
ok Pratio sam korake, ali mora da nešto nedostaje - kako će XSL znati koji datum koristiti ili u koje polje dodati dane od koja? Mrzim kad se koraci propuste.

Bez koda, dogovoreno!
30. 8. 2012. 12:12
Slažem se - mislim da se ovo zapravo ne računa kao "bez koda".
Zanimljivo je da sam zbog neke greške u sustavu SharePoint dobio izračunati stupac koji radi koristeći Danas... nisam siguran kako i zašto jer ga ne mogu natjerati da to učini ponovo, ali jedan je još uvijek tu i radi.

Formula za izračunati stupac "Dani u statusu"?
2. 5. 2012. 7:39
Justin – koju ste formulu koristili za izračunati stupac web-mjesta (stupac rezerviranog mjesta) "Days At Status"? Je li to bio "=danas"?

SharePoint 2007
2.12.2011. 11:29
Trenutno ne pokušavam primijeniti ovo rješenje na SharePoint 2007, ali ga razmatram. Nažalost, u korisničkom se sučelju na web-dijelu ne prikazuje nikakvo svojstvo XslLink.

Sjajan post
30. 11. 2011. 9:53
Pozdrav,
Odličan post.
Koristim SharePoint 2007.
Nemam odjeljak Razno kao što je gore navedeno.
Imate li upute za konfiguraciju paketa SP2007?
Hvala.

Re: Rješenje bez kodiranja: Prikaz dana od zadnje promjene stavke popisa sustava SharePoint
11.10.2011. 8:24
Bok Chris.
Odlično otkriće!
Pogledat ću što ste objavili, nadam se kasnije danas i vidjeti mogu li ovo rješenje učiniti malo robusnijim.
Drago mi je da vam se svidio post i jako mi je drago što ste uspjeli pronaći rješenje za europski format datuma. :)
-Justin

Rješenje za europske oblike datuma
11.10.2011. 6:45
Pozdrav opet Justin,
Za vašu informaciju, pronašao sam rješenje za problem koji sam ranije spomenuo na ovoj stranici;
https://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/

Europski oblici datuma
7.10.2011. 3:59
Pozdrav Justin,
Ovo je stvarno dobro rješenje, hvala, i upravo ono što sam proveo posljednja dva dana tražeći! Međutim, imam mali problem s tim i nadao sam se da mi možete pomoći.
Malo sam izmijenio vaš kod kako bih izračunao broj dana dok se nešto ne dogodi, a ne poslije, prebacivanjem varijabli u zadnjem retku funkcije "DateDiff";

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

Međutim, uspio sam ga natjerati da ispravno izračuna razliku samo pola vremena. Tako na primjer s ovim datumom (oblik dd/MM/gggg);

30/12/2011

Izračunava točno, ali s ovim datumom (u istom obliku)

12/10/2011

Izračunava se kao da je 10. prosinca 2011., a ne 12. listopada 2011.
Pokušao sam jednostavno promijeniti položaje vrijednosti dana i mjeseca u varijabli "JulianStartDate", ovako;

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

I to je riješilo problem s drugim spojem, međutim tada je bio netočan za prvi spoj!
Također sam pokušao promijeniti FormatDateTime pozive kako bi koristio europske LCID-ove i razne izmjene zadnjeg parametra FormatDateTime (npr. ddMMyyyy, MMddyyyy) s odgovarajućim prilagodbama parametara položaja podniza bez uspjeha.
Jako bih cijenio svaki savjet koji možete ponuditi.
Hvala,
Tomislav

No-Code
21. 9. 2011. 04:27
Mislim da se XSL ne kvalificira kao "no-code" rješenje, jer razumijevanje XSL jezika nije za svakoga - međutim ne uključuje programiranje. Osim toga: Lijepo rješenje, hvala!