marzo 2009 - Posts

[RS 2008] Data Item in Header e Footer. Ci siamo!
17 marzo 09 11.17 | abenedetti | 1 comment(s)

Un paio di giorni fa stavo spiegando come sia impossibile, all’interno dei Reporting Services, inserire un item di un proprio dataset all’interno di header e footer.

Ed infatti dicevo:

“Vedi, adesso l’aggiungo ed otterremo il classico errore: The Value expression for the textbox ‘...’ refers to a field.  Fields cannot be used in page headers or footers."

Trascino il campo e… oh, oh, oh… l’errore non si presenta ed il campo viene regolarmente aggiunto con la funzione d’aggregazione SUM come default.

Vado in preview ed il giro funziona, pubblico sul server di report ed il giro funziona.

In pratica: habemus item in footer!

clip_image002

Ovvero riesco a scrivere, in una textbox del footer, qualcosa come:

= “Sum(Fields!n.Value, 'DataSet1'): " & Sum(Fields!n.Value, "DataSet1")

Il punto però è un altro.

La feature non è stata pubblicizzata, non si trova nell’elenco delle cose fatte e, soprattutto, nei books online (qui: ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.en/s10rs_1devconc/html/e933d80f-045b-440e-b36b-94559af6f92e.htm) c’è scritto

  • "You cannot add fields or data-bound images directly to a header or footer"
  • "You cannot use aggregate functions on fields in the page header or footer"

Come diavolo fa uno a provare comunque una cosa leggendo che non funzionerà ?!?!

Comunque: spettacolo, ora mi sento come un bambino felice! :-)

Esempi pratici: la possibilità di utilizzare reporting per fare stampe di fatture (finalmente)!!!

PS: girando per la rete esiste un post di Robert Bruckner, del team di RS, di ottobre 2008 qui. Chiedo venia, mi era sfuggito :-(

[RS 2008] Ripetere le intestazioni di colonna sulle pagine. Funziona, funziona, … ;-)
16 marzo 09 04.48 | abenedetti | with no comments

A volte le nuove versioni dei prodotti rendono drammaticamente complicato cose che erano di una banalità disarmante…

Un’esempio: con i Reporting Services 2008 fare in modo che le intestazioni di colonna di una tabella (tablix) vengano riportate anche nella pagine successive alla prima.

Ecco, da zero, i passaggi per farlo.

 

1. Costruisco un nuovo report “ListaComuni”:

image

2. Genero sorgente dati e dataset

3. Inserisco un oggetto tabella (con una sola colonna) sul body del report

image

4. Tasto destro sulla tabella, quindi “Tablix Properties”

image

5. Nella finestra di proprietà, General, seleziono la voce “Repeat Header columns…”. Quindi premo “OK”.

image

Se provaste a vedere adesso la Preview non aspettatevi il risultato sperato… :-(

Pagina 1:

image

Pagine 2 (non ho portato l’intestazione di colonna):

image

 

Gli step ulteriori che devo fare:

6. Nell’area di lavoro Grouping (è l’area in fondo a Visual Studio, suddisiva tra “Row Groups” e “Column Groups” – se non l’aveste visualizzata potete aprirla tramite il menù di Visual Studio: “Report” –> “Grouping”) selezionate la modalità avanzata come in figura

image

7. Aprite la finestra di proprietà (F4) e selezionate, sotto “Row Groups” all’interno dell’area di lavoro “Grouping” la voce “(Static”)

image

8. A questo punto, nella finestra di proprietà impostate “FixedData” = True.

image 

Ok, fatto!

image 

Spero sia utile e faccia risparmiare tempo prezioso a qualcuno ;-)

NHibernate, SQL Server, performance, piani di esecuzione, …
11 marzo 09 01.25 | abenedetti | 1 comment(s)

Mi rifaccio ad un mio precedente post ("Ancora su query e sulla definizione dei parametri (perfomance e piani di esecuzione)", per segnalare come sia sempre molto importante verificare con attenzione il codice SQL che altri scrivono per noi.

Nel dettaglio, sembra che NHibernate non riesca a gestire correttamente i parametri.

Scott (ovvero Claudio), a colpi di debug e dopo una chiacchierata (la discussione può essere seguita qui) con Fabio Maulo (uno dei committers di NHibernate) ha tirato fuori una possibile soluzione che ha prontamente postato sul suo blog inglese (qui) – attendo anche una versione in italiano su UGI :-).

Il consiglio, a chi utilizza NH (ma in generale a chi si affida a “terzi”), è di dare sempre una particolare attenzione alle istruzioni prodotte, perchè i problemi che potrebbero nascere su sistemi di produzione sono sicuramente evitabili.

Personalmente cerco di stare sempre attento alle performance e qualche considerazione l’avevo già espressa tempo fa qui.

Ultimo punto: dico (e sottolineo) sempre che il Profiler sia il migliore amico di chi usa un database (il consiglio resta sempre quello di tenerlo aperto!).

