Grafico in c#

giovedì 21 febbraio 2008 - 10.54

elsinore Profilo | Junior Member

Ciao a tutti,

io avrei bisogno di rappresentare il risultato di una Query

es:

Ora Dato1 Dato2
10:00 xxx yyyy
10:10 aaa yyyy
12:30 xcc yyyy


in un grafico.....utilizzando c#... non ho la minima idea di come fare!..qualcuno mi sa indirizzare in qualche modo?

grazie mille!!

freeteo Profilo | Guru

ciao,
ci sono dei componenti che fanno proprio questo, come il pacchetto "Dundas Chart" (http://www.dundas.com/)

Pero' se vuoi qualcosa che ti puo' tornare utile anche per altre operazioni, tipo visualizzare dei dati sotto al grafico, fare dei calcoli etc...insomma in poche parole fare un "Report" allora puoi usare il ReportViewer di SqlReporting.

Aggiungi alla tua applicazione un file di Report ".rdlc" dal menu, lo disegni integrando dentro i dati che ti interessano (aggiungendo una datasource) e preparando il grafico utilizzando un designer che ti aiuta moltissimo nello sviluppo.

Fatto questo, ti basta aggiungere il viewer e dirgli da codice di visualizzare il report che hai disegnato prima:

DataTable table = ...carichi i tuoi dati... //--- riempi la tabella LocalReport report = this.reportViewer1.LocalReport; report.ReportPath = "rdlc\\Report1.rdlc"; report.DataSources[0] = new ReportDataSource(report.DataSources[0].Name , table); this.reportViewer1.RefreshReport();

dove "reportViewer1" è il viewer e la "table" ha la stessa struttura di quella con cui hai costruito il report...



ciao.

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

elsinore Profilo | Junior Member

grazie mille.......ora provo e ti faccio sapere!!

Anubis Profilo | Junior Member

Ciao,

io ho la stessa esigenza, mi sono importato l'oggetto Report nel mio progetto web in c#.

Solo che non riesco a connetterlo al DB. Il db è Oracle. (Dalle pagine aspx del progetti mi connetto senza problemi)

Nel web Config ho inserito questi parametri

<connectionStrings>
<add name="OracleConnectionString"
connectionString="Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=IMANSYSRV)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=MAVILO)));Persist Security Info=True;Password=mavilo;User ID=mavilo"
providerName="System.Data.OracleClient" />
</connectionStrings>

ma questa stringa di connessione non viene vista dal wizard per connettermi al DB......come in figura sotto...

575x451 37Kb



ho allora cliccato su "new connection"


332x360 27Kb



ma nono riesco a connettermi al mio db oracle...mi dice
ORA-12514:TNS:listener could not resolve SERVICE_NAME

nel tnsnames del server ho scritto

pippo=
(DESCRIPTION=
(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=MYSERVER)(PORT=1521))
)
(CONNECT_DATA=
(SERVICE_NAME=pippo)
)
)

e nella maschera ho scritto


332x360 28Kb



help!!!

elsinore Profilo | Junior Member

Freeteo scusa un'altra domanda, sto utilizzando l'oggetto Report, vedo che man mano che proseguo cn al connessione guidata al DB mi fa anche connettere alle varie tabelle e mi fa preparare le query, però le mie query non saranno fisse, ma verranno costruite dall'utente che naviga nel sito....... questo è possibile vero?

spero!

freeteo Profilo | Guru

x elsinore :
-------------------
se stai usando un report "rdlc" purtroppo il designer nn ti aiuta a farlo, puoi pero' farti un dataset con dentro una tabella che ha la struttura che ti serve, e che poi passerai da codice al report.
Se invece stai facendo un progetto Report (quindi sotto al nodo Nuovo->Business Intelligence Proejcts) allora si , puoi dirgli la query e lui ti crea un dataset basato su quella query.


x Anubis:
-------------------
Non ho esperienza su Oracle, cmq se hai il driver correttamente installato come vedo dalle immagini, dovresti capire la stringa di connessione, magari come "nome server" vuole l'ip etc...non saprei pero' con certezza
Verifica la stringa qui:
http://www.connectionstrings.com/?carrier=oracle

e poi come si connette visual studio credo sia corretto come hai impostato tu, forse c'e' un problema di qualche parametro..

