avtor Justin Joyce, LANtek
Opomba
Ta članek je del zbirke objav iz štirih let spletnega dnevnika Get the Point za SharePointove končne uporabnike.
Pregled: Poročila o staranju po meri brez kode
Eden od pogosto zahtevanih funkcionalnih delov SharePointovega mesta je poročilo o staranju za opravila ali elemente seznama. Z drugimi besedami, koliko dni / mesecev je minilo, odkar je bil ta element seznama nazadnje spremenjen?
Na prvi pogled se zdi, da je to zelo preprosta zahteva. Navsezadnje imamo datume za ustvarjanje in spreminjanje predmetov, imamo možnost shranjevanja datumov po meri, ko se določene spremembe predmetov zgodijo prek prejemnikov dogodkov. Izračunali smo stolpce, v katere lahko vključimo formule, podobne Excelu, za delo z našimi informacijami. To se zdi precej preprost predlog. Izberemo datumsko polje, ustvarimo izračunani stolpec in nato naredimo formulo v vrsticah [DateField] – [Today]. Ah, vendar ne tako hitro! Vsakdo, ki je poskušal opraviti to »preprosto« nalogo, ve, da poskus uporabe nečesa, kot je [Danes] v izračunanem stolpcu, povzroča težave. Poskusite vstaviti [Danes] v polje formule izračunanega stolpca in se prikaže sporočilo o napaki, podobno temu:
Zakaj je tako? No, to je povezano z načinom izračuna izračunanih stolpcev.
Vzemimo za primer preprosto formulo:
= IF( [stolpec1]<=[stolpec2], "V redu", "ni v redu")
Vse to pravi, da če je stolpec 1 manjši ali enak stolpcu 2, prikažite OK, sicer prikažite Ni v redu. To je dokaj tipična osnovna formula za izračunani stolpec in daje osnovno predpostavko o elementu seznama, ki vsebuje te stolpce: vrednosti za stolpec1 in stolpec2 ne bo mogoče nikoli spremeniti brez dogodka posodobitve na elementu seznama.
Tako je, izračunani stolpci se bodo preračunali šele, ko bo seznam posodobljen (ali ustvarjen), saj predvidevajo, da so podatki, ki jih izračunate, vsebovani v samem elementu. To povzroča težavo, ko poskušate uporabiti nekaj, kar se spremeni neodvisno od polj elementa, na primer današnji datum.
Zdaj nisem bil na sestanku, kjer so se odločili, da bodo tako delovali izračunani stolpci, če pa bi moral ugibati, bi domneval, da delujejo na ta način za uspešnost. Predstavljajte si, če bi imeli seznam več tisoč elementov, od katerih bi vsak vseboval izračunani stolpec, ki je potreboval »živo« posodobitev. To bi pomenilo, da bi moral nekakšen mehanizem, morda časovnik, vsake toliko časa ponavljati skozi vsak element, ki je vseboval ta izračunani stolpec, in posodobiti njegovo vrednost. To bi lahko bilo zelo obremenjujoče v smislu zmogljivosti, saj lahko z večjimi uvajanjem to delo nenehno teče in spreminja stvari. To je samo moja domneva, vendar je precej smiselno, če pomislite.
Obstaja nekaj predlogov za podobne rešitve, ki vključujejo prevaro SharePointa, da sprejme vrednost danes, tako da najprej ustvarite stolpec z imenom Danes, ga nato dodate v formulo in nato izbrišete. Vse to je lepo in dobro, vendar ne pozabite, kaj sem rekel o tem, ko so izračunani stolpci posodobljeni. Ta vrednost se bo spremenila šele, ko bo element posodobljen, kar pomeni, da bodo vaše vrednosti kmalu napačne, zlasti v primeru dnevnega izračuna.
Videl sem, da drugi uporabljajo pameten JavaScript za pisanje vrednosti na stran. Tudi to bi delovalo, vendar sem precej kategorično proti odjemalskemu skriptu, ko se mu je mogoče izogniti.
Izvajanje:
Torej, kaj storiti? Izračunani stolpci ne pridejo v poštev za tako imenovane »nestanovitne« funkcije, kot je Today. Možno je, da bi lahko razvili nekaj kode po meri, ki bi poskrbela za to za nas, kot je izračunani stolpec, časovnik ali načrtovani postopek, ki bi prišel in posodobil vsak posamezen element, ki potrebuje ta izračun. To nas pripelje nazaj k problemu uspešnosti, ki sem ga omenil v zadnjem odstavku, poleg tega pa je krhka rešitev, ki bi bila zelo specifična za zadevno spletno mesto / seznam / stolpec. Poleg teh dveh skrbi bi morali poiskati tudi piflarja, kot sem jaz, ki zna kodirati in ga prepričati, da razvije to rešitev za vas. Obstaja pa lažji način!
Če imate pravice za ustvarjanje polj in urejanje strani na svojem spletnem mestu ter imate nekaj znanja o XSLT in ustvarjanju pogledov, lahko sestavite predlogo XSL, ki jo je mogoče vključiti v pogled seznama in bo zvesto izračunala vašo vrednost vsakič, ko boste zahtevali stran. Ta scenarij odpravlja našo skrb glede učinkovitosti delovanja in ne zahteva razvoja in uvedbe kode po meri prek rešitve.
Popolno. Torej, kako to storimo?
- Ustvarite ali izberite polje, ki bo delovalo kot naš vir. To mora biti vrsta datuma.
- Ustvarite naše polje, ki bo delovalo kot označba mesta za vrednost, ki se izračuna.
- Dodajte obe polji v vrsto vsebine in jo dodajte na seznam.
- Ustvarite pogled tega seznama, ki vsebuje stolpca vira in označbe mesta.
- Prenesite predlogo XSL v knjižnico slogov
- Nastavite lastnost »Povezava XSL« za spletni gradnik pogleda seznama prek uporabniškega vmesnika.
- Uspelo je!
Raziščimo primer uporabe in se sprehodimo skozi implementacijo. Naša stranka je želela pogled na svoj glavni seznam, ki bi jim povedal, kako dolgo je določen element seznama sedel v svojem stanju. Ta seznam je vseboval vrsto vsebine mesta po meri, ki izhaja iz vrste elementa in je bila dodana na seznam. Sprejemnik dogodkov je že obstajal, ki zajame vsakič, ko je bilo spremenjeno polje stanja na elementu seznama, in ta datum shrani v stolpec z imenom »Datum spremembe stanja«. Vse to ožičenje ni potrebno in ga je mogoče narediti s KATERIM koli datumskim poljem (slučajno je to naša izvedba, vendar vas prosimo, da eksperimentirate). Najmanjši minimum, ki ga boste potrebovali, je polje izvornega datuma in polje označbe mesta, da boste svoj izračun (več o tem v naslednjem odstavku) dodali na seznam, čeprav predlagam, da uporabite stolpce spletnega mesta in vrste vsebine spletnega mesta, če želite to rešitev znova uporabiti na drugih mestih na vašem spletnem mestu.
Torej imamo izvorni datum, ki ga lahko uporabimo pri izračunu glede na današnji datum. Zdaj lahko ustvarimo stolpec spletnega mesta po meri, ki ga bomo uporabili kot vsebnik za izračunano vrednost. V tem primeru sem se odločil za uporabo izračunanega stolpca, ker ga ne bo mogoče spremeniti v obrazcih za nove ali urejanje elementov, ampak ga je mogoče izbrati za prikaz v pogledih, saj ne želimo, da uporabniki v ta stolpec vnašajo poljubne vrednosti. Lahko bi bilo zmedeno, zakaj ni prikazan v pogledih itd.
Zdaj, ko imamo stolpec spletnega mesta, ga lahko dodamo našim vrstam vsebine, ki bodo uporabljene na našem seznamu. Nato moramo ustvariti pogled, ki ga bomo kasneje prilagodili z našim XSLT. Ustvarite standardni pogled, ki vsebuje stolpec izvornega datuma in nov izračunani stolpec, ki bo deloval kot označba mesta za izračunano vrednost.
Zdaj imamo vse, kar bomo potrebovali za podporo našemu poročilu o staranju po meri. Vse, kar ostane, je ustvariti našo predlogo XSL, jo naložiti v knjižnico slogov spletnega mesta in jo povezati z našim pogledom seznama. Predloga XSL, ki jo bomo uporabili, bo vsebovala nekaj običajnih oznak, ki jih ustvari SharePoint, za ustvarjanje pogleda, kot tudi naše lastne oznake po meri, ki se uporabljajo za preglasitev določenih delov tega in izračun želene vrednosti za nas.
Če pripisujem zasluge, so predloge XSL za dejanske izračune, ki jih uporabljam za to rešitev, milostno zagotovil "swirch" na forumih MSDN:
http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/
Prenesite slogno tabelo XSL (aging.zip), ki sem jo sestavil tukaj:
https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissionsChanged=1&id=C262E8E2D59A86D9!104
Če to odprete v svojem najljubšem urejevalniku besedila, boste videli veliko običajnih oznak SharePoint XSL za upodabljanje pogledov, če se še naprej pomikate navzdol do vrstice 357, boste videli začetek predlog po meri, ki sem jih dodal v oznako, prva je predloga »DateDiff«, ki ji sledita »calculate-julian-day« in »FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020_Status«. To so naše tri predloge, ki bodo izdelale in prikazale naše izračune v naših pogledih. Če boste uporabljali drugačna imena polj, kot so bila navedena prej v tem članku, boste morali pregledati te predloge in zamenjati morebitne reference na druga imena. Ne pozabite, da boste za to želeli uporabiti NOTRANJE ime polja in ne prikazno ime.
Ko ste prepričani, da je predloga pripravljena za uporabo, se pomaknite v knjižnico slogov in jo naložite v mapo »XSL Style Sheets«, nato kopirajte povezavo do datoteke. To nam bo omogočilo, da ga pozneje enostavno spremenimo ali dodamo v različne dele spletnega mesta, kot želimo.
Nato pojdite na seznam in izberite pogled, ki ste ga ustvarili prej v tem članku. V meniju »Dejanja spletnega mesta« kliknite »Uredi stran«.
Na strani poiščite spletni gradnik pogleda seznama in odprite meni spletnega gradnika tako, da kliknete majhno puščico navzdol v zgornjem desnem kotu. V tem meniju izberite »Uredi spletni gradnik«.
S tem se odpre meni spletnega gradnika na desni strani okna brskalnika.
Kliknite + za razdelek »Razno« in poiščite lastnost »Povezava XSL«.
Prilepite povezavo do datoteke XSL v knjižnico slogov, ki ste jo prej kopirali (to je lahko relativna ali absolutna povezava).
Kliknite »V redu«, da shranite spremembe, nato kliknite gumb »Ustavi urejanje« na traku »Stran« na vrhu strani.
Če je bilo vse pravilno konfigurirano, bi zdaj morali videti številke v stolpcu »Dnevi v stanju«.
In končno, tukaj je, kako bi izgledalo z nekaterimi testnimi podatki različnih datumov:
Povzetek:
Tukaj je: lepo oblikovan, robusten in učinkovitejši način za ustvarjanje poročila o staranju v SharePointu, skupaj s preprosto implementacijo brez kode. To ima kar nekaj potencialnih aplikacij, razen enega primera uporabe, ki smo ga raziskali tukaj. Drug pogost scenarij za to vrsto poročila je, da ga priložite na seznam opravil, tako da lahko na prvi pogled vidite, koliko časa je minilo, odkar je bilo opravilo ustvarjeno.
Uživajte!
--Justin
Justin Joyce, LANtek
Pripombe
Manjkajoči koraki
8.10.2012 3:51
ok, sledil sem korakom, vendar mora nekaj manjkati - kako bo XSL vedel, kateri datum naj uporabi ali v katero polje naj doda dneve? Sovražim, ko so koraki zgrešeni.
Brez kode, dogovorjeno!
30.8.2012 12:12
Strinjam se - mislim, da to v resnici ne šteje kot "brez kode".
Zanimivo je, da imam zaradi neke napake v SharePointu delujoč izračunani stolpec z uporabo Danes ... Nisem prepričan, kako ali zakaj, ker ga ne morem ponoviti, vendar je še vedno tam in deluje.
Formula za izračunani stolpec »Dnevi v stanju«?
2.5.2012 7:39
Justin – Kakšna je formula, ki ste jo uporabili za izračunani stolpec spletnega mesta »Dnevi v stanju« (stolpec označbe mesta)? Je bilo "=danes"?
SharePoint 2007
2.12.2011 11:29
Trenutno te rešitve nisem poskušal uporabiti za SharePoint 2007, vendar jo preučujem. Na žalost v spletnem gradniku prek uporabniškega vmesnika ni nobene lastnosti XslLink.
Odlična objava
30.11.2011 9:53
Pozdravljeni,
Odlična objava.
Uporabljam SharePoint 2007.
Nimam razdelka Razno, kot je navedeno zgoraj.
Ali imate navodila za konfiguracijo servisnega paketa SP2007?
Hvala.
Re: Rešitev brez kode: Prikaz dni od zadnje spremembe elementa SharePointovega seznama
11.10.2011 8:24
Živjo, Chris.
Odlična najdba!
Upam, da si bom ogledal, kaj ste objavili pozneje danes, in videl, ali lahko to rešitev naredim nekoliko bolj robustno.
Vesel sem, da vam je bila objava všeč, in zelo sem vesel, da ste našli rešitev za evropsko obliko datuma. :)
-Justin
Rešitev za evropske oblike zapisa datuma
11.10.2011 6:45
Še enkrat pozdravljeni, Justin,
FYI, našel sem rešitev za težavo, ki sem jo prej omenil na tej strani;
https://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/
Evropske oblike zapisa datuma
7.10.2011 3:59
Živjo, Justin,
To je res dobra rešitev, hvala, in ravno tisto, kar sem iskal zadnja dva dni! Vendar pa imam z njim malo težav in upal sem, da mi lahko pomagate.
Nekoliko sem spremenil vašo kodo, da bi izračunal število dni, dokler se nekaj ne zgodi, namesto kasneje, s preklapljanjem spremenljivk v zadnji vrstici funkcije "DateDiff";
<xsl:vrednost-of select="$JulianToday - $JulianStartDate"></xsl:vrednost-od>
Vendar pa ga lahko dosežem, da pravilno zmanjša razliko le polovico časa. Tako na primer s tem datumom (oblika dd/MM/llll);
30/12/2011
Izračuna pravilno, vendar s tem datumom (enaka oblika)
12/10/2011
Izračuna se, kot da bi bil 10. december 2011 in ne 12. oktober 2011.
Poskušal sem preprosto preklopiti položaje dnevnih in mesečnih vrednosti v spremenljivki »JulianStartDate«, kot je ta;
<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)"/>
In to je odpravilo težavo z drugim zmenkom, vendar je bilo takrat napačno za prvi zmenek!
Prav tako sem poskušal spremeniti klice FormatDateTime, da bi uporabili evropske LCID-je in različne spremembe zadnjega parametra FormatDateTime (npr. ddMMyyyy, MMddyyyyy) z ustreznimi prilagoditvami parametrov položaja podniza, vendar brez uspeha.
Zelo bi bil hvaležen za vsak nasvet, ki ga lahko ponudite.
Hvala!
Francija
No-Code
21.9.2011 4:27
Mislim, da se XSL ne kvalificira kot rešitev "brez kode", saj razumevanje jezika XSL ni za vsakogar - vendar ne vključuje programiranja. Poleg tega: Lepa rešitev, hvala!