Sprendimas be kodo: dienų nuo paskutinio sąrašo elemento pakeitimo rodymas

pateikė Justinas Joyce'as, LANtek

Pastaba

Šis straipsnis yra dalis įrašų rinkinio iš ketverių metų dienoraščio "Get the Point " galutiniams vartotojams.

Apžvalga: Tinkintos senėjimo pagal terminus ataskaitos be kodo

Viena iš dažnai pageidaujamų "SharePoint" svetainės funkcinių dalių yra senėjimo ataskaita, skirta užduotims arba sąrašo elementams. Kitaip tariant, kiek dienų / mėnesių praėjo nuo paskutinio šio sąrašo elemento modifikavimo?

Iš pažiūros tai atrodo labai paprastas prašymas. Galų gale, turime elementų kūrimo ir modifikavimo datas, turime galimybę saugoti pasirinktines datas, kai tam tikri elementų pakeitimai įvyksta per įvykių gavėjus. Turime apskaičiuojamųjų stulpelių, kuriuose galime įtraukti į "Excel" panašių formulių, kad galėtume dirbti su savo informacija. Tai atrodo gana paprastas pasiūlymas. Mes pasirenkame datos lauką, sukuriame apskaičiuojamąjį stulpelį, tada darome formulę kažką panašaus į [DateField] – [Today]. Ak, ne taip greitai, nors! Kaip žino kiekvienas, kuris bandė atlikti šią "paprastą" užduotį, bandymas apskaičiuotame stulpelyje naudoti kažką panašaus į [Šiandien] sukelia problemų. Pabandykite įterpti [Šiandien] į apskaičiuojamojo stulpelio formulės lauką, bus pateiktas klaidos pranešimas, panašus į šį:

Klaidos pranešimas

Kodėl taip yra? Taip yra dėl apskaičiuojamųjų stulpelių skaičiavimo būdo.

Kaip pavyzdį paimkime paprastą formulę:

= IF( [Stulpelis1]<=[Stulpelis2], "Gerai", "Negerai")

Taip pat sakoma, kad jei Stulpelis1 yra mažesnis arba lygus stulpeliui2, rodyti Gerai, kitu atveju rodyti Nėra gerai. Tai gana įprasta apskaičiuotojo stulpelio pagrindinė formulė, pagal kurią daroma pagrindinė prielaida apie sąrašo elementą, kuriame yra šie stulpeliai: Stulpelių1 ir Stulpelio2 reikšmių niekada nebus galima pakeisti, jei nebus įvykio Atnaujinti sąrašo elementą.

Visiškai teisingai, apskaičiuojamieji stulpeliai bus perskaičiuojami tik tada, kai sąrašas atnaujinamas (arba sukuriamas), nes jie numano, kad jūsų skaičiuojama informacija yra pačiame elemente. Tai sukuria problemą, kai bandote naudoti ką nors, kas keičiasi nepriklausomai nuo elemento laukų, pvz., šiandienos datą.

Dabar aš nebuvau susitikime, kur jie nusprendė, kad tai yra būdas, kad apskaičiuojamieji stulpeliai veiktų, tačiau, jei aš turėčiau padaryti išsilavinęs spėlioti aš manyčiau, kad jie veikia tokiu būdu našumui. Įsivaizduokite, kad turėtumėte kelių tūkstančių elementų sąrašą, kiekviename iš kurių yra apskaičiuojamasis stulpelis, kurį reikia atnaujinti tiesiogiai. Tai reikštų, kad koks nors mechanizmas, galbūt laikmačio darbas, turėtų kartoti kiekvieną elementą, kuriame yra tas apskaičiuotas stulpelis, ir atnaujinti jo reikšmę. Tai gali būti labai sunku našumo požiūriu, nes naudojant didesnius diegimus šis darbas gali būti nuolat vykdomas ir keičiasi. Tai tik mano spėjimas, bet tai yra gana prasminga, jei apie tai pagalvojate.

Yra keli panašių sprendimų pasiūlymai, kai apgaudinėjama "SharePoint", kad ji priimtų šiandienos reikšmę, pirmiausia sukuriant stulpelį, pavadintą Šiandien, tada įtraukiant jį į formulę ir tada panaikinant. Visi jie yra gerai ir gerai, bet prisiminkite, ką sakiau apie tai, kai skaičiuojami stulpeliai yra atnaujinami. Ši reikšmė pasikeis tik atnaujinus elementą, o tai reiškia, kad netrukus jūsų reikšmės taps neteisingos, ypač skaičiuojant dieną.

Aš mačiau kitus naudojant protingas JavaScript rašyti reikšmes į puslapį. Tai taip pat veiktų, bet aš esu gana kategoriškai prieš kliento scenarijų, kai jo galima išvengti.