ps: un buon link da cui partire a crercare è anche questo:
http://www.oracle.com/technology/tech/dotnet/tools/index.html




ciao.

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

Anubis Profilo | Junior Member

ciao freeteo, grazie x l'aiuto...
ho risolto il problema della connessione al DB...
ho aggiunto un report al mio progetto, e ora sto cercando di modificare la query ke passo al DataSource...

ti posto il codice...

SqlDataAdapter query = new SqlDataAdapter(SQLCerca, ConnectionString); //imposto la query
DataSet queryDataSet = new DataSet(); //creo il DatSet
query.Fill(queryDataSet); //riempio il DataSet con il risultato della query

LocalReport report = this.reportViewer1.LocalReport;
report.ReportPath = "rdlc\\ReportGrafico.rdlc";
report.DataSources[0] = new ReportDataSource(report.DataSources[0].Name, queryDataSet.Tables[0].Rows);

this.reportViewer1.RefreshReport();

ho utilizzato il codice ke mi hai consigliato tu, ma mi da questo errore:

'_Default' does not contain a definition for 'reportViewer1'

freeteo Profilo | Guru

ciao,
il codice è corretto anche come concetto, il messaggio "'_Default' does not contain a definition for 'reportViewer1'" te lo dara' in fase di compilazione presumo, perche' significa che il tuo "viewer" che hai messo nella pagina, non si chiama "reportViewer1", quello era il mio

hai messo giu nella pagina il viewer per il report vero? Lo trovi nella toolbox, ti basta fare il drag&Drop...

ciao.

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

Anubis Profilo | Junior Member

ciao freeteo,

Ti faccio vedere che pagine ho:


277x656 36Kb


Nella pagina Report.aspx.cs ho messo la parte di codice che ti avevo postato nel mex precedente...

In ReportGrafico.rdlc ho inserito un grafico, Chart1...

Ora ho provato a sostituire reportviewer1 con Chart1, ma mi dice sempre la stessa cosa anche x lui...

Se ho capito bene il file ReportGrafico.rdlc sarebbe il file di report, mentre il grafico che ho inserito sarebbe il viewer...o mi sbaglio??

Anubis Profilo | Junior Member

Per il fatto del reportviewer ho risolto...(non avevo aggiunto il reportviewer all'aspx)

Ora mi da problemi sul metodo RefreshReport()

mi dice: 'Microsoft.Reporting.WebForms.ReportViewer' does not contain a definition for 'RefreshReport'

cioè è come se non riconoscesse questo metodo...il che sembra strano dato che è un metodo del reportviewer...

in che cosa sbaglio??

freeteo Profilo | Guru

ciao,
il RefreshReport è per la parte win32, ho sbagliato io a riportare il codice
Quello che ti basta è chiamare il "reportViewer1.DataBind()" che va a "Renderizzare" il report al posto di quella riga...


ciao.

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

Anubis Profilo | Junior Member

grazie mille x l'aiuto...
dimenticavo di dirti che è la prima volta che lavoro con questo oggetto report!!

Ora ho un altro problema:

quando lancio una query dalla pagina web mi da questo errore:

"An error has occurred while establishing a connection to the server. When connecting to SQL Server 2005, this failure may be caused by the fact that under the default settings SQL Server does not allow remote connections. (provider: Named Pipes Provider, error: 40 - Could not open a connection to SQL Server)"

a questa riga
query.Fill(queryDataSet);

La query è corretta e sul DB funziona, non capisco xkè mi parla di SQL Server quando il mio DB è Oracle...

freeteo Profilo | Guru

>grazie mille x l'aiuto...
>dimenticavo di dirti che è la prima volta che lavoro con questo
>oggetto report!!
tranquillo nessuno problema, siamo qui per questo



>error: 40 - Could not open a connection to SQL Server)"
>
>a questa riga
>query.Fill(queryDataSet);
>
>La query è corretta e sul DB funziona, non capisco xkè mi parla
>di SQL Server quando il mio DB è Oracle...
se è lo stesso codice che hai postato sotto il problmea è che hai usato una "SqlDataAdapter" , con SqlConnection etc...insomma "Sql"...nel tuo caso devi fare una connessione ODBC, o OleDB, ed usare i provider giusti, "OledbConnection" etc...
Verifica anche la stringa di connesssione perhce' cambia tra provider e provider, ti puo' aiutare questo sito:
http://www.connectionstrings.com/





