[vb.net] passare parametro a crystal report

martedì 28 ottobre 2008 - 19.55

yuri85 Profilo | Junior Member

Ciao a tutti,

qualcuno sa spiegarmi come passare un parametro a un report da vb.net?

in Crystal report ho creato il parametro "par_Nome" e l'ho associato alla query.

Infatti in Crystal mi chiede di inserire il nome cliente e mi visualizza il record scelto.

Ora, come posso da vb.net passare il nome al parametro?

ho un oggetto ReportDocument di nome rptRubricaClienti.

carico quindi il report con rptRubricaClienti.load("")

a questo punto per passare il parametro qual'è la sintassi corretta? ve lo chiedo perchè ho visto diverse soluzioni senza capirci molto.

infine stampo il report rptRubricaClienti.PrintToPrinter(1, False, 1, 1)


Infatti se voglio stampare l'intera rubrica, quindi senza uso di parametri, funziona tutto senza problemi.


grazie mille!

freeteo Profilo | Guru

Ciao,
puoi passare un parametro ad un report in questo modo:

ReportDocument report = new ReportDocument(); report.Load(...); ... report.SetParameterValue("mioparametro", "valore"); ...
e questo vale sia per un parametro che hai definito dentro al report (nella tab "Field Explorer" per intenderci) sia un parametro che serve al report per chiamare una stored o cmq fare accesso al db.

*ps: per problemi relativi alle stampe o cmq alla reportistica, c'è una stanza apposita, magari per i prossimi post usa quella così teniamo in ordine il forum.

Grazie,ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

yuri85 Profilo | Junior Member

ciao!

scusami non mi ero accorto che c'è un'area dedicata al crystal report.

comqunque ho provato come hai detto te :

Me.rptRubricaClienti.Load(My.Application.Info.DirectoryPath & "\Report\RubricaClienti.rpt") Me.rptRubricaClienti.SetParameterValue("par_Nome", "Angela") Me.rptRubricaClienti.PrintToPrinter(1, False, 1, 1)

e mi rilascia il seguente errore:

CrystalDecisions.CrystalReports.Engine.LogOnException non è stata gestita Message=" Errore nel file c:\Temp\RubricaClienti {65C57F02-489B-4A51-BDAA-493FA1ABD491}.rpt: Impossibile collegarsi: accesso ai parametri non corretto." Source="CrystalDecisions.ReportAppServer.DataSetConversion
"

ti chiedo .. il problema è da ricercarsi in vb o in crystal report?


grazie !!

freeteo Profilo | Guru

>scusami non mi ero accorto che c'è un'area dedicata al crystal
>report.
figurati, nessun problema era un suggerimento per i messaggi futuri di questo ambito



>Impossibile collegarsi: accesso ai parametri non corretto."
>Source="CrystalDecisions.ReportAppServer.DataSetConversion"
>ti chiedo .. il problema è da ricercarsi in vb o in crystal report?
il problema è che non hai impostato i dati di connessione al db, (oppure senza impstare i parametri di connessione, puoi passargli i dati tu al report se vai meglio) prima di stamparlo.
Infatti, l'esportazione o cmq la stampa, presuppone che il report venga elaborato tutto, esattamente come succede quando lo visualizzi dentro al CrystalReportViewer.
Perciò dopo il load del file dal disco, devi impostare i dati al report, seguendo uno di questi 2 metodi:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=21962
Inoltre se vuoi scaricare qualcosa da cui prendere spunto da questo:
http://www.dotnethell.it/articles/Crystal-Reports-Integration-Windows-Form.aspx (download a destra)

ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

yuri85 Profilo | Junior Member

io ho trovato questo metodo

Me.rptRubricaClienti.SetDatabaseLogon (utente,password,server,database)

può andar bene?

il problema comunque persiste ed è legato al parametro.

Infatti se creo un report senza parametri, ad esempio una semplice stampa dell'intera rubrica clienti e non di uno specifico, da vb.net stampo tranquillamente.

Se invece aggiungo un parametro mi produce l'errore descritto sopra.


ora stampa .. ma soltanto il titolo del report.

Me.rptRubricaClienti.Load(My.Application.Info.DirectoryPath & "\Report\RubricaClienti.rpt") Me.rptRubricaClienti.SetDatabaseLogon (utente,password,server,database) Me.rptRubricaClienti.RecordSelectionFormula = "{Clienti.Nominativo} = 'Angela'" Me.rptRubricaClienti.PrintToPrinter(1, False, 1, 1)


eppure in RecordSelectionFormula ho specificato la condizione .. help!

freeteo Profilo | Guru

>Me.rptRubricaClienti.SetDatabaseLogon (utente,password,server,database)
>può andar bene?
si va bene lo stesso


>il problema comunque persiste ed è legato al parametro.
>Infatti se creo un report senza parametri, ad esempio una semplice
>stampa dell'intera rubrica clienti e non di uno specifico, da
>vb.net stampo tranquillamente.
ma glielo setti da codice come ti ho scritto prima?