Įgyvendinimas:

Taigi, ką daryti? Apskaičiuojamieji stulpeliai negalimi vadinamosioms "kintamoms" funkcijoms, pvz., šiandien. Gali būti, kad galėtume sukurti tam tikrą pasirinktinį kodą, kuris tuo pasirūpintų už mus, pvz., apskaičiuojamąjį stulpelį, laikmačio užduotį ar suplanuotą procesą, kad ateitų ir atnaujintų kiekvieną elementą, kuriam reikia šio skaičiavimo. Tai grąžina mus prie našumo problemos, kurią minėjau paskutinėje pastraipoje, nors, be to, tai yra trapus sprendimas, kuris būtų labai specifinis svetainei / sąrašui / stulpeliui aptariama. Be šių dviejų rūpesčių, jūs taip pat turite eiti ieškoti nerdy vaikinas, pavyzdžiui, aš, kuris žino, kaip koduoti ir įtikinti jį sukurti šį sprendimą už jus. Tačiau yra paprastesnis būdas!

Jei turite teises kurti laukus ir redaguoti puslapius savo svetainėje ir turite šiek tiek žinių apie XSLT ir rodinių kūrimą, galite sukurti XSL šabloną, kurį galima įtraukti į sąrašo rodinį ir kuris tiksliai apskaičiuos jūsų reikšmę kiekvieną kartą, kai bus pateikta puslapio užklausa. Šis scenarijus pašalina mūsų susirūpinimą dėl našumo ir nereikalauja, kad pasirinktinis kodas būtų kuriamas ir įdiegtas naudojant sprendimą.

Tobula. Taigi, kaip tai padaryti?

  1. Sukurkite arba pažymėkite lauką, kuris veiks kaip mūsų šaltinis. Tai turi būti datos tipas.
  2. Sukurkite lauką, kuris veiks kaip skaičiuojamos reikšmės vietos rezervavimo ženklas.
  3. Abu šiuos laukus įtraukite į turinio tipą ir įtraukite tą turinio tipą į sąrašą.
  4. Sukurkite sąrašo rodinį, kuriame būtų šaltinio ir vietos rezervavimo ženklo stulpeliai.
  5. Nusiųskite XSL šabloną į stilių biblioteką.
  6. Nustatykite sąrašo rodinio puslapio dalies ypatybę "XSL saitas" naudodami vartotojo sąsają.
  7. Pavyko!

Panagrinėkime naudojimo atvejo pavyzdį ir peržiūrėkime diegimą. Klientas pageidaudavo matyti pagrindinio sąrašo rodinį, kuriame būtų nurodyta, kiek laiko konkretus sąrašo elementas neprarado savo būsenos. Šiame sąraše buvo pasirinktinis svetainės turinio tipas, išvestas iš elemento tipo ir įtrauktas į sąrašą. Jau buvo įdiegtas įvykio imtuvas, kuris fiksuoja kiekvieną kartą, kai pakeičiamas sąrašo elemento būsenos laukas, ir tą datą įrašo į stulpelį, pavadintą "Pakeistos datos būsena". Visi šie laidai nėra reikalingi, ir gali būti padaryta su bet kokiu datos lauku (tai tik taip atsitinka, kad tai yra mūsų įgyvendinimas, bet nedvejodami eksperimentuoti). Minimalus dalykas, kurio jums prireiks, yra šaltinio datos laukas ir vietos rezervavimo ženklo laukas, kuriame būtų jūsų skaičiavimas (daugiau apie tai kitoje pastraipoje), įtrauktas į sąrašą, nors siūlau naudoti svetainės stulpelius ir svetainės turinio tipus, jei norėsite pakartotinai naudoti šį sprendimą kitose svetainės vietose.

Taigi mes turime savo šaltinio datą, kurią galime naudoti savo skaičiavimuose pagal šiandienos datą. Dabar galime sukurti pasirinktinį svetainės stulpelį, kurį naudosime kaip apskaičiuotos reikšmės konteinerį. Šiuo atveju aš pasirinkau naudoti apskaičiuojamąjį stulpelį, nes jis negalės būti pakeistas naujo ar redaguoti elemento formose, bet gali būti pasirinktas rodyti rodiniuose, nes mes nenorime, kad vartotojai įvestų savavališkas reikšmes į šį stulpelį. Gali būti painu, kodėl jis nerodomas rodiniuose ir pan.

