Reporting Services 2008: quante pagine ho? Non lo so...

Titolo strano? Sicuramente si... L'intenzione è quella di suscitare l'interesse per leggere le righe seguenti :-)

Come sappiamo il motore della nuova versione dei Reporting Services (2008) è stato completamente riscritto per ottenere massimi benefici in termini di performance e scalabilità.

Una delle novità più interessanti riguarda proprio il render dei nostri dati che, oggi, viene fatto solo della pagina richiesta e non di tutto l'intero report, come con le precedenti versioni.

Cerco di spiegarmi con un'immagine:

image

Si tratta di un report di diverse migliaia di righe (>8.500) chiamato in esecuzione sul report server.

La cosa che si può notare è il punto interrogativo dopo il 2 (come evidenziato nell'immagine sopra).

Sembra che il nostro controllo non sia in grado di dirci il numero di pagine di cui è composto il nostro report.

Ed in effetti è proprio così!

Il controllo:

  • sa sicuramente di essere sulla prima pagina (o, comunque, sulla n-sima)
  • sa sicuramente se ci sarà un'altra pagina se i dati non finiscono nella pagina correntemente visualizzata
  • non avendo processato tutte le pagine che compongono il report non sa, a priori, quante sono!

L'idea nasce da questa domanda:  supponiamo di avere un report di 1000 pagine. L'utente le scorrerà tutte? Probabilmente no. Sicuramente vedrà la prima appena lo manderà in esecuzione. :-)

Due domande, che forse vi state già ponendo:

  1. cosa succede se ho bisogno di mostrare, nell'header o nel footer, il numero di pagine del report?
  2. cosa succede se premo il pulsante "Ultima Pagina" sulla toolbar del viewer?

Succede la stessa cosa: il motore deve necessariamente "lavorare" (renderizzare) tutto il report (altrimenti non saprebbe darci la risposta) con il conseguente tempo di elaborazione (è il costo relativo all'operazione di cui abbiamo bisogno).

Se inseriamo il valore del  numero di pagine il report avremo quindi, da subito, il numero:

image

Un appunto finale: il report che stiamo utilizzando come esempio non è certamente complesso, questa la query che lo genera:

 

select P.Name, POD.OrderQty, POD.DueDate, POD.UnitPrice, POD.LineTotal
from AdventureWorks.Purchasing.PurchaseOrderDetail POD
join AdventureWorks.Production.Product P on POD.ProductID = P.ProductID

 

ma possiamo comunque, analizzando la vista ExecutionLog2, vedere se ci sono o no delle differenze di tempi di rendering.

Utilizzo la seguente query:

select ReportPath, avg(TimeRendering) as timeRendering
from ReportServer..ExecutionLog2
where
    ReportPath = '/reportProjectVS2008/demoPagination' or
    ReportPath = '/reportProjectVS2008/demoPaginationWithHeader'
group by ReportPath

Questo il risultato:

image

La differenza c'è e si vede ;-)

Published mercoledì 16 aprile 2008 21.27 by abenedetti

Comments

No Comments