Caricare report e sottoreport

lunedì 15 giugno 2015 - 06.38
Tag Elenco Tags  VB.NET  |  .NET 4.0  |  Windows XP  |  Visual Studio 2008

basicdany Profilo | Expert

ciao carico i report in questa maniera:

cn = New OleDbConnection(ConnString)

cn.Open()

Dim oleAdapter As New OleDbDataAdapter

oleAdapter.SelectCommand = New OleDbCommand(Sql4, cn)

Dim ds As New DataSetStampaSchedaImmobileNote

ds.Clear()

oleAdapter.Fill(ds, "SchedeImmobile")

Dim rep As New CrystalDecisions.CrystalReports.Engine.ReportDocument

rep.Load(Application.StartupPath & "\RtpSchedaImmobileNote.rpt")

rep.SetDataSource(ds)

CRV.ReportSource = rep

cn.Close()

mi serve caricare un sottoreport contenuto nel report principale, come faccio questo, ?? da tener conto che al sottoreport devo caricare con una query dei dati da altra tabella.

grazie a tutti

ysdemarc Profilo | Expert

Suppongo che il tuo report abbia già un sotto report con i link per chiave.

dovresti fare in questo modo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Vincenzo
Programmatore sbilenco

basicdany Profilo | Expert

ciao, il sottoreport non ha link chiavi, perche tramite query che passo al dataset prendo i dati.
comunque nel codice che ho postato prima dove inserisco il codice per caricare il secondo sottoreport?
se noti il codice io uso il componente del cristal report...

grazie

ysdemarc Profilo | Expert

prima del CRV.ReportSource = rep

Ma come fai a non avere link? se il report ed il sotto report non sono aggangiati da chiavi rischi di avere un report "anomalo"
Vincenzo
Programmatore sbilenco

basicdany Profilo | Expert

ciao, gli passo la query al dataset quindi e sicuro i dati, il mio problema e invece come passare il dataset del secondo report e il percorso del report.

grazie

ysdemarc Profilo | Expert

Non riesco a comprendere quello che vuoi..

Tu hai il tuo report che all'inteno contiene un subreport a cui hai associato un nome.

con questa riga di codice

rep.OpenSubreport(nomesubreport).SetDataSource(dati);

Non fai altro che dire (rep è il report principale) di aprire il sub report ed associare i dati letti da db.

se devi passare dei paramentri al sotto report sempre allo stesso modo...

una volta che fai OpenSubreport hai tutte le proprietà del report come quello principale
Vincenzo
Programmatore sbilenco

basicdany Profilo | Expert

ciao, ti spiego meglio:

questo e il codice che io uso per caricare il report principale:

cn = New OleDbConnection(ConnString)

cn.Open()

Dim oleAdapter As New OleDbDataAdapter

oleAdapter.SelectCommand = New OleDbCommand(Sql4, cn)

Dim ds As New DataSetStampaSchedaImmobileNote

ds.Clear()

oleAdapter.Fill(ds, "SchedeImmobile")

Dim rep As New CrystalDecisions.CrystalReports.Engine.ReportDocument

rep.Load(Application.StartupPath & "\RtpSchedaImmobileNote.rpt")

rep.SetDataSource(ds)

CRV.ReportSource = rep

cn.Close()


IL SOTTOREPORT SI CHIAMA "RtpNOTE.rpt contenuto nel report principale, come faccio a dirgli di caricare un dataset al sottoreport CHE CHIAMIAMO DATASETNOTE e visualizzarlo CON IL report principale, QUINDI IN CVR.REPORTSOURCE??

GRAZIE TANTO

ysdemarc Profilo | Expert

Credo che purtroppo io mi spiega male

il tuo report RtpSchedaImmobileNote.rpt contiene al suo interno il sottoreport RtpNOTE.rpt (perchè suppongo glielo hai inserito in fase di progettazione).
Entrando nel file di crystal report (RtpSchedaImmobileNote.rpt) in modalità di sviluppo dovrsti vedere il tuo report ed in una sezione avrai inserito il tuo subreport (RtpNOTE.rpt).
Questo subreport cosa contiene nella proprietà Subreportname e non Name? supponiamo che abbia lo stesso nome del file e quindi una stringa "RtpNOTE.rpt".

Allora dovresti scrivere qualcosa del genere:
DataSet dsReport; //questo sarà valorizzato con la lettura dati al database dei dati che vuoi nel report
DataSet dsSottoReport; //questo sarà visualizzato con un'altra lettura al database con i dati che dovrà contenere il sottoreport + le chiavi che metterai in relazione nei link in crystall report

ReportDocument rep = new ReportDocument();
rep.Load(Application.StartupPath & "\RtpSchedaImmobileNote.rpt")

rep.SetDataSource(dsReport)
rep.OpenSubreport("RtpNOTE.rpt").SetDataSource(dsSottoReport);

a questo punto al tuo CrystalReportViewer CRV passerai solo rep:

CRV.ReportSource = rep

e poi puoi visualizzerai un'anteprima di stampa come fai di solito.

Vincenzo
Programmatore sbilenco

basicdany Profilo | Expert

ciao, ho provato cosi:

cn1 = New OleDbConnection(ConnString)
cn1.Open()
Dim oleAdapter1 As New OleDbDataAdapter
oleAdapter1.SelectCommand = New OleDbCommand(Sql1, cn1)
Dim ds1 As New DataSetStampaSchedaImmobileNote
ds1.Clear()
oleAdapter1.Fill(ds1, "SchedeImmobile")

cn2 = New OleDbConnection(ConnString)
cn2.Open()
Dim oleAdapter2 As New OleDbDataAdapter
oleAdapter2.SelectCommand = New OleDbCommand(Sql2, cn2)
Dim ds2 As New DataSetNote
ds2.Clear()
oleAdapter2.Fill(ds2, "NoteImmobile")

Dim rep1 As New CrystalDecisions.CrystalReports.Engine.ReportDocument
rep1.Load(Application.StartupPath & "\RtpSchedaImmobileNote.rpt")
rep1.SetDataSource(ds1)

rep1.OpenSubreport("\RtpNote_Per_SchedeImmobili.rpt").SetDataSource(ds2)

CRV.ReportSource = rep1
Cn.Close()


visualizza reporto vuoto!

se elimino questa istruzione: rep1.OpenSubreport("\RtpNote_Per_SchedeImmobili.rpt").SetDataSource(ds2)

mi visualizza solo il report principale


grazie

ysdemarc Profilo | Expert

Veramente è già starno che alla riga

rep1.OpenSubreport("\RtpNote_Per_SchedeImmobili.rpt").SetDataSource(ds2)

non ti abbia dato errore.. la "\" non dovrebbe essere accettata nella priprietà Subreportname..

Puoi allegare il report?


PS: Forse un esempio vale più di mille parole.

In allegato ho messo un file xml con 2 tabelle ed il progetto di un report che usa queste tabelle.
(Io per comodità ho usato il file xml, ma naturalmente quando progetti il report decidi da dove prendere i dati.)

Copiandoli in C:\

Mostro l'anteprima del report in questo modo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

ed ecco quello che ottengo:

974x735 79Kb

basicdany Profilo | Expert

ciao, ho seguito tutto quello che hai detto genera errore QUANDO APRO IL SOTTOREPORT :

riferimento a un oggetto non impostato...

il codice scritto tenendo conto che i 2 report sono nella cortella corrente in bin

Dim Sql1 As String
Sql1 = "SELECT * FROM schedeimmobile WHERE Numeroschedaimmobile=" & lblNumeroSchedaImmobile.Text

Dim Sql2 As String 'note
Sql2 = "SELECT * FROM NoteImmobile WHERE Numeroschedaimmobile=" & lblNumeroSchedaImmobile.Text


cn1 = New OleDbConnection(ConnString)
cn1.Open()
Dim oleAdapter1 As New OleDbDataAdapter
oleAdapter1.SelectCommand = New OleDbCommand(Sql1, cn1)
Dim ds1 As New DataSetStampaSchedaImmobileNote
ds1.Clear()
oleAdapter1.Fill(ds1, "SchedeImmobile")

cn2 = New OleDbConnection(ConnString)
cn2.Open()
Dim oleAdapter2 As New OleDbDataAdapter
oleAdapter2.SelectCommand = New OleDbCommand(Sql2, cn2)
Dim ds2 As New DataSetNote
ds2.Clear()
oleAdapter2.Fill(ds2, "NoteImmobile")

Dim rep1 As New CrystalDecisions.CrystalReports.Engine.ReportDocument
rep1.Load(Application.StartupPath & "\RtpSchedaImmobileNote.rpt")
rep1.SetDataSource(ds1)

rep1.OpenSubreport("RtpNote_Per_SchedeImmobili.rpt").SetDataSource(ds2)

CRV.ReportSource = rep1


GRAZIE TANTO

ysdemarc Profilo | Expert

Dal codice che hai scritto non mi risulta che hai seguito quello che ho scritto.

Se vuoi fammi vedere questo report, non riesco a capire proprio cosa hai fatto in progettazione.
E comunque controlla che i dataset che passi contengano realmente dati e non siano null.
Io di come estrai dati do per buono che funzioni.

Poi se posso permettermi un consiglio evita sempre, soprattutto per i report il " SELECT * FROM..."
L'ordine dei campi in Crystal Report è importante, e con crystal report .net anche il nome di essi deve essere uguale. Basta un piccolo cambiamento in tabella o nel report e non ti funzionerà più niente e per capire l'errore ci vorrà poi troppo tempo.
Vincenzo
Programmatore sbilenco

basicdany Profilo | Expert

Tutto ok, grazie per le ditte date.

basicdany Profilo | Expert

Tutto ok, funziona grazie per l aiuto
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