Crystal Report e DataAdapter

venerdì 10 marzo 2006 - 13.32

ikaroweb Profilo | Junior Member

Sto cercando di creare un report senza dataset e mi risulta un tantino complicato, sto cercando di popolare un report con il codice sottostante ma non riesco ad assegnare il datasource al report.La mia domanda è questa: è possibile usare i report senza dataset ?
Se si come?
Dim rep As New CrystalReport1
Dim db_name As String = Application.ExecutablePath
db_name = db_name.Substring(0, db_name.LastIndexOf("\") + 1)
If db_name.EndsWith("\bin\") Then
db_name = db_name.Substring(0, db_name.Length - 4)
End If
db_name &= "\database\database.mdb"
' Build the database connect string.
Dim Str1 As New String("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""" & db_name & """")
Conn.ConnectionString = Str1
Conn.Open()
' Open the connection.
' Make a SELECT Command.
dim query = "SELECT * FROM tabella"
Dim cmd As New OleDb.OleDbCommand( _
query, Conn)

' Execute the query.
Dim db_reader As OleDbDataReader = _
cmd.ExecuteReader(CommandBehavior.Default)
rep.SetDataSource(db_reader.Read)
Report.ReportSource = rep

freeteo Profilo | Guru

ciao,
non ho al momento 1a smentita ufficiale ma credo proprio che non sia possibile bindare il datasource a 1 datareader, devi passargli strutture gia create, come DataTable o DataSet.
Percio puoi passarla come datasource come hai fatto tu ma devi usare una datatable riempita e con la stessa struttura (megli se ha l'esatta sequenza di campi cosi' eviti possibili errori di match di struttura)

ciao
Matteo Raumer
MCAD ... .net addicted :-)
http://blogs.dotnethell.it/freeteo

ikaroweb Profilo | Junior Member

Allora quello che non riesco a capire è questo, se faccio tutto tramite wizard ottengo i campi da inserire nel report e fin qui ci siamo. Ma se voglio passare da codice il database e i vari campi come faccio? Perche se faccio tutto tramite wizard e cerco il db in locale è normale che compilando l'applicazione non trova più il database perche non è nella posizione dichiarata tramite wizard.Quindi non capisco come fare ad assegnare tramite codice il percorso per avere i campi da mettere nel report.

trinity Profilo | Guru

devi inserire nella tua windowsapplication un file tipo dataset1.xsd....
1 - devi crearti delle tabelle di appoggio per i dati che vorrei visualizzare sul report...
2 - da programma riempire la tabella che si trova nel dataset
3 - nel file report devi associargli il dataset, come? segui le due immagini postate


308x218 18Kb


499x402 39Kb

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

ikaroweb Profilo | Junior Member

Ok ho capito cosa devo fare ma visto che non ho mai utilizzato un dataset potresti spiegarmi come associare il mio database e le sue tabelle al dataset?

trinity Profilo | Guru

Ti posto un esempio di codice di come creao la tabella via programma e di come una tabella del db viene associata ad essa:

in un modulo io dichiaro quanto segue:

rem creazione tabella stampaetichetta

Public Function stampaetichetta() As DataTable Dim mytable As DataTable = New DataTable("stampaetichetta") Dim mycolumn As DataColumn = New DataColumn mycolumn.DataType = System.Type.GetType("System.String") mycolumn.ColumnName = "codice" mytable.Columns.Add(mycolumn) mycolumn = New DataColumn mycolumn.DataType = System.Type.GetType("System.String") mycolumn.ColumnName = "titolo" mytable.Columns.Add(mycolumn) mycolumn = New DataColumn mycolumn.DataType = System.Type.GetType("System.String") mycolumn.ColumnName = "nominativo" mytable.Columns.Add(mycolumn) mycolumn = New DataColumn mycolumn.DataType = System.Type.GetType("System.String") mycolumn.ColumnName = "indirizzo" mytable.Columns.Add(mycolumn) stampaetichetta = mytable End Function

Fatto questo nella tua applicazione se desideri passare i dati di una tabella del db a questa datatable devi scrivere così:

Dim ds As DataSet = New DataSet Dim mytable As DataTable Dim myrow As DataRow mytable = stampaetichetta() sql = "SELECT * FROM prova WHERE codice=@par1" cmd.Parameters.Add("@par1", SqlDbType.VarChar).Value = 1 cmd.Connection = db cmd.CommandText = sql cmd.CommandType = CommandType.Text dr = cmd.ExecuteReader If dr.Read Then myrow = mytable.NewRow() myrow("codice") = dr.GetSqlString(0).Value myrow("titolo") = dr.GetSqlString(1).Value myrow("nominativo") = dr.GetSqlString(2).Value myrow("indirizzo") = dr.GetSqlString(3).Value mytable.Rows.Add(myrow) End If dr.Close() cmd.Parameters.Clear() ds.Tables.Add(mytable) cmd.Dispose()

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

ikaroweb Profilo | Junior Member

Ok ci provo ma mi sembra un bel casino.
Stavo pensando che magari gestisco il tutto tramite listview(passando le query a quest'ultima) e stampo il suo contenuto.
Una domanda su questo problema: non riesco a paginare i risultati come faccio?
Ad esempio se voglio avere 100 righe per pagina?

freeteo Profilo | Guru

ciao,
mi sembra che Trinity usi 1po troppo codice per riempire 1a tabella
A me sembrava semplice, riempire 1a tabella di ado.net e passarla come sorgente al report:


------------------------------------
- Crei il report con i campi che vuoi tramite wizard di creazione report :
------------------------------------

data,ora,nome dalla tabella utenti


------------------------------------
- carichi la tabella di ado.net
------------------------------------

Dim miaConn As OleDbConnection = New OleDbConnection(("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\.......\db.mdb")))
Dim miaDataAdapter As OleDbDataAdapter = New OleDbDataAdapter("select data,ora,nome from utenti", miaConn)
Dim miaTab As DataTable = New DataTable("img")
miaDataAdapter.Fill(miaTab)


------------------------------------
- carchi il report e gli passi la sorgente e poi lo attacchi al visualizzatore:
------------------------------------

Dim mioReport As ReportDocument = New ReportDocument
mioReport.Load("c:\......\mioreport.rpt")
mioReport.SetDataSource(miaTab)

crystalReportViewer1.ReportSource = mioReport

------------------------------------


ps: se sei in asp.net aggiungi anche: crystalReportViewer1.DataBind() come ultima riga e se fai connessioni diverse cambi il provider da oledb a sqlclient etc...

e il gioco e' fatto...non vedo tanti giri con reader se poi non li devi elaborare da codice i dati che carichi....
A me sembrava abbastanza facile che dite?

ciao


Matteo Raumer
MCAD ... .net addicted :-)
http://blogs.dotnethell.it/freeteo

ikaroweb Profilo | Junior Member

Si ma come faccio a creare il report con i campi senza assegnarli un database?
Nel senso che senza assegnare un db da wizard come fai ad avere i campi per passargli i valori?
Comunque credo che la tua soluzione sia più abbordabile.

P.S. Il linguaggio che sto usando è vb.net.

trinity Profilo | Guru

Io utilizzo quel tipo di codice perchè mi permette di gestire singolarmente i campi del db che voglio far visualizzare nel dataset e poi successivamente nel report.....

ps come faccio a creare il report con i campi senza assegnarli un database?

Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

freeteo Profilo | Guru

ciao
puoi fare a meno di aggiungere il database al report (se ad esempio vuoi lavorare solo con sottoreport o campi label etc...) ma poi non puoi aggiungere oggetti a runtime, almeno per la versione di visual studio come dice ufficialmente il sito di businessobjects:

http://support.businessobjects.com/library/kbase/articles/c2007183.asp
e cito testualmente:
...
Note=====
All Runtime Report Creation functionality requires licensing. For more information, please visit http://www.crystaldecisions.com/products/crystalreports/license.
=========
...

Pero' si puo' fare ma al momento le versioni comprese in pacchetti come visual studio sono piu "leggere" e quindi permettono di definire 1o schema, caricarne i dati e modificare a runtime i campi parametro, formula , modificare i llayout degli oggetti etc...insomma quello che per la maggior parte delle applicazioni puo' bastare, questo ovviamente royalty free e senza pagare niente a parte registrarsi prima di distribuire il pacchetto. (poi nn so quanti lo fanno pero' sarebbe da fare cosi' )

Cmq se lavori con i campi formula e giocando 1po d'astuzia puoi ottene personalizzazione molto spinte anche se non saranno mai come la creazione a runtime completa.
ciao
Matteo Raumer
MCAD ... .net addicted :-)
http://blogs.dotnethell.it/freeteo

ikaroweb Profilo | Junior Member

Allora i campi che dovro usare saranno sempre gli stessi ad esempio nome cognome tel citta ecc ma i valori cambieranno in quanto le query saranno differenti. A questo punto quello che ti chiedo è come devo muovermi sul report per impostare tali campi per poi passargli i valori tramite il codice che mi hai postato sopra?

freeteo Profilo | Guru

ciao,
leggi bene quello che ti ho scritto è 1a soluzione completa , la sezione "carichi la tabella di ado.net" è dove cambierai la query con filtri etc.. o cambierai la connessione insomma cambierai il set di dati che ti servono....

ciao

Matteo Raumer
MCAD ... .net addicted :-)
http://blogs.dotnethell.it/freeteo

ikaroweb Profilo | Junior Member

------------------------------------
- Crei il report con i campi che vuoi tramite wizard di creazione report :
------------------------------------

data,ora,nome dalla tabella utenti

Si ma come faccio a mettere i campi senza portare un db dentro al report?
Scusa la mia ignoranza ma non ho mai usato un report quindi..

P.S. Si potrebbe passare il contenuto di un listview ad un report?

freeteo Profilo | Guru

>Si ma come faccio a mettere i campi senza portare un db dentro al report?
non puoi!
cmq 1a struttura che rispecchia quello che gli passerai da codice gliela devi dare in pasto.
Se vuoi quando sei nel wizard e selezioni la tabella da aggiungere, puoi usare l'opzione "comando" invede della "tabella intera" per specificare 1a query sql che vuoi tu

>Scusa la mia ignoranza ma non ho mai usato un report quindi..
non preoccuparti

>P.S. Si potrebbe passare il contenuto di un listview ad un report?
il listView lo carichi in qualche modo, tipo lo bindi ad 1 datatable etc... dai la stessa sorgente (ma non datareader!) al report
ciao.

Matteo Raumer
MCAD ... .net addicted :-)
http://blogs.dotnethell.it/freeteo

ikaroweb Profilo | Junior Member

Ok ci provo

trinity Profilo | Guru

Scusa Matteo ma io di solito associavo il dataset.xsd creato al report, per far visualizzare le tabelle, se utilizzo il metodo che hai postato te del datatable, associare i campi di questo datable al report non capisco come farlo....forse mi sto confondendo ora le idee, ma potresti dirmi come? se faccio il wizard trovo queste seguenti voci come da figura, quale dovrei selezionare e come?


499x402 39Kb


Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

ikaroweb Profilo | Junior Member


581x445 51Kb

Ok mi trovo qui, se seleziono il db da file compilando l'applicazione il db non verrà trovato quindi come faccio?

ikaroweb Profilo | Junior Member

Ecco io mi trovo nella stessa situazione di descritta da trinity.

ikaroweb Profilo | Junior Member

Non riesco a capire cosa e come devo usare tale tabella.

ikaroweb Profilo | Junior Member

Allora io ho seguito questo procedimento:
1-Creo da wizard il report e gli assegno i campi che voglio visualizzare
2-Tramite il codice che riporto sotto è possibile passare delle query per visualizzare i risultati in base alle proprie esigenze

Dim db_name As String = Application.ExecutablePath
db_name = db_name.Substring(0, db_name.LastIndexOf("\") + 1)
If db_name.EndsWith("\bin\") Then
db_name = db_name.Substring(0, db_name.Length - 4)
End If
db_name &= "\database\database.mdb"
Dim miaConn As OleDbConnection = New OleDbConnection(("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""" & db_name & """"))
Dim miaDataAdapter As OleDbDataAdapter = New OleDbDataAdapter("select nome,cognome from tabella order by ", miaConn)
Dim miaTab As DataTable = New DataTable("tabella")
miaDataAdapter.Fill(miaTab)
Dim mioReport As CrystalReport1 = New CrystalReport1
Dim rep As String = Application.StartupPath & "CrystalReport1.rpt"
mioReport.SetDataSource(miaTab)
CrystalReportViewer1.ReportSource = mioReport

Spero che sia giusto e che possa esservi utile.
Comunque devo provare a vedere se compilando l'applicazione e spostando il db passato da wizard funziona.

Edit:
Ok funziona perche il db viene passato da codice.
Mi spiegate a cosa serve la colonna a sx del report viewer?

ikaroweb Profilo | Junior Member

Per passare un listview al report ho usato questo codice

Dim mioReport As CrystalReport1 = New CrystalReport1
Dim rep As String = Application.StartupPath & "CrystalReport1.rpt"
mioReport.SetDataSource(ListView1.Items)
CrystalReportViewer1.ReportSource = mioReport

Solo che il listview non viene passato come appare sul form ma senza essere ordinato. Come faccio a passare il listview come si presenta sul form?

ikaroweb Profilo | Junior Member

Come faccio a passare il valore di una stringa al report? Ad esempio se volessi passare la stringa nome contenuta in un textbox come faccio?

freeteo Profilo | Guru

ciao,
prova a dare 1occhiata a questo thread dove spiego come passare 1valore ad 1campo formula da codice:

http://www.dotnethell.it/forum/messages.aspx?ThreadID=6475

ciao.

Matteo Raumer
MCAD ... .net addicted :-)
http://blogs.dotnethell.it/freeteo

ikaroweb Profilo | Junior Member

Allora con quel 3d non sono riuscito a cavarne niente, allora ho pensato di creare un campo di parametro solo che non riesco a capire come passargli il parametro e se questà è la soluzione giusta per passare una stringa a tale campo.

freeteo Profilo | Guru

ciao,
prova con il metodo "setParameter" e vai per nome - valore.
Pero' se non va bene per il campo formula avrai problemi anche con il parametro penso ma che tipo di valore devi passare?

trinity Profilo | Guru

senti Matteo ho letto e visto il thread che hai postato in cui spieghi quanto segue:

mioreport.SetDataSource(miatabella) mioreport.DataDefinition.FormulaFields["miaformula"].Text = "ecco qui il mio testo" dove mioreport è il nome del report tuo. Se invece vuoi filtrare i dati che gli passi per 1 campo che hai a codice: mioreport.DataDefinition.RecordSelectionFormula[0] = "{db.miocampoid} = 123"

se dovessi avere tanti campi sul report devo fare N formule e riempirle singolarmente utilizzando il datareader, prima ipotesi....
seconda ipotesi utilizzare un datatable associarlo al Setdatasource del report e poi associare i vari campi cn questo modo:
mioreport.DataDefinition.RecordSelectionFormula[0] = "{db.miocampoid}

oppure in un'altro modo? cmq la prima ipotesi andrebbe bene il discorso del datareader?

Ciao
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/

ikaroweb Profilo | Junior Member

Devo passare il valore di un combobox.

ikaroweb Profilo | Junior Member

Allora mi spiego meglio, quello che devo creare è una stampa di una descrizione come l'immagine sotto e cioè oltre a caricare dei valori da database( e fin qui ci siamo riusciti) devo caricare un'immagine e dei valori che vengono selezionati sul form. Un'altra cosa che devo fare è quella di stampare il tutto in dimensione 7x6 cm come faccio? Grazie.

791x483 89Kb

ikaroweb Profilo | Junior Member

Dopo ore di prove finalmente ho trovato il codice per passare un parametro da un form al report
'Dichiaro i parametri relativi agli oggetti
Dim param1Fields As New CrystalDecisions.Shared.ParameterFields
Dim param1Field As New CrystalDecisions.Shared.ParameterField
Dim param1Range As New CrystalDecisions.Shared.ParameterDiscreteValue

param1Field.ParameterFieldName = "Nome" 'nome del parametro di crystal report
param1Range.Value = "Eugenio"
param1Field.CurrentValues.Add(param1Range)
param1Fields.Add(param1Field)

ikaroweb Profilo | Junior Member

Per quanto riguarda il caricamento dell'immagine non riesco a trovare niente, qualcuno ha qualche soluzione al problema?

ikaroweb Profilo | Junior Member

Vorrei sapere se esiste un altro sistema al posto del report per stampare un immagine simile a quella in basso.

791x483 89Kb

Mikyct86 Profilo | Junior Member

Vi prego aiuto.....Ciao scusa se disturbo ma ho un problema...sono un giovane programamtore vorrei utilizzare i crystal reports e gli xsd per far visualizzare un array multidimensionale nel report ma non ci riesco.........
ho creato la tabella(datatable)il dataset
il dataset ho fatto :dataset1.WriteXmlSchema(FileWriter)
ma adesso?????
ci vuole un datasource giusto?
oppure io ho provato con il datatable aggiungendo le row e le column e mettendo nella row il mio array
ma non visualizza niente...solo le colonne....i dati????????
aiutooooooooooooooooooooooooooooooooo
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