Dabar, kai turime savo svetainės stulpelį, galime jį įtraukti į savo turinio tipus, kurie bus naudojami mūsų sąraše. Tada turime sukurti savo rodinį, kuris vėliau bus pritaikytas naudojant mūsų XSLT. Įsitikinkite, kad sukūrėte standartinį rodinį, kuriame yra šaltinio datos stulpelis ir naujas apskaičiuotasis stulpelis, kuris veiks kaip apskaičiuotos reikšmės vietos rezervavimo ženklas.

Dabar turime viską, ko mums reikės, kad paremtume savo pasirinktinę senėjimo ataskaitą. Belieka sukurti mūsų XSL šabloną, įkelti jį į svetainės stilių biblioteką ir susieti jį su mūsų sąrašo rodiniu. XSL šablone, kurį naudosime, bus įprastas "SharePoint" sugeneruotas žymėjimas rodiniui generuoti, taip pat mūsų pačių pasirinktinis žymėjimas, naudojamas perrašyti tam tikras šio straipsnio dalis ir apskaičiuoti mums norimą vertę.

Suteikiant kreditą, kai kreditas yra priklauso, XSL šablonai daryti faktinius skaičiavimus aš naudoju šį sprendimą buvo maloniai suteikta "swirch" MSDN forumuose:
http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/

Parsisiųsti XSL stiliaus lapą (aging.zip) aš sujungiau čia:
https://„OneDrive“.live.com/?cid=c262e8e2d59a86d9&permissionsChanged=1&id=C262E8E2D59A86D9!104

Atidarant šį savo mėgstamą teksto rengyklę pamatysite daug įprastų SharePoint XSL žymėjimas generuoti rodinius, jei nuolat slinkti žemyn iki eilutės 357 pamatysite pasirinktinių šablonų, kad aš pridėjo prie žymėjimo pradžią, pirmasis yra "DateDiff" šablonas po "skaičiuoti-julian-diena" ir "FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020_Status". Tai yra trys mūsų šablonai, kurie atliks ir parodys mūsų skaičiavimus mūsų rodiniuose. Jei ketinate naudoti kitokius laukų pavadinimus, nei buvo nurodyti anksčiau šiame straipsnyje, turėsite pereiti per šiuos šablonus ir pakeisti nuorodas į kitus pavadinimus. Atminkite, kad tam reikės naudoti lauko VIDINĮ pavadinimą, o ne rodomą pavadinimą.

Kai būsite patenkinti, kad šablonas paruoštas naudoti, eikite į stilių biblioteką ir nusiųskite jį į aplanką "XSL stilių aprašai", tada nukopijuokite saitą į failą. Tai leis mums lengvai jį pakeisti vėliau arba pridėti prie skirtingų svetainės dalių, kaip norėsime.

Tada eikite į sąrašą ir pasirinkite rodinį, kurį sukūrėte anksčiau šiame straipsnyje. Meniu "Svetainės veiksmai" spustelėkite "Redaguoti puslapį".

Komanda Redaguoti puslapį meniu Svetainės veiksmai

Raskite savo sąrašo rodinio puslapio dalį puslapyje ir atidarykite puslapio dalies meniu spustelėdami mažą rodyklę žemyn viršutiniame dešiniajame kampe. Šiame meniu pasirinkite "Redaguoti puslapio dalį".

Komanda Redaguoti puslapio dalį puslapio dalies meniu

Bus atidarytas puslapio dalies meniu naršyklės lango dešinėje pusėje.

Meniu Žiniatinklio dalis

Spustelėkite + skiltyje "Įvairūs" ir suraskite ypatybę "XSL Link".

XSL saito ypatybė puslapio dalies meniu

Įklijuokite saitą į XSL failą stilių bibliotekoje, kurį nukopijavote anksčiau (tai gali būti santykinis arba absoliutus saitas).

XSL failo saitas įklijuotas

Norėdami įrašyti pakeitimus, spustelėkite Gerai, tada spustelėkite mygtuką Stabdyti redagavimą puslapio viršuje esančioje juostelėje.

Mygtukas Stabdyti redagavimą skirtuke Puslapis

Jei viskas buvo tinkamai sukonfigūruota, dabar turėtumėte matyti skaičius stulpelyje "Būsenos dienos".

Dienos būsenos stulpelyje – rodomas skaičius

Ir galiausiai, štai kaip tai atrodytų su kai kuriais įvairių datų bandymų duomenimis:

Senėjimo ataskaita, kurioje rodomi testo duomenys

Suvestinė:

Štai jis: gražiai suformatuotas, patikimas ir našesnis būdas kurti senėjimo ataskaitą "SharePoint" su paprastu diegimu be kodo. Tai turi nemažai galimų programų, išskyrus vieną naudojimo atvejį, kurį čia išnagrinėjome. Kitas įprastas šio tipo ataskaitų scenarijus – pridėti ją prie užduočių sąrašo, kad galėtumėte iškart matyti, kiek laiko praėjo nuo užduoties sukūrimo.