>ora stampa .. ma soltanto il titolo del report.
>Me.rptRubricaClienti.Load(My.Application.Info.DirectoryPath &
>"\Report\RubricaClienti.rpt")
>Me.rptRubricaClienti.SetDatabaseLogon (utente,password,server,database)
>Me.rptRubricaClienti.RecordSelectionFormula = "{Clienti.Nominativo}
>= 'Angela'"
>Me.rptRubricaClienti.PrintToPrinter(1, False, 1, 1)
qui non capisco, non gli passi il parametro...
casomai allega qui (o mandamelo via email) un db con dati di prova e il report, che vedo di sistemartelo io.
ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

yuri85 Profilo | Junior Member


>ma glielo setti da codice come ti ho scritto prima?


ma così non gli passa la condizione?

>>Me.rptRubricaClienti.RecordSelectionFormula = "{Clienti.Nominativo}= 'Angela'"

scusami, ma sono alle primissime armi con crystal reports.



freeteo Profilo | Guru

>ma così non gli passa la condizione?
>>>Me.rptRubricaClienti.RecordSelectionFormula = "{Clienti.Nominativo}= 'Angela'"
no in questo codice, setti il filtro da fare sui record, ma il parametro di cui mi parlavi prima, se viene usato nella query con cui hai costruito il report (immagino che nell' "esperto database" tu abbia agganciato il report ad un "Comando" scrivendo tu la sintassi sql...) allora devi passarglielo.


>scusami, ma sono alle primissime armi con crystal reports.
figurati, nessun problema, siamo qui proprio per dare una mano se possibile

ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

yuri85 Profilo | Junior Member

>>ma così non gli passa la condizione?
>>>>Me.rptRubricaClienti.RecordSelectionFormula = "{Clienti.Nominativo}= 'Angela'"
>no in questo codice, setti il filtro da fare sui record, ma il
>parametro di cui mi parlavi prima, se viene usato nella query
>con cui hai costruito il report (immagino che nell' "esperto
>database" tu abbia agganciato il report ad un "Comando" scrivendo
>tu la sintassi sql...) allora devi passarglielo.
OK

allora in "Esperto selezione" ho messo Clienti.Nominativo è uguale a {?par_nome}

fino a qui è giusto?

in vb.net scrivo quindi:

Me.rptRubricaClienti.SetParameterValue("par_Nome", "Angela")

mi visualizza : accesso ai parametri non corretto.


freeteo Profilo | Guru

ciao,
il parametro si chiama "par_nome" tutto minuscolo, e quindi potrebbe essere un banale problema di Case-Sensitive, anche se devo confessarti che da me il problema non c'è.

Io ho un report che ha una stringa di select sul db, così:
SELECT ... FROM ... WHERE nome='{?utente}'

e lo visualizzo con:
ReportDocument report = new ReportDocument(); report.Load(@"....rpt", OpenReportMethod.OpenReportByTempCopy); report.SetParameterValue("utente", "matteo"); crystalReportViewer1.ReportSource = report;
e funziona come ci si aspetta...strano che a te non vada...
ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

yuri85 Profilo | Junior Member

ho fatto un'altra prova :

Me.rptRubricaClienti.Load(My.Application.Info.DirectoryPath & "\Report\Prova.rpt")
Me.rptRubricaClienti.SetDatabaseLogon(utente,password,server,database)
Me.rptRubricaClienti.SetParameterValue("idcliente", "55")

aggiungendo:
ReportViewer.ReportSource = rptRubricaClienti

così funziona (anche se mi chiede di digitare la password prima di visualizzare il reportviewver ... come mai? )

e poi se da ReportViewer lancio la stampa non ho nessun problema.

Ora, deduco che per stampare un report devo prima lanciare il reportViewer , giusto? non posso una volta valorizzato il parametro eseguire direttamente il seguente comando senza passare per il reportviewer?

Me.rptRubricaClienti.PrintToPrinter(1, False, 1, 1)

freeteo Profilo | Guru

>così funziona (anche se mi chiede di digitare la password prima
>di visualizzare il reportviewver ... come mai? )
ti chiede la password?...strano...mi sa che non imposti correttamente i parametri di accesso al db...prova con i metodi che ti ho suggerito io, in particolare quello che usa "LogonInfo".


>Ora, deduco che per stampare un report devo prima lanciare il
>reportViewer , giusto? non posso una volta valorizzato il parametro
>eseguire direttamente il seguente comando senza passare per il
>reportviewer?
>Me.rptRubricaClienti.PrintToPrinter(1, False, 1, 1)
no no, puoi tranquillamente! le cose che devi fare prima di stampare sono passare i dati (in qualche modo) e i parametri e poi lanciare la stampa, non serve il viewer se non vuoi vederlo nella maschera.
ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

yuri85 Profilo | Junior Member

intendi così:

Me.rptRubricaClienti.Load(My.Application.Info.DirectoryPath & "\Report\Prova.rpt")

Me.rptRubricaClienti.SetParameterValue("idcliente", "55")

Dim LogOnInfo As CrystalDecisions.Shared.TableLogOnInfo
LogOnInfo = Me.rptRubricaClienti.Database.Tables.Item("Clienti").LogOnInfo // per intenderci, cosa va dentro Item?

LogOnInfo.ConnectionInfo.ServerName = server
LogOnInfo.ConnectionInfo.DatabaseName = database
LogOnInfo.ConnectionInfo.UserID = utente
LogOnInfo.ConnectionInfo.Password = password
Me.rptRubricaClienti.Database.Tables(0).ApplyLogOnInfo(LogOnInfo) // a cosa deve far riferimento lo 0 in tables?

e quindi

ReportViewer.ReportSource = rptRubricaClienti se voglio vedere prima il report

altrimenti potrei direttamente lanciare la stampa

Me.rptRubricaClienti.PrintToPrinter(1, False, 1, 1)

freeteo Profilo | Guru

>Me.rptRubricaClienti.Database.Tables(0).ApplyLogOnInfo(LogOnInfo)
>// a cosa deve far riferimento lo 0 in tables?
è l'indice della tabella,ma puoi andare anche per nome, o cmq se è l'unica che hai nel report, l'indice è per forza 0.
Ma puoi partire dal link dell'articolo che ti ho segnalato prima:
http://www.dotnethell.it/files/CrystalReports-Form.zip e vedi li dentro come fa con le logoninfo, a parte che il tuo codice mi sembra corretto.


>ReportViewer.ReportSource = rptRubricaClienti se voglio vedere
>prima il report
no, non serve nessuna visualizzazione nel viewer se devi solo stamparlo


>altrimenti potrei direttamente lanciare la stampa
>Me.rptRubricaClienti.PrintToPrinter(1, False, 1, 1)
si esatto fai la stampa senza aprirti il viewer
ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

yuri85 Profilo | Junior Member

no, ho diverse tabelle ..

comunque anche facendo così

Me.rptRubricaClienti.Load(My.Application.Info.DirectoryPath & "\Report\Prova.rpt") Dim LogOnInfo As CrystalDecisions.Shared.TableLogOnInfo LogOnInfo = Me.rptRubricaClienti.Database.Tables.Item("Clienti").LogOnInfo LogOnInfo.ConnectionInfo.ServerName = "server LogOnInfo.ConnectionInfo.DatabaseName = database LogOnInfo.ConnectionInfo.UserID = utente LogOnInfo.ConnectionInfo.Password = password Me.rptRubricaClienti.Database.Tables("Clienti").ApplyLogOnInfo(LogOnInfo) Me.rptRubricaClienti.SetParameterValue("idcliente", "55") Me.rptRubricaClienti.PrintToPrinter(1, False, 1, 1)

non risolvo perchè continua a darmi errore.

Funziona soltanto se uso il report viewer e se invece di usare LogOnInfo metto
Me.rptRubricaClienti.SetDatabaseLogon(utente,password,server,database)

anche se continua a chiedere la password.

L'esempio tuo l'ho guardato ma purtoppo qualsiasi metodo uso non risolvo nulla.

freeteo Profilo | Guru

ciao,
prova a mandami via email (che trovi sul mio profilo) il progetto che te lo faccio andare io.


ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

yuri85 Profilo | Junior Member

Alla fine, dopo innumerevoli prove ho risolto .. era un impostazione sbagliata in crystal.


grazie.

freeteo Profilo | Guru

>Alla fine, dopo innumerevoli prove ho risolto .. era un impostazione
>sbagliata in crystal.
ok, puoi postare anche parzialmente dove stava il problema? Così può tornare utile anche a qualcun'altro che in futuro magari si trovi a passare di qui...Grazie.

ciao.

Matteo Raumer
[MVP Visual C#]
http://blogs.dotnethell.it/freeteo

yuri85 Profilo | Junior Member

l'elenco dei valori era statico e non dimanico. Non so perchè, ma con dinamico funziona

yuri85 Profilo | Junior Member

Ciao, ora ho un altro problema ..

Se da Crystal report lascio flaggata l'opzione "salva dati con report" funziona la stampa ma ovviamente solo dei dati salvati in fase di progettazione del report.

Io invece voglio poter interrogare direttamente il database con i record aggiornati.

Ho quindi toltoi l flag da "salva dati con report" ma facendo così non funziona più .. cosa manca?

posto il codice

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

cosa manca?

freeteo Profilo | Guru

Ciao,
cosa intendi precisamente per "non funziona" ? Non ti visualizza nessun dato, non ti apre il report, ti da una maschera di richiesta login etc...cosa di preciso?
Dal tipo di "non funzionamento" posso aiutarti meglio .
ciao.

Matteo Raumer
[MVP Visual C#]
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