Stampare report da db Oracle senza CrystalReportViewer / Stampare più ...

giovedì 11 marzo 2010 - 11.25

danilolc Profilo | Newbie

Ciao a tutti!

Tramite un'applicazione web .net attualmente faccio un stampa di un report tramite CrystalReportViewer etraendo dei dati abbastanza complessi da un db oracle, ed il tutto funziona bene : passo il mio CrystalReportSource con i vari parametri di connessione, passo le variabili di stampa ed il CrystalReportViewer mi viene visualizzato e posso scegliere se stampare od esportare su file il report.

Ora, il mio problema è questo : per velocizzare il processo, mi viene richiesto che tale report venga stampato SENZA alcuna anteprima a video.

Come faccio a stampare (tenendo conto di tutti i parametri che passo al report) senza visualizzare a video il CrystalReportViewer ?

Questo è il codice che uso attualmente :

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

Inoltre, un'altra questione : come posso lanciare la stampa di più report senza doverli confermare ad uno ad uno ?

Spero sia tutto chiaro!

Grazie!
ciao.

freeteo Profilo | Guru

Ciao,
devi usare un oggetto "ReportDocument" e lavorare con quello, usando il metodo "PrintToPrinter" per saltare l'anteprima, con un codice di questo tipo:

'--- carico l'oggetto ReportDocument Dim mioreport as new ReportDocument() mioreport.load("c:\..\..\crystalreport1.rpt") '--- accesso al database 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) '--- stampo direttamente nella stampante mioreport.PrintOptions.PrinterName = "FinePrint" mioreport.PrintToPrinter(1, false, 0, 0)

Se vuoi stamparne più di uno di fila, ti basta caricarne vari in maniera ciclica...

* ps: il codice di prima io lo uso anche per l'anteprima, infatti poi lo visualizzo settandolo come "ReportSource" del viewer:
CrystalReportViewer1.ReportSource = mioreport

Il viewer infatti è un oggetto che lo visualizza, ma il report da solo è già quello che serve per elaborare tutto l'ambaradan...


Ciao.

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

danilolc Profilo | Newbie

Grazie per la risposta!

Però quando vado a fare il load del report mi da errore : "Caricamento report non riuscito".

Dato che la pagina aspx da cui carico il report ed il report stesso sono nello stesso path, non metto alcun percorso nell'istruzione di load :

'--- carico l'oggetto ReportDocument
Dim mioreport As New ReportDocument()
mioreport.Load("crpStampaWeekend.rpt")

