Soluzione senza codice: la visualizzazione dei giorni dopo l'ultima modifica di una voce di elenco

Soluzione senza codice: la visualizzazione dei giorni dopo l'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 provato questa "semplice" attività, se si usa qualcosa di simile a [Today] in una colonna calcolata, si verifica un problema. Se si prova a inserire [Today] nella casella della formula della colonna calcolata, si ottiene un messaggio di errore simile a questo:

Messaggio di errore

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

Ad esempio, si consideri una semplice formula come questa:

= IF( [Column1]<=[Column2], "OK", "NO")

Tutto questo spiega che se Column1 è minore o uguale a Column2, quindi visualizza OK, altrimenti Visualizza non OK. Si tratta di una formula di base abbastanza tipica per una colonna calcolata e prende in considerazione la voce di elenco che contiene le colonne seguenti: i valori per Column1 e Column2 non saranno mai in grado di cambiare senza un evento di aggiornamento nella voce di elenco.

Questo è vero, perché le colonne calcolate vengono ricalcolate solo quando l'elenco viene aggiornato (o creato), in quanto presuppongono che le informazioni calcolate sono contenute nell'elemento stesso. Di conseguenza, si crea un problema quando si prova a usare un valore che cambia indipendentemente dai campi dell'elemento, ad esempio la data odierna.

Ora non ero nella riunione in cui hanno deciso che questo è il modo in cui le colonne calcolate avrebbero funzionato, tuttavia, se dovessi fare un'ipotesi plausibile presumo che funzionino in questo modo per ottenere prestazioni. Immaginate di avere un elenco di diverse migliaia di elementi, ognuno dei quali conteneva una colonna calcolata che serviva un aggiornamento "Live". Ciò significherebbe che qualche meccanismo, magari un processo timer, dovrebbe scorrere ogni elemento che conteneva la colonna calcolata ogni tanto e aggiornarne il valore. Ciò potrebbe essere estremamente gravoso in termini di prestazioni, perché con distribuzioni più grandi questo processo può essere costantemente in esecuzione e cambiando le cose. Questa è solo la mia ipotesi, ma fa 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.

Altri adottano la soluzione di usare JavaScript 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 sono da evitare per funzioni cosiddette "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 riguardo alle 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 della visualizzazione elenco tramite l'interfaccia utente.

  7. Ecco fatto!

Analizziamo un esempio di use case e camminiamo nell'implementazione. Il nostro cliente ha voluto una visualizzazione dell'elenco principale che indicasse il periodo di tempo in cui un particolare elemento dell'elenco era stato seduto al suo stato. Questo elenco contiene un tipo di contenuto del sito personalizzato derivato dal tipo di elemento e aggiunto all'elenco. C'era già un ricevitore di eventi in posizione che acquisisce ogni volta che il campo stato nella voce di elenco veniva modificato e salvato tale data in una colonna denominata "data stato modificato". Tutto questo cablaggio non è necessario e può essere eseguito con qualsiasi campo Data (in questo caso è la nostra implementazione, ma sentiti libero di provare). Il minimo indispensabile è il campo Data di origine e il campo segnaposto per contenere il calcolo (più avanti nel paragrafo successivo) aggiunto all'elenco, anche se suggerisco di usare le colonne del sito e i tipi di contenuto del sito nel caso in cui si voglia riutilizzare questa soluzione in altre posizioni del sito.

Quindi abbiamo la data di origine che possiamo usare nel calcolo rispetto alla data odierna. A questo punto è possibile creare una colonna del sito personalizzata da usare come contenitore per il valore calcolato. In questo caso ho scelto di usare una colonna calcolata perché non potrà essere modificata nei moduli New o Edit Item, ma può essere selezionata per la visualizzazione nelle visualizzazioni poiché non si vuole che gli utenti immettino valori arbitrari nella colonna. Potrebbe essere confusa sul motivo per cui non viene visualizzata nelle visualizzazioni e così via.

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 modello XSL, caricarlo nella raccolta stili del sito e collegarlo alla 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 dove è dovuto il credito, i modelli XSL per eseguire i calcoli effettivi che uso per questa soluzione sono stati gentilmente forniti da "swirch" nei forum MSDN:
http://social.msdn.Microsoft.com/Forums/en-US/sharepointcustomization/thread/aeda905b-9bc6-40c4-BD22-21306c5cb0d2/

Scaricare il foglio di stile XSL (aging.zip), disponibile qui:
https://OneDrive.live.com/?cid=c262e8e2d59a86d9&permissionsChanged=1&id=C262E8E2D59A86D9!104

Aprendolo nell'editor di testo preferito verrà visualizzato un ampio markup XSL di SharePoint normale per il rendering delle visualizzazioni, se si continua a scorrere verso il basso fino a line 357 si vedrà l'inizio dei modelli personalizzati aggiunti al markup, il primo dei quali è il modello "DateDiff" seguito da "Calculate-Giuliano-giorno" e "FieldRef_printTableCell_EcbAllowed. Days_x0020_At_x0020_Status". Questi sono i tre modelli che faranno e visualizzeranno i nostri calcoli nelle nostre visualizzazioni. Se si utilizzeranno nomi di campo diversi rispetto a quelli specificati in precedenza in questo articolo, è necessario passare a questi modelli e sostituire eventuali riferimenti agli altri nomi. Tenere presente che per questo si vuole usare il nome interno del campo e non il nome visualizzato.

