Soluzione senza codice: visualizzare i giorni dall'ultima modifica di una voce di elenco

Di Justin Joyce, LANtek

Nota

Questo articolo fa parte di una raccolta di post pubblicati in quattro anni sul blog Get the Point rivolto agli utenti finali di SharePoint.

Panoramica: report di aging personalizzati senza codice

Una delle parti funzionali più richieste di un sito di SharePoint è un report di aging per attività o elementi di elenco. In altre parole, quanti giorni/mesi sono passati dall'ultima volta in cui questo elemento di elenco è stato modificato?

A un primo sguardo, questa sembra una richiesta molto semplice. Dopo tutto, gli elementi creati e modificati sono associati a date specifiche e chiunque è in grado di memorizzare date personalizzate quando vengono apportate determinate modifiche agli elementi tramite ricevitori di elenchi. Esistono inoltre colonne calcolate in cui è possibile includere formule simili a quelle di Excel da usare con le informazioni. Può sembrare una questione piuttosto lineare. Si seleziona un campo data, si crea una colonna calcolata e quindi si crea una formula del tipo [DateField] - [Today]. Tuttavia, non è un'operazione così immediata. Come sa chiunque abbia tentato questo "semplice" compito, provare a usare qualcosa come [Oggi] in una colonna calcolata causa problemi. Provare a inserire [Oggi] nella casella della formula della colonna calcolata visualizzerà un messaggio di errore simile al seguente:

Messaggio di errore

Qual è il motivo? Dipende dal modo in cui le colonne calcolate vengono effettivamente calcolate.

Prendiamo come esempio una semplice formula:

= SE( [Colonna1]<=[Colonna2], "OK", "Non OK")

Tutto ciò significa che se Colonna1 è minore o uguale a Colonna2, visualizzare OK, altrimenti visualizzare Non OK. Si tratta di una formula di base abbastanza tipica per una colonna calcolata e fa un presupposto di base sulla voce di elenco che contiene queste colonne: I valori di Column1 e Column2 non saranno mai modificabili senza un evento Update nella voce di elenco.

A questo scopo, le colonne calcolate verranno ricalcolate solo quando l'elenco viene aggiornato (o creato) poiché presuppongono che le informazioni calcolate siano contenute nell'elemento stesso. Questo crea un problema quando si cerca di usare qualcosa che cambia indipendentemente dai campi dell'elemento, come la data odierna.

Ora non ero alla riunione in cui hanno deciso che questo è il modo in cui funzionerebbero le colonne calcolate, tuttavia, se dovessi fare un'ipotesi plausibile assumerei che funzionino in questo modo per le prestazioni. Si supponga di avere un elenco di diverse migliaia di elementi, ognuno dei quali contiene una colonna calcolata che necessita di un aggiornamento in tempo reale. Ciò significherebbe che un meccanismo, ad esempio un processo timer, dovrebbe scorrere ogni elemento che contiene la colonna calcolata di tanto in tanto e aggiornarne il valore. Questo potrebbe essere estremamente faticoso in termini di prestazioni perché con implementazioni più grandi questo lavoro potrebbe essere costantemente in esecuzione e cambiare le cose. Questa è solo una mia ipotesi, ma ha un bel po' di senso se ci pensi.

Alcuni suggerimenti per soluzioni simili comportano la capacità di fare in modo che SharePoint accetti un valore di data odierna creando per prima cosa una colonna denominata Today, quindi aggiungendola alla formula e infine eliminandola. Si tratta di soluzioni valide, ma è bene ricordare cosa è stato detto riguardo all'aggiornamento delle colonne calcolate. Questo valore viene modificato solo quando viene aggiornato l'elemento e questo significa che i valori risulteranno presto non corretti, in particolare nel caso di un calcolo di giorni.

Ho visto altri usare JavaScript intelligente per scrivere i valori nella pagina. Anche questa soluzione funziona, ma è meglio evitare categoricamente uno script client quando è possibile.

