ReportViewer

domenica 06 marzo 2011 - 12.12
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Windows 7  |  Windows XP  |  Visual Studio 2008  |  Access (.mdb)

LucaGP Profilo | Newbie

Ciao a tutti ragazzi!

Sono uno sviluppatore esperto di VB6 e sto passando piano piano a .NET ma l'impresa è ardua e molto scoraggiante.
Ho un problema serio ed abbastanza frustrante con la creazione un semplice report. In VB6 ci si impiega per farlo... un 2 minuti al max! Qui ha due giorni che leggo info sulla rete, scarico esempi allucinanti di pagine e pagine che nemmeno si eseguono per via di errori sconosciuti..
Allora:

1) Immaginiamo di avere un Database Access su c:\ chiamato "DB1.mdb". Tale Database è la sorgente dei dati da stampare.
Questo Database contiene una tabella alla volta (su due totali che ne sono previste). Può contenere la tabella "TAB1" o "TAB2" a seconda di cosa sceglie di stampare l'utente a runtime.

la TAB1 è composta da sole 3 colonne: A, B, C di semplice testo;
la TAB2 è composta da sole 2 colonne: W, Q di semplice testo;

2) Non voglio creare nulla a design time (tranne la grafica del report) poichè noto che eventuali dataset e adapter creati in progettazione mi limitano la flessibilità del codice (magari sono io);

Quindi...

Apro VS 200x
Nuovo progetto Windows
Importo una copia di DB1 nel progetto;
Scelgo form1 vuota;
le incollo su un bel ReportViewer1
Aggiungo un nuovo elemento.. scelgo generico Report1.rdlc (che si aprirà quando la form1 capisce che l'utente vuol stampare la TAB1)
nel corpo metto una tabella con 3 colonne senza associare nulla. Bella, mi piace.
Chiudo tutto e salvo.

Torno a Form1, evento Form_LOAD

'con una function vedo se nel DB c'è TAB1 o TAB2..
Dim Tabella as string = CosaEsserciLi()
if Tabella="TAB1" then
' apro report1..

dim conn1 as oledb.oledbconnection = "Provider=microsoft...;Data Source=db1.mdb"
dim cmd as new oledbcommand("Select * from TAB1",conn1)
dim ADP1 as new oledbdataadapter
dim DS1 as new system.data.Dataset

dap1.selectcommand= cmd
ds1.clear 'svuoto sempre il dataset per evitare che eventuali aggiornamenti dell'ultimo minuto si perdano

dap1.fill(DS1,"TAB1")

'adesso che ho il mio dataset con la tabella "TAB1" caricata voglio associarlo al file Report1.rdlc e qui vengono i guai
'COME SI FAAAA ????
' ci vorrebbe qualcosa tipo:

"report1.rdlc".table1.datasouce = DS1
"report1.rdlc".table1.colonna1.datafield = "A"
"report1.rdlc".table1.colonna2.datafield = "B"
"report1.rdlc".table1.colonna3.datafield = "C"

form1.reportviewer1.datareport= "report1.rdlc"
form1.reportviewer1.show

else
' apro report2... faccio le associazioni come per il report1 usando la tabella TAB2

form1.reportviever1.datareport = "REPORT2.RDLC" ' disegnato in progettazione con una table di sole 2 colonne questa volta.

end if


Potete aiutarmi con un esempio funzionante? Ve ne prego perchè in rete non c'è niente di questo genere.. non penso sia chiedere tanto.. mah!
Vi ringrazio di cuore

gaetanodimatteo Profilo | Newbie

Ciao,
ho trovato anche io le tue stesse difficoltà nel passaggio al .net e se vuoi evitarne altre
ti consiglio di procurarti un buon manuale.
Per la stampa dovresti utilizzare il controllo reportviewer.
Sono disponibili diverse soluzioni per la stampa, io ho scelto la seguente:

1) creo una form di anteprima, con un reportviewer, che accetta un parametro nel costruttore
di tipo datatable che dovrebbe contenere i dati da stampare.
2) inserisco il seguente codice nell'evento load della form :

Dim report As New Microsoft.Reporting.WinForms.LocalReport
report = ReportViewer1.LocalReport
Dim fdati As New Microsoft.Reporting.WinForms.ReportDataSource("PrimaNotaDS_PrimaNota", dt)
report.DataSources.Add(fdati)

ReportViewer1.ZoomMode = Microsoft.Reporting.WinForms.ZoomMode.Percent
ReportViewer1.SetDisplayMode(Microsoft.Reporting.WinForms.DisplayMode.PrintLayout)
ReportViewer1.ZoomPercent = 100

Me.ReportViewer1.RefreshReport()

devi solo fare attenzione al nome del datasourse che hai impostato (in questo caso PrimaNotaDS_PrimaNota)

