<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Reporting</title>
        <link>http://blogs.ugidotnet.org/pietrolibroblog/category/Reporting.aspx</link>
        <description>Reporting</description>
        <language>it-IT</language>
        <copyright>Pietro Libro</copyright>
        <managingEditor>pietro.libro@libero.it</managingEditor>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Report e proprietà OnLastPage</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2009/11/29/report-e-proprieta-onlastpage.aspx</link>
            <description>Se in un Report, desideriamo che il contenuto del footer sia visualizzato solo nell'ultima pagina , possiamo impostare la proprietà "PrintOnLastPage" del footer a true. Fin qui tutto ok. Però , ieri mi è capitata una situazione (apparentemente) strana: nonostante la proprietà fosse impostata correttamente, il ReportViewer (e di conseguenza la stampa) riportava il piè di pagina su tutte le pagine ad esclusione della prima. Non avendo trovato una soluzione e spiegazione valida, ho risolto impostando la proprietà "Visibility\Hidden" dei controlli contenuti nel footer su :=(Globals!PageNumber &amp;lt;globals !TotalPages)&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/97629.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2009/11/29/report-e-proprieta-onlastpage.aspx</guid>
            <pubDate>Sun, 29 Nov 2009 12:08:02 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2009/11/29/report-e-proprieta-onlastpage.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/97629.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/97629.aspx</trackback:ping>
        </item>
        <item>
            <title>The setup failed to read IIsMimeMap table&amp;hellip;</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2009/01/11/the-setup-failed-to-read-iismimemap-tablehellip.aspx</link>
            <description>Finalmente sono riuscito a ritagliare del tempo per formattare e ripristinare il mio portatile, prima che arrivi il mio periodo “caldo” (causa lavoro e Università). In questi giorni, mi è capitato di dover rimuovere da un PC, SQL Server 2005, nel caso in cui durante il processo di disinstallazione si presenti il messaggio : Il programma di installazione non riesce a leggere tabella IIsMimeMap. Il codice di errore è-2147024893 (o The setup failed to read IIsMimeMap table. The error code is –2147024893 )
 
la soluzione è in questo articolo, in pratica si tratta di disabilitare in sequenza i servizi Servizio  di Amministrazione di IIS e Servizio Pubblicazione sul Web prima di procedere con la disinstallazione &lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/95167.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2009/01/11/the-setup-failed-to-read-iismimemap-tablehellip.aspx</guid>
            <pubDate>Sun, 11 Jan 2009 21:34:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2009/01/11/the-setup-failed-to-read-iismimemap-tablehellip.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/95167.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/95167.aspx</trackback:ping>
        </item>
        <item>
            <title>Image, MemoryStream e file .rdlc</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2008/11/25/image-memorystream-e-file-.rdlc.aspx</link>
            <description>Supponiamo di avere un file di Report in formato .rdlc, e di voler stampare una lista di prodotti visualizzando un'immagine prodotta a run-time e memorizzata in un MemoryStream, piuttosto che utilizzare file d'immagine. Ad esempio, supponiamo di avere nel nostro Database, una tabella denominata Prodotti, contenente 4 colonne:     Aggiungiamo al nostro progetto (ad esempio di tipo Web Application) un DataSet tipizzato (dsProdotti)  contenente un DataTable Prodotti, a cui andiamo ad aggiungere una colonna denominata  Immagine, con proprietà DataType impostata su System.Byte[]:     Aggiungiamo un nuovo file di Report (Report1.rdlc), nel designer del report, dalla toolbox degli strumenti, trasciniamo nella sezione Body, un item Table che configuriamo  opportunamente:     Come si evince dalla figura, nell'ultima colonna della Table, è stato aggiunto un controllo Image. Affinchè il tutto funzioni correttamente, è necessario impostare correttamente le proprietà di questo controllo, ovvero:      La proprietà Source deve essere impostata su Database     La proprietà MIMEType deve essere impostata sul tipo di immagine che si vuole visualizzare (images/gif, image/jpeg etc...)     La proprietà Value deve essere impostata sul valore campo contenente lo Stream di byte, nello specifico: =Fields!Immagine.Value    Agganciato il report ad un opportuno controllo ReportViewer  non resta che scrivere il codice per recuperare i dati dal Database e popolare un opportuno DataTable, da utilizzare come sorgente dati per il Report:   1 DsProdotti dsProdotti = new DsProdotti();
 2 
 3 dsProdotti.Prodotti.RowChanged += new DataRowChangeEventHandler(Prodotti_RowChanged);
 4 
 5 using (DsProdottiTableAdapters.ProdottiTableAdapter prodottiAdapter = new ReportConImmaginiStream.DsProdottiTableAdapters.ProdottiTableAdapter())
 6 {
 7     prodottiAdapter.Fill(dsProdotti.Prodotti);
 8 }
 9 
10 ReportViewer1.LocalReport.DataSources.Clear();
11 ReportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource("DsProdotti_Prodotti", dsProdotti.Prodotti));

 