Implementazione:

Che fare? Le colonne calcolate non sono in discussione per le cosiddette funzioni "volatili" come Today. Per gestire questo aspetto, si potrebbe sviluppare codice personalizzato, come una colonna calcolata, un processo timer o un processo pianificato, che potrebbero aggiornare ogni singolo elemento per cui è necessaria l'esecuzione di questo calcolo. Questo approccio ripropone tuttavia il problema delle prestazioni posto nell'ultimo paragrafo ed è inoltre una soluzione poco efficace e altamente specifica per il sito/elenco/colonna in questione. Oltre a questi due problemi, sarebbe inoltre necessaria una persona molto competente, che sappia come creare il codice e che sviluppi questa soluzione. C'è un'alternativa più semplice!

Chi ha i diritti necessari per creare campi e modificare le pagine nel sito e ha una certa competenza in XSLT e nella creazione di visualizzazioni può creare un modello XSL, che può essere incluso in una visualizzazione elenco e calcolare fedelmente il valore ogni volta che la pagina viene richiesta. Questo scenario elimina le preoccupazioni sulle prestazioni e non richiede lo sviluppo e la distribuzione di codice personalizzato tramite una soluzione.

Perfetto. Come si fa?

  1. Creare o selezionare il campo che fungerà da origine. Deve essere un campo di tipo data.
  2. Creare il campo che fungerà da segnaposto per il valore calcolato.
  3. Aggiungere entrambi i campi a un tipo di contenuto e aggiungere quest'ultimo a un elenco.
  4. Creare una visualizzazione dell'elenco che contenga le colonne di origine e segnaposto.
  5. Caricare il modello XSL nella raccolta stili.
  6. Impostare la proprietà "Collegamento XSL" per la web part Visualizzazione elenco tramite l'interfaccia utente.
  7. Ecco fatto!

Esploriamo un caso d'uso di esempio e analizziamo l'implementazione. Il cliente voleva una visualizzazione dell'elenco principale che gli dicesse da quanto tempo un particolare elemento dell'elenco era rimasto allo stato attuale. Questo elenco contiene un tipo di contenuto del sito personalizzato derivato dal tipo Elemento e aggiunto all'elenco. È già presente un ricevitore di eventi che acquisisce ogni volta che quel campo di stato della voce di elenco è stato modificato e salvato in quella data in una colonna denominata "Data di modifica dello stato". Tutto questo cablaggio non è necessario e può essere fatto con QUALSIASI campo data (si dà il caso che questa sia la nostra implementazione, ma sentitevi liberi di sperimentare). Il minimo indispensabile è il campo della data di origine e il campo segnaposto per contenere il calcolo (ne parleremo nel prossimo paragrafo) aggiunto all'elenco, anche se ti suggerisco di utilizzare le colonne del sito e i tipi di contenuto del sito nel caso in cui desideri riutilizzare questa soluzione in altri punti del tuo sito.

Abbiamo quindi la nostra data di origine che possiamo utilizzare nel nostro calcolo rispetto alla data odierna. Ora possiamo creare una colonna del sito personalizzata da usare come contenitore per il valore calcolato. In questo caso ho scelto di utilizzare una colonna calcolata poiché non sarà in grado di essere modificata nei moduli di elemento nuovo o modificato, ma può essere selezionata per la visualizzazione nelle visualizzazioni poiché non vogliamo che gli utenti immettano valori arbitrari in questa colonna. Potrebbe creare confusione sul motivo per cui non viene visualizzato nelle visualizzazioni, ecc.

Una volta definita la colonna del sito, è possibile aggiungerla ai tipi di contenuto che verranno usati nell'elenco. È quindi necessario creare la visualizzazione che verrà successivamente personalizzata con XSLT. Assicurarsi di creare una visualizzazione standard contenente la colonna di date di origine e la nuova colonna calcolata che fungerà da segnaposto per il valore calcolato.

