Soluție fără cod: Afișarea zilelor de la ultima modificare a unui element de listă
Se aplică la
de Justin Joyce, LANtek
Notă: Acest articol face parte dintr-o colecție de postări de la patru ani ai blogului Get the Point pentru utilizatorii finali SharePoint.
Prezentare generală: Rapoarte particularizate de îmbătrânire fără cod
Una dintre părțile funcționale solicitate adesea ale unui site SharePoint este un raport de îmbătrânire pentru activități sau elemente de listă. Cu alte cuvinte, câte zile/luni au trecut de la ultima modificare a acestui element din listă?
La suprafață, aceasta pare a fi o solicitare foarte simplă. Până la urmă, avem date pentru elementele create și modificate, avem posibilitatea de a stoca date particularizate atunci când anumite modificări ale elementelor au loc prin receptoarele de evenimente. Avem coloane calculate în care putem include formule asemănătoare cu Excel pentru a lucra cu informațiile noastre. Acest lucru pare a fi o propunere destul de drept înainte. Alegem un câmp dată, creăm o coloană calculată, apoi facem o formulă ceva de-a lungul liniilor [CâmpDată] - [Astăzi]. Ah, nu atât de repede, totuși! Ca oricine a încercat această activitate "simplă" știe, încercarea de a utiliza ceva de genul [Azi] într-o coloană calculată cauzează probleme. Încercați să inserați [Azi] în caseta de formule a coloanei calculate vă va oferi un mesaj de eroare asemănător cu acesta:
De ce este aceasta? Are legătură cu modul în care sunt calculate coloanele.
Să luăm o formulă simplă ca exemplu:
= IF( [Coloana1]<=[Coloana2], "OK", "Nu este OK")
Toate acestea spun că, dacă Coloana1 este mai mică sau egală cu Coloana2, atunci se afișează OK, altfel se afișează Nu este OK. Aceasta este o formulă de bază destul de obișnuită pentru o coloană calculată și face o presupunere de bază despre elementul de listă care conține aceste coloane: Valorile pentru Coloana1 și Coloana2 nu se vor putea modifica niciodată fără un eveniment Actualizare în elementul de listă.
În mod corect, coloanele calculate vor fi recalculate numai atunci când lista este actualizată (sau creată), deoarece presupun că informațiile pe care le calculați sunt conținute în elementul propriu-zis. Acest lucru creează o problemă atunci când încercați să utilizați ceva care modifică independent de câmpurile elementului, cum ar fi data de astăzi.
Acum, nu am fost în întâlnire în cazul în care au decis că acesta este modul în care coloanele calculate ar funcționa, cu toate acestea, dacă am avut de a face o ghici educat mi-ar presupune că acestea funcționează în acest fel pentru performanță. Imaginați-vă dacă ați avea o listă de câteva mii de elemente, fiecare dintre acestea conținand o coloană calculată care avea nevoie de o actualizare "live". Aceasta ar însemna că un mecanism, poate o activitate cronometru, ar trebui să itereze prin fiecare element care conține acea coloană calculată la fiecare atât de des și să își actualizeze valoarea. Acest lucru ar putea fi extrem de taxare în ceea ce privește performanța, deoarece cu implementări mai mari acest loc de muncă ar putea fi în mod constant rulează și lucrurile în schimbare. Asta e doar parerea mea, dar are un pic de sens dacă te gândești la asta.
Există câteva sugestii pentru soluții similare care implică păcălirea SharePoint în acceptarea unei valori Azi, creând mai întâi o coloană numită Azi, apoi adăugând-o la formulă, apoi ștergând-o. Toate acestea sunt bune și bune, dar rețineți ce am spus atunci când se actualizează coloanele calculate. Această valoare se va modifica doar atunci când elementul este actualizat, ceea ce înseamnă că valorile dvs. vor fi în curând incorecte, mai ales în cazul unui calcul pe zi.
Am văzut altele folosind inteligent JavaScript pentru a scrie valorile pe pagina. Acest lucru ar funcționa, de asemenea, dar eu sunt destul de mult împotriva script-ul de client atunci când acesta poate fi evitat.
Implementarea:
Deci, ce să fac? Coloanele calculate sunt în afara întrebărilor pentru așa-numitele funcții "volatile", cum ar fi astăzi. Este posibil să dezvoltăm un cod particularizat pentru a ne ocupa de acest lucru, cum ar fi o coloană calculată, o activitate cronometrată sau un proces programat pentru a veni și a actualiza fiecare element care necesită acest calcul. Asta ne aduce înapoi la problema de performanță am menționat în ultimul paragraf, deși, și în plus, este o soluție fragil, care ar fi extrem de specifice pentru site-ul / lista / coloana în cauză. Pe partea de sus a celor două preocupări, va trebui, de asemenea, să găsească un tip tocilar, cum ar fi mine, care știe cum să cod și să-l convingă să dezvolte această soluție pentru tine. Dar există o cale mai ușoară!
Dacă aveți drepturi să creați câmpuri și să editați pagini pe site-ul dvs., să aveți cunoștințe despre XSLT și să creați vizualizări, puteți să alcătuiți un șablon XSL care poate fi inclus într-o vizualizare listă și să calculați cu fidelitate valoarea de fiecare dată când se solicită pagina. Acest scenariu elimină îngrijorarea noastră față de performanță și nu necesită dezvoltarea și implementarea unui cod particularizat printr-o soluție.
Perfect. Deci, cum o facem?
-
Creați sau selectați câmpul care va acționa ca sursă. Trebuie să fie un tip de dată.
-
Creați câmpul nostru care va acționa ca substituent pentru valoarea calculată.
-
Adăugați ambele câmpuri la un tip de conținut și adăugați acel tip de conținut într-o listă.
-
Creați o vizualizare a listei care conține atât coloanele sursă, cât și substituentul.
-
Încărcați șablonul XSL în Biblioteca de stiluri.
-
Setați proprietatea "XSL Link" pentru partea web Vizualizare listă prin interfața de utilizator.
-
Succes!
Să explorăm un exemplu de caz de utilizare și să parcurgem implementarea. Clientul nostru a dorit o vizualizare a listei principale, care să-i spună cât timp a stat un anumit element de listă la starea sa. Această listă conține un tip de conținut de site particularizat derivat din tipul Element și adăugat la listă. A existat deja un receptor de evenimente care capturează de fiecare dată când acel câmp de stare din elementul de listă a fost modificat și salvat data respectivă într-o coloană numită "Data modificării stării". Toate aceste cabluri nu este necesară, și se poate face cu orice câmp dată (se întâmplă doar acest lucru este punerea în aplicare a noastră, dar nu ezitați să experimentați). Minimul de care veți avea nevoie este câmpul de dată sursă și câmpul substituent pentru a păstra calculul (mai multe despre aceasta în paragraful următor) adăugat la listă, deși vă sugerez să utilizați coloane de site și tipuri de conținut de site în cazul în care doriți să reutilizați această soluție în alte locuri de pe site-ul dvs.
Deci, avem data sursă pe care o putem utiliza în calculul nostru în raport cu data de astăzi. Acum putem crea o coloană de site particularizată de utilizat ca container pentru valoarea noastră calculată. În acest caz, am ales să utilizez o coloană calculată, deoarece aceasta nu va putea fi modificată în formularele de elemente noi sau de editare, dar poate fi selectată pentru afișare în vizualizări, deoarece nu dorim ca utilizatorii să introducă valori arbitrare în această coloană. Ar putea fi derutant de ce nu se afișează în vizualizări etc.
Acum că avem coloana noastră de site, o putem adăuga la tipurile noastre de conținut care vor fi utilizate în lista noastră. În continuare, trebuie să creăm vizualizarea noastră, care va fi particularizată mai târziu cu XSLT. Asigurați-vă că creați o vizualizare standard care conține coloana dată sursă și noua coloană calculată care va acționa ca substituent pentru valoarea calculată.
Acum avem totul în vigoare, de care vom avea nevoie pentru a susține raportul nostru particularizat de îmbătrânire. Tot ce rămâne este să creăm șablonul XSL, să-l încărcăm în Biblioteca de stiluri a site-ului și să-l legăm la vizualizarea listă. Șablonul XSL pe care îl vom utiliza va conține unele marcaje normale generate de SharePoint pentru generarea vizualizării, precum și propriile noastre marcaje particularizate utilizate pentru a înlocui anumite părți ale acestuia și a calcula valoarea dorită pentru noi.
Acordarea de credit în cazul în care creditul este scadent, XSL templates for doing the real calculations I sînt using for this solution were graciously provided by "swirch" on the MSDN forums:http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/
Descărcați foaia de stil XSL (aging.zip) pe care am alcătuit-o aici:https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissionsChanged=1&id=C262E8E2D59A86D9!104
Deschiderea acestei opțiuni în editorul de text preferat veți vedea o mulțime de marcaje XSL SharePoint normale pentru redarea vizualizărilor, dacă continuați să defilați în jos la linia 357, veți vedea începutul șabloanelor particularizate pe care le-am adăugat la marcaj, primul fiind șablonul "DateDiff", urmat de "calculate-julian-day" și "FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020_Status". Acestea sunt cele trei șabloane care vor crea și vor afișa calculele noastre în vizualizările noastre. Dacă veți utiliza nume de câmp diferite de cele specificate anterior în acest articol, va trebui să parcurgeți aceste șabloane și să înlocuiți orice referințe la alte nume. Rețineți că, pentru aceasta, veți dori să utilizați numele INTERN al câmpului, nu numele afișat.
După ce sunteți mulțumit că șablonul este gata de lucru, navigați la Biblioteca de stiluri și încărcați-l sub folderul "Foi de stiluri XSL", apoi copiați linkul în fișier. Acest lucru ne va permite să facem cu ușurință modificări la acesta mai târziu sau să îl adăugăm la diferite părți ale site-ului, după cum dorim.
În continuare, accesați lista și selectați vizualizarea pe care ați creat-o anterior în acest articol. Din meniul "Acțiuni site", faceți clic pe "Editare pagină".
Găsiți partea web Vizualizare listă pe pagină și deschideți meniul Parte web făcând clic pe săgeata mică orientată în jos din colțul din dreapta sus. Din acest meniu, selectați "Editare parte Web".
Acest lucru va deschide meniul părții web în partea dreaptă a ferestrei browserului.
Faceți clic pe + pentru secțiunea "Diverse" și găsiți proprietatea "XSL Link".
Lipiți în linkul la fișierul XSL din Biblioteca de stiluri pe care l-ați copiat mai devreme (acesta poate fi un link relativ sau absolut).
Faceți clic pe "OK" pentru a salva modificările, apoi faceți clic pe butonul "Oprire editare" din panglica "Pagină" din partea de sus a paginii.
Dacă totul a fost configurat corect, acum ar trebui să vedeți numerele în coloana "Zile în stare".
Și, în sfârșit, iată cum ar arăta cu unele date de test de la diferite date:
Rezumat:
Iată: o modalitate mai bine formatată, robustă și mai bună de a crea un raport de îmbătrânire în SharePoint, completat de o implementare simplă fără cod. Acest lucru are destul de câteva aplicații potențiale în afară de un caz de utilizare am explorat aici. Un alt scenariu comun pentru acest tip de raport este atașarea sa la o listă de activități, astfel încât să puteți vedea cât timp a trecut de când a fost creată o activitate dintr-o privire.
Sperăm să vă placă!
--Justin
Justin Joyce, LANtek
Comentarii
Pași lipsă 08.10.2012 03:51 OK Am urmat pașii, dar trebuie să existe ceva lipsă - cum va XSL știu ce dată să utilizați, sau care câmp pentru a adăuga zile în? nu-l urăsc atunci când sunt omisi pașii.
No-Code, de acord! 30.08.2012 12:12 PM Sunt de acord - nu cred că acest lucru contează cu adevărat ca "nici un cod".Interesant, printr-o șuruburi de SharePoint, am o coloană calculată funcțională care utilizează Azi... nu sunt sigur cum sau de ce pentru că eu nu pot să-l fac să o facă din nou, dar cea este încă acolo și de lucru.
Formulă pentru coloana calculată "Zile la stare"? 02.05.2012 07:39 Justin - Care este formula pe care ați utilizat-o pentru coloana de site calculată "Zile la stare" (coloană substituent)? A fost "=azi"?
SharePoint 2007 2.12.2011 11:29 AM În prezent, nu am încercat să aplice această soluție la SharePoint 2007, cu toate acestea eu sunt în căutarea în ea. Din păcate, nu există nicio proprietate XslLink apărută pe partea web prin interfața de utilizator.
Great Post 30.11.2011 9:53 AM Bună ziua Marea Post.Utilizez SharePoint 2007.Nu am o secțiune Misc, așa cum am menționat mai sus.Aveți pași pentru o configurație SP2007? Vă mulțumesc.
Re: Soluție fără cod: Afișarea zilelor de la ultima modificare a unui element de listă SharePoint 11.10.2011 8:24 AM Bună Chris.găsi mare! Am de gând să ia o privire la ceea ce ați postat sperăm că mai târziu pe ziua de azi și a vedea dacă i se poate face această soluție un pic mai robust.Mă bucur că ți-a plăcut post, și mă bucur că au fost în măsură să găsească o soluție la formatul de dată europene. :) -Justin
Soluție pentru formatele de dată europene 11.10.2011 06:45 Bună din nou Justin, Notă, am găsit o soluție pentru problema menționată anterior pe această pagină;https://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/
Formate de dată europene 07.10.2011 03:59 Bună Justin, Aceasta este o soluție foarte bună, mulțumesc, și doar genul de lucru pe care l-am petrecut ultimele două zile în căutare! Cu toate acestea am un pic de o problemă cu ea și am fost în speranța că ai putea să mă ajute.V-am modificat ușor codul pentru a calcula numărul de zile până când se întâmplă ceva, mai degrabă decât de atunci, comutând variabilele în ultima linie a funcției "DateDiff"; <xsl:value-of select="$JulianToday - $JulianStartDate"></xsl:value-of> Cu toate acestea eu sunt doar în măsură să-l caclulate diferența corect jumătate din timp. Așadar, de exemplu, cu această dată (format dd/MM/yyyy); 12.03.2011 Calculează corect, dar cu această dată (același format) 10.12.2011 Se calculează ca și cum 10-Dec-2011, nu 12-Oct-2011.Am încercat pur și simplu comutarea pozițiile de zi și lună valorile în "JulianStartDate" variabilă, astfel; <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 aceasta a corectat problema cu a doua dată, însă a fost incorectă pentru prima dată! De asemenea, am încercat să modific apelurile FormatDateTime pentru a utiliza LCID-uri europene și diverse modificări ale ultimului parametru FormatDateTime (de exemplu, ddMMyyyy, MMddyyyy) cu ajustările corespunzătoare ale parametrilor poziționali subșir fără succes.Aș aprecia foarte mult orice sfat puteți oferi.Mulţumesc Chris
Fără cod 21.09.2011 04:27 Nu cred că XSL se califică ca o soluție "nu-cod", ca înțelegerea limbajului XSL nu este pentru toată lumea - cu toate acestea, nu implică programare. Pe lângă asta: Nice soluție, vă mulțumesc!