Creare un report da codice

martedì 16 ottobre 2007 - 11.46

flinston Profilo | Newbie

Ciao a tutti. E' la prima volta che scrivo nella speranza che qualcuno possa darmi una mano.
Il mio problema è il seguente : ho la necessità di creare un report con una base predefinita, ma con la particolarità che di volta in volta il report deve essere generato da una tabella con la stessa struttura, ma con nome diverso.
Avrei la necessità di capire come accedere a questi dati utilizzando il codice VB.NET 2005.
Spero di essermi spiegato correttamente.

Grazie a tutti coloro che midaranno dei suggerimenti

Ciao

Paolo72 Profilo | Newbie

Ciao, sinceramente non so come si possa fare in VB.NET in quanto sono ancora rimasto al buon vecchio ma funzionale VB 6 (scelte dettate da esigenze legate alla società per la quale lavoro), quindi ti premetto subito che non so fino a che punto ti possa servire il mio suggerimento. Comuqnue il codice che uso per visualizzare un report è il seguente:

ContolloCrystalReport.DataFiles(0) = App.Path & "\data\Archivio.mdb"
ContolloCrystalReport.ReportFileName = App.Path & "\Report\Documento.rpt"
ContolloCrystalReport.Action = 1

Di conseguenza se è il database a cambiare nome basta utilizzare il seguente codice:

Dim sNomeArchivio as String

...codice per assegnare il nome dell'archivio alla variabile sNomeArchivio

ContolloCrystalReport.DataFiles(0) = App.Path & sNomeArchivio
ContolloCrystalReport.ReportFileName = App.Path & "\Documento.rpt"
ContolloCrystalReport.Action = 1

Se invece è la tabella a cambiare nome potresti optare tra due soluzioni:
1) Copiare tutti i dati che devi visulizzare in una cartella di appoggio utilizzando l'istruzione INSERT INTO TabellaDiAppoggio SELECT * FROM TabellaDiOrigine.
2) Oppure legare al report la tabella che intendi utilizzare di volta in volta utilizzando un codice simile a quello descritto per il cambio nome dell'archivio.

Nel primo caso il programma potrebbe essere un pò rallentato ma tieni conto che l'istruzione SQL che ti ho scritto è molto veloce inoltre se non metti nessun tipo di ordinamento ottieni un notevole aumento di velocità. Mi spiego meglio: se utilizzi la seguente istruzione SQL "SELECT * FROM Tabella ORDER BY IdTabella" non ci sono problemi...funziona perfettamente, ma la clausola ORDER BY provoca un rallentamento nel popolamento di un record set. Se invece usi "SELECT * FROM Tabella" e poni l'ordinamento tramite il campo IdTabella direttamente sul report di Crystal riesci a velocizzare il popolamento del record set e quindi anche la visualizzazione del report stesso. Ovviamente ciò vale sia con l'istruzione SELECT che con l'istruzione INSERT INTO SELECT.

Purtroppo non posso dirti di più in quanto non mi è mai capitata un'esigenza del genere.

Fammi sapere se sono stato in grado di darti un suggerimento utile oppure no.

Ciao

P.S.: comunque potresti anche provare a vedere su MSDN On Line sul sito MicroSoft...anche se la stessa MicroSoft sinceramente complica notevolmente anche i casi più semplici

nar Profilo | Newbie

E' la prima volta che scrivo..
Volevo esserti solidale... Ho il tuo stesso problema e mi sto cervellando.. Non riesco a capire come strutturare il mio rpt in forma design time senza inserire nessuna tabella visto che la struttura è la stessa mentre il nome tabella cambia..
Confido.. ci sono ottimi programmatori nel forum..
Grazie ..
Andy/74

freeteo Profilo | Guru

ciao,
io nella progettazione di un report mi baso su questi (miei) punti basilari
- sono visualizzatori complessi di una sorgente dati
- a design time imposto la struttura e l'aspetto ma i dati che uso per avere le anteprime in questa fase possono essere qualsiasi (mi è capitato anche di fare un database mdb di appoggio per agilita' di test)
- da codice gli passo la sorgente dati in 2 modi: con il metodo SetDataSource (gli passo io un datatable/collection con i dati da visualizzare) o impostando le LogonInfo(dico al report in quale database andare a prendersi i dati)