Quando si è soddisfatti del modello e si è pronti a continuare, passare alla raccolta stili e caricarlo nella cartella "Fogli di stile XSL" e quindi copiare il collegamento 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. Nel menu "Azioni sito" scegliere "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 scegliere "Modifica web part".

Comando Modifica web part del menu Web part

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

Menu web part

Fare clic sul segno + per la sezione "Vari" 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 e quindi sul pulsante "Interrompi modifica" nella scheda "Pagina" della barra multifunzione nella parte superiore della pagina.

Pulsante Interrompi modifica nella scheda Pagina

Se la configurazione è corretta, i numeri dovrebbero ora essere visualizzati nella colonna dei giorni di permanenza nello 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 consiste nel collegarlo a un elenco attività in modo da poter determinare immediatamente il tempo trascorso da quando è stata creata un'attività.

Buon divertimento!

--Justin

Justin Joyce, LANtek

Commenti

Passaggi mancanti
10/8/2012 3:51 AM
Ok ho seguito la procedura, ma ci deve essere qualcosa che manca: in che modo l'XSL conosce la data da usare o il campo in cui aggiungere i giorni successivi? odio quando i passaggi vengono persi.

No-code, concordato!
8/30/2012 12:12 PM
Sono d'accordo-non credo che questo valga veramente come "nessun codice".
È interessante notare che, con alcuni screwup di SharePoint, ho una colonna calcolata funzionante usando oggi... non si sa come o perché non riesco a farlo di nuovo, ma quello è ancora lì e funziona.

Formula per la colonna calcolata "giorni in stato"?
5/2/2012 7:39 AM
Justin-qual è la formula usata per la colonna del sito calcolata "Days at status" (colonna segnaposto)? Forse "=today"?

SharePoint 2007
12/2/2011 11:29 AM
Attualmente non si è tentato di applicare questa soluzione a SharePoint 2007, ma si sta cercando. Sfortunatamente non esiste alcuna proprietà Collegamento XSL nella web part tramite l'interfaccia utente.

Post
grande 11/30/2011 9:53 AM
Ciao,
Ottimo post.
Si usa SharePoint 2007.
Non si ha una sezione Misc come indicato sopra.
Si hanno passaggi per una configurazione di SP2007?
Grazie.

Re: soluzione senza codice: la visualizzazione dei giorni dopo l'ultima modifica
di una voce di elenco di SharePoint 10/11/2011 8:24 AM
Ciao Luca.
ottima ricerca.
Ho intenzione di dare un'occhiata a ciò che hai postato, auspicabilmente, in seguito oggi e vedere se riesco a rendere questa soluzione un po' più robusta.
sono contento che ti sia piaciuto il post e sono molto lieto che tu sia riuscito a trovare una soluzione al formato data europea. :)
-Justin

Soluzione per i formati
di data europei 10/11/2011 6:45 AM
Ciao di nuovo Justin,
FYI, 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
di data europei 10/7/2011 3:59 AM
Ciao Giustino,
Si tratta di una soluzione veramente buona grazie, e proprio il tipo di cosa che ho trascorso gli ultimi due giorni cercando! Ho però un piccolo problema per cui spero tu possa aiutarmi.
Il codice è stato alterato leggermente per calcultate il numero di giorni fino a quando non succede qualcosa, invece che da allora, cambiando le variabili nell'ultima riga della funzione "DateDiff";

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

Tuttavia riesco solo a caclulate la differenza correttamente la metà del tempo. Quindi, ad esempio, con questa data (formato gg/MM/AAAA);

30/12/2011

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

12/10/2011

Il calcolo viene calcolato come se fosse 10-Dec-2011 invece di 12-ott-2011.
Ho provato semplicemente a cambiare le posizioni dei valori giorno e mese nella variabile "JulianStartDate", ad esempio

: <xsl: with-param name = "month" Select = "substring (ddwrt: FormatDateTime (String ($StartDate), 1033,' AAAAMMGG '), 7, 2)"/>
<xsl: with-param name = "Day" Select = "substring (ddwrt: FormatDateTime (String ($StartDate), 1033,' AAAAMMGG '), 5, 2)"/>

E questo ha risolto il problema con la seconda data, ma era quindi errato per la prima data.
Ho anche provato a modificare le chiamate di FormatDateTime per usare gli LCID europei e varie alterazioni per l'ultimo parametro di FormatDateTime (ad esempio GGMMAAAA, MMGGAAAA) con le opportune modifiche ai parametri posizionali della sottostringa senza successo.
Apprezzerei molto tutti i consigli che puoi offrire.
Grazie,
Chris

Senza codice
9/21/2011 4:27 AM
Non penso che l'XSL sia qualificata come soluzione "No-Code", perché la comprensione del linguaggio XSL non è per tutti, ma non prevede la programmazione. A parte questo, ottima soluzione, grazie!

Nota:  Questa pagina è stata tradotta automaticamente e potrebbe contenere errori di grammatica o imprecisioni. L'intento è quello di rendere fruibile il contenuto. Queste informazioni sono risultate utili' Questo è l'articolo in inglese per riferimento.

Amplia le tue competenze su Office
Esplora i corsi di formazione
Ottieni in anticipo le nuove caratteristiche
Partecipa al programma Office Insider

Queste informazioni sono risultate utili?

Grazie per il feedback!

Grazie per il tuo feedback! Potrebbe essere utile metterti in contatto con uno dei nostri operatori del supporto di Office.

×