A questo punto sono stati definiti tutti gli elementi necessari per supportare il report di aging personalizzato. Non resta che creare il nostro modello XSL, caricarlo nella libreria di stili del sito e collegarlo alla nostra visualizzazione elenco. Il modello XSL usato conterrà una parte di markup normale generato da SharePoint per la creazione della visualizzazione, nonché il markup personalizzato usato per eseguire l'override di certe parti e calcolare automaticamente il valore desiderato.

Dando credito a chi è dovuto, i modelli XSL per eseguire i calcoli effettivi che sto usando per questa soluzione sono stati gentilmente forniti da "swirch" sui forum MSDN:
http://social.msdn.microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-bd22-21306c5cb0d2/

Scarica il foglio di stile XSL (aging.zip) che ho messo insieme che si trova qui:
https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissionsChanged=1&id=C262E8E2D59A86D9!104

Aprendo questo nel tuo editor di testo preferito vedrai un sacco di normale markup XSL di SharePoint per il rendering delle viste, se continui a scorrere verso il basso fino alla riga 357 vedrai l'inizio dei modelli personalizzati che ho aggiunto al markup, il primo è il template "DateDiff" seguito da "calculate-julian-day" e "FieldRef_printTableCell_EcbAllowed.Days_x0020_At_x0020_Status". Questi sono i nostri tre modelli che eseguiranno e visualizzeranno i nostri calcoli nelle nostre viste. Se si prevede di usare nomi di campo diversi da quelli specificati in precedenza in questo articolo, sarà necessario esaminare questi modelli e sostituire i riferimenti agli altri nomi. Tenere presente che per questo è consigliabile usare il nome INTERNO del campo e non il nome visualizzato.

Una volta che sei soddisfatto che il modello sia pronto per l'uso, vai alla tua libreria di stili e caricalo nella cartella "XSL Style Sheets", quindi copia il link al file. In questo modo, sarà possibile modificarlo facilmente in seguito o aggiungerlo ad altre parti del sito nel modo desiderato.

Passare quindi all'elenco e selezionare la visualizzazione creata in precedenza in questo articolo. Dal menu "Azioni sito" clicca su "Modifica pagina".

Comando Modifica pagina del menu Azioni sito

Trovare la web part della visualizzazione elenco nella pagina e aprire il menu Web part facendo clic sulla piccola freccia rivolta verso il basso nell'angolo in alto a destra. In questo menu selezionare "Modifica web part".

Comando Modifica web part del menu Web part

Verrà aperto il menu della web part sul lato destro della finestra del browser.

Menu web part

Fare clic su + per la sezione "Varie" e individuare la proprietà "Collegamento XSL".

Proprietà Collegamento XSL nel menu Web part

Incollare nella raccolta stili il collegamento al file XSL copiato prima. Il collegamento può essere relativo o assoluto.

Collegamento al file XSL incollato

Fare clic su "OK" per salvare le modifiche, quindi fare clic sul pulsante "Interrompi modifica" sulla barra multifunzione "Pagina" nella parte superiore della pagina.

Pulsante Interrompi modifica nella scheda Pagina

Se tutto è stato configurato correttamente, ora vengono visualizzati numeri nella colonna "Giorni allo stato".

Colonna dei giorni di permanenza in uno stato contenente un numero

Infine, ecco cosa succederebbe con alcuni dati di prova di date diverse:

Report di aging con visualizzati dati di test

Riepilogo:

Ecco qui: un metodo solido, con formattazione accurata e prestazioni migliori per creare un report di aging in SharePoint, completo di una semplice implementazione senza codice. Questo report può avere diverse possibili applicazioni oltre al caso d'uso esplorato in questo articolo. Un altro scenario comune per questo tipo di report è allegarlo a un elenco di attività in modo da poter vedere a colpo d'occhio quanto tempo è passato dalla creazione di un'attività.

Buon divertimento!

--Justin

Justin Joyce, LANtek

Commenti