Smagaus žiūrėjimo!

- Justinas

Justin Joyce, LANtek

Komentarai

Trūksta veiksmų
10/8/2012 3:51 AM
Gerai, atlikau žingsnius, bet kažko turi trūkti - kaip XSL žinos, kurią datą naudoti, arba į kurį lauką pridėti dienas nuo į? Nekenčiate, kai praleidžiami veiksmai.

Be kodo, sutinku!
8/30/2012 12:12 PM
Sutinku - nemanau, kad tai tikrai skaičiuojama kaip "be kodo".
Įdomu tai, kad per kai kuriuos SharePoint, aš turiu darbo apskaičiuotą stulpelį, naudojant Šiandien ... nežinau, kaip ir kodėl, nes aš negaliu gauti jį daryti dar kartą, bet vienas vis dar yra ir veikia.

Apskaičiuojamojo stulpelio "Dienos būsenoje" formulė?
5/2/2012 7:39 AM
Justinas – Kokia formulė naudojama apskaičiuotajam svetainės stulpeliui (vietos rezervavimo ženklo stulpeliui) "Dienos būsenoje"? Ar tai buvo "= šiandien"?

SharePoint 2007
12/2/2011 11:29 AM
Šiuo metu aš nebandžiau taikyti šį sprendimą SharePoint 2007, tačiau aš žiūriu į jį. Deja, nėra XslLink ypatybės paviršių puslapio dalyje per vartotojo sąsają.

Didžiosios paštu
11/30/2011 9:53 AM
Sveiki!
Didžiosios paštu.
Naudoju "SharePoint 2007".
Neturiu skyriaus "Misc", kaip minėta aukščiau.
Ar turite SP2007 konfigūracijos veiksmus?
Ačiū.

Re: Sprendimas be kodo: dienų nuo "SharePoint" sąrašo elemento paskutinio pakeitimo rodymas
10/11/2011 8:24 AM
Sveiki, Chris.
Puikus radinys!
Aš ketinu pažvelgti į tai, ką paskelbėte, tikiuosi, vėliau šiandien ir pažiūrėti, ar galiu padaryti šį sprendimą šiek tiek tvirtesnį.
Džiaugiuosi, kad jums patiko pranešimas, ir aš labai džiaugiuosi, kad jums pavyko rasti sprendimą dėl Europos datos formato. :)
- Justinas

Europos datų formatų sprendimas
10/11/2011 6:45 AM
Sveiki dar kartą Justin,
FYI, radau anksčiau minėtos problemos sprendimą šiame puslapyje;
https://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/

Europos datų formatai
10/7/2011 3:59 AM
Sveiki, Justinai,
Tai tikrai geras sprendimas, ačiū, ir tik tokio dalyko, kurio praleidau per pastarąsias dvi dienas ieškodamas! Tačiau aš turiu šiek tiek problemų su juo ir aš tikiuosi, kad galėsite man padėti.
Aš šiek tiek pakeičiau jūsų kodą, kad apskaičiuočiau dienų skaičių, kol kažkas atsitiks, o ne nuo tada, perjungdamas kintamuosius paskutinėje "DateDiff" funkcijos eilutėje;

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

Tačiau aš tik sugebėti gauti jį cculculate skirtumas teisingai pusę laiko. Taigi, pavyzdžiui, su šia data (formatas dd/MM/yyyy);

30/12/2011

Ji skaičiuoja teisingai, bet su šia data (tas pats formatas)

12/10/2011

Skaičiuojama taip, lyg 2011-Gruod-10, o ne 2011-Spal-12.
Bandžiau tiesiog perjungti dienos ir mėnesio reikšmių pozicijas kintamajame "JulianStartDate", taip;

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

Ir tai ištaisė problemą su antruoju pasimatymu, tačiau tada jis buvo neteisingas pirmajam pasimatymui!
Taip pat bandžiau pakeisti FormatDateTime iškvietimus, kad būtų naudojami Europos LCID ir įvairūs paskutinio FormatDateTime parametro pakeitimai (pvz., ddMMyyyy, MMddyyyy) su atitinkamais poeilučių pozicinių parametrų koregavimais, tačiau nesėkmingai.
Būčiau labai dėkingas už bet kokį patarimą, kurį galite pasiūlyti.
Ačiū!
Darius

No-Code
9/21/2011 AM 4:27 AM
Nemanau, kad XSL kvalifikuojamas kaip "no-code" sprendimas, nes XSL kalbos supratimas yra ne visiems, tačiau tai neapima programavimo. Be to: Puikus sprendimas, ačiū!