Inoltre devo passare dei parametri al report. Pensi che il problema sia dovuto al fatto che il report non venga trovato (ed in questo caso devo cambiare il path all'istruzioni LOAD) ?

ciao e grazie!

freeteo Profilo | Guru

>Grazie per la risposta!
di niente!


>Però quando vado a fare il load del report mi da errore : "Caricamento
>report non riuscito".
facile che non abbiato trovato il file...



>Inoltre devo passare dei parametri al report.
usa il metodo "SetParameter" sempre dell'oggetto report



>Pensi che il problema
>sia dovuto al fatto che il report non venga trovato (ed in questo
>caso devo cambiare il path all'istruzioni LOAD) ?
quando carichi qualcosa da un path relativo, usa Server.MapPath("...") che lo trasforma in assoluto (a livello sistema operativo). Prova a verificare che il path del report sia corretto intanto come prima cosa.

Ciao.

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

danilolc Profilo | Newbie

ok, ho risolto per apertura report e passaggio parametri.

ho però un problema nell'accesso al mio db, con il codice :

'--- accesso al database
Dim logOnInfo As New TableLogOnInfo
logOnInfo = mioreport.Database.Tables.Item("Tabella").LogOnInfo
logOnInfo.ConnectionInfo.ServerName = clsFunzioni.cDBServer
logOnInfo.ConnectionInfo.DatabaseName = clsFunzioni.cDBName
logOnInfo.ConnectionInfo.UserID = clsFunzioni.cDBUser
logOnInfo.ConnectionInfo.Password = clsFunzioni.cDBPassword
logOnInfo.TableName = "Tabella"
mioreport.Database.Tables(0).ApplyLogOnInfo(logOnInfo)

il mio report non accede ad una sola tabella, ma a più tabelle; inoltre, se serve l'informazione, al suo interno vi sono dei Subreports; cosa devo mettere al posto di "Tabella" ? Se metto una delle mie tabelle utilizzate al momento della stampa mi esce poi un errore :

Errore nel file C:\Users\danilo\AppData\Local\Temp\crpStampaWeekend {32C24E02-D7E1-4250-9634-60B037DCA30D}.rpt:
Impossibile collegarsi: accesso ai parametri non corretto.

Oppure questo è un problema dei parametri che ho passato ?

freeteo Profilo | Guru

>il mio report non accede ad una sola tabella, ma a più tabelle;
ok puoi fare il ciclo sulle tabelle, che sono un array (nell'esempio va solo nella tabella di indice 0)



>inoltre, se serve l'informazione, al suo interno vi sono dei
>Subreports; cosa devo mettere al posto di "Tabella" ? Se metto
ma per tutto il report hai le stesse logoninfo? allora puoi provare ad usare un metodo "generico" "SetDatabaseLogon" che dovrebbe applicare le stesse info di accesso a tutte le tabelle.
Verifica se funziona già anche per i sottoreport, altrimenti, dato che un sottoreport è di fatto un ReportDocument anche lui, devi aprirlo con il metodo "OpenSubReport" e poi settargli le info come per quello principale.


Ciao.

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

danilolc Profilo | Newbie

Ho optato per SetDatabaseLogon, ma niente da fare; questo è il codice attuale :

Dim mioreport As New ReportDocument()
mioreport.Load(Percorso)

mioreport.SetParameterValue("settimana", "07")
mioreport.SetParameterValue("datainizio", StartDate)
mioreport.SetParameterValue("datafine", EndDate)
mioreport.SetParameterValue("esercizio", "10")

mioreport.SetDatabaseLogon(clsFunzioni.cDBUser, clsFunzioni.cDBPassword, clsFunzioni.cDBServer, clsFunzioni.cDBName)
mioreport.OpenSubreport("Sub1").SetDatabaseLogon(clsFunzioni.cDBUser, clsFunzioni.cDBPassword, clsFunzioni.cDBServer, clsFunzioni.cDBName)
mioreport.OpenSubreport("Sub2").SetDatabaseLogon(clsFunzioni.cDBUser, clsFunzioni.cDBPassword, clsFunzioni.cDBServer, clsFunzioni.cDBName)
mioreport.OpenSubreport("Sub3").SetDatabaseLogon(clsFunzioni.cDBUser, clsFunzioni.cDBPassword, clsFunzioni.cDBServer, clsFunzioni.cDBName)
mioreport.OpenSubreport("Sub4").SetDatabaseLogon(clsFunzioni.cDBUser, clsFunzioni.cDBPassword, clsFunzioni.cDBServer, clsFunzioni.cDBName)
mioreport.OpenSubreport("Sub5").SetDatabaseLogon(clsFunzioni.cDBUser, clsFunzioni.cDBPassword, clsFunzioni.cDBServer, clsFunzioni.cDBName)

mioreport.PrintOptions.PrinterName = "NomeStampante"
mioreport.PrintToPrinter(1, False, 0, 0)

Quando arrivo all'ultima istruzione, eseguendola esce l'errore "Impossibile collegarsi: accesso ai parametri non corretto.".

freeteo Profilo | Guru

Ciao,
presumo che i dati di connessione siano corretti, forse è un problema della proprietà "location" della tabella del report (quella che per intenderci recuperti da: report.database.tables(x)), come in passato è successo, vedi questo post:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=30228

prova a verificare anche questo...

Ciao.

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

danilolc Profilo | Newbie

Ciao,

Prima di tutto ho provato come test a prendere un report più semplice, senza subreports (giusto per escludere che il problema sia relativo a questo).

Ho quindi provato a vedere il post che mi hai linkato, ma anche con il seguente codice ho lo stesso problema :

Dim tb As CrystalDecisions.CrystalReports.Engine.Table
Dim i As Integer = 0
For Each tb In mioreportTest.Database.Tables
tb.LogOnInfo.ConnectionInfo.ServerName = clsFunzioni.cDBServer
tb.LogOnInfo.ConnectionInfo.DatabaseName = clsFunzioni.cDBName
tb.LogOnInfo.ConnectionInfo.UserID = clsFunzioni.cDBUser
tb.LogOnInfo.ConnectionInfo.Password = clsFunzioni.cDBPassword
tb.LogOnInfo.ConnectionInfo.Type = ConnectionInfoType.CRQE
mioreportTest.Database.Tables(i).Location = tb.Location
tb.ApplyLogOnInfo(tb.LogOnInfo)
i += 1
Next

L'errore mi esce proprio sulla riga in cui viene assegnata la Location (l'errore mi dice che la password non è assegnata, quindi è impossibile connettersi al db).

Questo è il codice completo per la stampa di questo report di test :

''''TEST
Dim PercorsoTest As String
PercorsoTest = Server.MapPath("crpElencoUtenti.rpt")
Dim mioreportTest As New ReportDocument()
mioreportTest.Load(PercorsoTest)
Dim tb As CrystalDecisions.CrystalReports.Engine.Table
Dim i As Integer = 0
For Each tb In mioreportTest.Database.Tables
tb.LogOnInfo.ConnectionInfo.ServerName = clsFunzioni.cDBServer
tb.LogOnInfo.ConnectionInfo.DatabaseName = clsFunzioni.cDBName
tb.LogOnInfo.ConnectionInfo.UserID = clsFunzioni.cDBUser
tb.LogOnInfo.ConnectionInfo.Password = clsFunzioni.cDBPassword
tb.LogOnInfo.ConnectionInfo.Type = ConnectionInfoType.CRQE
mioreportTest.Database.Tables(i).Location = tb.Location
tb.ApplyLogOnInfo(tb.LogOnInfo)
i += 1
Next
mioreportTest.SetParameterValue("Reparto", "1")
mioreportTest.PrintOptions.PrinterName = "NomeStampante"
mioreportTest.PrintOptions.PaperOrientation = PaperOrientation.Portrait
mioreportTest.PrintToPrinter(1, False, 0, 0)
'''FINE TEST

Ho quindi asteriscato la parte della location
Ho provato a mandare in debug riga per riga il tutto, ed ho verificato che quando arrivo alla riga " tb.LogOnInfo.ConnectionInfo.Type = ConnectionInfoType.CRQE" se vado a vedere quali valori contiene tg.LogOnInfo.ConnectionInfo vedo che ci sono tutti i parametri corretti per l'accesso al mio db :


795x518 109Kb


Nel momento in cui però vado a fare l'ApplyLogInfo, ho visto che perdo i dati relativi al nome server ed alla password :


694x596 82Kb


Quindi poi alla fine quando cerco di stampare mi esce il fatidico errore "Impossibile collegarsi: accesso ai parametri non corretto.".

qualche suggerimento....

ciao !

danilolc Profilo | Newbie

Non ci credo.... ho risolto..... !

cercando a destra e sinistra ho trovato un'informazione che diceva che per i database Oracle non bisogna passare alcuna stringa al parametro di DatabaseName... Ho provato quindi a modificare il codice in questo modo :

logOnInfo.ConnectionInfo.DatabaseName = ""

e.... tutto funziona !

ciao!

freeteo Profilo | Guru

>al parametro di DatabaseName... Ho provato quindi a modificare
>il codice in questo modo : logOnInfo.ConnectionInfo.DatabaseName = ""
>e.... tutto funziona !
a volte sono proprio delle stupidaggini che non penseresti mai
Bene così, e grazie per aver postato la soluzione, utile magari a qualcun'altro che si trovasse a passare per questo thread...


Ciao.

Matteo Raumer
[MCAD .net, 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-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5