Problemi con origine dati Crystal Report

venerdì 06 ottobre 2006 - 19.31

relux Profilo | Newbie

Salve a tutti...
sto cercando di creare un sistema di reportistica integrato in un'applicazione realizzata con Visual basic 2005. Sono alla mia prima esperienza con questa tecnologia e ho subito incontrato i primi problemi che adesso andrò ad esporvi:

Creo un Window form, inserisco al suo interno un CrystalReportViewer e lo collego con un nuovo CrystalReport (tutto dall'ambiente visuale di visual studio). E fin qui nessun problema.
Il problema nasce quando devo creare il CrystalReport.
Lo creo con il wizard, che mi chiede subito di inserire l'origine dati dalla quale il report leggerà i valori, e qui sorge il dramma

Se scelgo OLE DB (ADO) --> Microsoft Jet 4.0 OLE DB PROVIDER (che è poi quello che uso nel progetto vb) oppure DAO mi chiede di inserire il db (Access) di riferimento. Io sfoglio le cartelle e inserisco il path relativo al db. lancio il debug del progetto e il report mi mostra i dati che si trovano nel db situato nella cartella del progetto e non quelli del db situato nella cartella di debug.
Mi spiego:
Io gli do il path della cartella di sviluppo dove è situato il db. Quando eseguo il debug o il building il tool ide copia questo db in una nuova cartella (Debug o release) e vi esegue le operazioni sopra. Perchè Crystal Report non fa la stessa cosa? Se io gli imposto un percorso di origine dati (sempre dal tool visuale) lui anche a runtime andrà a prelevare le informazioni sempre da lì. Esiste un modo per assegnare ad un'origine dati di Crystal Report una specie di "path relativo"? Ho provato ad assegnerli la stringa presente nel datasource del progetto ovvero "|DataDirectory|\db.mdb" ma non ho risolto nulla.
Potete darmi delle delucidazioni a riguardo?
Mi scuso se sono stato poco chiaro nell'esporre il problema.
Ciao

freeteo Profilo | Guru

ciao,
il report si aspetta 1a sorgente dati in 2 metodi:
- lo carichi tu con ado.net e poi lo passi come sorgente dati al report con il metodo "SetDataSource"
- gli passi il path del db da codice q eindi decidi tu dove si trova, ma non come nella stringa sqlexpress (ovvero con "|datadirectory|) ma bensi come logoninfo

Per entrambi i metodi ho scritto quji del codice di esempio, prova a darci 1occhiata:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=8681

guarda quello che ho scritto li dentro...
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

relux Profilo | Newbie

Scusa la mia ignoranza ma nn riesco a capire alcune cose tipo:

mioreport .load(server.Mappath("...."))

come faccio a dichiarare l'oggetto "server"? cosa devo mettere al posto dei puntini il path del db che si trova all'interno della cartella del progetto?

logOnInfo.ConnectionInfo.ServerName = "SERVER"

"SERVER" a cosa corrisponde?

non riesco ad adattare le seguenti righe

Me.CrystalReport11.Database.Tables[0].ApplyLogOnInfo(logOnInfo)
CrystalReportViewer1.DataBind()

Puoi aiutarmi per favore? Sono un neofita di questa tecnologia e mi sento perso!
Grazie

freeteo Profilo | Guru

>Scusa la mia ignoranza ma nn riesco a capire alcune cose tipo:
>
>mioreport .load(server.Mappath("...."))

>come faccio a dichiarare l'oggetto "server"? cosa devo mettere
>al posto dei puntini il path del db che si trova all'interno
>della cartella del progetto?

l'esempio era per pagine aspx, server è 1a classe gia pronta per tutte le pagine quando sviluppi in asp e il metodo MapPAth ritorna 1percorso fisico su disco a partire da 1percorso virtuale.
Nel tuo caso, ovvero applicazione win32, devi mettere il path del tuo file "rpt" ad esempio "c:\reports\mioreport.rpt"



>logOnInfo.ConnectionInfo.ServerName = "SERVER"
>
>"SERVER" a cosa corrisponde?
"server" = nome del server sql (oppure path del file mdb)

>non riesco ad adattare le seguenti righe
>
>Me.CrystalReport11.Database.Tables[0].ApplyLogOnInfo(logOnInfo)
>CrystalReportViewer1.DataBind()
cioe?

>Puoi aiutarmi per favore? Sono un neofita di questa tecnologia
certo, ecco qui il codice per far vedere 1report:
... Dim mioreport as new ReportDocument() mioreport .load("c:\reports\file salvato.rpt") Dim logOnInfo As New TableLogOnInfo logOnInfo = mioreport.Database.Tables.Item("Tabella").LogOnInfo logOnInfo.ConnectionInfo.ServerName = "computerconsql" logOnInfo.ConnectionInfo.DatabaseName = "nomedatabase" logOnInfo.ConnectionInfo.UserID = "User" logOnInfo.ConnectionInfo.Password = "pwd" logOnInfo.TableName = "Tabella" mioreport.Database.Tables[0].ApplyLogOnInfo(logOnInfo) CrystalReportViewer1.ReportSource = mioreport CrystalReportViewer1.DataBind(); ...

riadatta e sistema 1po questo codice e vedrai che riesci senza problemi.


ps: Se invece vuoi caricare tu a mano i dati dal database e poi passarli al report, guarda come fa l'esempio qui (fondo pagina c'e' il link):
http://www.dotnethell.it/tips/Crystal-Reports-BLOB.aspx

anche se è stato fatto per altri scopi, guardando il codice del caricamento del report si riesce a capire...
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

relux Profilo | Newbie

Ti posto i miei ultimi dubbi:

>mioreport.Database.Tables[0].ApplyLogOnInfo(logOnInfo)
>CrystalReportViewer1.DataBind()

Tables[0] se nn ho capito male dovrebbe restituire la prima tabella ma riportato così mi dà errore: "L'accesso alla proprietà deve assegnare un valore alla proprietà o utilizzare quello corrente."
Ho pensato allora di modificarlo con:

mioreport.Database.Tables.Item("nomeTabella").ApplyLogOnInfo(logOnInfo) oppure

mioreport.Database.Tables.Current.ApplyLogOnInfo(logOnInfo)

Però nn so se queste modifiche sortiscono il risultato desiderato.

Infine per quanto riguarda

CrystalReportViewer1.DataBind() mi dice che non è un membro di CrystalDecisions.Windows.Forms.CrystalReportViewer

Volevo chiederti a cosa serve questo metodo e con cosa potrei sostituirlo?
Grazie infinite per l'interessamento.

freeteo Profilo | Guru

>mioreport.Database.Tables.Item("nomeTabella").ApplyLogOnInfo(logOnInfo)
>oppure
>
>mioreport.Database.Tables.Current.ApplyLogOnInfo(logOnInfo)
>

si scusa il codice che ti ho postato è in c# tu stai programmando in vb.net quindi le tue correzioni sono giuste

>Però nn so se queste modifiche sortiscono il risultato desiderato.
>
>Infine per quanto riguarda
>
>CrystalReportViewer1.DataBind() mi dice che non è un
>membro di CrystalDecisions.Windows.Forms.CrystalReportViewer
scusami ma è il residuo di 1copia-incolla, è 1 metodo web, toglilo pure tanto in win32 non esiste

ma alla fine sei riuscito a farlo funzionare?
ciao.

Matteo Raumer
[MCAD .net]
http://blogs.dotnethell.it/freeteo

relux Profilo | Newbie

FINALMENTE CI SONO RIUSCITO!!!

Ho utilizzato una soluzione proposta nella documentazione di Visual studio 2005.

Se a qualcuno può servire:

1. creo un report con il wizard di visual stuudio e lo collego al dataset ado.net presente nel mio progetto
(Da quanto ho capito crystal report così collegato permette di progettare il report ma non è effettivamente collegato al db. Per collegarlo vedere 2.)

2. Creo una classe di supporto per compilare il DataSet

Imports System.Data
Imports System.Data.OleDb


Public Class DataSetConfiguration
Private Const CONNECTION_STRING As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\db.mdb"

Public Shared ReadOnly Property getDataSet(ByVal table As String, ByVal query As String) As DataSet
Get
Dim myDataSet As dbDataSet = New dbDataSet
Dim myOleDbConnection As OleDbConnection = New OleDbConnection(CONNECTION_STRING)

Dim myOleDbDataAdapter As OleDbDataAdapter = New OleDbDataAdapter(query, myOleDbConnection)
myOleDbDataAdapter.Fill(myDataSet, table)
Return myDataSet
End Get
End Property

End Class

(Questa versione è leggermente modificata e consente di caricare in maniera generica nel dataset i file contenuti nel db passando come parametro la tabella da caricare e la query di caricamento)

3. In un nuovo form creo un CrystalReportViewer e nel metodo di caricamento della classe richiamo il CR passandogli il dataset ricompilato.

Private bar As CrystalReport1
Private Sub ConfigureCrystalReports(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
bar = New CrystalReport1
Dim myDataSet As DataSet
myDataSet = DataSetConfiguration.getDataSet("Cliente_Acquisto", "SELECT * FROM Cliente INNER JOIN Acquisto ON Cliente.codice_fiscale=Acquisto.cliente")
bar.SetDataSource(myDataSet)
CrystalReportViewer1.ReportSource = bar
End Sub
E il gioco è fatto!!

Per freeteo: Ti ringrazio del tempo che mi hai dedicato ma nn sono riuscito a far funzionare la tua soluzione probabilmente in seguito alla mia inesperienza con questa tecnologia. Ti ringrazio ugualmente.
Ciao.

ant Profilo | Newbie

Salve.

Mi trovo nella tua situazione iniziale. Sto provando il metodo che suggerisci, ma non riesco a interpretare correttamente il punto n. 3. Puoi descriverlo più in dettaglio.

Grazie tante
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