archivi mensili: Dicembre 2007

Creare grafici Bar in SharePoint

Panoramica:

(AGGIORNAMENTO 12/04/07: Aggiunta di un'altra risorsa interessante alla fine collegamento a un altro blog che affronta questo tramite una web part molto interessante)

Questo Blog viene descritto come creare un grafico a barre in SharePoint. Questo funziona in ambienti WSS e MOSS come dipende solo la web part visualizzazione dati.

L'approccio generale è come segue:

  1. Creare un elenco o raccolta di documenti che contiene i dati che si desidera grafico.
  2. Posto la libreria del documento associato / personalizzati elencati su una pagina e convertirlo in una web part visualizzazione dati (DVWP).
  3. Modificare XSL del DVWP per generare il codice HTML che mostra come un grafico.

Scenario business / Installazione:

Ho creato un elenco personalizzato con la colonna titolo standard e una colonna aggiuntiva, "Status". Questo modelli (molto semplicisticamente) un' "autorizzazione di spesa" scenario dove il titolo rappresenta il progetto e lo stato di un valore dall'elenco dei:

  • Proposto
  • Nel processo di
  • In fase di stallo

L'obiettivo è quello di produrre un grafico a barre orizzontale interattivo che mostra questi codici di stato.

Io ho compilato la lista e sembra che questo:

immagine

Creare Web Part visualizzazione dati:

Creare il DVWP aggiungendo l'elenco personalizzato in una pagina (pagina del sito nel mio caso) e seguire le istruzioni qui (http://paulgalvin.spaces.live.com/blog/cns!1CC1EDB3DAA9B8AA!395.entry).

Oltre a creare semplicemente il DVWP, Abbiamo anche bisogno di impostare la proprietà di spostamento per visualizzare tutte le righe disponibili. Per me, Questo sembra qualcosa di simile:

immagine

A questo punto, Chiudo sempre SPD e il browser. Quindi riaprire la pagina utilizzando il browser. Questo consente di evitare accidentalmente rovinando il layout di parte web nella pagina.

Modificare il XSLT:

Ora è il momento di modificare il XSLT.

Io uso sempre visual studio per questo. (Vedere qui per una nota importante su intellisense che ti aiuterà molto).

Creare un progetto vuoto aggiungere quattro nuovi file (sostituire le parole "originale" e "New" se del caso):

  • Original.XSLT
  • New.XSLT
  • Params.xml originale
  • Params.xml nuovo

Nel mio caso, sembra che questo:

immagine

Modificare la parte web e copiare il params e XSL all'originale"" versione di Visual Studio.

Qui l'obiettivo è quello di causare il XSL trasformare i risultati che otteniamo indietro dalla query DVWP in HTML che esegue il rendering come un grafico.

A tal fine, Aiuta a in primo luogo considerare che cosa il codice HTML dovrebbe essere simile prima di noi rimaniamo confusi dalla follia che è conosciuta come "XSL". (Per essere chiari, di seguito è semplicemente un esempio; non digitare o copiare e incollare in visual studio. Fornisco un colpo completo punto di partenza per questo più tardi nel write-up). Il grafico di esempio seguente viene eseguito il rendering come HTML immediatamente dopo:

Esempio di grafico a barre

HTML corrispondente:

<html>
<corpo>
<centro>
<Table width = 80%>
<TR><TD><centro>Grafico a barre orizzontali</TD></TR>
<TR>
<TD align = "center">
<table border = "1" larghezza = 80%>
<TR>
<larghezza TD = 10%>Aperto</TD>
<TD><tabella cellpadding ="0" CellSpacing ="0" border = 0 width = 50%><TR bgcolor = colore rosso><TD>&nbsp;</TD></TR></tabella></TD>
</TR>
<TR>
<larghezza TD = 10%>Chiuso</TD>
<TD><tabella cellpadding ="0" CellSpacing ="0" border = 0 width = 25%><TR bgcolor = colore rosso><TD>&nbsp;</TD></TR></tabella></TD>
</TR>
<TR>
<larghezza TD = 10%>In fase di stallo</TD>
<TD><tabella cellpadding ="0" CellSpacing ="0" border = 0 width = 25%><TR bgcolor = colore rosso><TD>&nbsp;</TD></TR></tabella></TD>
</TR>
</tabella>
</TD>
</TR>
</tabella>
</corpo>
</html>

Ho usato un approccio morto semplice per creare il mio bar impostando il colore di sfondo di una riga su "red".

Qui il Take-Away è questo: Alla fine, tutto quello che stiamo facendo è la creazione di HTML con righe e colonne.

Modello XSLT:

Ho copiato il codice XSLT che genera un grafico a barre orizzontale. È abbastanza ben commentato così non aggiungerà molto qui tranne queste note:

  • Ho iniziato con il valore predefinito XSL che SharePoint Designer mi ha dato quando ho creato il DVWP.
  • Sono stato in grado di tagliare questo da SPD 657 linee di 166 linee.
  • Non pasticciare con il file XML dei parametri (quale è separato da XSL e saprete che cosa voglio dire quando si va a modificare il DVWP stesso; ci sono due file che è possibile modificare). Tuttavia, al fine di semplificare l'it, Ho fatto rimuovere quasi tutti da XSL. Questo significa che se si vuole fare uso di tali parametri, Hai solo bisogno di aggiungere loro le definizioni di variabili torna al XSL. Che sarà facile, poiché avrete le definizioni di variabili XSL originale nel progetto visual studio.
  • Si dovrebbe essere in grado di copiare e incollare questo direttamente nel progetto visual studio. Poi, rimuovere le mie chiamate e inserire le proprie chiamate a "ShowBar".
  • Il drill-down funziona creando un <href> In questo modo: http://server/List?FilterField1=fieldname&FilterValue1=actualFilterValue. Questa tecnica può essere utile in altri contesti. In un primo momento, Ho pensato che avrei bisogno di conformarsi a un formato più complesso: http://server/List/AllItems.aspx?View={guid}&FilterField1=blah&FilterValue1=blah, ma nel mio ambiente che non è necessario. URL dell'elenco viene passato a noi da SharePoint quindi questo è abbastanza facile da generalizzare.

Qui è:

<xsl:StyleSheet Versione="1.0" escludere-risultato-prefissi="RS z o s ddwrt dt msxsl" 
xmlns:msxsl="urna:schemas-microsoft-com:XSLT" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:SharePoint="Microsoft.SharePoint.WebControls" xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer"
xmlns:ASP="http://schemas.microsoft.com/ASPNET/20" xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"
xmlns:o="urna:schemas-microsoft-com:Ufficio" xmlns:s="UUID:BDC6E3F0-6DA3-11D1-A2A3-00AA00C14882"
xmlns:DT="UUID:C2F41010-65B3 - 11d 1-A29F-00AA00C14882" xmlns:RS="urna:schemas-microsoft-com:set di righe" xmlns:z="#RowsetSchema"
xmlns:ddwrt2="urna:FrontPage:interno"
> <xsl:uscita Metodo.="html" trattino="No" /> <xsl:formato decimale NaN="" /> <xsl:param nome="ListUrlDir"></xsl:param> <!-- Ho bisogno di questo per sostenere un drill-down. --> <xsl:modello match="/" xmlns:SharePoint="Microsoft.SharePoint.WebControls"
xmlns:__designer=http://schemas.microsoft.com/WebParts/v2/DataView/designer xmlns:ASP="http://schemas.microsoft.com/ASPNET/20"
> <xsl:variabile nome="dvt_StyleName">Tabella</xsl:variabile> <xsl:variabile nome="Righe" selezionare="/Riga/righe/dsQueryResponse" /> <xsl:variabile nome="dvt_RowCount" selezionare="Conte($Righe)" /> <xsl:variabile nome="IsEmpty" selezionare="$dvt_RowCount = 0" /> <xsl:variabile nome="dvt_IsEmpty" selezionare="$dvt_RowCount = 0" /> <xsl:scegliere> <xsl:Quando test="$dvt_IsEmpty"> Non sono disponibili dati per il grafico!<br/> </xsl:Quando> <xsl:in caso contrario> <!-- La roba interessante inizia qui. Abbiamo bisogno di definire una coppia di variabili per ogni riga nel grafico: numero totale di elementi e per cento del totale. --> <xsl:variabile nome="totalProposed" selezionare="Conte(/Riga/righe/dsQueryResponse[normalizzare-spazio(@Status) = 'Proposto'])" /> <xsl:variabile nome="percentProposed" selezionare="$totalProposed div $dvt_RowCount" /> <xsl:variabile nome="totalInProcess" selezionare="Conte(/Riga/righe/dsQueryResponse[normalizzare-spazio(@Status) = 'Nel processo'])" /> <xsl:variabile nome="percentInProcess" selezionare="$totalInProcess div $dvt_RowCount" /> <xsl:variabile nome="totalStalled" selezionare="Conte(/Riga/righe/dsQueryResponse[normalizzare-spazio(@Status) = 'Stallo'])" /> <xsl:variabile nome="percentStalled" selezionare="$totalStalled div $dvt_RowCount" /> <!-- Definiamo la nostra tabella HTML qui. Prendo in prestito da alcuni stili standard di SharePoint qui per renderlo coerente. Penso che onorerà modifiche al file css globale così come si esegue l'override di tema. --> <tabella Larghezza="100%" CellSpacing="0" cellpadding="2" stile="Border-destra: 1 #C0C0C0 solido; border-bottom: 1 #C0C0C0 solido; border-left-style: solido; border-left-width: 1; border-top-style: solido; border-top-width: 1;"> <TR> <TD allineare="centro"> <tabella confine="1" Larghezza="100%"> <!-- Per ogni stato che si desidera rappresentare, noi chiamiamo il "ShowBar" modello. Abbiamo passarlo: 1. Un'etichetta per la riga. Questo si trasforma in un collegamento ipertestuale. 2. Il per cento (variabile dall'alto). 3. Il nome di campo effettivo del codice dall'elenco sottostante. Questo non deve corrispondere l'etichetta di visualizzazione. 4. Valore del campo corrispondente per #3. 5. Totali articoli di questo codice di stato (non il totale di tutti i codici di stato). Emette un <TR></TR> e la linea del grafico a barre orizzontali. Noi chiamiamo questo modello per ogni codice di stato che si desidera visualizzare. --> <xsl:modello di chiamata nome="ShowBar"> <xsl:con param nome="BarDisplayLabel" selezionare="'Proposto'"/> <xsl:con param nome="BarPercent" selezionare="$percentProposed"/> <xsl:con param nome="QueryFilterFieldName" selezionare="'Status'"/> <xsl:con param nome="QueryFilterFieldValue" selezionare="'Proposto'"/> <xsl:con param nome="TotalItems" selezionare="$totalProposed"></xsl:con param> </xsl:modello di chiamata> <xsl:modello di chiamata nome="ShowBar"> <xsl:con param nome="BarDisplayLabel" selezionare="'Stallo'"/> <xsl:con param nome="BarPercent" selezionare="$percentStalled"/> <xsl:con param nome="QueryFilterFieldName" selezionare="'Status'"/> <xsl:con param nome="QueryFilterFieldValue" selezionare="'Stallo'"/> <xsl:con param nome="TotalItems" selezionare="$totalStalled"></xsl:con param> </xsl:modello di chiamata> <xsl:modello di chiamata nome="ShowBar"> <xsl:con param nome="BarDisplayLabel" selezionare="'Nel processo'"/> <xsl:con param nome="BarPercent" selezionare="$percentInProcess"/> <xsl:con param nome="QueryFilterFieldName" selezionare="'Status'"/> <xsl:con param nome="QueryFilterFieldValue" selezionare="'Nel processo'"/> <xsl:con param nome="TotalItems" selezionare="$totalInProcess"></xsl:con param> </xsl:modello di chiamata> </tabella> </TD> </TR> </tabella> </xsl:in caso contrario> </xsl:scegliere> </xsl:modello> <!-- Questo modello fa il lavoro di visualizzazione di singole linee in grafico a barre. Probabilmente farete la maggior parte del vostro ritocco qui. --> <xsl:modello nome="ShowBar"> <xsl:param nome="BarDisplayLabel" /> <!-- etichetta per mostrare --> <xsl:param nome="BarPercent"/> <!-- Per cento del totale. --> <xsl:param nome="QueryFilterFieldName"/> <!-- Utilizzato per passare alla query & filtro --> <xsl:param nome="QueryFilterFieldValue"/> <!-- Utilizzato per passare alla query & filtro --> <xsl:param nome="TotalItems" /> <!-- conteggio totale di questo barlabel --> <TR> <!-- La barra stessa etichetta. --> <TD classe="MS-formbody" Larghezza="30%"> <!-- Questo prossimo set di istruzioni genera una stringa di query che permette di drill-down in una visualizzazione filtrata dei dati sottostanti. Facciamo uso di un paio di cose qui: 1. Possiamo passare a un elenco per filtrare una colonna FilterField1 e FilterValue1. 2. SharePoint è passando un parametro chiave per noi, ListUrlDir che punta all'elenco sottostante su cui questo DVWP viene "eseguita". Non è divertente XSL? --> <xsl:Testo disable-output-escaping=""> <![CDATA[<href ="]]></xsl:Testo> <xsl:valore di selezionare="$ListUrlDir"/> <xsl:Testo disable-output-escaping=""><![CDATA[?FilterField1 =]]></xsl:Testo> <xsl:valore di selezionare="$QueryFilterFieldName"/> <xsl:Testo disable-output-escaping=""><![CDATA[&FilterValue1 =]]></xsl:Testo> <xsl:valore di selezionare="$QueryFilterFieldValue"/> <xsl:Testo disable-output-escaping=""><![CDATA[">]]></xsl:Testo> <xsl:valore di selezionare="$BarDisplayLabel"/> <xsl:Testo disable-output-escaping=""><![CDATA[</un>]]></xsl:Testo> <!-- Il bit successivo mostra alcuni numeri nel formato: "(totale / % del totale)" --> (<xsl:valore di selezionare="$TotalItems"/> / <!-- Questo crea una bella etichetta percentuale per noi. Grazie, Microsoft! --> <xsl:modello di chiamata nome="PercentFormat"> <xsl:con param nome="per cento" selezionare="$BarPercent"/> </xsl:modello di chiamata>) </TD> <!-- Infine, emettono un <TD> Tag per la barra stessa.--> <TD> <tabella cellpadding="0" CellSpacing="0" confine="0" Larghezza="{turno($BarPercent * 100)+1}%"> <TR bgcolor="rosso"> <xsl:Testo disable-output-escaping=""><![CDATA[&nbsp;]]></xsl:Testo> </TR> </tabella> </TD> </TR> </xsl:modello> <!-- Questo è preso direttamente da alcuni XSL che ho trovato in un modello di MS. --> <xsl:modello nome="PercentFormat"> <xsl:param nome="per cento"/> <xsl:scegliere> <xsl:Quando test="formato numero($per cento, '#,##0%;-#,##0%')= 'NaN'">0%</xsl:Quando> <xsl:in caso contrario> <xsl:valore di selezionare="formato numero($per cento, '#,##0%;-#,##0%')" /> </xsl:in caso contrario> </xsl:scegliere> </xsl:modello> </xsl:StyleSheet>

I risultati:

il XSL da sopra genera questo grafico:

immagine

Dettaglio dei dati sottostanti cliccando sul codice di stato:

immagine

Riflessioni conclusive:

Questo può essere generalizzato?

Mi piace questo concetto grafico, ma odio il fatto che devo andare e fare così tanto di mano-codifica. Ho dato un piccolo pensiero per se può essere generalizzato e sono ottimista, ma io sono anche un po' timoroso che potrebbe esserci un muro di mattoni da qualche parte lungo il percorso che non offre alcun lavoro intorno. Se qualcuno ha delle buone idee su questo, si prega di fare una nota nei commenti o email me.

Grafici verticali:

Si tratta di un grafico a barre orizzontale. È certamente possibile creare un grafico verticale. Abbiamo solo bisogno di modificare il codice HTML. Vorrei iniziare allo stesso modo: Creare una rappresentazione HTML di un grafico a barre verticale e poi capire come ottenere che tramite XSL. Se qualcuno è interessato a che, Io potrei essere convinto a provarlo e risolvere i nodi. Se qualcuno lo ha già fatto, per favore fatemelo sapere e sarò contento di link al tuo blog 🙂

Credo che la sfida con un grafico verticale è che le etichette del grafico sono più difficili da gestire, ma certamente non impossibile.

Campo nome Gotcha:

Ci sono almeno due cose da guardare fuori con i nomi di campo..

Primo, un nome di campo con uno spazio deve essere sottoposto a escape in XSL. Questo sarà probabilmente un problema qui:

        <xsl:variabile nome="totalProposed" 
selezionare="Conte(/Riga/righe/dsQueryResponse[normalizzare-spazio(@Status) = 'Proposto'])" />

Se il tuo Status"" colonna è in realtà denominato "codice di stato" quindi è necessario fare riferimento ad esso come "Status_x0020_Code":

   <xsl:variabile nome="totalProposed" 
selezionare="Conte(/Riga/righe/dsQueryResponse[normalizzare-spazio(@Status_x0020_Code) = 'Proposto'])" />

Secondo, e io sono un po ' sfocata su questo, ma devi anche essere in allerta per le modifiche di nome di campo. Se il nome il campo "codice di stato" e poi in seguito, rinominarlo in "AFE Status", il nome"interno" non cambia. Il nome interno sarà ancora "codice di stato" e deve essere fatto riferimento come "Status_x0020_Code". Le "altre risorse" link possono aiutare a diagnosticare e correggere questo tipo di problema.

Info su quel colore:

Ho scelto "rosso" perché è piacevole per me al momento. Non sarebbe un grosso problema a mostrare diversi colori in modo da fornire più appena una descrizione visiva di un numero, ma anche fornire un utile indicatore KPI. Per esempio, Se la percentuale di "stallo" AFE è > 10% poi Visualizza rosso, in caso contrario mostrarlo in nero. Uso <xsl:scegliere> per eseguire questa operazione.

Altre risorse:

Trasformando felice!

<fine />

Iscriviti al mio blog!

SharePoint non fornisce “Chi ha accesso” Rapporti

AGGIORNAMENTO 01/28/08: Questo progetto codeplex risolve questo problema: http://www.codeplex.com/AccessChecker. Non ho usato, ma sembra promettente, se questo è un problema che dovete indirizzo nel vostro ambiente.

AGGIORNAMENTO 11/13/08: Joel Oleson ha scritto un ottimo post sul più grande problema di gestione sicurezza qui: http://www.sharepointjoel.com/ Lists/Posts/Post.aspx?Lista = 0cd1a63d % 2D183c % 2D4fc2 %2 D 8320% 2Dba5369008acb&ID = 113. Si collega a un numero di altre risorse utili.

I clienti e gli utenti del forum chiedono spesso una domanda lungo queste linee: "Come generare un elenco di tutti gli utenti con accesso a un sito" o "come posso io automaticamente avvisare tutti gli utenti con accesso alla lista sulle modifiche apportate all'elenco?"

Non c'è nessun out soluzione per questo. Se ci pensate per un momento, non è difficile capire il perchè.

Protezione di SharePoint è molto flessibile. Ci sono almeno quattro principali categorie di utenti:

  • Utenti anonimi.
  • Gruppi e utenti di SharePoint.
  • Active Directory utenti.
  • L'autenticazione basata su form (FBA) utenti.

La flessibilità significa che da una prospettiva di sicurezza, qualsiasi sito di SharePoint specificato sarà drammaticamente diverso da un altro. Al fine di generare un report di access elenco, bisogna accertare come il sito viene protetto, query più repository di profilo di utente diverso e quindi di presentarlo in modo utile. Questo è un problema difficile da risolvere genericamente.

Come organizzazioni che fare con questo? Mi piacerebbe sentire da voi nei commenti o Posta elettronica.

</fine>