Gestendo  l'evento RowChanged del DataTable Prodotti, possiamo popolare il valore del campo Immagine della riga aggiunta alla collezione del DataTable, con lo stream di byte rappresentante l'immagine che vogliamo visualizzare:

1 void Prodotti_RowChanged(object sender, DataRowChangeEventArgs e)
2 {
3     if (e.Action == DataRowAction.Add)
4     {
5         //Immagine da Stream
6          e.Row["Immagine"] = ImageDataRow.ImageDataRowIstance.GetImageArray();
7     }
8 }

Dove il codice della classe ImageDataRow è il seguente:



 1 public class ImageDataRow
 2 {
 3     private static byte[] _imageArray = null;
 4     private static ImageDataRow _imageDataRowIstance;
 5 
 6     private ImageDataRow() { }
 7 
 8     public static ImageDataRow ImageDataRowIstance
 9     {
10         get
11         {
12             if (_imageDataRowIstance == null)
13                 _imageDataRowIstance = new ImageDataRow();
14             return _imageDataRowIstance;
15         }
16     }
17 
18     public System.Byte[] GetImageArray()
19     {
20         if (_imageArray == null)
21         {
22             using (MemoryStream imgStream = new MemoryStream())
23             {
24                 System.Drawing.Image img = new Bitmap(32, 32);
25                 Graphics gr = Graphics.FromImage(img);
26                 gr.FillRectangle(new SolidBrush(Color.White), 0, 0, 32, 32);
27                 gr.DrawEllipse(new Pen(Color.Red, 2), 1, 1, 30, 30);
28                 img.Save(imgStream, System.Drawing.Imaging.ImageFormat.Gif);
29                 _imageArray = imgStream.ToArray();
30             }
31         }
32         return _imageArray;
33     }
34 }



Dato che nell'esempio viene visualizzata sempre la stessa immagine, per non instanziare ad ogni riga un oggetto MemoryStream ed eseguire il codice di  disegno, si è scelto di utilizzare un Singleton. Ovviamente, nel caso in cui l'immagine debba cambiare a seconda dei valori contenuti nella riga, il codice dovrà essere ottimizzato opportunamente.

Il risultato che si otterrà eseguendo il codice, sarà qualcosa del tipo:

 

Sorgenti completi del progetto&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/94755.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2008/11/25/image-memorystream-e-file-.rdlc.aspx</guid>
            <pubDate>Tue, 25 Nov 2008 18:42:48 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2008/11/25/image-memorystream-e-file-.rdlc.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/94755.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/94755.aspx</trackback:ping>
        </item>
        <item>
            <title>Report Locali &amp;amp; ReportDataSource</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2008/04/15/92210.aspx</link>
            <description>Post nato da una discussione su forum. Supponiamo di avere un DataSet tipizzato contenente un oggetto DataTable "Articoli" come in figura:    Supponiamo di avere anche un report locale del tipo:       Per associare il nostro DataTable al report, possiamo utilizzare un ReportDataSource, scrivendo del codice tipo:      1         Dim dsStampa As New DsStampa()
 2         Dim tableArticoli As New DsStampa.ArticoliDataTable()
 3 
 4         'Aggiungo un paio di righe
 5         Dim articoloRow As DsStampa.ArticoliRow = tableArticoli.NewArticoliRow()
 6         articoloRow.Codice = "CODICE A"
 7         articoloRow.Descrizione = " DESCRIZIONE 1"
 8         tableArticoli.Rows.Add(articoloRow)
 9 
10         articoloRow = tableArticoli.NewArticoliRow()
11         articoloRow.Codice = "CODICE B"
12         articoloRow.Descrizione = " DESCRIZIONE 2"
13         tableArticoli.Rows.Add(articoloRow)
14 
15         Dim reportDataSource As New Microsoft.Reporting.WinForms.ReportDataSource()
16 
17         reportDataSource.Name = "DsStampa_Articoli"
18         reportDataSource.Value = tableArticoli
19 
20         Me.ReportViewer1.LocalReport.ReportPath = "Report1.rdlc"
21         Me.ReportViewer1.LocalReport.DataSources.Clear()
22         Me.ReportViewer1.LocalReport.DataSources.Add(reportDataSource)
23         Me.ReportViewer1.RefreshReport()


E' importante non sbagliare ad impostare la stringa della proprietà Name della nostra istanza di reportDataSource con il valore presente nelle proprietà Table del report



altrimenti all'interno del ReportViewer verrebbe notificato un errore che indica che non è stata fornita nessuna sorgente dati

 

Codice sorgente: Test Report.zip

 


  Technorati Tag: ReportDataSource&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/92210.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2008/04/15/92210.aspx</guid>
            <pubDate>Tue, 15 Apr 2008 12:07:50 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2008/04/15/92210.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/92210.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/92210.aspx</trackback:ping>
        </item>
    </channel>
</rss>