L’importante è saperlo anche leggere ;-)

SQL Server 2008: T-SQL Querying
09 marzo 09 10.18 | abenedetti | with no comments

L’amico Itzik ha mandato in pubblicazione la versione aggiornata alla versione 2008 del libro relativo al querying.

Sul suo sito trovate il sommario, capitoli di esempio ed uno splendido poster sul Logical Query Processing che consiglio a tutti!

Filed under: , ,
Ancora su query e sulla definizione dei parametri (perfomance e piani di esecuzione)
03 marzo 09 07.13 | abenedetti | 2 comment(s)

Supponiamo di avere una “classica” tabella di comuni, qualcosa come:

image

Nell’esempio in questione, poichè i dati verranno utilizzati al 95% con interrogazioni sulla descrizione del comune, è stato impostato l’indice cluster proprio su questa colonna, definita come VARCHAR(50):

create table municipalities
(
id smallint identity(1,1),
idDistrict smallint foreign key references districts(id),
[description] varchar(50),
code char(5), 

constraint pkMunicipalities primary key nonclustered  (id)
)
go 

create clustered index idxMunicipalities on municipalities ([description])
go
 

A questo punto proviamo a fare una ricerca su una parte di testo, ad esempio:

set statistics io on
exec sp_executesql N'select Description 
from municipalities where (Description like @p0 ) 
order by Description'
,N'@p0 varchar(50)',@p0=N'la s%'
set statistics io off
 
Questo il piano di esecuzione prodotto, con una precisa “Index Seek” sull’indice clustered:
image
Queste le statistiche:
Table 'municipalities'. Scan count 1, logical reads 2
 
Adesso proviamo ad analizzare la stessa interrogazione leggermente diversa.
Ovvero a definire il parametro non più VARCHAR(50) ma NVARCHAR(5), ovvero un NVARCHAR dimensionato secondo la lunghezza del testo passato (se avessi richiesto “ancona%” il parametro sarebbe stato dimensionato a 7 caratteri):
 
set statistics io on
exec sp_executesql N'select Description 
from municipalities where (Description like @p0 ) 
order by Description'
,N'@p0 nvarchar(5)',@p0=N'la s%'
set statistics io off

Il piano di esecuzione e le statistiche sono drammaticamente diversi:

image

Table 'municipalities'. Scan count 1, logical reads 41

Siamo passati, di fatto, ad un Clustered Index Scan che, nel nostro esempio, equivale ad un Table Scan (infatti una “select * from municipalities” esegue proprio 41 letture).

Tra le due istruzioni questa è l’unica differenza:

  • @p0 varchar(50)
  • @p0 nvarchar(5)

 

Qual è il motivo che spinge l’ottimizzatore a scegliere una strada completamente diversa?

 

La differenza nella seconda istruzione, analizzando il piano di esecuzione, sta tutta nel predicato, ovvero:

image

CONVERT_IMPLICIT(nvarchar(50),[lxkMonitoring].[dbo].[municipalities].[description],0) like [@p0]

 

La funzione di conversione (CONVER_IMPLICIT), che deve essere applicata alla colonna e non al parametro, fa si che l’indice costruito su questa stessa non possa essere utilizzato.

 

Cosa succederebbe se fossi io a forzare la conversione del parametro nel tipo corretto ( …cast( @p0 as varchar(50))… )?

set statistics io on
exec sp_executesql N'select Description 
from municipalities where (Description like cast( @p0 as varchar(50)) ) 
order by Description'
,N'@p0 nvarchar(5)',@p0=N'la s%'
set statistics io off

L’istruzione sarebbe nuovamente scritta nel modo corretto, infatti:

image

Table 'municipalities'. Scan count 1, logical reads 2

Morale: l’unica strada corretta è quella di utilizzare in maniera giusta i parametri, definendoli come devono essere defniti.

MVP Summit 2009
02 marzo 09 06.24 | abenedetti | with no comments

In questi giorni, insieme a molti altri amici MVP, italiani e di ogni parte del mondo, mi trovo a Seattle per il Summit annuale.

Trovo queste giornate una fantastica occasione ed opportunità per (ri)vedere persone che non potrei vedere altrimenti, per fare networking con le persone dei vari team di sviluppo, per respirare quell’aria di tecnologia e di futuro che si respira raramente altrove.

Oggi e domani saremo al Campus di Microsoft, a Redmond, insieme a tutti gli altri.

Ho con me una lista di punti di cui vorrei discutere con alcuni PM, in primis quelli di Reporting Services (alcuni di questi punti sono in realtà suggerimenti e note di clienti, collaboratori, amici).

Le domande sono tante, la voglia di capire dove stiamo andando (e a che velocità ci stiamo muovendo) anche.

Spero di poter postare qualche news interessante!

Filed under: , ,

This Blog

Syndication