Nel tuo caso, se non ho capito male hai stessa struttura ma in tabelle diverse, quindi ti basta creare il report a designtime usandone una qualsiasi e poi applicare i 1 dei 2 metodi che ti dicevo prima.
Dopo aver fatto il report e posizionato i campi dove ti interessa, usi un codice di questo tipo:

1o metodo:
... Dim tabella As New DataTable() ... mioDataAdapter.Fill(tabella) ... Dim mioreport as new ReportDocument() mioreport.load("c:\..\..\crystalreport1.rpt") mioreport .SetDataSource(tabella) CrystalReportViewer1.ReportSource = mioreport ...



2o metodo:
... Dim mioreport as new ReportDocument() mioreport.load("c:\..\..\crystalreport1.rpt") Dim logOnInfo As New TableLogOnInfo logOnInfo = mioreport.Database.Tables.Item("Tabella").LogOnInfo logOnInfo.ConnectionInfo.ServerName = "SERVER" logOnInfo.ConnectionInfo.DatabaseName = "miodb" logOnInfo.ConnectionInfo.UserID = "User" logOnInfo.ConnectionInfo.Password = "pwd" logOnInfo.TableName = Tabella" mioreport.Database.Tables[0].ApplyLogOnInfo(logOnInfo) CrystalReportViewer1.ReportSource = mioreport CrystalReportViewer1.DataBind(); ...



quale dei 2 usare? dipende dalle esigenze, se i dati ti serve caricarli in ado.net perche' devi cmq farlo in qualche altra parte del progetto allora sicuramente è da usare il primo, se invece vuoi fare a meno di scrivere codice ado.net per dati che useresti solo per il report allora anche il secondo va benissimo.
Per moli di dati clamorose, il secondo è piu' performante.
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

nar Profilo | Newbie

Grazie.. sei proprio bravo..
Sto visitando da alcuni giorni questo forum !
Sei un' ottimo programmatore..grazie ancora...

Ho risolto grazie al tuo aiuto.. Allego lo script per un eventuale aiuto:




Private Sub ConfigureCrystalReports()
Dim database As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source=c:\inetpub\sito_di_test\prova.mdb")

customerReport = New ReportDocument()

Const tab As String = "[Nome della tabella che cambierà in continuazione]"

Const QUERY_STRING As String = "SELECT " & tab & ".* FROM " & tab & ""


Dim reportPath As String = Server.MapPath("CrystalReport2.rpt")
customerReport.Load(reportPath)


Dim tabella1 As DataSet = New DataSet()
Dim tabellaxx As OleDb.OleDbDataAdapter = New OleDb.OleDbDataAdapter(QUERY_STRING, database)
tabellaxx.Fill(tabella1, tab)

customerReport.SetDataSource(tabella1.Tables(0))

Dim logOnInfo As New TableLogOnInfo()

Dim table As Table

For Each table In customerReport.Database.Tables

logOnInfo = customerReport.Database.Tables.Item("Tabella1").LogOnInfo
logOnInfo.ConnectionInfo.ServerName = "c:\inetpub\sito_di_test\prova.mdb"
logOnInfo.ConnectionInfo.DatabaseName = "c:\inetpub\sito_di_test\prova.mdb"
logOnInfo.ConnectionInfo.UserID = "Admin"
logOnInfo.ConnectionInfo.Password = ""
logOnInfo.TableName = "Tabella1"
table.ApplyLogOnInfo(logOnInfo)

Next table
myCrystalReportViewer.ReportSource = customerReport
myCrystalReportViewer.DataBind()

End Sub


Andy/74

freeteo Profilo | Guru

>Grazie.. sei proprio bravo..
>Sto visitando da alcuni giorni questo forum !
>Sei un' ottimo programmatore..grazie ancora...
>
>Ho risolto grazie al tuo aiuto..
Perfetto! ti ringrazio per i complimenti anche se "ottimo" è una parola che non mi si addice proprio
Accetta una risposta cosi' marchiamo il thread come risolto.
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5