2) associo il report rdlc al reportviewer tramite la combobox nella finestra "attività del controllo"
3) dalla form principale recupero il datatable con i dati da stampare
4) richiamo la form di anteprima

Spero di essere stato utileù

Ciao


Gaetano Di Matteo

LucaGP Profilo | Newbie

Ti ringrazio tantissimo Gaetano,
appena arrivo a casa a pranzo provo subito il codice!

Ascolta, tu sai come impostare una label a runtime dentro un foglio di report (*.rdlc) ??

Ad esempio, nell'intestazione del report ho una label1 con scritto: "PERIODO DI ESTRAPOLAZIONE : "
vorrei che dal codice stesso prima di dare il comando:
form1.reportviewer1.show (o simile, non ricordo ora la sintassi) si potesse inserire qualcosa del tipo:

** report("foglio1.rdlc").Section("intestazione").Label1.text = "PERIODO DI ESTRAPOLAZIONE : " & DATE_DAL() & " AL " & DATE_AL() **

Sai come procedere per tale problematica?

ps: il manuale lo possiedo eccome, ho comprato Microsoft VB.NET per i database di Access, ASP.NET 2.0, SQL SERVER ecc..

li ho letti ma nessuno parla dei report con questo controllo (ne tantomeno Crystal, questo sconosciuto!!!). E' semplicemente ridicola la mancanza di qualunque accenno in merito! Conosci un testo da consigliarmi? Però ecco.. mi sembra eccessivo un testo nuovo solo per fare cose elementari come questa.. oddio in VB6 ci sono andato al 90% ad intuito.. :-/ Ad ogni modo.. forza e coraggio dico sempre, no? :-p

Spero in una tua dritta per la domanda appena postata.. Ciao!!!

gaetanodimatteo Profilo | Newbie

Ciao,
ricordo anche io la flessibilità del vb6 con i report e ti confesso che mi manca molto.
In .net non è previsto l'accesso diretto ai controlli delle specifiche rdlc.
In casi disperati, per configurare manualmente la posizione dei controlli in un file rdlc,
ho dovuto creare una routine di modifica del file di definizione.
Per modificare solo il valore del controllo "label" nel report
devi utilizzare i parametri che trovi nel menu "Report/Parametri report" se hai
VS2008, se utilizzi VS2010 puoi accerevi tramite "Visualizza/Dati rapporto",
definisci i parametri di cui necessiti, li assegni alle label e utilizzi la routine
seguente nell'evento load della form di anteprima:

Private Sub AssegnaParametri()
Dim parms As New List(Of Microsoft.Reporting.WinForms.ReportParameter)
parms.Add(New Microsoft.Reporting.WinForms.ReportParameter("Data1", _Data1))
parms.Add(New Microsoft.Reporting.WinForms.ReportParameter("Data2", _Data2))
parms.Add(New Microsoft.Reporting.WinForms.ReportParameter("TotEntrate", _totEntrate))
parms.Add(New Microsoft.Reporting.WinForms.ReportParameter("TotUscite", _totUscite))
parms.Add(New Microsoft.Reporting.WinForms.ReportParameter("Differenza", _Differenza))

ReportViewer1.LocalReport.SetParameters(parms)
End Sub

Naturalmente i miei consigli sono frutto delle mie esperienze e non rappresentano procedure
assolute, magari qualcuno più esperto di me potrà consigliarti soluzioni più adeguate.

Ciao


Gaetano Di Matteo

LucaGP Profilo | Newbie

Azz... ok, vedro' di capire quest'altra cosa grazie ai tuoi esempi!
Ps. Tornando a casa ho avuto una mezz'oretta per ricostruire il progetto "ReportSample" di cui stiamo parlando (almeno fino all'associazione di un report vuoto).. ho capito come evitare il passaggio obbligato di assegnare il report (*.rdlc)tramite il passaggio "ComboBox" della "finestra attività" del controllo ReportViewer! Ti interessa il codice? In caso posto tutto stasera..

Pensi che il datasource di una tabella inserita nel corpo del file di report si possa associare da codice solo con i parametri?

Altra cosa.. una volta che creo il mio bell'eseguibile.. il file di report non viene "inglobato" dentro l'exe come succedeva per VB6 ? Ho avuto questa sensazione perchè provando il programmino e sbagliando il percorso del file rdlc assegnato da stringa... mi dice: "Nessun report1.rdlc in c:\SampleReport\SampleReport\x86\debug\bin ecc. ecc.". Credo che lo voglia sempre come risorsa esterna.. è vero?

Luca.

gaetanodimatteo Profilo | Newbie

Ciao,
il file di report non viene inglobato nell'exe perchè non lo assegni tramite progettazione ma a run time (almeno credo).
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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5