Passaggi mancanti
2012/10/8 03:51
ok ho seguito i passaggi, ma deve mancare qualcosa: come farà l'XSL a sapere quale data utilizzare o in quale campo aggiungere i giorni da allora? Odia quando si sbagliano i passaggi.

No-Code, d'accordo!
30/08/2012 12:12
Sono d'accordo - non credo che questo conti davvero come "no code".
La cosa interessante è che grazie a qualche falla di SharePoint ho una colonna calcolata che funziona con Today... non so in che modo o come mai, perché non riesco a riprodurre i passaggi, ma c'è e funziona.

Formula per la colonna calcolata "Giorni allo stato"?
2/5/2012 07:39
Justin - Qual è la formula usata per la colonna del sito calcolato "Days At Status" (colonna segnaposto)? Forse "=today"?

SharePoint 2007
2011/12/2011 11:29
Attualmente non ho tentato di applicare questa soluzione a SharePoint 2007, tuttavia la sto esaminando. Sfortunatamente non esiste alcuna proprietà Collegamento XSL nella web part tramite l'interfaccia utente.

Ottimo post
2011/11/30 09:53
Ciao,
Ottimo post.
Sto usando SharePoint 2007.
Non trovo la sezione Vari indicata sopra.
Hai dei passaggi per una configurazione SP2007?
Grazie.

Re: Soluzione senza codice: visualizzare i giorni dall'ultima modifica di una voce di elenco di SharePoint
11/10/2011 08:24
Ciao Chris.
Ottima scoperta!
Darò un'occhiata a ciò che hai pubblicato, si spera più tardi oggi, e vedrò se riesco a rendere questa soluzione un po' più robusta.
Sono contento che il post ti sia piaciuto, e sono molto contento che tu sia riuscito a trovare una soluzione al formato di data europeo. :)
-Giustino

Soluzione per i formati data europei
11/10/2011 06:45
Ciao ancora Justin,
Cordiali saluti, ho trovato una soluzione per il problema che ho menzionato in precedenza in questa pagina;
https://sharepointbydummies.wordpress.com/2011/07/13/possible-work-around-to-date-format-issue-sharepoint-2010/

Formati data europei
2011/10/7 03:59
Ciao Justin,
Questa è davvero un'ottima soluzione, grazie, e proprio il genere di cose che ho passato gli ultimi due giorni a cercare! Ho però un piccolo problema per cui spero tu possa aiutarmi.
Ho modificato leggermente il tuo codice per calcolare il numero di giorni prima che succeda qualcosa, piuttosto che dopo, cambiando le variabili nell'ultima riga della funzione "DateDiff";

<xsl:valore-di select="$JulianToday - $JulianStartDate"></xsl:valore-di>

Tuttavia, sono in grado di farlo caculare correttamente la differenza solo la metà delle volte. Quindi, ad esempio, con questa data (formato gg/MM/aaaa);

30/12/2011

Il calcolo viene eseguito correttamente, ma con questa data (stesso formato)

12/10/2011

Calcola come se fosse 10-dic-2011 piuttosto che 12-ott-2011.
Ho provato semplicemente a scambiare le posizioni dei valori di giorno e mese nella variabile "JulianStartDate", in questo modo;

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

E questo ha corretto il problema con il secondo appuntamento, tuttavia non era corretto per il primo appuntamento!
Ho anche provato ad alterare le chiamate FormatDateTime per utilizzare gli LCID europei e varie modifiche all'ultimo parametro di FormatDateTime (ad es. ddMMyyyy, MMddyyyy) con le opportune regolazioni ai parametri posizionali della sottostringa senza successo.
Apprezzerei davvero qualsiasi consiglio al riguardo.
Grazie,
Chris

No-Code
2011/09/21 04:27
Non credo che XSL si qualifichi come una soluzione "no-code", poiché la comprensione del linguaggio XSL non è per tutti, tuttavia non coinvolge la programmazione. A parte questo, ottima soluzione, grazie!