ciao.

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

Anubis Profilo | Junior Member

grazie freeteo, ho risolto i problemi nel codice

SQLCerca = "select * from APPL_AEA__Token";
OracleDataAdapter query = new OracleDataAdapter(SQLCerca, ConnectionString); //imposto la query
DataSet queryDataSet = new DataSet(); //creo il DatSet
query.Fill(queryDataSet); //riempio il DataSet con il risultato della query

LocalReport report = this.ReportViewer1.LocalReport;
report.ReportPath = "E:\\Progetti\\Mavilo\\MaviloWeb\\Report\\ReportGrafico.rdlc";
report.DataSources.Clear();
report.DataSources.Add(new ReportDataSource("ReportDataSource", queryDataSet.Tables[0].Rows));

this.ReportViewer1.DataBind();

Ora però ho dei problemi nel grafico...non riesco a impostare i valori...ti posto alcuni screenshot:

Qui imposto come valore il campo APPL, che tiro su dalla query del DataSet:


1280x800 173Kb


nelle propietà del grafico non so cosa devo mettere come DataSetName:


1280x800 178Kb


sapresti darmi qualche consiglio??

freeteo Profilo | Guru

ciao,
il problema è che hai aggiunto una datasource con i tuoi dati e va benissimo, ma non si chiama come quella che si aspetta il report (che è quella con cui l'hai costruito) che è "DataSet1_Appl_3d", come ti segnala a runtime.

Ti basta quindi dare il nome giusto qui:
report.DataSources.Add(new ReportDataSource("#NOMEGIUSTO#", queryDataSet.Tables[0].Rows));

altrimenti non riesce a fare il match...

ciao.

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

Anubis Profilo | Junior Member

...ok l'ho messo,

report.DataSources.Add(new ReportDataSource("ReportDataSource", queryDataSet.Tables[0].Rows));
e ReportDataSource l'ho aggiunto nel campo DatasetName del grafico....

ma ora mi da questo errore...


An error occurred during local report processing.
The definition of the report 'Main Report' is invalid.
The chart ‘Chart1’ refers to an invalid DataSetName ‘ReportDataSource’.

freeteo Profilo | Guru

no!

il problema come ti dice è proprio il nome "ReportDataSource", quando nel report hai messo un nome diverso.
Se vuoi lasciare quel codice (quindi con il nome "ReportDataSource") , quando hai aperto il report, vai su menu "Report->Data Source" e devi mettere lo stesso nome che gli metti come stringa da codice (questo "ReportDataSource") nella voce "Report DataSources:".

Vedi tu quale ti va meglio, ma le 2 stringhe devono conicidere...

ciao.

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

Anubis Profilo | Junior Member



non mi uccidere!!!

sento che quasi ci siamo!!

nel menù report-datasource
nelle'elencoDataSources non ho nullla..... se scrivo a mano nella casella "Project Data Source" la mia stringa "ReportDataSource"....poi clicco ADD to Report......do l'ok e poi però non me lo aggiunge......mi manca sta parte mi sa!!... come faccio ad agganciare il mio nome ReportDataSource definito nel codice al grafico??


1280x800 184Kb


come vedi dall'immagine....ho creato un datasource con l'interfaccia guidata....ma mi fa collegare ad una tabella predefinita del mio DB...e non mi va bene...non so come agganciare il mio nome ReportDataSource definito nel codice al grafico.....

freeteo Profilo | Guru

>non mi uccidere!!!
ma va


>sento che quasi ci siamo!!
si ci stiamo perdendo in un bicchier d'acqua...


>nel menù report-datasource
>nelle'elencoDataSources non ho nullla..... se scrivo a mano nella
>casella "Project Data Source" la mia stringa "ReportDataSource"....poi
>clicco ADD to Report......do l'ok e poi però non me lo aggiunge......mi
>manca sta parte mi sa!!... come faccio ad agganciare il mio nome
>ReportDataSource definito nel codice al grafico??
sarebbe il contrario
Dovresti creare il report, e poi andare da codice a dire i tuoi dati sono questi, e per dire "i tuoi dati" devi dargli il nome, quindi quello che vedi nella finstra dell'immagine che mi hai messo tu "DAtaSet1_APP..." quello è il nome da dare alla datasource.

Ti ho allegato un esempio che carica dei dati, controlla come fa li, se apri il report vedi lo stesso nome "dbReport" sia nel codice, che nelle datasources del report


>come vedi dall'immagine....ho creato un datasource con l'interfaccia
>guidata....ma mi fa collegare ad una tabella predefinita del
>mio DB...e non mi va bene...non so come agganciare il mio nome
>ReportDataSource definito nel codice al grafico.....
si ok, ma quello serve perche' lo stai disegnando, e devi dargli una struttura, altrimenti lui come fa a farti il grafico? Basandosi su che dati? ma soprattutto incrociando quali colonne? (il nome delle colonne arriva dalla sorgente dati che gli passi appunto)


ciao.

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

Anubis Profilo | Junior Member

ok freeteo ora sono riuscito a disegnare il grafico passandogli una query dimanica
Alla fine la creazione del DataSource via interfaccia che si collega ad una tabella predefinita, viene poi "sovrascritta" dallla query che gli passo dal codice... mi mancava questo passaggio!!

ho ancora dei problemi però...ti spiego:

devo mettere sull'asse delle Y il campo APPL (conteggiato, questo campo contiene cmq sempre lo stesso nome) e sull'asse delle X tutti i valori del campo TIME_APPL...(che contiene valori tipo "Mon Jan 24 16:26:27 2005")

per fare ciò ho aggiunto nella proprietà Values del grafico (nella sezione Data) il campo APPL, impostando come Value =Count(Fields!APPL.Value)

nella prorpietà Category Groups ho aggiunto il campo TIME_APPL, impostando come Value =Fields!TIME_APPL.Value

il problema è che quando mi disegna il grafico mi fa vedere una linea dritta, senza mettere i valori di TIME_APPL sull'asse delle X, come in questa immagine:


704x382 14Kb


...il fatto che metta solo il valore 1 per l'asse Y è corretto, perchè il campo APPL ha sempre un solo tipo di valore...
io però mi aspettavo che mettesse sull'asse delle X tutti i valori di TIME_APPL....per poi crearmi l'andamento...

freeteo Profilo | Guru

ciao,
non hai messo i campi nei posti giusti del grafico, che ha 3 aree da riempire:

- Categories: punti di interesse delle ascisse

- Values: il valore che vuoi visualizzare nelle ordinate, tipo il "count(...campo...)" o il "sum" etc...

- Series: se vuoi che per ogni valore di Categoria venga suddiviso anche per questo campo


Esempio:
Visualizzare il conto dei messaggi del giorno per utente

- Categorie: Fields!DataMessaggio
- Values: Count(Fields!DataMessaggio) <--- qualsiasi campo per il conto va bene tanto a me serve il conto delle righe
- Series: Fields!Utente

nello stesso giorno 2 utenti hanno qualcosa qui vedi 2 barre di colore diverso, una per utente (series) e ne vedi tante quante sono le date diverse (categories) e il valore che vedi è il conto (values)

Spero di essere stato piu chiaro con questo esempietto

ciao.

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

Anubis Profilo | Junior Member

Se nel Values devo mettere i valori delle ordinate(Y) e nel Categories devo mettere i valori delle ascisse(X), mi sembra di aver impostato correttamente questi valori...dato ke io metto in Categories TIME_APPL(=Fields!TIME_APPL.Value) e in Values APPL(=Count(Fields!APPL.Value))...guarda come li ho messi:


745x464 58Kb


nel tuo esempio utilizzi anke Series xké fai un grafico dove puoi visualizzare più utenti, ma nel mio caso il tipo di APPL è 1 solo, quindi penso ke nn mi serva utilizzare anke Series...se poi ci vogliono per forza tutte e 3 le proprietà allora è 1 altro discorso

A me sembra ke questi valori non riesca a metterli sul grafico, oppure nn riesce a prenderli dalla tabella...dato ke ho provato anke con altri campi della mia tabella, ma ottengo sempre lo stesso risultato di 1 grafico vuoto...

non capisco dove sbaglio


nono mi abbandonare!!!
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-2023
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5