od strane Justin Džojs, LANtek
Napomena
Ovaj članak je deo kolekcije objava iz četiri godine bloga " Preuzmi poentu " za krajnje korisnike sistema SharePoint.
Pregled: prilagođeni izveštaji o starenju bez koda
Jedan od često traženih funkcionalnih delova SharePoint lokacije je izveštaj o zastarevanju za zadatke ili stavke liste. Drugim rečima, koliko dana/meseci je prošlo od poslednje izmene ove stavke sa liste?
Na površini, ovo izgleda kao vrlo jednostavan zahtev. Na kraju krajeva, imamo datume za stavke koje se kreiraju i menjaju, imamo mogućnost da uskladištimo prilagođene datume kada se određene promene stavki odvijaju putem prijemnika događaja. Izračunali smo kolone u koje možemo da uključimo formule slične programu Excel za rad sa informacijama. Ovo izgleda kao prilično jednostavan predlog. Izaberemo polje za datum, napravimo izračunatu kolonu, a zatim napravimo formulu nešto slično kao [PoljeDatuma] – [Danas]. Ah, ne tako brzo! Kao što svako ko je pokušao da izvrši ovaj "jednostavan" zadatak zna, pokušaj korišćenja nečega poput [Danas] u izračunatoj koloni uzrokuje probleme. Pokušaj da umetnete [Danas] u okvir za formulu izračunate kolone prikazaće poruku o grešci nalik na ovu:
Zašto je to tako? Pa, to ima veze sa načinom na koji se izračunavaju izračunate kolone.
Uzmimo jednostavnu formulu kao primer:
= IF( [Kolona1]<=[Kolona2], "U redu", "Nije u redu")
Sve što ovo govori je da ako je Kolona1 manja od ili jednaka koloni2, prikaži "U redu", u suprotnom prikaži "Nije u redu". Ovo je prilično tipična osnovna formula za izračunatu kolonu koja pravi osnovnu pretpostavku o stavci liste koja sadrži te kolone: vrednosti za Kolone1 i Kolonu2 nikada neće moći da se promene bez događaja Ažuriranja za stavku liste.
Tako je, izračunate kolone će se ponovo izračunati samo kada se lista ažurira (ili napravi) jer pretpostavljaju da su informacije koje izračunavate sadržane u samoj stavki. Ovo stvara problem kad pokušate da koristite nešto što se menja nezavisno od polja stavke, kao što je današnji datum.
Sada nisam bio na sastanku na kojem su odlučili da je to način na koji će izračunate kolone funkcionisati, međutim, ako bih morao da napravim obrazovanu pretpostavku, pretpostavio bih da oni funkcionišu na ovaj način za performanse. Zamislite da imate listu od nekoliko hiljada stavki, od kojih svaka sadrži izračunatu kolonu koju je potrebno ažurirati "uživo". To bi značilo da bi neki mehanizam, možda posao tajmera, morao povremeno da ponavlja svaku stavku koja sadrži tu izračunatu kolonu i ažurira njenu vrednost. Ovo bi moglo biti izuzetno oporezujuće u pogledu performansi, jer sa većim raspoređivanjem ovaj posao može stalno raditi i menjati stvari. To je samo moja pretpostavka, ali ima dosta smisla ako razmislite o tome.
Postoje neki predlozi za slična rešenja koja uključuju prevaru sistema SharePoint da prihvati vrednost "Danas" tako što će prvo kreirati kolonu pod imenom "Danas", zatim je dodati u formulu, a zatim izbrisati. Sve je to u redu, ali ne zaboravite šta sam rekao o tome kada se izračunate kolone ažuriraju. Ova vrednost će se promeniti samo kada se stavka ažurira, što znači da će vrednosti uskoro biti netačne, naročito u slučaju izračunavanja dana.
Video sam druge kako koriste pametan JavaScript za pisanje vrednosti na stranici. Ovo bi takođe funkcionisalo, ali ja sam prilično kategorički protiv klijentske skripte kada se to može izbeći.
Primena:
Pa šta da radim? Izračunate kolone ne dolaze u obzir za takozvane "nepostojane" funkcije kao što je današnji datum. Moguće je da bismo mogli da razvijemo neki prilagođeni kod koji bi se pobrinuo za ovo za nas, kao što je izračunata kolona, tajmer ili planirani proces koji će doći i ažurirati svaku stavku koja treba izvršiti ovo izračunavanje. To nas vraća na problem performansi koji sam pomenuo u poslednjem paragrafu, a pored toga je krhko rešenje koje bi bilo veoma specifično za sajt / listu / kolonu u pitanju. Povrh ove dve brige, takođe biste morali da pronađete štreberskog momka, kao što sam ja, koji zna kako da kodira i ubedi ga da razvije ovo rešenje za vas. Ali postoji lakši način!
Ako imate prava da kreirate polja i uređivate stranice na vašoj lokaciji i imate malo znanja o XSLT-u i kreiranju prikaza, možete da sastavite XSL predložak koji može biti uključen u prikaz liste i koji će verno izračunati vašu vrednost svaki put kada se zahteva stranica. Ovaj scenario uklanja našu brigu o performansama i ne zahteva razvoj i primenu prilagođenog koda putem rešenja.
Savršeno. Kako to da uradimo?
- Kreirajte ili izaberite polje koje će se ponašati kao naš izvor. Mora biti tipa datuma.
- Kreirajte polje koje će se ponašati kao čuvar mesta za vrednost koja se izračunava.
- Dodajte oba ova polja tipu sadržaja i dodajte taj tip sadržaja na listu.
- Kreirajte prikaz te liste koji sadrži izvornu kolonu i kolonu čuvara mesta.
- Otpremite XSL predložak u biblioteku stilova.
- Postavite svojstvo "XSL veza" za veb segment za prikaz liste pomoću korisničkog interfejsa.
- Uspelo je!
Hajde da istražimo primer slučaja upotrebe i prođimo kroz primenu. Naš klijent je želeo da ima prikaz glavne liste koji će im reći koliko dugo je određena stavka liste u svom statusu. Ova lista je sadržala prilagođeni tip sadržaja lokacije izveden iz tipa stavke i dodat na listu. Već je postojao prijemnik događaja koji snima svaki put kada se to statusno polje na stavci liste promeni i čuva taj datum u koloni pod imenom "Datum promene statusa". Sve ovo ožičenje nije potrebno, i može se uraditi sa bilo kojim datumom polja (to se samo tako dešava ovo je naša implementacija, ali slobodno eksperimentišite). Minimum koji će vam trebati je polje izvornog datuma i polje čuvara mesta za držanje izračunavanja (više o tome u sledećem pasusu) dodatih na listu, mada predlažem da koristite kolone sajta i tipove sadržaja sajta u slučaju da želite ponovo da koristite ovo rešenje na drugim mestima na vašem sajtu.
Dakle, imamo datum izvora koji možemo da koristimo u izračunavanju u odnosu na današnji datum. Sada možemo da napravimo prilagođenu kolonu lokacije koju ćemo koristiti kao kontejner za izračunatu vrednost. U ovom slučaju odabrao sam da koristim izračunatu kolonu zato što je nije moguće promeniti u obrascu za nove niti uređivanje stavki, ali može da se izabere za prikaz u prikazima jer ne želimo da korisnici unose proizvoljne vrednosti u ovu kolonu. To može biti zbunjujuće zašto se ne prikazuje u prikazima, itd.
Sada kada imamo kolonu sajta, možemo da je dodamo u tipove sadržaja koji će se koristiti na listi. Zatim treba da kreiramo prikaz koji će kasnije biti prilagođen pomoću XSLT-a. Obavezno kreirajte standardni prikaz koji sadrži kolonu sa izvornim datumom i novu izračunatu kolonu koja će se ponašati kao čuvar mesta za izračunatu vrednost.
Sada imamo sve što će nam biti potrebno da podržimo naš prilagođeni izveštaj o starenju. Sve što preostaje je da kreiramo XSL predložak, otpremimo ga u biblioteku stilova sajta i povežemo ga sa prikazom liste. XSL predložak koji ćemo koristiti sadržaće neke normalne SharePoint generisane naznake za generisanje prikaza, kao i naše prilagođene naznake koje se koriste za zamenu određenih delova ovoga i izračunavanje željene vrednosti za nas.
Dajući kredit tamo gde je kredit dospeo, KSSL šabloni za obavljanje stvarnih proračuna koje koristim za ovo rešenje su ljubazno obezbeđeni od strane "swirch" na MSDN forumima:
http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/
Preuzmite KSSL stilski opis (aging.zip) koji sam sastavio koji se nalazi ovde:
https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissionsChanged=1&id=C262E8E2D59A86D9!104
Otvarajući ovo u vašem omiljenom uređivaču teksta, videćete dosta normalnih SharePoint XSL oznaka za prikazivanje prikaza, ako nastavite da se pomerate do reda 357 videćete početak prilagođenih šablona koje sam dodao u naznaku, prvi je "DateDiff" šablon praćen sa "calculate-julian-day" i "FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020_Status". Ovo su naša tri predloška koji prave i prikazuju naša izračunavanja u prikazima. Ako planirate da koristite imena polja koja se razlikuju od imena navedenih ranije u ovom članku, moraćete da prođete kroz ove predloške i zamenite reference na druga imena. Ne zaboravite, za ovo ćete želeti da koristite INTERNO ime polja, a ne ime za prikaz.
Kada budete sigurni da je predložak spreman za upotrebu, idite u biblioteku stilova i otpremite ga u fasciklu "XSL opisi stilova", a zatim kopirajte vezu do datoteke. To će nam omogućiti da kasnije lako unosimo promene u njih ili da ih dodajemo u različite delove lokacije po želji.
Zatim idite na listu i izaberite prikaz koji ste kreirali ranije u ovom članku. Iz menija "Radnje na lokaciji" izaberite stavku "Uredi stranicu".
Pronađite veb segment za prikaz liste na stranici i otvorite meni veb segmenta klikom na strelicu usmerenu nadole u gornjem desnom uglu. Iz ovog menija izaberite stavku "Uredi veb segment".
Time ćete otvoriti meni veb segmenta sa desne strane prozora pregledača.
Kliknite na + za odeljak "Razno" i pronađite svojstvo "XSL veza".
Nalepite vezu ka XSL datoteci u biblioteci stilova koju ste prethodno kopirali (to može biti relativna ili apsolutna veza).
Kliknite na dugme "U redu" da biste sačuvali promene, a zatim kliknite na dugme "Zaustavi uređivanje" na traci "Stranica" na vrhu stranice.
Ako je sve ispravno konfigurisano, sada bi trebalo da vidite brojeve u koloni "Dani u statusu".
I na kraju, evo kako bi to izgledalo sa nekim testnim podacima različitih datuma:
Rezime:
Evo ga: lepo oblikovan, robustan i bolje performansan način za kreiranje izveštaja o zastarelosti u sistemu SharePoint., kompletan sa jednostavnom primenom bez kodova. Ovo ima dosta potencijalnih aplikacija osim jednog slučaja upotrebe koji smo ovde istraživali. Drugi uobičajeni scenario za ovaj tip izveštaja jeste prilaganje izveštaja na listu zadataka tako da na prvi pogled možete da vidite koliko je prošlo od kreiranja zadatka.
Uživajte!
--Džastin
Džastin Džojs, LANtek
Komentari
Koraci nedostaju
8.10.2012. 3:51
ok Pratio sam korake, ali mora da nešto nedostaje - kako će KSSL znati koji datum da koristi, ili koje polje da doda dane u? Mrzim kada se propuste koraci.
No-Code, agreed!
30.8.2012. 12:12 popodne
Slažem se - mislim da se ovo zaista ne računa kao "bez koda".
Zanimljivo je da sam zbog nekog zajeba sistema SharePoint dobio izračunatu kolonu koja koristi stavku "Danas... nisam siguran kako ili zašto, jer ne mogu da ga nateram da to uradi ponovo, ali jedan je još uvek tu i radi.
Formula za izračunatu kolonu "Dani u statusu"?
2.5.2012. 7:39
Justin – Koja je formula koja se koristi za izračunatu kolonu lokacije "Dani u statusu" (kolona čuvara mesta)? Da li je bilo "= danas"?
SharePoint 2007
2.12.2011. 11:29
Trenutno ne pokušavam da primenim ovo rešenje na SharePoint 2007, ali ga razmatram. Nažalost, ne postoji svojstvo XslLink koje se pojavljuje na veb segmentu putem korisničkog interfejsa.
Odlična poruka
30.11.2011. 9:53
Zdravo,
Odličan post.
Koristim SharePoint 2007.
Nemam odeljak Ostalo kao što je gore navedeno.
Da li imate korake za konfiguraciju SP2007?
Hvala.
Re: Rešenje bez koda: Prikazivanje dana od poslednje izmene stavke SharePoint liste
11.10.2011. 08:24
Zdravo Kris.
Odlično otkriće!
Ja ću pogledati šta ste objavili, nadam se kasnije danas i videti da li mogu da napravim ovo rešenje malo robusnijim.
Drago mi je da vam se svideo post, i veoma mi je drago što ste uspeli da pronađete rešenje za evropski format datuma. :)
-Džastin
Rešenje za evropske formate datuma
11.10.2011. 6:45
Zdravo opet Džastine,
Za vašu informaciju, pronašao sam rešenje za problem koji sam ranije pomenuo na ovoj stranici;
https://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/
Evropski formati datuma
7.10.2011. 3:59
Zdravo Džastine,
Ovo je stvarno dobro rešenje hvala, i upravo ono što sam proveo poslednja dva dana u potrazi za! Međutim, imam malo problema sa tim i nadao sam se da biste mi mogli pomoći.
Malo sam promenio vaš kod da bih izračunao broj dana dok se nešto ne desi, a ne posle, prebacivanjem promenljivih u poslednjem redu funkcije "DateDiff";
<xsl:value-of select="$JulianToday - $JulianStartDate"></xsl:value-of>
Međutim, uspeo sam da ga nateram da pravilno izračunam razliku u polovini vremena. Tako na primer sa ovim datumom (format dd/MM/gggg);
30/12/2011
Izračunava ispravno, ali sa ovim datumom (u istom formatu)
12/10/2011
Izračunava se kao da je 10-dec-2011, a ne 12-okt-2011.
Pokušao sam jednostavno prebaciti pozicije vrednosti dana i meseca u promenljivoj "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 rešilo problem sa drugim datumom, međutim tada je bio netačan za prvi sastanak!
Takođe sam pokušao da promenim FormatDateTime pozive da koristi evropske LCID-ove i razne izmene poslednjeg parametra FormatDateTime (npr. ddMMyyyy, MMddyyyy) sa odgovarajućim podešavanjima parametara pozicije podniske bez uspeha.
Bio bih veoma zahvalan na svakom savetu koji možete ponuditi.
Hvala,
Jun
No-Code
9/21/2011 4:27 AM
Ne mislim da se XSL kvalifikuje kao "no-code" rešenje, jer razumevanje XSL jezika nije za svakoga - međutim ne uključuje programiranje. Pored toga: Lepo rešenje, hvala!